mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-19 06:03:14 +00:00
* Refactors projectile parrying and makes it actually possible. * [MIRROR] Refactors projectile parrying and makes it actually possible. [MDB IGNORE] (#3885) * Refactors projectile parrying and makes it actually possible. * Update debuffs.dm * Update projectile.dm * conflict * how'd that get there --------- Co-authored-by: SmArtKar <44720187+SmArtKar@users.noreply.github.com> Co-authored-by: SomeRandomOwl <2568378+SomeRandomOwl@users.noreply.github.com> Co-authored-by: Fluffles <piecopresident@gmail.com> --------- Co-authored-by: SmArtKar <44720187+SmArtKar@users.noreply.github.com> Co-authored-by: NovaBot <154629622+NovaBot13@users.noreply.github.com> Co-authored-by: SomeRandomOwl <2568378+SomeRandomOwl@users.noreply.github.com> Co-authored-by: Fluffles <piecopresident@gmail.com> Co-authored-by: SpaceLoveSs13 <68121607+SpaceLoveSs13@users.noreply.github.com>
143 lines
4.9 KiB
Plaintext
143 lines
4.9 KiB
Plaintext
/obj/item/style_meter
|
|
name = "style meter attachment"
|
|
desc = "Attach this to a pair of glasses to install a style meter system in them. \
|
|
You get style points from performing stylish acts and lose them for breaking your style. \
|
|
The style affects the quality of your mining, with you being able to mine ore better during a good chain. \
|
|
A responsive data HUD gives you the ability to reflect lavaland-based projectiles by punching them with an empty hand. \
|
|
In addition, at high style, you are able to swap an item in your hand with one in your backpack by <b>hitting</b> one with another."
|
|
icon_state = "style_meter"
|
|
icon = 'icons/obj/clothing/glasses.dmi'
|
|
/// The style meter component we give.
|
|
var/datum/component/style/style_meter
|
|
/// Mutable appearance added to the attached glasses
|
|
var/mutable_appearance/meter_appearance
|
|
/// If this is multitooled, which is passed onto the component on-creation, if one doesn't currently exist
|
|
var/multitooled = FALSE
|
|
|
|
/obj/item/style_meter/Initialize(mapload)
|
|
. = ..()
|
|
meter_appearance = mutable_appearance(icon, icon_state)
|
|
|
|
/obj/item/style_meter/Destroy(force)
|
|
if(istype(loc, /obj/item/clothing/glasses))
|
|
clean_up(loc)
|
|
return ..()
|
|
|
|
/obj/item/style_meter/examine(mob/user)
|
|
. = ..()
|
|
. += span_notice("You feel like a <b>multitool</b> could be used on this.")
|
|
|
|
/obj/item/style_meter/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers)
|
|
if(!istype(interacting_with, /obj/item/clothing/glasses))
|
|
return NONE
|
|
|
|
. = ITEM_INTERACT_SUCCESS
|
|
|
|
forceMove(interacting_with)
|
|
interacting_with.add_overlay(meter_appearance)
|
|
RegisterSignal(interacting_with, COMSIG_ITEM_EQUIPPED, PROC_REF(check_wearing))
|
|
RegisterSignal(interacting_with, COMSIG_ITEM_DROPPED, PROC_REF(on_drop))
|
|
RegisterSignal(interacting_with, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine))
|
|
RegisterSignal(interacting_with, COMSIG_CLICK_ALT, PROC_REF(on_click_alt))
|
|
RegisterSignal(interacting_with, COMSIG_ATOM_TOOL_ACT(TOOL_MULTITOOL), PROC_REF(redirect_multitool))
|
|
balloon_alert(user, "style meter attached")
|
|
playsound(src, 'sound/machines/click.ogg', 30, TRUE)
|
|
if(!iscarbon(interacting_with.loc))
|
|
return .
|
|
|
|
var/mob/living/carbon/carbon_wearer = interacting_with.loc
|
|
if(carbon_wearer.glasses != interacting_with)
|
|
return .
|
|
|
|
style_meter = carbon_wearer.AddComponent(/datum/component/style, multitooled)
|
|
return .
|
|
|
|
/obj/item/style_meter/Moved(atom/old_loc, Dir, momentum_change)
|
|
. = ..()
|
|
if(!istype(old_loc, /obj/item/clothing/glasses))
|
|
return
|
|
clean_up(old_loc)
|
|
|
|
|
|
/// Check if the glasses that this meter is linked with are being worn
|
|
/obj/item/style_meter/proc/check_wearing(datum/source, mob/equipper, slot)
|
|
SIGNAL_HANDLER
|
|
|
|
if(!(slot & ITEM_SLOT_EYES))
|
|
if(style_meter)
|
|
QDEL_NULL(style_meter)
|
|
return
|
|
|
|
style_meter = equipper.AddComponent(/datum/component/style, multitooled)
|
|
|
|
|
|
/// Signal proc for when the meter-holding glasses are dropped/unequipped
|
|
/obj/item/style_meter/proc/on_drop(datum/source, mob/user)
|
|
SIGNAL_HANDLER
|
|
|
|
if(!style_meter)
|
|
return
|
|
|
|
QDEL_NULL(style_meter)
|
|
|
|
|
|
/// Signal proc for on-examine
|
|
/obj/item/style_meter/proc/on_examine(datum/source, mob/user, list/examine_list)
|
|
SIGNAL_HANDLER
|
|
|
|
examine_list += span_notice("You feel like a <b>multitool</b> could be used on this.")
|
|
examine_list += span_notice("<b>Alt-click</b> to remove the style meter.")
|
|
|
|
|
|
/// Signal proc to remove from glasses
|
|
/obj/item/style_meter/proc/on_click_alt(datum/source, mob/user)
|
|
SIGNAL_HANDLER
|
|
|
|
if(!istype(loc, /obj/item/clothing/glasses) || !user.can_perform_action(source))
|
|
return CLICK_ACTION_BLOCKING
|
|
|
|
clean_up(loc)
|
|
forceMove(get_turf(src))
|
|
INVOKE_ASYNC(user, TYPE_PROC_REF(/mob, put_in_hands), src)
|
|
return CLICK_ACTION_SUCCESS
|
|
|
|
/obj/item/style_meter/multitool_act(mob/living/user, obj/item/tool)
|
|
multitooled = !multitooled
|
|
balloon_alert(user, "meter [multitooled ? "" : "un"]hacked")
|
|
style_meter?.multitooled = multitooled
|
|
return ITEM_INTERACT_SUCCESS
|
|
|
|
/// Redirect multitooling on our glasses to our style meter
|
|
/obj/item/style_meter/proc/redirect_multitool(datum/source, mob/living/user, obj/item/tool, ...)
|
|
SIGNAL_HANDLER
|
|
|
|
return multitool_act(user, tool)
|
|
|
|
/// Unregister signals and just generally clean up ourselves after being removed from glasses
|
|
/obj/item/style_meter/proc/clean_up(atom/movable/old_location)
|
|
old_location.cut_overlay(meter_appearance)
|
|
UnregisterSignal(old_location, list(COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED, COMSIG_ATOM_EXAMINE, COMSIG_CLICK_ALT))
|
|
UnregisterSignal(old_location, COMSIG_ATOM_TOOL_ACT(TOOL_MULTITOOL))
|
|
if(!style_meter)
|
|
return
|
|
QDEL_NULL(style_meter)
|
|
|
|
|
|
/atom/movable/screen/style_meter_background
|
|
icon_state = "style_meter_background"
|
|
icon = 'icons/hud/style_meter.dmi'
|
|
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
|
screen_loc = "WEST,CENTER:16"
|
|
maptext_height = 120
|
|
maptext_width = 105
|
|
maptext_x = 5
|
|
maptext_y = 94
|
|
maptext = ""
|
|
layer = SCREENTIP_LAYER
|
|
|
|
/atom/movable/screen/style_meter
|
|
icon_state = "style_meter"
|
|
icon = 'icons/hud/style_meter.dmi'
|
|
layer = SCREENTIP_LAYER
|
|
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|