mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-07-14 01:24:21 +01:00
203 lines
6.8 KiB
Plaintext
203 lines
6.8 KiB
Plaintext
//If you look at the "geyser_soup" overlay icon_state, you'll see that the first frame has 25 ticks.
|
|
//That's because the first 18~ ticks are completely skipped for some ungodly weird fucking byond reason
|
|
|
|
///A lavaland geyser that spawns chems and can be mining scanned for points. Made to work with the plumbing pump to extract that sweet rare nectar
|
|
/obj/structure/geyser
|
|
name = "geyser"
|
|
icon = 'icons/obj/mining_zones/terrain.dmi'
|
|
icon_state = "geyser"
|
|
anchored = TRUE
|
|
|
|
///set to null to get it greyscaled from "[icon_state]_soup". Not very usable with the whole random thing, but more types can be added if you change the spawn prob
|
|
var/erupting_state = null
|
|
///what chem do we produce?
|
|
var/datum/reagent/reagent_id = /datum/reagent/fuel/oil
|
|
///how much reagents we add every process (2 seconds)
|
|
var/potency = 2
|
|
///maximum volume
|
|
var/max_volume = 500
|
|
|
|
///Have we been discovered with a mining scanner?
|
|
var/discovered = FALSE
|
|
///How many points we grant to whoever discovers us
|
|
var/point_value = 100
|
|
///what's our real name that will show upon discovery? null to do nothing
|
|
var/true_name
|
|
///the message given when you discover this geyser.
|
|
var/discovery_message = null
|
|
|
|
/obj/structure/geyser/Initialize(mapload) //if xenobio wants to bother, nethermobs are around geysers.
|
|
. = ..()
|
|
|
|
AddElement(/datum/element/swabable, CELL_LINE_TABLE_NETHER, CELL_VIRUS_TABLE_GENERIC, 1, 5)
|
|
|
|
create_reagents(max_volume, DRAINABLE)
|
|
reagents.add_reagent(reagent_id, max_volume)
|
|
|
|
RegisterSignal(reagents, COMSIG_REAGENTS_HOLDER_UPDATED, PROC_REF(start_chemming))
|
|
|
|
if(erupting_state)
|
|
icon_state = erupting_state
|
|
else
|
|
var/mutable_appearance/I = mutable_appearance('icons/obj/mining_zones/terrain.dmi', "[icon_state]_soup")
|
|
I.color = mix_color_from_reagents(reagents.reagent_list)
|
|
add_overlay(I)
|
|
|
|
///start making those CHHHHHEEEEEEMS. Called whenever chems are removed
|
|
/obj/structure/geyser/proc/start_chemming()
|
|
SIGNAL_HANDLER
|
|
|
|
UnregisterSignal(reagents, COMSIG_REAGENTS_HOLDER_UPDATED)
|
|
|
|
START_PROCESSING(SSplumbing, src) //Its main function is to be plumbed, so use SSplumbing
|
|
|
|
///Add reagents until we are full
|
|
/obj/structure/geyser/process()
|
|
//create more
|
|
if(reagents.total_volume <= reagents.maximum_volume)
|
|
reagents.add_reagent(reagent_id, potency)
|
|
return
|
|
|
|
//we're full
|
|
RegisterSignal(reagents, COMSIG_REAGENTS_HOLDER_UPDATED, PROC_REF(start_chemming))
|
|
return PROCESS_KILL
|
|
|
|
/obj/structure/geyser/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
|
|
if(!istype(item, /obj/item/mining_scanner) && !istype(item, /obj/item/t_scanner/adv_mining_scanner))
|
|
playsound(src, SFX_INDUSTRIAL_SCAN, 20, TRUE, -2, TRUE, FALSE)
|
|
return ..() //this runs the plunger code
|
|
|
|
if(discovered)
|
|
to_chat(user, span_warning("This geyser has already been discovered!"))
|
|
return
|
|
|
|
to_chat(user, span_notice("You discovered the geyser and mark it on the GPS system!"))
|
|
playsound(src, 'sound/machines/beep/twobeep_high.ogg', 30)
|
|
SEND_SIGNAL(user, COMSIG_LIVING_DISCOVERED_GEYSER, src)
|
|
if(discovery_message)
|
|
to_chat(user, discovery_message)
|
|
|
|
discovered = TRUE
|
|
if(true_name)
|
|
name = true_name
|
|
|
|
AddComponent(/datum/component/gps, true_name) //put it on the gps so miners can mark it and chemists can profit off of it
|
|
|
|
if(isliving(user))
|
|
var/mob/living/living = user
|
|
|
|
var/obj/item/card/id/card = living.get_idcard()
|
|
if(card)
|
|
to_chat(user, span_notice("[point_value] mining points have been paid out!"))
|
|
card.registered_account.mining_points += point_value
|
|
|
|
/obj/structure/geyser/wittel
|
|
reagent_id = /datum/reagent/wittel
|
|
point_value = 250
|
|
true_name = "wittel geyser"
|
|
discovery_message = "It's a rare wittel geyser! This could be very powerful in the right hands... "
|
|
|
|
/obj/structure/geyser/plasma_oxide
|
|
reagent_id = /datum/reagent/plasma_oxide
|
|
true_name = "plasma-oxide geyser"
|
|
|
|
/obj/structure/geyser/protozine
|
|
reagent_id = /datum/reagent/medicine/omnizine/protozine
|
|
true_name = "protozine geyser"
|
|
|
|
/obj/structure/geyser/hollowwater
|
|
reagent_id = /datum/reagent/water/hollowwater
|
|
true_name = "hollow water geyser"
|
|
|
|
/obj/structure/geyser/chiral_buffer
|
|
reagent_id = /datum/reagent/reaction_agent/inversing_buffer
|
|
point_value = 250
|
|
true_name = "chiral inversing geyser"
|
|
discovery_message = "It's a rare chiral inversing geyser! This could be very powerful in the right hands... "
|
|
|
|
/obj/structure/geyser/random
|
|
point_value = 500
|
|
|
|
/obj/structure/geyser/random/Initialize(mapload)
|
|
reagent_id = get_random_reagent_id()
|
|
|
|
true_name = "[initial(reagent_id.name)] geyser"
|
|
|
|
discovery_message = "It's a [true_name]! How does any of this even work?" //it doesnt
|
|
|
|
return ..()
|
|
|
|
///A wearable tool that lets you empty plumbing machinery and some other stuff
|
|
/obj/item/plunger
|
|
name = "plunger"
|
|
desc = "It's a plunger for plunging."
|
|
icon = 'icons/obj/watercloset.dmi'
|
|
icon_state = "plunger"
|
|
worn_icon_state = "plunger"
|
|
icon_angle = 90
|
|
|
|
slot_flags = ITEM_SLOT_MASK
|
|
flags_inv = HIDESNOUT
|
|
|
|
///time*plunge_mod = total time we take to plunge an object
|
|
var/plunge_mod = 1
|
|
///whether we do heavy duty stuff like geysers
|
|
var/reinforced = TRUE
|
|
///alt sprite for the toggleable layer change mode
|
|
var/layer_mode_sprite = "plunger_layer"
|
|
///Wheter we're in layer mode
|
|
var/layer_mode = FALSE
|
|
///What layer we set it to
|
|
var/target_layer = DUCT_LAYER_DEFAULT
|
|
|
|
/obj/item/plunger/attack_atom(obj/attacked_obj, mob/living/user, list/modifiers, list/attack_modifiers)
|
|
if(layer_mode)
|
|
SEND_SIGNAL(attacked_obj, COMSIG_MOVABLE_CHANGE_DUCT_LAYER, attacked_obj, target_layer)
|
|
return ..()
|
|
else
|
|
if(!attacked_obj.plunger_act(src, user, reinforced))
|
|
return ..()
|
|
|
|
/obj/item/plunger/throw_impact(atom/hit_atom, datum/thrownthing/tt)
|
|
. = ..()
|
|
if(tt.target_zone != BODY_ZONE_HEAD)
|
|
return
|
|
if(iscarbon(hit_atom))
|
|
var/mob/living/carbon/H = hit_atom
|
|
if(!H.wear_mask)
|
|
H.equip_to_slot_if_possible(src, ITEM_SLOT_MASK)
|
|
H.visible_message(span_warning("The plunger slams into [H]'s face!"), span_warning("The plunger suctions to your face!"))
|
|
|
|
/obj/item/plunger/attack_self(mob/user)
|
|
. = ..()
|
|
|
|
layer_mode = !layer_mode
|
|
|
|
if(!layer_mode)
|
|
icon_state = initial(icon_state)
|
|
to_chat(user, span_notice("You set the plunger to 'Plunger Mode'."))
|
|
else
|
|
icon_state = layer_mode_sprite
|
|
to_chat(user, span_notice("You set the plunger to 'Layer Mode'."))
|
|
|
|
playsound(src, 'sound/machines/click.ogg', 10, TRUE)
|
|
|
|
/obj/item/plunger/click_alt(mob/user)
|
|
var/new_layer = tgui_input_list(user, "Select a layer", "Layer", GLOB.plumbing_layers)
|
|
if(isnull(new_layer) || !user.can_perform_action(src))
|
|
return CLICK_ACTION_BLOCKING
|
|
target_layer = GLOB.plumbing_layers[new_layer]
|
|
return CLICK_ACTION_SUCCESS
|
|
|
|
///A faster reinforced plunger
|
|
/obj/item/plunger/reinforced
|
|
name = "reinforced plunger"
|
|
desc = "It's an M. 7 Reinforced Plunger© for heavy duty plunging."
|
|
icon_state = "reinforced_plunger"
|
|
worn_icon_state = "reinforced_plunger"
|
|
reinforced = TRUE
|
|
plunge_mod = 0.5
|
|
layer_mode_sprite = "reinforced_plunger_layer"
|
|
|
|
custom_premium_price = PAYCHECK_CREW * 8
|