Event stuff, but also Squeak component (#7285)

This commit is contained in:
BlackMajor
2023-12-11 14:40:47 +13:00
committed by GitHub
parent 835e207c5c
commit 92c744dfec
32 changed files with 831 additions and 78 deletions
@@ -0,0 +1,103 @@
var/static/list/mapped_autostrips = list()
var/static/list/mapped_autostrips_mob = list()
/*
This should actually be refactored if it ever needs to be used again into just being
an event controller with more graceful solutions.
Creating lockers was not graceful, in practice, and creates clutter, for example.
Repurpose this idea into a self contained machine in the future that stores and auto-equips someones gear.
But for now, for what it's been used for, it works.
*/
//Admin tool to automatically strip a human victim of all their equipment and genetics powers, and store them in a closet.
//Equips Vox/Zaddat survival gear, and a few basic pieces of clothing
/obj/effect/step_trigger/autostrip
name = "Autostrip trigger. Set the targetid to match the effect/autostriptarget"
var/targetid = "Default"
var/obj/effect/autostriptarget/target
var/obj/effect/autostriptarget/mob/Mtarget
var/remove_implants = 0 //Havn't bothered to implement this yet
var/remove_mutations = 0
/obj/effect/step_trigger/autostrip/Initialize(mapload)
. = ..()
initMappedLink()
/obj/effect/step_trigger/autostrip/Trigger(mob/living/carbon/human/H as mob)
if(!istype(H))
return
if(!target)
if(!initMappedLink())
return
if(Mtarget)
H.forceMove(Mtarget.loc)
var/obj/locker = new /obj/structure/closet/secure_closet/mind(target.loc, mind_target = H.mind)
for(var/obj/item/W in H)
if(istype(W, /obj/item/weapon/implant/backup) || istype(W, /obj/item/device/nif))
continue //VOREStation Edit
if(H.drop_from_inventory(W))
W.forceMove(locker)
if(remove_mutations)
var/needs_update = H.mutations.len > 0
for(var/entry in H.mutations)
var/mut
switch(entry)
if(TK)
mut = TELEBLOCK
if(XRAY)
mut = XRAYBLOCK
if(HULK)
mut = HULKBLOCK
if(mRemotetalk)
mut = REMOTETALKBLOCK
if(COLD_RESISTANCE)
mut = FIREBLOCK
if(mut)
new /obj/item/weapon/dnainjector/safe(locker, block_type = mut)
H.dna.SetSEState(mut,0)
H.mutations = list()
H.disabilities = 0
H.sdisabilities = 0
if(needs_update)
domutcheck(H,null,MUTCHK_FORCED)
H.update_mutations()
if(H.species.name == SPECIES_VOX || SPECIES_ZADDAT) //Species that 'actually' require survival gear to live. The rest don't.
H.species.equip_survival_gear(H)
H.equip_to_slot_or_del(new /obj/item/clothing/under/chameleon(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H),slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/radio/headset(H),slot_l_ear)
H.equip_to_slot_or_del(new /obj/item/clothing/under/permit(H), slot_l_hand)
/obj/effect/step_trigger/autostrip/proc/initMappedLink()
. = FALSE
target = mapped_autostrips[targetid]
Mtarget = mapped_autostrips_mob[targetid]
if(target)
. = TRUE
/obj/effect/autostriptarget
name = "Autostrip target. Link me via targetid to an autostrip trigger."
icon = 'icons/mob/screen1.dmi'
icon_state = "no_item1"
var/targetid = "Default"
unacidable = 1
layer = 99
anchored = 1
invisibility = 99
/obj/effect/autostriptarget/Initialize(mapload)
. = ..()
if(targetid)
mapped_autostrips[targetid] = src
/obj/effect/autostriptarget/mob
name = "Autostrip target to send mobs to."
/obj/effect/autostriptarget/mob/Initialize(mapload)
if(targetid)
mapped_autostrips_mob[targetid] = src
@@ -0,0 +1,85 @@
/obj/item/device/radio/headset/casino
name = "radio headset"
desc = "An updated, modular intercom that fits over the head with extra comfortable for the hardworking casino luxury crew. Has encryption key for scamm-... Kind casino staff channel."
icon = 'icons/obj/casino_ch.dmi'
icon_state = "headset"
origin_tech = list(TECH_ILLEGAL = 2)
ks1type = /obj/item/device/encryptionkey/raider
//Badmin piece of clothing that applies a few effects to a mob, used specifically for events with "hunters"
//This just helps me equip the hunters a little easier
/obj/item/device/radio/headset/event
name = "totally normal headset"
desc = "A headset with numerous toolkits appended to it, applying a wide variety of effects to its wearer set as per its manufacturer."
icon_state = "cent_headset_alt"
item_state = "headset"
var/mob/living/carbon/human/wearer
var/effect_icon = 'modular_chomp/icons/effects/effects.dmi' //Cosmetic Effect that will be applied to the mob as an overlay
var/effect_icon_state = "arrow2"
var/image/effect_overlay = null //Reference to an overlay so we can remove it on unequip
var/overlay_offset_y = 32
//Spells that will be added on equip
var/list/spells = list("/spell/targeted/unrestricted/mend", "/spell/targeted/unrestricted/plasmastun")
var/list/remove_spells = list() //Reference to spells that'll get removed
var/slowdown_to_set = 0.5
var/item_slowdown_reset = 0 //Vars to copy and reset later
var/slowdown_reset = 0
light_range = 6
light_power = 0 //Set this to 0 if you don't want a light
light_color = "#ffaaaa"
var/tele_threshold = 50
var/telex = 16
var/teley = 16
var/telez = 0 //Set this in-round if you want a return point with fake health
/obj/item/device/radio/headset/event/equipped(var/mob/living/carbon/human/H)
if(H && ((H.l_ear == src) || (H.r_ear == src)))
wearer = H
if(light_power)
set_light(light_range,light_power,light_color,1)
if(effect_icon)
effect_overlay = image(effect_icon, effect_icon_state, pixel_y = overlay_offset_y*H.size_multiplier)
effect_overlay.appearance_flags |= (RESET_COLOR|PIXEL_SCALE)
effect_overlay.plane = PLANE_LIGHTING_ABOVE
effect_overlay.layer = MOB_LAYER
H.add_overlay(effect_overlay)
if(spells.len)
for(var/thing in spells)
var/spell/SP = new thing(H)
H.add_spell(SP)
remove_spells += SP
if(slowdown_to_set != 0)
slowdown_reset = H.species.slowdown
item_slowdown_reset = H.species.item_slowdown_mod
H.species.slowdown = slowdown_to_set
H.species.item_slowdown_mod = 0
/obj/item/device/radio/headset/event/dropped(var/mob/living/carbon/human/H)
..()
if(wearer)
wearer = null
if(light_power)
light_on = 0
if(effect_icon)
H.cut_overlay(effect_overlay)
if(remove_spells.len)
for(var/spell/SP in remove_spells)
H.remove_spell(SP)
qdel(SP)
if(slowdown_to_set != 0)
H.species.slowdown = slowdown_reset
H.species.item_slowdown_mod = item_slowdown_reset
/obj/item/device/radio/headset/event/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack")
if(!telez)
return FALSE
tele_threshold -= damage
if(tele_threshold <= 0)
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread()
spark_system.set_up(5, 0, user.loc)
spark_system.start()
playsound(src, "sparks", 50, 1)
user.visible_message("<span class='danger'>[user] is abruptly flung somewhere else in response to the damage!</span>")
do_teleport(user, locate(telex,teley,telez), local = 0, bohsafe = 1)
tele_threshold = initial(tele_threshold)
return TRUE
@@ -0,0 +1,46 @@
//Same as regular injector, but without the radiation
//Using for events, set the block to the desired gene
//Note, genetics code is incredibly scuffed, sometimes blocks just won't activate unless you do it multiple times????
/obj/item/weapon/dnainjector/safe
desc = "A slightly safer DNA injector"
datatype = DNA2_BUF_SE
value = 0xFFF
/obj/item/weapon/dnainjector/safe/New(var/block_type)
block = block_type
..()
/obj/item/weapon/dnainjector/safe/inject(mob/M as mob, mob/user as mob)
/*
if (!(NOCLONE in M.mutations)) // prevents drained people from having their DNA changed
if (buf.types & DNA2_BUF_UI)
if (!block) //isolated block?
M.UpdateAppearance(buf.dna.UI.Copy())
if (buf.types & DNA2_BUF_UE) //unique enzymes? yes
M.real_name = buf.dna.real_name
M.name = buf.dna.real_name
uses--
else
M.dna.SetUIValue(block,src.GetValue())
M.UpdateAppearance()
uses--
if (buf.types & DNA2_BUF_SE)
if (!block) //isolated block?
M.dna.SE = buf.dna.SE.Copy()
M.dna.UpdateSE()
else
M.dna.SetSEValue(block,src.GetValue())
domutcheck(M, null, block!=null)
uses--
if(prob(5))
trigger_side_effect(M)
*/
M.dna.SetSEState(block,1)
domutcheck(M,null,MUTCHK_FORCED)
M.update_mutations()
spawn(0)//this prevents the collapse of space-time continuum
if (user)
user.drop_from_inventory(src)
qdel(src)
return uses
@@ -0,0 +1,5 @@
/obj/item/weapon/melee/shock_maul/harmless
name = "rubber concussion maul"
desc = "A variant of the concussion maul that staggers and weakens victims. Despite their screams, does no real damage."
damtype = HALLOSS
launch_force = 0
@@ -0,0 +1,42 @@
/obj/structure/closet/secure_closet/mind
name = "mind secured locker"
var/datum/mind/owner
var/self_del = 1
anchored = 0
/obj/structure/closet/secure_closet/mind/New(var/datum/mind/mind_target, var/del_self = 1)
.=..()
self_del = del_self
if(mind_target)
owner = mind_target
name = "Owned by [owner.name]"
if(owner.current)
var/icon/I = get_flat_icon(owner.current, dir=SOUTH, no_anim=TRUE)
var/image/IM = image(I, pixel_x = (32 - I.Width()))
//icon2base64(get_flat_icon(owner.current,dir=SOUTH,no_anim=TRUE))
/*
I.appearance_flags |= (RESET_COLOR|PIXEL_SCALE)
I.plane = MOB_PLANE
I.layer = MOB_LAYER
*/
add_overlay(IM)
qdel(I)
/obj/structure/closet/secure_closet/mind/allowed(mob/user)
if(user.mind == owner)
return TRUE
else
return FALSE
/obj/structure/closet/secure_closet/mind/open()
.=..()
if(self_del)
qdel(src)
/obj/structure/closet/secure_closet/mind/LateInitialize()
if(ispath(closet_appearance))
closet_appearance = GLOB.closet_appearances[closet_appearance]
if(istype(closet_appearance))
icon = closet_appearance.icon
color = null
update_icon()
@@ -216,3 +216,14 @@
B.digest_brute = 20
B.special_entrance_sound = 'sound/machines/blender.ogg'
B.recycling = TRUE
/obj/structure/toilet/item/Initialize(mapload)
..()
return INITIALIZE_HINT_LATELOAD
/obj/structure/toilet/item/LateInitialize()
if(istype(loc, /mob/living)) return
var/obj/item/I
for(I in loc)
if(I.density || I.anchored || I == src) continue
I.forceMove(src)