mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-01-31 19:32:42 +00:00
* Adds Trait Genetics from Outpost21 Adds trait genetics from Outpost 21 - Tried to update each file it touched to be equivalent to their Chomp specific variants in order to maintain functionality and make sure no oddities would happen due to code differences. (Some things like the eardeaf loop were left there but commented out) * Morph trait * Fixes a server crashing bug with flip aa * flip * Makes morph superpower better - Makes it use the appearance_changer instead of 1000 different procs - Makes cocoon weaver able to change eye and skin color. I did NOT select you. BAD * begone * fix dna modifier * Fixes massive memory leak * Brain Runtime Fix * There was no reason for this to be a spawn(0) And no I didn't spawn with no blood - https://i.imgur.com/vPizqCD.png * revert revert the dna changes there * Deconf * gets rid of unused proc vars that did nothing * expects enough free slots * glob * fixed and added two other tests * another few tests * this is a list * fixed bad injector * lets wrap these for sanity * better feedback * wrong name * don't allow multiple occupants into the dna pod * future traits will have activation levels instead of binary on/off --------- Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com> Co-authored-by: Willburd <7099514+Willburd@users.noreply.github.com>
349 lines
11 KiB
Plaintext
349 lines
11 KiB
Plaintext
/obj/structure/generic_structure
|
|
name = "unusual object"
|
|
desc = "An unusual object of some sort."
|
|
icon = 'icons/obj/props/decor.dmi'
|
|
icon_state = "bsb_off"
|
|
anchored = 1
|
|
density = 1
|
|
climbable = 0
|
|
breakable = 0
|
|
var/on = 0
|
|
var/icon_state_off = "bsb_off"
|
|
var/icon_state_on = "bsb_on"
|
|
var/wrenchable = 0
|
|
var/activatable_hand = 1
|
|
var/togglable = 1
|
|
var/text_activated = "The strucutre turns on."
|
|
var/text_deactivated = "The structure turns off."
|
|
var/effect = 0
|
|
var/object = 0
|
|
var/sound_activated = 0
|
|
var/delay_time = 0
|
|
var/icon_on = 0
|
|
var/icon_off = 0
|
|
|
|
/obj/structure/generic_structure/attack_hand(mob/user)
|
|
if(activatable_hand)
|
|
if(!on)
|
|
if(delay_time)
|
|
if(!do_after(user, delay_time, src, exclusive = TASK_USER_EXCLUSIVE))
|
|
return 0
|
|
on = 1
|
|
icon_state = icon_state_on
|
|
if(icon_on)
|
|
icon = icon_on
|
|
else
|
|
icon = 'icons/obj/props/decor.dmi'
|
|
icon_state = icon_state_on
|
|
src.visible_message(span_notice("[text_activated]"))
|
|
update_icon()
|
|
if(effect == 1)
|
|
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
|
s.set_up(3, 1, src)
|
|
s.start()
|
|
if(effect == 2)
|
|
for(var/obj/machinery/light/L in machines)
|
|
if(L.z != src.z || get_dist(src,L) > 10)
|
|
continue
|
|
else
|
|
L.flicker(10)
|
|
if(effect == 3)
|
|
for (var/mob/O in viewers(src, null))
|
|
if(get_dist(src, O) > 3)
|
|
continue
|
|
|
|
var/flash_time = 10
|
|
if(ishuman(O))
|
|
var/mob/living/carbon/human/H = O
|
|
if(H.nif && H.nif.flag_check(NIF_V_FLASHPROT,NIF_FLAGS_VISION))
|
|
H.nif.notify("High intensity light detected, and blocked!",TRUE)
|
|
continue
|
|
if(FLASHPROOF in H.mutations)
|
|
continue
|
|
if(!H.eyecheck() <= 0)
|
|
continue
|
|
flash_time *= H.species.flash_mod
|
|
var/obj/item/organ/internal/eyes/E = H.internal_organs_by_name[O_EYES]
|
|
if(!E)
|
|
return
|
|
if(E.is_bruised() && prob(E.damage + 50))
|
|
H.flash_eyes()
|
|
E.damage += rand(1, 5)
|
|
else
|
|
if(!O.blinded && isliving(O))
|
|
var/mob/living/L = O
|
|
L.flash_eyes()
|
|
O.Weaken(flash_time)
|
|
if(effect == 4)
|
|
var/atom/o = new object(get_turf(src))
|
|
src.visible_message(span_notice("[src] has produced [o]!"))
|
|
if(effect == 5)
|
|
for (var/mob/O in viewers(src, null))
|
|
if(get_dist(src, O) > 7)
|
|
continue
|
|
|
|
if(ishuman(O))
|
|
var/mob/living/carbon/human/H = O
|
|
H.fear = 200
|
|
if(sound_activated)
|
|
playsound(src, sound_activated, 50, 1)
|
|
else if(togglable)
|
|
if(delay_time)
|
|
if(!do_after(user, delay_time, src, exclusive = TASK_USER_EXCLUSIVE))
|
|
return 0
|
|
on = 0
|
|
icon_state = icon_state_off
|
|
if(icon_off)
|
|
icon = icon_off
|
|
else
|
|
icon = 'icons/obj/props/decor.dmi'
|
|
src.visible_message(span_notice("[text_deactivated]"))
|
|
update_icon()
|
|
return ..()
|
|
|
|
/obj/structure/generic_structure/attackby(obj/item/W as obj, mob/user as mob)
|
|
if(wrenchable && W.has_tool_quality(TOOL_WRENCH))
|
|
add_fingerprint(user)
|
|
to_chat(user, span_notice("You [anchored? "un" : ""]secured \the [src]!"))
|
|
anchored = !anchored
|
|
|
|
/client/proc/generic_structure()
|
|
set category = "Fun.Event Kit"
|
|
set name = "Spawn Generic Structure"
|
|
set desc = "Spawn a customisable structure with a range of different options."
|
|
|
|
var/s_wrenchable = 0
|
|
var/s_anchored = 0
|
|
var/s_density = 0
|
|
var/s_activatable = 0
|
|
var/s_togglable = 0
|
|
var/s_icon_state_on = 0
|
|
var/s_delay = 0
|
|
var/s_text_activated = 0
|
|
var/s_text_deactivated = 0
|
|
var/s_effect = 0
|
|
var/s_sound = 0
|
|
var/s_object = 0
|
|
var/s_icon = 0
|
|
var/s_icon2 = 0
|
|
var/list/icon_state_options = list("bsb_off",
|
|
"bsb_on",
|
|
"bsc",
|
|
"bsc_dust",
|
|
"biosyphon",
|
|
"von_krabin",
|
|
"last_shelter",
|
|
"complicator",
|
|
"random_radio",
|
|
"nt_pedestal0_old",
|
|
"nt_pedestal1_old",
|
|
"nt_reader_off",
|
|
"nt_reader_on",
|
|
"nt_biocan",
|
|
"nt_optable-idle",
|
|
"nt_optable-active",
|
|
"nt_obelisk",
|
|
"nt_obelisk_on",
|
|
"nt_cruciforge",
|
|
"nt_cruciforge_start",
|
|
"nt_cruciforge_work",
|
|
"nt_solidifier",
|
|
"nt_solidifier_on",
|
|
"artwork_statue_1",
|
|
"artwork_statue_2",
|
|
"artwork_statue_3",
|
|
"artwork_statue_4",
|
|
"artwork_statue_5",
|
|
"artwork_statue",
|
|
"dominator",
|
|
"dominator-broken",
|
|
"gel_cocoon",
|
|
"tank_broken",
|
|
"tank_larva",
|
|
"stump",
|
|
"conduit_off",
|
|
"conduit_spin",
|
|
"core_empty",
|
|
"core_inactive",
|
|
"core_active",
|
|
"tradebeacon",
|
|
"tradebeacon_active",
|
|
"tradebeacon_sending",
|
|
"treadebeacon_sending_active",
|
|
"smelter",
|
|
"smelter-process",
|
|
"sorter",
|
|
"sorter-process",
|
|
"stamper",
|
|
"stamper_on",
|
|
"tgmc_console1",
|
|
"tgmc_console1_on",
|
|
"tgmc_console2",
|
|
"tgmc_console2_on",
|
|
"tgmc_console3",
|
|
"tgmc_console3_on",
|
|
"tgmc_console4",
|
|
"tgmc_console4_on",
|
|
"tgmc_console5",
|
|
"tgmc_console5_on",
|
|
"tgmc_sentry",
|
|
"minirocket_pod",
|
|
"ob_warhead_1",
|
|
"ob_warhead_2",
|
|
"ob_warhead_3",
|
|
"ob_warhead_4",
|
|
"angel",
|
|
"Upload Own Sprite")
|
|
var/list/sound_options = list('sound/effects/alert.ogg',
|
|
'sound/effects/bamf.ogg',
|
|
'sound/effects/bang.ogg',
|
|
'sound/effects/blobattack.ogg',
|
|
'sound/effects/cascade.ogg',
|
|
'sound/effects/clockcult_gateway_disrupted.ogg',
|
|
'sound/effects/closet_close.ogg',
|
|
'sound/effects/confetti_ball.ogg',
|
|
'sound/effects/deskbell.ogg',
|
|
'sound/effects/EMPulse.ogg',
|
|
'sound/effects/Explosion1.ogg',
|
|
'sound/effects/ghost.ogg',
|
|
'sound/effects/Glassbr1.ogg',
|
|
'sound/effects/lightningshock.ogg',
|
|
'sound/effects/lighton.ogg',
|
|
'sound/effects/magnetclamp.ogg',
|
|
'sound/effects/pai_boot.ogg',
|
|
'sound/effects/pai_login.ogg',
|
|
'sound/effects/pai-restore.ogg',
|
|
'sound/effects/radio_common.ogg',
|
|
'sound/effects/refill.ogg',
|
|
'sound/effects/siren.ogg',
|
|
'sound/effects/smoke.ogg',
|
|
'sound/effects/sparks1.ogg',
|
|
'sound/effects/spray.ogg',
|
|
'sound/effects/squelch1.ogg',
|
|
'sound/effects/supermatter.ogg',
|
|
'sound/effects/Whipcrack.ogg',
|
|
'sound/effects/woodcutting.ogg')
|
|
|
|
var/check_togglable
|
|
|
|
|
|
if(!holder)
|
|
return
|
|
|
|
var/s_name = tgui_input_text(src, "Structure Name:", "Name")
|
|
var/s_desc = tgui_input_text(src, "Structure Description:", "Description")
|
|
var/check_anchored = tgui_alert(src, "Start anchored?", "anchored", list("Yes", "No", "Cancel"))
|
|
if(!check_anchored || check_anchored == "Cancel")
|
|
return
|
|
if(check_anchored == "No")
|
|
s_anchored = 0
|
|
if(check_anchored == "Yes")
|
|
s_anchored = 1
|
|
var/check_density = tgui_alert(src, "Start dense?", "density", list("Yes", "No", "Cancel"))
|
|
if(!check_density || check_density == "Cancel")
|
|
return
|
|
if(check_density == "No")
|
|
s_density = 0
|
|
if(check_density == "Yes")
|
|
s_density = 1
|
|
var/check_wrenchable = tgui_alert(src, "Allow it to be fastened and unfastened with a wrench?", "wrenchable", list("Yes", "No", "Cancel"))
|
|
if(!check_wrenchable || check_wrenchable == "Cancel")
|
|
return
|
|
if(check_wrenchable == "No")
|
|
s_wrenchable = 0
|
|
if(check_wrenchable == "Yes")
|
|
s_wrenchable = 1
|
|
var/s_icon_state_off = tgui_input_list(src, "Choose starting icon state:", "icon_state_off", icon_state_options)
|
|
if(s_icon_state_off == "Upload Own Sprite")
|
|
s_icon = input(usr, "Choose an image file to upload. Images that are not 32x32 will need to have their positions offset.","Upload Icon") as null|file
|
|
var/check_activatable = tgui_alert(src, "Allow it to be turned on?", "activatable", list("Yes", "No", "Cancel"))
|
|
if(!check_activatable || check_activatable == "Cancel")
|
|
return
|
|
if(check_activatable == "No")
|
|
s_activatable = 0
|
|
if(check_activatable == "Yes")
|
|
s_activatable = 1
|
|
s_text_activated = tgui_input_text(src, "Activation text:", "Activation Text")
|
|
check_togglable = tgui_alert(src, "Allow it to be turned back off again?", "togglable", list("Yes", "No", "Cancel"))
|
|
if(!check_togglable || check_togglable == "Cancel")
|
|
return
|
|
if(check_togglable == "No")
|
|
s_togglable = 0
|
|
if(check_togglable == "Yes")
|
|
s_text_deactivated = tgui_input_text(src, "Deactivation text:", "Deactivation Text")
|
|
s_togglable = 1
|
|
s_icon_state_on = tgui_input_list(src, "Choose activated icon state:", "icon_state_on", icon_state_options)
|
|
if(s_icon_state_on == "Upload Own Sprite")
|
|
s_icon2 = input(usr, "Choose an image file to upload. Images that are not 32x32 will need to have their positions offset.","Upload Icon") as null|file
|
|
s_delay = tgui_input_number(src, "Do you want it to take time to put turn on? Choose a number of deciseconds to activate, or 0 for instant.", "Delay")
|
|
var/check_effect = tgui_alert(src, "Produce an effect on activation?", "Effect?", list("No", "Spark", "Flicker Lights", "Flash", "Spawn Item", "Fear", "Cancel"))
|
|
if(!check_effect || check_effect == "Cancel")
|
|
return
|
|
if(check_effect == "No")
|
|
s_effect = 0
|
|
if(check_effect == "Spark")
|
|
s_effect = 1
|
|
if(check_effect == "Flicker Lights")
|
|
s_effect = 2
|
|
if(check_effect == "Flash")
|
|
s_effect = 3
|
|
if(check_effect == "Spawn Item")
|
|
s_effect = 4
|
|
s_object = get_path_from_partial_text()
|
|
if(check_effect == "Fear")
|
|
s_effect = 5
|
|
var/check_sound = tgui_alert(src, "Play a sound when turning on?", "Sound", list("Yes", "No", "Cancel"))
|
|
if(!check_sound || check_sound == "Cancel")
|
|
return
|
|
if(check_sound == "Yes")
|
|
s_sound = tgui_input_list(src, "Choose a sound to play on activation:", "Sound", sound_options)
|
|
|
|
var/spawnloc = get_turf(src.mob)
|
|
var/obj/structure/generic_structure/P = new(spawnloc)
|
|
P.name = s_name
|
|
P.desc = s_desc
|
|
P.anchored = s_anchored
|
|
P.density = s_density
|
|
P.icon_state_off = s_icon_state_off
|
|
P.icon_state_on = s_icon_state_on
|
|
P.wrenchable = s_wrenchable
|
|
P.activatable_hand = s_activatable
|
|
P.togglable = s_togglable
|
|
P.text_activated = s_text_activated
|
|
P.text_deactivated = s_text_deactivated
|
|
P.effect = s_effect
|
|
P.sound_activated = s_sound
|
|
P.delay_time = s_delay
|
|
P.object = s_object
|
|
P.icon_state = s_icon_state_off
|
|
P.icon_off = s_icon
|
|
P.icon_on = s_icon2
|
|
if(s_icon)
|
|
P.icon = s_icon
|
|
P.update_icon()
|
|
|
|
/client/proc/get_path_from_partial_text(default_path)
|
|
var/desired_path = tgui_input_text(usr, "Enter full or partial typepath.","Typepath","[default_path]")
|
|
|
|
if(!desired_path) //VOREStation Add - If you don't give it anything it builds a list of every possible thing in the game and crashes your client.
|
|
return //VOREStation Add - And the main way for it to do that is to push the cancel button, which should just do nothing. :U
|
|
|
|
var/list/types = typesof(/atom)
|
|
var/list/matches = list()
|
|
|
|
for(var/path in types)
|
|
if(findtext("[path]", desired_path))
|
|
matches += path
|
|
|
|
if(matches.len==0)
|
|
tgui_alert_async(usr, "No results found. Sorry.")
|
|
return
|
|
|
|
var/result = null
|
|
|
|
if(matches.len==1)
|
|
result = matches[1]
|
|
else
|
|
result = tgui_input_list(usr, "Select an atom type", "Spawn Atom", matches, strict_modern = TRUE)
|
|
return result
|