mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-28 10:01:58 +00:00
## About The Pull Request <details> - renamed ai folder to announcer -- announcer -- - moved vox_fem to announcer - moved approachingTG to announcer - separated the ambience folder into ambience and instrumental -- ambience -- - created holy folder moved all related sounds there - created engineering folder and moved all related sounds there - created security folder and moved ambidet there - created general folder and moved ambigen there - created icemoon folder and moved all icebox-related ambience there - created medical folder and moved all medbay-related ambi there - created ruin folder and moves all ruins ambi there - created beach folder and moved seag and shore there - created lavaland folder and moved related ambi there - created aurora_caelus folder and placed its ambi there - created misc folder and moved the rest of the files that don't have a specific category into it -- instrumental -- - moved traitor folder here - created lobby_music folder and placed our songs there (title0 not used anywhere? - server-side modification?) -- items -- - moved secdeath to hailer - moved surgery to handling -- effects -- - moved chemistry into effects - moved hallucinations into effects - moved health into effects - moved magic into effects -- vehicles -- - moved mecha into vehicles created mobs folder -- mobs -- - moved creatures folder into mobs - moved voice into mobs renamed creatures to non-humanoids renamed voice to humanoids -- non-humanoids-- created cyborg folder created hiss folder moved harmalarm.ogg to cyborg -- humanoids -- -- misc -- moved ghostwhisper to misc moved insane_low_laugh to misc I give up trying to document this. </details> - [X] ambience - [x] announcer - [x] effects - [X] instrumental - [x] items - [x] machines - [x] misc - [X] mobs - [X] runtime - [X] vehicles - [ ] attributions ## Why It's Good For The Game This folder is so disorganized that it's vomit inducing, will make it easier to find and add new sounds, providng a minor structure to the sound folder. ## Changelog 🆑 grungussuss refactor: the sound folder in the source code has been reorganized, please report any oddities with sounds playing or not playing server: lobby music has been repathed to sound/music/lobby_music /🆑
141 lines
5.4 KiB
Plaintext
141 lines
5.4 KiB
Plaintext
/obj/item/forcefield_projector
|
|
name = "forcefield projector"
|
|
desc = "An experimental device that can create several forcefields at a distance."
|
|
icon = 'icons/obj/devices/tool.dmi'
|
|
icon_state = "signmaker_forcefield"
|
|
slot_flags = ITEM_SLOT_BELT
|
|
w_class = WEIGHT_CLASS_SMALL
|
|
item_flags = NOBLUDGEON
|
|
inhand_icon_state = "electronic"
|
|
worn_icon_state = "electronic"
|
|
lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi'
|
|
righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi'
|
|
custom_materials = list(/datum/material/iron= SMALL_MATERIAL_AMOUNT * 2.5, /datum/material/glass= SMALL_MATERIAL_AMOUNT * 5)
|
|
var/max_shield_integrity = 250
|
|
var/shield_integrity = 250
|
|
var/max_fields = 3
|
|
var/list/current_fields
|
|
var/field_distance_limit = 7
|
|
/// Time it takes to materialize a forcefield.
|
|
var/creation_time = 1 SECONDS
|
|
/// Checks to make sure the projector isn't busy with making another forcefield.
|
|
var/force_proj_busy = FALSE
|
|
|
|
/obj/item/forcefield_projector/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers)
|
|
return ranged_interact_with_atom(interacting_with, user, modifiers)
|
|
|
|
/obj/item/forcefield_projector/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers)
|
|
if(!check_allowed_items(interacting_with, not_inside = TRUE))
|
|
return NONE
|
|
if(istype(interacting_with, /obj/structure/projected_forcefield))
|
|
var/obj/structure/projected_forcefield/F = interacting_with
|
|
if(F.generator == src)
|
|
to_chat(user, span_notice("You deactivate [F]."))
|
|
qdel(F)
|
|
return ITEM_INTERACT_BLOCKING
|
|
var/turf/T = get_turf(interacting_with)
|
|
var/obj/structure/projected_forcefield/found_field = locate() in T
|
|
if(found_field)
|
|
to_chat(user, span_warning("There is already a forcefield in that location!"))
|
|
return ITEM_INTERACT_BLOCKING
|
|
if(T.density)
|
|
return ITEM_INTERACT_BLOCKING
|
|
if(get_dist(T,src) > field_distance_limit)
|
|
return ITEM_INTERACT_BLOCKING
|
|
if(get_turf(src) == T)
|
|
to_chat(user, span_warning("Target is too close, aborting!"))
|
|
return ITEM_INTERACT_BLOCKING
|
|
if(LAZYLEN(current_fields) >= max_fields)
|
|
to_chat(user, span_warning("[src] cannot sustain any more forcefields!"))
|
|
return ITEM_INTERACT_BLOCKING
|
|
if(force_proj_busy)
|
|
to_chat(user, span_notice("[src] is busy creating a forcefield."))
|
|
return ITEM_INTERACT_BLOCKING
|
|
playsound(loc, 'sound/machines/click.ogg', 20, TRUE)
|
|
if(creation_time)
|
|
force_proj_busy = TRUE
|
|
if(!do_after(user, creation_time, target = interacting_with))
|
|
force_proj_busy = FALSE
|
|
return ITEM_INTERACT_BLOCKING
|
|
force_proj_busy = FALSE
|
|
|
|
playsound(src,'sound/items/weapons/resonator_fire.ogg',50,TRUE)
|
|
user.visible_message(span_warning("[user] projects a forcefield!"),span_notice("You project a forcefield."))
|
|
var/obj/structure/projected_forcefield/F = new(T, src)
|
|
current_fields += F
|
|
user.changeNext_move(CLICK_CD_MELEE)
|
|
return ITEM_INTERACT_SUCCESS
|
|
|
|
/obj/item/forcefield_projector/attack_self(mob/user)
|
|
if(LAZYLEN(current_fields))
|
|
to_chat(user, span_notice("You deactivate [src], disabling all active forcefields."))
|
|
for(var/obj/structure/projected_forcefield/F in current_fields)
|
|
qdel(F)
|
|
|
|
/obj/item/forcefield_projector/examine(mob/user)
|
|
. = ..()
|
|
. += span_notice("It is currently sustaining [LAZYLEN(current_fields)]/[max_fields] fields, and it's [round((shield_integrity/max_shield_integrity)*100)]% charged.")
|
|
|
|
/obj/item/forcefield_projector/Initialize(mapload)
|
|
. = ..()
|
|
current_fields = list()
|
|
START_PROCESSING(SSobj, src)
|
|
|
|
/obj/item/forcefield_projector/Destroy()
|
|
STOP_PROCESSING(SSobj, src)
|
|
return ..()
|
|
|
|
/obj/item/forcefield_projector/process(seconds_per_tick)
|
|
if(!LAZYLEN(current_fields))
|
|
shield_integrity = min(shield_integrity + seconds_per_tick * 2, max_shield_integrity)
|
|
else
|
|
shield_integrity = max(shield_integrity - LAZYLEN(current_fields) * seconds_per_tick * 0.5, 0) //fields degrade slowly over time
|
|
for(var/obj/structure/projected_forcefield/F in current_fields)
|
|
if(shield_integrity <= 0 || get_dist(F,src) > field_distance_limit)
|
|
qdel(F)
|
|
|
|
/obj/structure/projected_forcefield
|
|
name = "forcefield"
|
|
desc = "A glowing barrier, generated by a projector nearby. It could be overloaded if hit enough times."
|
|
icon = 'icons/effects/effects.dmi'
|
|
icon_state = "forcefield"
|
|
layer = ABOVE_ALL_MOB_LAYER
|
|
plane = ABOVE_GAME_PLANE
|
|
anchored = TRUE
|
|
pass_flags_self = PASSGLASS
|
|
density = TRUE
|
|
mouse_opacity = MOUSE_OPACITY_OPAQUE
|
|
resistance_flags = INDESTRUCTIBLE
|
|
can_atmos_pass = ATMOS_PASS_DENSITY
|
|
armor_type = /datum/armor/structure_projected_forcefield
|
|
var/obj/item/forcefield_projector/generator
|
|
|
|
/datum/armor/structure_projected_forcefield
|
|
bullet = 25
|
|
laser = 50
|
|
energy = 50
|
|
bomb = 25
|
|
fire = 100
|
|
acid = 100
|
|
|
|
/obj/structure/projected_forcefield/Initialize(mapload, obj/item/forcefield_projector/origin)
|
|
. = ..()
|
|
generator = origin
|
|
|
|
/obj/structure/projected_forcefield/Destroy()
|
|
visible_message(span_warning("[src] flickers and disappears!"))
|
|
playsound(src,'sound/items/weapons/resonator_blast.ogg',25,TRUE)
|
|
if(generator)
|
|
generator.current_fields -= src
|
|
generator = null
|
|
return ..()
|
|
|
|
/obj/structure/projected_forcefield/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
|
|
playsound(loc, 'sound/items/weapons/egloves.ogg', 80, TRUE)
|
|
|
|
/obj/structure/projected_forcefield/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
|
|
if(sound_effect)
|
|
play_attack_sound(damage_amount, damage_type, damage_flag)
|
|
if(generator)
|
|
generator.shield_integrity = max(generator.shield_integrity - damage_amount, 0)
|