diff --git a/code/_onclick/click_ctrl.dm b/code/_onclick/click_ctrl.dm index e80f8fa05cb..19c86970aee 100644 --- a/code/_onclick/click_ctrl.dm +++ b/code/_onclick/click_ctrl.dm @@ -41,7 +41,7 @@ if(grab(target) != GRAB_SKIP) changeNext_move(CLICK_CD_MELEE) return - pulled(target) + start_pulling(target) /** * Ctrl mouse wheel click diff --git a/code/_onclick/hud/screen_objects/screen_objects.dm b/code/_onclick/hud/screen_objects/screen_objects.dm index 7631674c460..84f71ea788a 100644 --- a/code/_onclick/hud/screen_objects/screen_objects.dm +++ b/code/_onclick/hud/screen_objects/screen_objects.dm @@ -396,8 +396,11 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen) // I hate this place var/vertical = FALSE /atom/movable/screen/floor_changer/Click(location,control,params) - var/list/modifiers = params2list(params) + var/mob/living/user = get_mob() + if(usr != user) + return + var/list/modifiers = params2list(params) var/mouse_position if(vertical) @@ -406,10 +409,23 @@ INITIALIZE_IMMEDIATE(/atom/movable/screen) // I hate this place mouse_position = text2num(LAZYACCESS(modifiers, ICON_X)) if(mouse_position > 16) - usr.up() + //non-living can't RMB anyway, but just a precaution. + if(LAZYACCESS(modifiers, RIGHT_CLICK) && isliving(user)) + if(user.looking_vertically == UP) + user.end_look() + else + user.look_up() + return + hud.mymob.up() return - usr.down() + if(LAZYACCESS(modifiers, RIGHT_CLICK) && isliving(user)) + if(user.looking_vertically == DOWN) + user.end_look() + else + user.look_down() + return + hud.mymob.down() return /atom/movable/screen/floor_changer/vertical diff --git a/code/datums/components/blob_minion.dm b/code/datums/components/blob_minion.dm index 8e8f796d3ae..6549410f4a4 100644 --- a/code/datums/components/blob_minion.dm +++ b/code/datums/components/blob_minion.dm @@ -74,7 +74,6 @@ var/mob/living/living_parent = parent living_parent.add_faction(ROLE_BLOB) ADD_TRAIT(parent, TRAIT_BLOB_ALLY, REF(src)) - remove_verb(parent, /mob/living/verb/pulled) // No dragging people into the blob RegisterSignal(parent, COMSIG_MOB_MIND_INITIALIZED, PROC_REF(on_mind_init)) RegisterSignal(parent, COMSIG_ATOM_UPDATE_ICON, PROC_REF(on_update_appearance)) RegisterSignal(parent, COMSIG_MOB_GET_STATUS_TAB_ITEMS, PROC_REF(on_update_status_tab)) @@ -98,7 +97,6 @@ living_parent.pass_flags &= ~PASSBLOB living_parent.remove_faction(ROLE_BLOB) REMOVE_TRAIT(parent, TRAIT_BLOB_ALLY, REF(src)) - add_verb(parent, /mob/living/verb/pulled) UnregisterSignal(parent, list( COMSIG_ATOM_BLOB_ACT, COMSIG_ATOM_FIRE_ACT, diff --git a/code/datums/martial/_action.dm b/code/datums/martial/_action.dm new file mode 100644 index 00000000000..72d3dadc39b --- /dev/null +++ b/code/datums/martial/_action.dm @@ -0,0 +1,39 @@ +/datum/action/swap_arts + name = "Remember the Basics" //this is dynamic, uses `update_button_name` + desc = "LMB: See your movelist. RMB: Swap artstyle, if you have more than one." + background_icon_state = "bg_martial_arts" + button_icon_state = "martial" + + ///The martial arts currently used for the name & help information. + var/datum/martial_art/current_used_art + +/datum/action/swap_arts/Destroy() + current_used_art = null + return ..() + +/datum/action/swap_arts/New(Target, datum/martial_art/starting_style) + current_used_art = starting_style + return ..() + +/datum/action/swap_arts/update_button_name(atom/movable/screen/movable/action_button/button, force, datum/martial_art/new_art) + if(new_art) + current_used_art = new_art + name = "[current_used_art.help_verb]" + var/mob/living/living_owner = owner + if(LAZYLEN(living_owner.martial_arts) >= 2) + name += "/Swap Style" + return ..() + +/datum/action/swap_arts/Trigger(mob/living/clicker, trigger_flags) + . = ..() + var/mob/living/living_owner = owner + if(trigger_flags & TRIGGER_SECONDARY_ACTION && (LAZYLEN(living_owner.martial_arts) >= 2)) + clicker.cycle_style() + return TRUE + var/help_information = current_used_art.get_style_help() + if(isnull(help_information)) + to_chat(clicker, span_notice("[current_used_art.name] doesn't have any combat information!")) + return TRUE + for(var/info in help_information) + to_chat(clicker, info) + return TRUE diff --git a/code/datums/martial/_martial.dm b/code/datums/martial/_martial.dm index 1281d028b22..53dbaae321d 100644 --- a/code/datums/martial/_martial.dm +++ b/code/datums/martial/_martial.dm @@ -19,7 +19,7 @@ VAR_PRIVATE/datum/weakref/current_target /// Path to verb to display help text for this martial art. - var/help_verb + var/help_verb = "Remember the Basics" /// If TRUE, this martial art smashes tables when performing table slams and head smashes var/smashes_tables = FALSE /// If TRUE, a combo meter will be displayed on the HUD for the current streak @@ -327,9 +327,11 @@ LAZYINSERT(new_holder.martial_arts, 2, src) else LAZYADD(new_holder.martial_arts, src) + + if(LAZYLEN(new_holder.martial_arts) == 1 ? get_style_help() : !(locate(/datum/action/swap_arts) in new_holder.actions)) + var/datum/action/swap_arts/new_action = new(new_holder, src) + new_action.Grant(new_holder) if(LAZYLEN(new_holder.martial_arts) >= 2) - // newly learned martials are preferred to be the active one - add_verb(new_holder, /mob/living/proc/verb_switch_style) // if the active one is locked, this will no-op, which is fine new_holder.switch_style(GET_ACTIVE_MARTIAL_ART(new_holder), src) else if(!active) @@ -369,8 +371,9 @@ UnregisterSignal(old_holder, COMSIG_QDELETING) LAZYREMOVE(old_holder.martial_arts, src) holder = null - if(LAZYLEN(old_holder.martial_arts) <= 1) - remove_verb(old_holder, /mob/living/proc/verb_switch_style) + if(LAZYLEN(old_holder.martial_arts) < 1) //no more arts, we check above to switch style already. + var/datum/action/swap_arts/swap_button = locate() in old_holder.actions + qdel(swap_button) return TRUE /** @@ -379,8 +382,6 @@ /datum/martial_art/proc/activate_style(mob/living/new_holder) SHOULD_CALL_PARENT(TRUE) active = TRUE - if(help_verb) - add_verb(new_holder, help_verb) RegisterSignal(new_holder, COMSIG_LIVING_UNARMED_ATTACK, PROC_REF(unarmed_strike)) RegisterSignal(new_holder, COMSIG_LIVING_GRAB, PROC_REF(attempt_grab)) RegisterSignals(new_holder, list(COMSIG_LIVING_TABLE_SLAMMING, COMSIG_LIVING_TABLE_LIMB_SLAMMING), PROC_REF(smash_table)) @@ -395,8 +396,6 @@ /datum/martial_art/proc/deactivate_style(mob/living/remove_from) SHOULD_CALL_PARENT(TRUE) active = FALSE - if(help_verb) - remove_verb(remove_from, help_verb) UnregisterSignal(remove_from, list(COMSIG_LIVING_UNARMED_ATTACK, COMSIG_LIVING_GRAB, COMSIG_LIVING_TABLE_SLAMMING, COMSIG_LIVING_TABLE_LIMB_SLAMMING)) remove_from.hud_used?.remove_screen_object(HUD_MOB_COMBO) @@ -405,11 +404,7 @@ SIGNAL_HANDLER source.hud_used.add_screen_object(/atom/movable/screen/combo, HUD_MOB_COMBO, HUD_GROUP_INFO, update_screen = TRUE) -/mob/living/proc/verb_switch_style() - set name = "Swap Style" - set desc = "Switch to a different martial arts style." - set category = "IC" - +/mob/living/proc/cycle_style() var/datum/martial_art/current = GET_ACTIVE_MARTIAL_ART(src) var/datum/martial_art/next = GET_NEXT_MARTIAL_ART(src) @@ -417,7 +412,7 @@ to_chat(src, span_warning("You can't stop practicing [current]! It's too ingrained in your muscle memory.")) return - switch_style(GET_ACTIVE_MARTIAL_ART(src), GET_NEXT_MARTIAL_ART(src)) + switch_style(current, next) to_chat(src, span_notice("You stop practicing [current] and start practicing [next].")) /// Deactivates the current martial art and activates the next one. @@ -428,6 +423,9 @@ if(!current_martial.active || next_martial.active) return + var/datum/action/swap_arts/swap_button = locate() in actions + swap_button.current_used_art = next_martial + current_martial.deactivate_style(src) next_martial.activate_style(src) // front of the list with ye @@ -436,3 +434,7 @@ // back of the list with ye LAZYREMOVE(martial_arts, current_martial) LAZYADD(martial_arts, current_martial) + +///To be overwritten for artstyle help. +/datum/martial_art/proc/get_style_help() + return FALSE diff --git a/code/datums/martial/boxing.dm b/code/datums/martial/boxing.dm index 6318b34c4b7..2dc52641649 100644 --- a/code/datums/martial/boxing.dm +++ b/code/datums/martial/boxing.dm @@ -17,7 +17,7 @@ name = "Boxing" id = MARTIALART_BOXING pacifist_style = TRUE - help_verb = /mob/living/proc/boxing_help + help_verb = "Focus on your Form" /// Boolean on whether we are sportsmanlike in our tussling; TRUE means we have restrictions var/honorable_boxer = TRUE /// Can we perform grabs even if it would be dishonorable? @@ -379,22 +379,20 @@ return FALSE return ..() -/mob/living/proc/boxing_help() - set name = "Focus on your Form" - set desc = "You focus on how to make the most of your boxing form." - set category = "Boxing" - to_chat(usr, "You focus on your form, visualizing how best to throw a punch.") +/datum/martial_art/boxing/get_style_help() + . = list() - to_chat(usr, "What moves you perform depend on what mouse buttons you click, and whether the last button clicked matches which hand you have selected when you throw the last punch.") + . += "You focus on your form, visualizing how best to throw a punch." + . += "What moves you perform depend on what mouse buttons you click, and whether the last button clicked matches which hand you have selected when you throw the last punch." - to_chat(usr, "[span_notice("Straight Punch")]: Left Left/Right Right with the matching hand. Regular damage.") - to_chat(usr, "[span_notice("Jab")]: Left Left/Right Right with the opposite hand. Regular damage. If you're blind, you'll make a blind jab instead.") - to_chat(usr, "[span_notice("Left/Right Hook")]: Left Right/Right Left with the matching hand. Does extra damage, but slows your next hit.") - to_chat(usr, "[span_notice("Uppercut")]: Left Right/Right Left with the opposite hand. Has a higher probability to knock out the target, but slows your next hit.") + . += "[span_notice("Straight Punch")]: Left Left/Right Right with the matching hand. Regular damage." + . += "[span_notice("Jab")]: Left Left/Right Right with the opposite hand. Regular damage. If you're blind, you'll make a blind jab instead." + . += "[span_notice("Left/Right Hook")]: Left Right/Right Left with the matching hand. Does extra damage, but slows your next hit." + . += "[span_notice("Uppercut")]: Left Right/Right Left with the opposite hand. Has a higher probability to knock out the target, but slows your next hit." - to_chat(usr, "While in Throw Mode, you can block incoming punches and return a bit of damage back to an attacker. Blocking attacks this way causes you to lose some stamina damage.") - - to_chat(usr, "Your boxing abilities are only able to be used on other boxers.") + . += "While in Throw Mode, you can block incoming punches and return a bit of damage back to an attacker. Blocking attacks this way causes you to lose some stamina damage." + . += "Your boxing abilities are only able to be used on other boxers." + return . // Boxing Variants! @@ -405,25 +403,24 @@ name = "Evil Boxing" id = MARTIALART_EVIL_BOXING pacifist_style = FALSE - help_verb = /mob/living/proc/evil_boxing_help + help_verb = "Focus on Brawling" honorable_boxer = FALSE boxing_traits = list(TRAIT_BOXING_READY, TRAIT_STRENGTH, TRAIT_STIMMED) -/mob/living/proc/evil_boxing_help() - set name = "Focus on Brawling" - set desc = "You ponder how best to rearrange the faces of your enemies." - set category = "Evil Boxing" - to_chat(usr, "You contemplate on the violence ahead, visualizing how best to throw a punch.") +/datum/martial_art/boxing/evil/get_style_help() + . = list() - to_chat(usr, "What moves you perform depend on what mouse buttons you click, and whether the last button clicked matches which hand you have selected when you throw the last punch.") + . += "You contemplate on the violence ahead, visualizing how best to throw a punch." + . += "What moves you perform depend on what mouse buttons you click, and whether the last button clicked matches which hand you have selected when you throw the last punch." - to_chat(usr, "[span_notice("Straight Punch")]: Left Left/Right Right with the matching hand. Regular damage.") - to_chat(usr, "[span_notice("Jab")]: Left Left/Right Right with the opposite hand. Regular damage. If you're blind, you'll make a blind jab instead.") - to_chat(usr, "[span_notice("Left/Right Hook")]: Left Right/Right Left with the matching hand. Does extra damage, but slows your next hit.") - to_chat(usr, "[span_notice("Uppercut")]: Left Right/Right Left with the opposite hand. Has a higher probability to knock out the target, but slows your next hit.") - to_chat(usr, "[span_notice("Sucker Punch")]: Any combination done to a vulnerable target becomes a sucker punch. This could knock them out in one!.") + . += "[span_notice("Straight Punch")]: Left Left/Right Right with the matching hand. Regular damage." + . += "[span_notice("Jab")]: Left Left/Right Right with the opposite hand. Regular damage. If you're blind, you'll make a blind jab instead." + . += "[span_notice("Left/Right Hook")]: Left Right/Right Left with the matching hand. Does extra damage, but slows your next hit." + . += "[span_notice("Uppercut")]: Left Right/Right Left with the opposite hand. Has a higher probability to knock out the target, but slows your next hit." + . += "[span_notice("Sucker Punch")]: Any combination done to a vulnerable target becomes a sucker punch. This could knock them out in one!." - to_chat(usr, "While in Throw Mode, you can block incoming punches and return a bit of damage back to an attacker. Blocking attacks this way causes you to lose some stamina damage.") + . += "While in Throw Mode, you can block incoming punches and return a bit of damage back to an attacker. Blocking attacks this way causes you to lose some stamina damage." + return . /// Hunter Boxing: for the uncaring, completely deranged one-spacer ecological disaster. /// The honor check accepts boxing ready targets, OR various biotypes as valid targets. Uses a special crit effect rather than the standard one (against monsters). @@ -432,7 +429,7 @@ name = "Hunter Boxing" id = MARTIALART_HUNTER_BOXING pacifist_style = FALSE - help_verb = /mob/living/proc/hunter_boxing_help + help_verb = "Focus on the Hunt" default_damage_type = BRUTE boxing_traits = list(TRAIT_BOXING_READY) ignore_grab_restriction = TRUE @@ -442,23 +439,22 @@ var/list/first_word_strike = list("Extinction", "Brutalization", "Explosion", "Adventure", "Thunder", "Lightning", "Sonic", "Atomizing", "Whirlwind", "Tornado", "Shark", "Falcon") var/list/second_word_strike = list(" Punch", " Pawnch", "-punch", " Jab", " Hook", " Fist", " Uppercut", " Straight", " Strike", " Lunge") -/mob/living/proc/hunter_boxing_help() - set name = "Focus on the Hunt" - set desc = "You focus on how to most effectively punch the hell out of another endangered species." - set category = "Hunter Boxing" - to_chat(usr, "You focus on your Fists. You focus on Adventure. You focus on the Hunt.") +/datum/martial_art/boxing/hunter/get_style_help() + . = list() - to_chat(usr, "What moves you perform depend on what mouse buttons you click, and whether the last button clicked matches which hand you have selected when you throw the last punch.") + . += "You focus on your Fists. You focus on Adventure. You focus on the Hunt." + . += "What moves you perform depend on what mouse buttons you click, and whether the last button clicked matches which hand you have selected when you throw the last punch." - to_chat(usr, "[span_notice("Straight Punch")]: Left Left/Right Right with the matching hand. Regular damage.") - to_chat(usr, "[span_notice("Jab")]: Left Left/Right Right with the opposite hand. Regular damage. If you're blind, you'll make a blind jab instead.") - to_chat(usr, "[span_notice("Left/Right Hook")]: Left Right/Right Left with the matching hand. Does extra damage, but slows your next hit.") - to_chat(usr, "[span_notice("Uppercut")]: Left Right/Right Left with the opposite hand. Has a higher probability to critically hit the target, but slows your next hit.") + . += "[span_notice("Straight Punch")]: Left Left/Right Right with the matching hand. Regular damage." + . += "[span_notice("Jab")]: Left Left/Right Right with the opposite hand. Regular damage. If you're blind, you'll make a blind jab instead." + . += "[span_notice("Left/Right Hook")]: Left Right/Right Left with the matching hand. Does extra damage, but slows your next hit." + . += "[span_notice("Uppercut")]: Left Right/Right Left with the opposite hand. Has a higher probability to critically hit the target, but slows your next hit." - to_chat(usr, "While in Throw Mode, you can block incoming punches and return a bit of damage back to an attacker. Blocking attacks this way causes you to lose some stamina damage.") - to_chat(usr, "Stringing together effective combos restores some of your health and deals even more damage.") + . += "While in Throw Mode, you can block incoming punches and return a bit of damage back to an attacker. Blocking attacks this way causes you to lose some stamina damage." + . += "Stringing together effective combos restores some of your health and deals even more damage." - to_chat(usr, "Your hunter boxing abilities are only able to be used on the various flora, fauna and unnatural creatures that reside in this universe. Against normal humanoids, you are just a boxer.") + . += "Your hunter boxing abilities are only able to be used on the various flora, fauna and unnatural creatures that reside in this universe. Against normal humanoids, you are just a boxer." + return . /datum/martial_art/boxing/hunter/honor_check(mob/living/possible_boxer) if(HAS_TRAIT(possible_boxer, TRAIT_BOXING_READY)) diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm index 0e7ba1a5aae..46993c93e02 100644 --- a/code/datums/martial/cqc.dm +++ b/code/datums/martial/cqc.dm @@ -7,7 +7,7 @@ /datum/martial_art/cqc name = "CQC" id = MARTIALART_CQC - help_verb = /mob/living/proc/CQC_help + help_verb = "Remember The Basics" smashes_tables = TRUE display_combos = TRUE /// Weakref to a mob we're currently restraining (with grab-grab combo) @@ -377,19 +377,19 @@ return MARTIAL_ATTACK_FAIL -/mob/living/proc/CQC_help() - set name = "Remember The Basics" - set desc = "You try to remember some of the basics of CQC." - set category = "CQC" - to_chat(usr, "You try to remember some of the basics of CQC.") +/datum/martial_art/cqc/get_style_help() + . = list() - to_chat(usr, "[span_notice("Slam")]: Grab Punch. Slam opponent into the ground, knocking them down.") - to_chat(usr, "[span_notice("CQC Kick")]: Punch Punch. Knocks opponent away. Knocks out stunned opponents and does stamina damage.") - to_chat(usr, "[span_notice("Restrain")]: Grab Grab. Locks opponents into a restraining position, disarm to knock them out with a chokehold.") - to_chat(usr, "[span_notice("Pressure")]: Shove Grab. Decent stamina damage.") - to_chat(usr, "[span_notice("Consecutive CQC")]: Shove Shove Punch. Mainly offensive move, huge damage and decent stamina damage.") + . += "You try to remember some of the basics of CQC." - to_chat(usr, "In addition, by having your throw mode on when being attacked, you enter an active defense mode where you have a chance to block and sometimes even counter attacks done to you.") + . += "[span_notice("Slam")]: Grab Punch. Slam opponent into the ground, knocking them down." + . += "[span_notice("CQC Kick")]: Punch Punch. Knocks opponent away. Knocks out stunned opponents and does stamina damage." + . += "[span_notice("Restrain")]: Grab Grab. Locks opponents into a restraining position, disarm to knock them out with a chokehold." + . += "[span_notice("Pressure")]: Shove Grab. Decent stamina damage." + . += "[span_notice("Consecutive CQC")]: Shove Shove Punch. Mainly offensive move, huge damage and decent stamina damage." + + . += "In addition, by having your throw mode on when being attacked, you enter an active defense mode where you have a chance to block and sometimes even counter attacks done to you." + return . ///Subtype of CQC. Only used for the chef. /datum/martial_art/cqc/under_siege diff --git a/code/datums/martial/plasma_fist.dm b/code/datums/martial/plasma_fist.dm index 2a959789529..eb8357abdc6 100644 --- a/code/datums/martial/plasma_fist.dm +++ b/code/datums/martial/plasma_fist.dm @@ -5,7 +5,7 @@ /datum/martial_art/plasma_fist name = "Plasma Fist" id = MARTIALART_PLASMAFIST - help_verb = /mob/living/proc/plasma_fist_help + help_verb = "Recall Teachings" var/nobomb = FALSE var/plasma_power = 1 //starts at a 1, 2, 4 explosion. var/plasma_increment = 1 //how much explosion power gets added per kill (1 = 1, 2, 4. 2 = 2, 4, 8 and so on) @@ -162,18 +162,17 @@ add_to_streak("G", defender) return check_streak(attacker, defender) ? MARTIAL_ATTACK_SUCCESS : MARTIAL_ATTACK_INVALID -/mob/living/proc/plasma_fist_help() - set name = "Recall Teachings" - set desc = "Remember the martial techniques of the Plasma Fist." - set category = "Plasma Fist" +/datum/martial_art/plasma_fist/get_style_help() + . = list() - var/datum/martial_art/plasma_fist/martial = GET_ACTIVE_MARTIAL_ART(src) - to_chat(usr, "You clench your fists and have a flashback of knowledge...") - to_chat(usr, "[span_notice("Tornado Sweep")]: Punch Punch Shove. Repulses opponent and everyone back.") - to_chat(usr, "[span_notice("Throwback")]: Shove Punch Shove. Throws the opponent and an item at them.") - to_chat(usr, "[span_notice("The Plasma Fist")]: Punch Shove Shove Shove Punch. Instantly gibs an opponent.[martial.nobomb ? "" : " Each kill with this grows your [span_notice("Apotheosis")] explosion size."]") + var/datum/martial_art/plasma_fist/martial = GET_ACTIVE_MARTIAL_ART(holder) + . += "You clench your fists and have a flashback of knowledge..." + . += "[span_notice("Tornado Sweep")]: Punch Punch Shove. Repulses opponent and everyone back." + . += "[span_notice("Throwback")]: Shove Punch Shove. Throws the opponent and an item at them." + . += "[span_notice("The Plasma Fist")]: Punch Shove Shove Shove Punch. Instantly gibs an opponent.[martial.nobomb ? "" : " Each kill with this grows your [span_notice("Apotheosis")] explosion size."]" if(!martial.nobomb) - to_chat(usr, "[span_notice("Apotheosis")]: Use [span_notice("The Plasma Fist")] on yourself. Sends you away in a glorious explosion.") + . += "[span_notice("Apotheosis")]: Use [span_notice("The Plasma Fist")] on yourself. Sends you away in a glorious explosion." + return . /obj/effect/temp_visual/plasma_soul diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm index b1cb83c8846..589a6975f20 100644 --- a/code/datums/martial/sleeping_carp.dm +++ b/code/datums/martial/sleeping_carp.dm @@ -6,7 +6,7 @@ /datum/martial_art/the_sleeping_carp name = "The Sleeping Carp" id = MARTIALART_SLEEPINGCARP - help_verb = /mob/living/proc/sleeping_carp_help + help_verb = "Recall Teachings" display_combos = TRUE grab_state_modifier = 1 /// List of traits applied to users of this martial art. @@ -374,24 +374,23 @@ return style_factor_points /// Verb added to humans who learn the art of the sleeping carp. -/mob/living/proc/sleeping_carp_help() - set name = "Recall Teachings" - set desc = "Remember the martial techniques of the Sleeping Carp clan." - set category = "Sleeping Carp" +/datum/martial_art/the_sleeping_carp/get_style_help() + . = list() - to_chat(usr, span_info("You retreat inward and recall the teachings of the Sleeping Carp...\n\ - [span_notice("Gnashing Teeth")]: Punch Grab. Violently twists your opponent's arm, dislocating or even shattering bone and forcing them to drop their held items.\n\ - [span_notice("Crashing Wave Kick")]: Punch Shove. Launch your opponent away from you with incredible force!\n\ - [span_notice("Keelhaul")]: Shove Shove. Nonlethally kick an opponent to the floor, knocking them down, discombobulating them and dealing substantial stamina damage. If they're already prone, disarm them as well.\n\ - [span_notice("Kraken Wrack")]: Grab Punch. Deliver a knee jab into the opponent, dealing high stamina damage, as well as briefly stunning them, winding them and making it difficult for them to speak.\n\ - [span_notice("Grabs and Shoves")]: While in combat mode, your typical grab and shove do decent stamina damage, and your grabs harder to break. If you grab someone who has substantial amounts of stamina damage, you knock them out!\n\ - While in combat mode (and not stunned, not a hulk, and not in a mech), you can reflect all projectiles that come your way, sending them back at the people who fired them! \n\ - However, your ability to avoid projectiles is negatively affected when your are burdened by armor, or whenever you are carrying normal-sized or heavier objects in your hands. \n\ - But if you commmit fully to the martial arts lifestyle by wearing martial arts or carp-related regalia, you will feel empowered enough to potentially avoid attacks even from melee weapons or other unarmed combatants. \n\ - Some melee weapons, such as bo starves, spears, short blades, knives, toolboxes, baseball bats and non-blocking small objects are safe to carry without affecting your ability to defend yourself. Exploit this for a tactical advantage. \n\ - Also, you are more resilient against suffering wounds in combat, and your limbs cannot be dismembered. This grants you extra staying power during extended combat, especially against slashing and other bleeding weapons. \n\ - You are not invincible, however- while you may not suffer debilitating wounds often, you must still watch your health and should have appropriate medical supplies for use during downtime. \n\ - In addition, your training has imbued you with a loathing of guns, and you can no longer use them.")) + . += span_info("You retreat inward and recall the teachings of the Sleeping Carp...\n\ + [span_notice("Gnashing Teeth")]: Punch Grab. Violently twists your opponent's arm, dislocating or even shattering bone and forcing them to drop their held items.\n\ + [span_notice("Crashing Wave Kick")]: Punch Shove. Launch your opponent away from you with incredible force!\n\ + [span_notice("Keelhaul")]: Shove Shove. Nonlethally kick an opponent to the floor, knocking them down, discombobulating them and dealing substantial stamina damage. If they're already prone, disarm them as well.\n\ + [span_notice("Kraken Wrack")]: Grab Punch. Deliver a knee jab into the opponent, dealing high stamina damage, as well as briefly stunning them, winding them and making it difficult for them to speak.\n\ + [span_notice("Grabs and Shoves")]: While in combat mode, your typical grab and shove do decent stamina damage, and your grabs harder to break. If you grab someone who has substantial amounts of stamina damage, you knock them out!\n\ + While in combat mode (and not stunned, not a hulk, and not in a mech), you can reflect all projectiles that come your way, sending them back at the people who fired them! \n\ + However, your ability to avoid projectiles is negatively affected when your are burdened by armor, or whenever you are carrying normal-sized or heavier objects in your hands. \n\ + But if you commmit fully to the martial arts lifestyle by wearing martial arts or carp-related regalia, you will feel empowered enough to potentially avoid attacks even from melee weapons or other unarmed combatants. \n\ + Some melee weapons, such as bo starves, spears, short blades, knives, toolboxes, baseball bats and non-blocking small objects are safe to carry without affecting your ability to defend yourself. Exploit this for a tactical advantage. \n\ + Also, you are more resilient against suffering wounds in combat, and your limbs cannot be dismembered. This grants you extra staying power during extended combat, especially against slashing and other bleeding weapons. \n\ + You are not invincible, however- while you may not suffer debilitating wounds often, you must still watch your health and should have appropriate medical supplies for use during downtime. \n\ + In addition, your training has imbued you with a loathing of guns, and you can no longer use them.") + return . /obj/item/staff/bostaff name = "bo staff" diff --git a/code/datums/martial/spiders_bite.dm b/code/datums/martial/spiders_bite.dm index 3ace8bdcb1a..a5d6ddaa369 100644 --- a/code/datums/martial/spiders_bite.dm +++ b/code/datums/martial/spiders_bite.dm @@ -1,7 +1,7 @@ /datum/martial_art/spiders_bite name = "Spider's Bite" id = MARTIALART_SPIDERSBITE - help_verb = /mob/living/proc/spiders_bite_help + help_verb = "Recall Teachings" grab_damage_modifier = 10 grab_escape_chance_modifier = -20 /// REF() to the last mob we kicked @@ -60,13 +60,12 @@ return IS_LEFT_INDEX(martial_artist.active_hand_index) ? BODY_ZONE_L_LEG : BODY_ZONE_R_LEG -/mob/living/proc/spiders_bite_help() - set name = "Recall Teachings" - set desc = "Remember the Spider Bite technique used by the Spider Clan." - set category = "Spider's Bite" +/datum/martial_art/spiders_bite/get_style_help() + . = list() - to_chat(usr, span_info("You retreat inward and recall the Spider Clan's techniques...\n\ + . += span_info("You retreat inward and recall the Spider Clan's techniques...\n\ • Remember, Many Legged Spider: Unarmed attacks against staggered opponents will always be kicks - granting you greater accuracy and damage.\n\ • Remember, Jump and Climb: Right clicking on throw mode will perform a tackle which is far far less likely to fail.\n\ • Remember, Flow of Gravity: Kicking opponents will have a chance to knock their weapons to the floor. The chance increases for each sequential kick.\n\ - • Remember, Wrap in Web: Your grabs will be harder to escape from.")) + • Remember, Wrap in Web: Your grabs will be harder to escape from.") + return . diff --git a/code/modules/antagonists/changeling/powers/absorb.dm b/code/modules/antagonists/changeling/powers/absorb.dm index 3e34de497fe..ec28fc2866f 100644 --- a/code/modules/antagonists/changeling/powers/absorb.dm +++ b/code/modules/antagonists/changeling/powers/absorb.dm @@ -216,11 +216,7 @@ if(href_list["exit_hivemind"] && !QDELETED(src)) exit_hivemind() -/mob/eye/imaginary_friend/hivemind/verb/exit_hivemind() - set category = "IC" - set name = "Exit Hivemind" - set desc = "Leave the hivemind behind and enter the land of the dead." - +/mob/eye/imaginary_friend/hivemind/proc/exit_hivemind() var/response = tgui_alert(src, "Are you sure you want to exit the hivemind? \ You can't re-enter it, though you can still be revived.", "Confirm Exit", list("Exit", "Stay")) if(response != "Exit" || QDELETED(src)) diff --git a/code/modules/mining/lavaland/mining_loot/megafauna/colossus.dm b/code/modules/mining/lavaland/mining_loot/megafauna/colossus.dm index a5c24eabb95..f130cd891e5 100644 --- a/code/modules/mining/lavaland/mining_loot/megafauna/colossus.dm +++ b/code/modules/mining/lavaland/mining_loot/megafauna/colossus.dm @@ -383,7 +383,6 @@ possessor.mind.transfer_to(holder_animal) var/datum/action/exit_possession/escape = new(holder_animal) escape.Grant(holder_animal) - remove_verb(holder_animal, /mob/living/verb/pulled) /obj/structure/closet/stasis/dump_contents(kill = TRUE) for(var/mob/living/possessor in src) diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 4a6c6a3585c..7e038a23688 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -343,13 +343,11 @@ */ /mob/dead/new_player/proc/register_for_interview() // First we detain them by removing all the verbs they have on client - for (var/v in client.verbs) - var/procpath/verb_path = v + for (var/procpath/verb_path as anything in client.verbs) remove_verb(client, verb_path) // Then remove those on their mob as well - for (var/v in verbs) - var/procpath/verb_path = v + for (var/procpath/verb_path as anything in verbs) remove_verb(src, verb_path) // Then we create the interview form and show it to the client diff --git a/code/modules/mob/dead/observer/observer_movement.dm b/code/modules/mob/dead/observer/observer_movement.dm index 6972d3b265f..cfe505fb0f7 100644 --- a/code/modules/mob/dead/observer/observer_movement.dm +++ b/code/modules/mob/dead/observer/observer_movement.dm @@ -1,14 +1,8 @@ /mob/dead/observer/down() - set name = "Move Down" - set category = "IC" - if(zMove(DOWN, z_move_flags = ZMOVE_FEEDBACK)) to_chat(src, span_notice("You move down.")) /mob/dead/observer/up() - set name = "Move Upwards" - set category = "IC" - if(zMove(UP, z_move_flags = ZMOVE_FEEDBACK)) to_chat(src, span_notice("You move upwards.")) diff --git a/code/modules/mob/eye/eye.dm b/code/modules/mob/eye/eye.dm index fb3c2a4fab7..2b79ab2a19c 100644 --- a/code/modules/mob/eye/eye.dm +++ b/code/modules/mob/eye/eye.dm @@ -27,16 +27,10 @@ return FALSE /mob/eye/up() - set name = "Move Upwards" - set category = "IC" - if(zMove(UP, z_move_flags = ZMOVE_FEEDBACK)) to_chat(src, span_notice("You move upwards.")) /mob/eye/down() - set name = "Move Down" - set category = "IC" - if(zMove(DOWN, z_move_flags = ZMOVE_FEEDBACK)) to_chat(src, span_notice("You move down.")) diff --git a/code/modules/mob/living/basic/blob_minions/blob_mob.dm b/code/modules/mob/living/basic/blob_minions/blob_mob.dm index 8d24dccd7df..ef7184d09ac 100644 --- a/code/modules/mob/living/basic/blob_minions/blob_mob.dm +++ b/code/modules/mob/living/basic/blob_minions/blob_mob.dm @@ -21,6 +21,7 @@ initial_language_holder = /datum/language_holder/empty can_buckle_to = FALSE damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, STAMINA = 0, OXY = 1) + pull_force = 0 /// Size of cloud produced from a dying spore var/death_cloud_size = BLOBMOB_CLOUD_NONE var/loot = /obj/item/food/spore_sack diff --git a/code/modules/mob/living/basic/space_fauna/lightgeist.dm b/code/modules/mob/living/basic/space_fauna/lightgeist.dm index 36ae135619c..50d59efbf2a 100644 --- a/code/modules/mob/living/basic/space_fauna/lightgeist.dm +++ b/code/modules/mob/living/basic/space_fauna/lightgeist.dm @@ -41,18 +41,14 @@ minimum_survivable_temperature = 0 maximum_survivable_temperature = 1500 obj_damage = 0 + pull_force = 0 environment_smash = ENVIRONMENT_SMASH_NONE ai_controller = /datum/ai_controller/basic_controller/lightgeist /mob/living/basic/lightgeist/Initialize(mapload) . = ..() - ADD_TRAIT(src, TRAIT_VENTCRAWLER_ALWAYS, INNATE_TRAIT) - ADD_TRAIT(src, TRAIT_MEDICAL_HUD, INNATE_TRAIT) - - remove_verb(src, /mob/living/verb/pulled) - remove_verb(src, /mob/verb/me_verb) - + add_traits(list(TRAIT_VENTCRAWLER_ALWAYS, TRAIT_MEDICAL_HUD, TRAIT_EMOTEMUTE), INNATE_TRAIT) AddElement(/datum/element/simple_flying) AddComponent(\ /datum/component/healing_touch,\ diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 286d074cf34..17c77733e22 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -13,6 +13,8 @@ var/datum/atom_hud/data/diagnostic/diag_hud = GLOB.huds[DATA_HUD_DIAGNOSTIC] diag_hud.add_atom_to_hud(src) add_ally(src) + if(!pull_force) + remove_verb(src, /mob/living/verb/pulled) GLOB.mob_living_list += src SSpoints_of_interest.make_point_of_interest(src) update_fov() @@ -512,14 +514,11 @@ //mob verbs are a lot faster than object verbs //for more info on why this is not atom/pull, see examinate() in mob.dm -/mob/living/verb/pulled(atom/movable/AM as mob|obj in oview(1)) +/mob/living/verb/pulled(atom/movable/thing_pulled as mob|obj in oview(1)) set name = "Pull" - set category = "IC" - if(istype(AM) && Adjacent(AM)) - start_pulling(AM) - else if(!combat_mode) //Don;'t cancel pulls if misclicking in combat mode. - stop_pulling() + if(istype(thing_pulled) && Adjacent(thing_pulled)) + start_pulling(thing_pulled) /mob/living/stop_pulling() if(ismob(pulling)) @@ -528,11 +527,6 @@ update_pull_movespeed() update_pull_hud_icon() -/mob/living/verb/stop_pulling1() - set name = "Stop Pulling" - set category = "IC" - stop_pulling() - //same as above /mob/living/pointed(atom/A) if(INCAPACITATED_IGNORING(src, INCAPABLE_RESTRAINTS)) @@ -607,7 +601,7 @@ /mob/living/proc/mob_sleep() set name = "Sleep" - set category = "IC" + set hidden = TRUE if(IsSleeping()) to_chat(src, span_warning("You are already sleeping!")) @@ -662,9 +656,6 @@ return account /mob/living/proc/toggle_resting() - set name = "Rest" - set category = "IC" - set_resting(!resting, FALSE) @@ -1134,10 +1125,7 @@ return FALSE return TRUE -/mob/living/verb/resist() - set name = "Resist" - set category = "IC" - +/mob/living/proc/resist() DEFAULT_QUEUE_OR_CALL_VERB(VERB_CALLBACK(src, PROC_REF(execute_resist))) ///proc extender of [/mob/living/verb/resist] meant to make the process queable if the server is overloaded when the verb is called @@ -2104,6 +2092,13 @@ GLOBAL_LIST_EMPTY(fire_appearances) return FALSE update_transform(var_value/current_size) . = TRUE + if(NAMEOF(src, pull_force)) + if(var_value == 0) //no more pulling + remove_verb(src, /mob/living/verb/pulled) + else + add_verb(src, /mob/living/verb/pulled) + . = TRUE + if(!isnull(.)) datum_flags |= DF_VAR_EDITED @@ -2941,10 +2936,7 @@ GLOBAL_LIST_EMPTY(fire_appearances) log_admin("[key_name(admin)] gave a guardian spirit controlled by [guardian_client] to [src].") BLACKBOX_LOG_ADMIN_VERB("Give Guardian Spirit") -/mob/living/verb/lookup() - set name = "Look Up" - set category = "IC" - +/mob/living/proc/lookup() if(looking_vertically) to_chat(src, "You set your head straight again.") end_look() @@ -2961,10 +2953,7 @@ GLOBAL_LIST_EMPTY(fire_appearances) to_chat(src, "You tilt your head upwards.") look_up() -/mob/living/verb/lookdown() - set name = "Look Down" - set category = "IC" - +/mob/living/proc/lookdown() if(looking_vertically) to_chat(src, "You set your head straight again.") end_look() diff --git a/code/modules/mob/living/navigation.dm b/code/modules/mob/living/navigation.dm index dcaee5b0945..c63b4594b65 100644 --- a/code/modules/mob/living/navigation.dm +++ b/code/modules/mob/living/navigation.dm @@ -10,7 +10,7 @@ /mob/living/verb/navigate() set name = "Navigate" - set category = "IC" + set hidden = TRUE if(incapacitated) return diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 86315686aac..63d59db1a53 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -1083,16 +1083,10 @@ end_multicam() /mob/living/silicon/ai/up() - set name = "Move Upwards" - set category = "IC" - if(eyeobj.zMove(UP, z_move_flags = ZMOVE_FEEDBACK)) to_chat(src, span_notice("You move upwards.")) /mob/living/silicon/ai/down() - set name = "Move Down" - set category = "IC" - if(eyeobj.zMove(DOWN, z_move_flags = ZMOVE_FEEDBACK)) to_chat(src, span_notice("You move down.")) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index d8285681d95..4cbaa4ae6b0 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -782,11 +782,7 @@ * * Calls attack self on the item and updates the inventory hud for hands */ -/mob/verb/mode() - set name = "Activate Held Object" - set category = "IC" - set src = usr - +/mob/proc/mode() DEFAULT_QUEUE_OR_CALL_VERB(VERB_CALLBACK(src, PROC_REF(execute_mode))) ///proc version to finish /mob/verb/mode() execution. used in case the proc needs to be queued for the tick after its first called @@ -1462,13 +1458,6 @@ //Do not do parent's actions, as we *usually* do this differently. fully_replace_character_name(real_name, new_name) -///Show the language menu for this mob -/mob/verb/open_language_menu_verb() - set name = "Open Language Menu" - set category = "IC" - - get_language_holder().open_language_menu(usr) - ///Adjust the nutrition of a mob /mob/proc/adjust_nutrition(change, forced = FALSE) //Honestly FUCK the oldcoders for putting nutrition on /mob someone else can move it up because holy hell I'd have to fix SO many typechecks if(HAS_TRAIT(src, TRAIT_NOHUNGER) && !forced) @@ -1588,21 +1577,6 @@ clear_important_client_contents() canon_client = null -///Shows a tgui window with memories -/mob/verb/memory() - set name = "Memories" - set category = "IC" - set desc = "View your character's memories." - if(!mind) - var/fail_message = "You have no mind!" - if(isobserver(src)) - fail_message += " You have to be in the current round at some point to have one." - to_chat(src, span_warning(fail_message)) - return - if(!mind.memory_panel) - mind.memory_panel = new(usr, mind) - mind.memory_panel.ui_interact(usr) - ///Shows a tgui window with memories /mob/proc/open_memory_panel() if(!mind) @@ -1655,12 +1629,6 @@ data["memories"] = memories return data -/mob/verb/view_skills() - set category = "IC" - set name = "View Skills" - - mind?.print_levels(src) - /mob/key_down(key, client/client, full_key) ..() SEND_SIGNAL(src, COMSIG_MOB_KEYDOWN, key, client, full_key) diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 221964621a2..9d5bfd2a5b6 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -546,10 +546,7 @@ SEND_SIGNAL(src, COMSIG_MOVE_INTENT_TOGGLED) ///Moves a mob upwards in z level -/mob/verb/up() - set name = "Move Upwards" - set category = "IC" - +/mob/proc/up() if(remote_control) return remote_control.relaymove(src, UP) @@ -573,10 +570,7 @@ to_chat(src, span_notice("You move upwards.")) ///Moves a mob down a z level -/mob/verb/down() - set name = "Move Down" - set category = "IC" - +/mob/proc/down() if(remote_control) return remote_control.relaymove(src, DOWN) diff --git a/code/modules/unit_tests/resist.dm b/code/modules/unit_tests/resist.dm index 2fc64a02703..4e746e09aae 100644 --- a/code/modules/unit_tests/resist.dm +++ b/code/modules/unit_tests/resist.dm @@ -10,7 +10,7 @@ TEST_ASSERT_EQUAL(human.fire_stacks, 5, "Human does not have 5 fire stacks pre-resist") // Stop, drop, and roll has a sleep call. This would delay the test, and is not necessary. - call_async(human, /mob/living/verb/resist) + human.execute_resist() //since resist() is a verb that possibly queues its actual execution for the next tick, we need to make the subsystem that handles the delayed execution process //the callback. either that or sleep ourselves and see if it ran. diff --git a/icons/hud/actions.dmi b/icons/hud/actions.dmi index 071ba38f726..6d51cc55534 100644 Binary files a/icons/hud/actions.dmi and b/icons/hud/actions.dmi differ diff --git a/icons/mob/actions/backgrounds.dmi b/icons/mob/actions/backgrounds.dmi index ecbda704fe1..1256caf05b4 100644 Binary files a/icons/mob/actions/backgrounds.dmi and b/icons/mob/actions/backgrounds.dmi differ diff --git a/strings/tips.txt b/strings/tips.txt index d832de900b3..45942b20776 100644 --- a/strings/tips.txt +++ b/strings/tips.txt @@ -297,6 +297,7 @@ When hacking doors, cutting and mending a "test light wire" will restore power t When in doubt about technical issues, clear your cache (byond launcher > cogwheel > preferences > game prefs), update your BYOND, and relog. When placing floor tiles in space, you don't need to place down lattice if there is a piece of plating nearby. Where the space map levels connect is randomized every round, but are otherwise kept consistent within rounds. Remember that they are not necessarily bidirectional! +While the floor changer buttons allow you to move through vertical open space, you can also right-click it to look through open space and even glass floors without having to move! Working out improves your fitness which increases your size and faster times to fireman carry. Remember that a quality diet and sleep are essential! You can alt-click tank transfer valves to remove a tank from them. You can automatically extract and retract arm implants by 'activating' the empty hand they're on. This includes integrated toolsets, cursed katanas, and vorpal scythes. diff --git a/tgstation.dme b/tgstation.dme index 5a6c082f90d..4b491aeb074 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1817,6 +1817,7 @@ #include "code\datums\mapgen\biomes\lavaland.dm" #include "code\datums\mapgen\Cavegens\IcemoonCaves.dm" #include "code\datums\mapgen\Cavegens\LavalandGenerator.dm" +#include "code\datums\martial\_action.dm" #include "code\datums\martial\_martial.dm" #include "code\datums\martial\boxing.dm" #include "code\datums\martial\cqc.dm"