mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-23 13:10:02 +01:00
Merge remote-tracking branch 'tgstation/master' into upstream-feb12-2026
# Conflicts: # .github/CODEOWNERS # .github/workflows/compile_changelogs.yml # .github/workflows/stale.yml # SQL/database_changelog.md # _maps/map_files/CatwalkStation/CatwalkStation_2023.dmm # code/__DEFINES/atom_hud.dm # code/__DEFINES/inventory.dm # code/__DEFINES/mobs.dm # code/__DEFINES/species_clothing_paths.dm # code/__DEFINES/subsystems.dm # code/__DEFINES/surgery.dm # code/__HELPERS/global_lists.dm # code/_globalvars/lists/maintenance_loot.dm # code/_globalvars/traits/_traits.dm # code/controllers/subsystem/minor_mapping.dm # code/controllers/subsystem/processing/quirks.dm # code/controllers/subsystem/shuttle.dm # code/datums/components/palette.dm # code/datums/components/surgery_initiator.dm # code/datums/diseases/advance/advance.dm # code/datums/hud.dm # code/datums/mood.dm # code/datums/mutations/chameleon.dm # code/datums/quirks/negative_quirks/nyctophobia.dm # code/datums/status_effects/debuffs/debuffs.dm # code/datums/status_effects/debuffs/drunk.dm # code/datums/status_effects/debuffs/slime/slime_leech.dm # code/datums/weather/weather.dm # code/game/data_huds.dm # code/game/objects/items.dm # code/game/objects/items/devices/scanners/health_analyzer.dm # code/game/objects/items/frog_statue.dm # code/game/objects/items/rcd/RLD.dm # code/game/objects/items/robot/items/hypo.dm # code/game/objects/items/stacks/medical.dm # code/game/objects/items/stacks/wrap.dm # code/game/objects/items/storage/garment.dm # code/game/objects/items/tools/medical/defib.dm # code/game/objects/items/weaponry.dm # code/game/objects/items/weaponry/melee/misc.dm # code/game/objects/structures/crates_lockers/closets/secure/security.dm # code/game/objects/structures/curtains.dm # code/game/objects/structures/dresser.dm # code/game/objects/structures/girders.dm # code/game/objects/structures/maintenance.dm # code/game/objects/structures/mirror.dm # code/modules/admin/greyscale_modify_menu.dm # code/modules/admin/verbs/light_debug.dm # code/modules/antagonists/ashwalker/ashwalker.dm # code/modules/antagonists/heretic/knowledge/starting_lore.dm # code/modules/antagonists/ninja/ninjaDrainAct.dm # code/modules/art/paintings.dm # code/modules/client/preferences.dm # code/modules/client/verbs/ooc.dm # code/modules/clothing/head/wig.dm # code/modules/events/disease_outbreak.dm # code/modules/holodeck/holo_effect.dm # code/modules/jobs/job_types/head_of_security.dm # code/modules/jobs/job_types/security_officer.dm # code/modules/library/skill_learning/generic_skillchips/point.dm # code/modules/mining/lavaland/ash_flora.dm # code/modules/mining/lavaland/mining_loot/megafauna/ash_drake.dm # code/modules/mob/dead/new_player/new_player.dm # code/modules/mob/living/basic/guardian/guardian.dm # code/modules/mob/living/basic/space_fauna/space_dragon/space_dragon.dm # code/modules/mob/living/carbon/carbon.dm # code/modules/mob/living/carbon/human/human.dm # code/modules/mob/living/carbon/human/human_defines.dm # code/modules/mob/living/carbon/life.dm # code/modules/mob/living/living.dm # code/modules/mob/living/living_defines.dm # code/modules/mob/mob.dm # code/modules/mob_spawn/ghost_roles/mining_roles.dm # code/modules/mod/mod_control.dm # code/modules/mod/modules/modules_general.dm # code/modules/modular_computers/computers/item/computer_ui.dm # code/modules/paperwork/paper.dm # code/modules/paperwork/paperbin.dm # code/modules/power/lighting/light.dm # code/modules/projectiles/guns/energy/kinetic_accelerator.dm # code/modules/projectiles/projectile.dm # code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm # code/modules/reagents/chemistry/reagents/food_reagents.dm # code/modules/reagents/chemistry/reagents/other_reagents.dm # code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm # code/modules/research/xenobiology/crossbreeding/_clothing.dm # code/modules/research/xenobiology/crossbreeding/prismatic.dm # code/modules/surgery/advanced/brainwashing.dm # code/modules/surgery/advanced/lobotomy.dm # code/modules/surgery/amputation.dm # code/modules/surgery/blood_filter.dm # code/modules/surgery/bodyparts/_bodyparts.dm # code/modules/surgery/brain_surgery.dm # code/modules/surgery/cavity_implant.dm # code/modules/surgery/coronary_bypass.dm # code/modules/surgery/gastrectomy.dm # code/modules/surgery/healing.dm # code/modules/surgery/limb_augmentation.dm # code/modules/surgery/organ_manipulation.dm # code/modules/surgery/revival.dm # code/modules/surgery/sleeper_protocol.dm # code/modules/surgery/surgery_helpers.dm # code/modules/surgery/surgery_step.dm # code/modules/unit_tests/_unit_tests.dm # code/modules/unit_tests/designs.dm # code/modules/unit_tests/icon_state_worn.dm # code/modules/unit_tests/screenshots/screenshot_antag_icons_cultist.png # code/modules/unit_tests/screenshots/screenshot_antag_icons_headrevolutionary.png # code/modules/unit_tests/screenshots/screenshot_antag_icons_provocateur.png # code/modules/unit_tests/screenshots/screenshot_husk_body.png # code/modules/unit_tests/screenshots/screenshot_husk_body_missing_limbs.png # icons/map_icons/clothing/head/_head.dmi # icons/map_icons/clothing/shoes.dmi # icons/map_icons/items/_item.dmi # icons/mob/huds/hud.dmi # icons/mob/inhands/64x64_lefthand.dmi # icons/mob/inhands/64x64_righthand.dmi # icons/obj/machines/computer.dmi # tgui/packages/tgui/interfaces/OperatingComputer.jsx # tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/MainPage.tsx # tgui/packages/tgui/interfaces/PreferencesMenu/types.ts # tgui/packages/tgui/interfaces/SurgeryInitiator.tsx # tools/icon_cutter/check.py
This commit is contained in:
@@ -16,7 +16,7 @@
|
||||
/// What sound plays when a thing operates?
|
||||
var/usage_sound = 'sound/machines/mining/wooping_teleport.ogg'
|
||||
/// Silo link to its materials list.
|
||||
var/datum/component/remote_materials/silo_materials
|
||||
var/datum/remote_materials/silo_materials
|
||||
/// Mining points held by the machine for miners.
|
||||
var/points_held = 0
|
||||
///The action verb to display to players
|
||||
@@ -30,8 +30,8 @@
|
||||
/obj/machinery/bouldertech/Initialize(mapload)
|
||||
. = ..()
|
||||
|
||||
silo_materials = AddComponent(
|
||||
/datum/component/remote_materials, \
|
||||
silo_materials = new (
|
||||
src, \
|
||||
mapload, \
|
||||
mat_container_flags = MATCONTAINER_NO_INSERT \
|
||||
)
|
||||
@@ -46,7 +46,7 @@
|
||||
AddElement(/datum/element/connect_loc, loc_connections)
|
||||
|
||||
/obj/machinery/bouldertech/Destroy()
|
||||
silo_materials = null
|
||||
QDEL_NULL(silo_materials)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/bouldertech/on_deconstruction(disassembled)
|
||||
|
||||
@@ -84,7 +84,7 @@
|
||||
/obj/item/grapple_gun/proc/on_grapple_hit(datum/source, atom/movable/firer, atom/target, Angle)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
UnregisterSignal(source, list(COMSIG_PROJECTILE_ON_HIT, COMSIG_PREQDELETED))
|
||||
UnregisterSignal(source, list(COMSIG_PROJECTILE_SELF_ON_HIT, COMSIG_PREQDELETED))
|
||||
QDEL_NULL(zipline)
|
||||
var/mob/living/user = zipliner?.resolve()
|
||||
if(isnull(user) || isnull(target))
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
/**********************Kheiral Cuffs**********************/
|
||||
/// Acts as a GPS beacon & connects to station crew monitors from lavaland
|
||||
/obj/item/kheiral_cuffs
|
||||
/obj/item/clothing/accessory/kheiral_cuffs
|
||||
name = "\improper Kheiral cuffs"
|
||||
desc = "A prototype wrist communicator powered by Kheiral Matter. When both ends are clamped to one wrist, acts as a signal range booster for your suit sensors.\n<i>A small engraving on the inside reads, \"NOT HANDCUFFS\"</i>"
|
||||
desc = "A prototype wrist communicator powered by Kheiral Matter. When both ends are clamped to one wrist, acts as a signal range booster for your suit sensors.\n\
|
||||
A small engraving on the inside reads, \"NOT HANDCUFFS\"."
|
||||
icon = 'icons/obj/mining.dmi'
|
||||
icon_state = "strand"
|
||||
worn_icon = 'icons/mob/clothing/hands.dmi'
|
||||
worn_icon_state = "strandcuff"
|
||||
slot_flags = ITEM_SLOT_GLOVES
|
||||
throwforce = 0
|
||||
@@ -15,6 +17,8 @@
|
||||
attack_verb_continuous = list("connects")
|
||||
attack_verb_simple = list("connect")
|
||||
resistance_flags = FIRE_PROOF
|
||||
attachment_slot = NONE // fits as accessory as long as there's an undersuit
|
||||
icon_state_is_worn = FALSE
|
||||
/// If we're in the glove slot
|
||||
var/on_wrist = FALSE
|
||||
/// If the GPS is already on
|
||||
@@ -22,27 +26,27 @@
|
||||
/// If we're off the station's Z-level
|
||||
var/far_from_home = FALSE
|
||||
|
||||
/obj/item/kheiral_cuffs/Initialize(mapload)
|
||||
/obj/item/clothing/accessory/kheiral_cuffs/Initialize(mapload)
|
||||
. = ..()
|
||||
update_icon(UPDATE_OVERLAYS)
|
||||
RegisterSignal(src, COMSIG_MOVABLE_Z_CHANGED, PROC_REF(check_z))
|
||||
|
||||
check_z(new_turf = loc)
|
||||
|
||||
/obj/item/kheiral_cuffs/examine(mob/user)
|
||||
/obj/item/clothing/accessory/kheiral_cuffs/examine(mob/user)
|
||||
. = ..()
|
||||
if(gps_enabled)
|
||||
. += span_notice("The cuff's GPS signal is on.")
|
||||
|
||||
/obj/item/kheiral_cuffs/equipped(mob/user, slot, initial)
|
||||
/obj/item/clothing/accessory/kheiral_cuffs/equipped(mob/user, slot, initial)
|
||||
. = ..()
|
||||
if(!(slot & ITEM_SLOT_GLOVES))
|
||||
if(!(slot & ITEM_SLOT_GLOVES) && !(slot & ITEM_SLOT_ICLOTHING))
|
||||
return
|
||||
on_wrist = TRUE
|
||||
playsound(loc, 'sound/items/weapons/handcuffs.ogg', 30, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
|
||||
connect_kheiral_network(user)
|
||||
|
||||
/obj/item/kheiral_cuffs/dropped(mob/user, silent)
|
||||
/obj/item/clothing/accessory/kheiral_cuffs/dropped(mob/user, silent)
|
||||
. = ..()
|
||||
if(on_wrist)
|
||||
playsound(loc, 'sound/items/weapons/handcuffs.ogg', 30, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
|
||||
@@ -50,7 +54,7 @@
|
||||
remove_kheiral_network(user)
|
||||
|
||||
/// Enables the GPS and adds the multiz trait
|
||||
/obj/item/kheiral_cuffs/proc/connect_kheiral_network(mob/living/user)
|
||||
/obj/item/clothing/accessory/kheiral_cuffs/proc/connect_kheiral_network(mob/living/user)
|
||||
if(gps_enabled)
|
||||
return
|
||||
if(!on_wrist || !far_from_home)
|
||||
@@ -65,17 +69,17 @@
|
||||
gps_enabled = TRUE
|
||||
|
||||
/// Disables the GPS and removes the multiz trait
|
||||
/obj/item/kheiral_cuffs/proc/remove_kheiral_network(mob/user)
|
||||
/obj/item/clothing/accessory/kheiral_cuffs/proc/remove_kheiral_network(mob/user)
|
||||
if(!gps_enabled)
|
||||
return
|
||||
if(on_wrist && far_from_home)
|
||||
return
|
||||
balloon_alert(user, "gps de-activated")
|
||||
balloon_alert(user, "gps de-activated") // GPS component deletes itself when we get on-Z
|
||||
REMOVE_TRAIT(user, TRAIT_MULTIZ_SUIT_SENSORS, REF(src))
|
||||
gps_enabled = FALSE
|
||||
|
||||
/// If we're off the Z-level, set far_from_home = TRUE. If being worn, trigger kheiral_network proc
|
||||
/obj/item/kheiral_cuffs/proc/check_z(datum/source, turf/old_turf, turf/new_turf)
|
||||
/obj/item/clothing/accessory/kheiral_cuffs/proc/check_z(datum/source, turf/old_turf, turf/new_turf)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
if(!isturf(new_turf))
|
||||
@@ -83,23 +87,29 @@
|
||||
|
||||
if(is_station_level(new_turf.z))
|
||||
far_from_home = FALSE
|
||||
// for the "worn on glove slot" case
|
||||
if(isliving(loc))
|
||||
remove_kheiral_network(loc)
|
||||
else if(isliving(loc.loc)) // for the "worn as accessory" case
|
||||
remove_kheiral_network(loc.loc)
|
||||
else
|
||||
far_from_home = TRUE
|
||||
// for the "worn on glove slot" case
|
||||
if(isliving(loc))
|
||||
connect_kheiral_network(loc)
|
||||
else if(isliving(loc.loc)) // for the "worn as accessory" case
|
||||
connect_kheiral_network(loc.loc)
|
||||
|
||||
/obj/item/kheiral_cuffs/worn_overlays(mutable_appearance/standing, isinhands, icon_file)
|
||||
/obj/item/clothing/accessory/kheiral_cuffs/worn_overlays(mutable_appearance/standing, isinhands, icon_file)
|
||||
. = ..()
|
||||
if(!isinhands)
|
||||
. += emissive_appearance(icon_file, "strandcuff_emissive", src, alpha = src.alpha)
|
||||
|
||||
/obj/item/kheiral_cuffs/update_overlays()
|
||||
/obj/item/clothing/accessory/kheiral_cuffs/update_overlays()
|
||||
. = ..()
|
||||
. += emissive_appearance(icon, "strand_light", src, alpha = src.alpha)
|
||||
|
||||
/obj/item/kheiral_cuffs/suicide_act(mob/living/carbon/user)
|
||||
/obj/item/clothing/accessory/kheiral_cuffs/suicide_act(mob/living/carbon/user)
|
||||
if(!ishuman(user))
|
||||
return
|
||||
|
||||
|
||||
@@ -231,7 +231,7 @@
|
||||
for(var/i in 1 to summon_amount)
|
||||
var/turf/drop_off = find_dropoff_turf(target, user)
|
||||
var/mob/living/basic/mining/demon_afterimage/crusher/friend = new(drop_off)
|
||||
friend.faction = list(FACTION_NEUTRAL)
|
||||
friend.set_faction(list(FACTION_NEUTRAL))
|
||||
friend.befriend(user)
|
||||
friend.ai_controller?.set_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET, target)
|
||||
COOLDOWN_START(src, summon_cooldown, 30 SECONDS)
|
||||
|
||||
@@ -4,18 +4,11 @@
|
||||
change_base_icon_state = TRUE
|
||||
new_icon = 'icons/obj/mining.dmi'
|
||||
new_icon_state = "ipickaxe"
|
||||
/// Specifies the icon state for the crusher's appearance in hand. Should appear in both new_lefthand_file and new_righthand_file.
|
||||
var/new_inhand_icon = "ipickaxe"
|
||||
new_inhand_icon_state = "ipickaxe"
|
||||
/// Specifies the icon file in which the crusher's projectile sprite is located.
|
||||
var/new_projectile_icon = 'icons/obj/weapons/guns/projectiles.dmi'
|
||||
/// For if the retool kit changes the projectile's appearance.
|
||||
var/new_projectile_icon_state
|
||||
/// Specifies the left hand inhand icon file. Don't forget to set the right hand file as well.
|
||||
var/new_lefthand_file
|
||||
/// Specifies the right hand inhand icon file. Don't forget to set the left hand file as well.
|
||||
var/new_righthand_file
|
||||
/// Specifies the worn icon file.
|
||||
var/new_worn_file
|
||||
/// Specifies the X dimensions of the new inhand, only relevant with different inhand files.
|
||||
var/new_inhandx
|
||||
/// Specifies the Y dimensions of the new inhand, only relevant with different inhand files.
|
||||
@@ -23,25 +16,15 @@
|
||||
|
||||
/datum/atom_skin/crusher_skin/apply(obj/item/kinetic_crusher/apply_to)
|
||||
. = ..()
|
||||
APPLY_VAR_OR_RESET_INITIAL(apply_to, inhand_icon_state, new_inhand_icon, reset_missing)
|
||||
APPLY_VAR_OR_RESET_INITIAL(apply_to, projectile_icon, new_projectile_icon, reset_missing)
|
||||
APPLY_VAR_OR_RESET_INITIAL(apply_to, projectile_icon_state, new_projectile_icon_state, reset_missing)
|
||||
APPLY_VAR_OR_RESET_INITIAL(apply_to, lefthand_file, new_lefthand_file, reset_missing)
|
||||
APPLY_VAR_OR_RESET_INITIAL(apply_to, righthand_file, new_righthand_file, reset_missing)
|
||||
APPLY_VAR_OR_RESET_INITIAL(apply_to, worn_icon, new_worn_file, reset_missing)
|
||||
APPLY_VAR_OR_RESET_INITIAL(apply_to, worn_icon_state, new_icon_state, reset_missing)
|
||||
APPLY_VAR_OR_RESET_INITIAL(apply_to, inhand_x_dimension, new_inhandx, reset_missing)
|
||||
APPLY_VAR_OR_RESET_INITIAL(apply_to, inhand_y_dimension, new_inhandy, reset_missing)
|
||||
|
||||
/datum/atom_skin/crusher_skin/clear_skin(obj/item/kinetic_crusher/clear_from)
|
||||
. = ..()
|
||||
RESET_INITIAL_IF_SET(clear_from, inhand_icon_state, new_inhand_icon)
|
||||
RESET_INITIAL_IF_SET(clear_from, projectile_icon, new_projectile_icon)
|
||||
RESET_INITIAL_IF_SET(clear_from, projectile_icon_state, new_projectile_icon_state)
|
||||
RESET_INITIAL_IF_SET(clear_from, lefthand_file, new_lefthand_file)
|
||||
RESET_INITIAL_IF_SET(clear_from, righthand_file, new_righthand_file)
|
||||
RESET_INITIAL_IF_SET(clear_from, worn_icon, new_worn_file)
|
||||
RESET_INITIAL_IF_SET(clear_from, worn_icon_state, new_icon_state)
|
||||
RESET_INITIAL_IF_SET(clear_from, inhand_x_dimension, new_inhandx)
|
||||
RESET_INITIAL_IF_SET(clear_from, inhand_y_dimension, new_inhandy)
|
||||
|
||||
@@ -49,20 +32,20 @@
|
||||
new_name = "proto-kinetic sword"
|
||||
preview_name = "Sword"
|
||||
new_icon_state = "crusher_sword"
|
||||
new_inhand_icon = "crusher_sword"
|
||||
new_inhand_icon_state = "crusher_sword"
|
||||
|
||||
/datum/atom_skin/crusher_skin/harpoon
|
||||
new_name = "proto-kinetic harpoon"
|
||||
preview_name = "Harpoon"
|
||||
new_icon_state = "crusher_harpoon"
|
||||
new_inhand_icon = "crusher_harpoon"
|
||||
new_inhand_icon_state = "crusher_harpoon"
|
||||
new_projectile_icon_state = "pulse_harpoon"
|
||||
|
||||
/datum/atom_skin/crusher_skin/harpoon/apply(atom/apply_to)
|
||||
/datum/atom_skin/crusher_skin/harpoon/apply(atom/apply_to, mob/user)
|
||||
. = ..()
|
||||
RegisterSignal(apply_to, COMSIG_ITEM_ATTACK_ANIMATION, PROC_REF(on_attack_animation))
|
||||
|
||||
/datum/atom_skin/crusher_skin/harpoon/clear_skin(atom/clear_from)
|
||||
/datum/atom_skin/crusher_skin/harpoon/clear_skin(atom/clear_from, mob/user)
|
||||
. = ..()
|
||||
UnregisterSignal(clear_from, COMSIG_ITEM_ATTACK_ANIMATION)
|
||||
|
||||
@@ -77,14 +60,14 @@
|
||||
new_name = "proto-kinetic dual dagger and blaster"
|
||||
preview_name = "Dagger and Blaster"
|
||||
new_icon_state = "crusher_dagger"
|
||||
new_inhand_icon = "crusher_dagger"
|
||||
new_inhand_icon_state = "crusher_dagger"
|
||||
|
||||
/datum/atom_skin/crusher_skin/dagger/apply(atom/apply_to)
|
||||
/datum/atom_skin/crusher_skin/dagger/apply(atom/apply_to, mob/user)
|
||||
. = ..()
|
||||
RegisterSignal(apply_to, COMSIG_ITEM_ATTACK_ANIMATION, PROC_REF(on_attack_animation))
|
||||
RegisterSignal(apply_to, COMSIG_CRUSHER_FIRED_BLAST, PROC_REF(on_fired_blast))
|
||||
|
||||
/datum/atom_skin/crusher_skin/dagger/clear_skin(atom/clear_from)
|
||||
/datum/atom_skin/crusher_skin/dagger/clear_skin(atom/clear_from, mob/user)
|
||||
. = ..()
|
||||
UnregisterSignal(clear_from, COMSIG_ITEM_ATTACK_ANIMATION)
|
||||
UnregisterSignal(clear_from, COMSIG_CRUSHER_FIRED_BLAST)
|
||||
@@ -120,7 +103,7 @@
|
||||
new_name = "proto-kinetic glaive"
|
||||
preview_name = "Glaive"
|
||||
new_icon_state = "crusher_glaive"
|
||||
new_inhand_icon = "crusher_glaive"
|
||||
new_inhand_icon_state = "crusher_glaive"
|
||||
new_lefthand_file = 'icons/mob/inhands/64x64_lefthand.dmi'
|
||||
new_righthand_file = 'icons/mob/inhands/64x64_righthand.dmi'
|
||||
new_inhandx = 64
|
||||
@@ -133,7 +116,7 @@
|
||||
/datum/atom_skin/crusher_skin/locked/ashen_skull
|
||||
preview_name = "Skull"
|
||||
new_icon_state = "crusher_skull"
|
||||
new_inhand_icon = "crusher_skull"
|
||||
new_inhand_icon_state = "crusher_skull"
|
||||
new_projectile_icon_state = "pulse_skull"
|
||||
|
||||
/// Unlockable (or forced) skins
|
||||
|
||||
@@ -19,5 +19,6 @@
|
||||
state_normal = "weatherwarning", \
|
||||
state_warning = "urgentwarning", \
|
||||
state_danger = "direwarning", \
|
||||
radar_z_trait = ZTRAIT_MINING, \
|
||||
)
|
||||
set_frequency(FREQ_SUPPLY)
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
qdel(src)
|
||||
|
||||
// Every x seconds, if on lavaland, add one stack
|
||||
/obj/item/organ/monster_core/brimdust_sac/on_life(seconds_per_tick, times_fired)
|
||||
/obj/item/organ/monster_core/brimdust_sac/on_life(seconds_per_tick)
|
||||
. = ..()
|
||||
if(!COOLDOWN_FINISHED(src, brimdust_auto_apply_cooldown))
|
||||
return
|
||||
@@ -47,7 +47,7 @@
|
||||
/// Make a cloud which applies brimdust to everyone nearby
|
||||
/obj/item/organ/monster_core/brimdust_sac/on_triggered_internal()
|
||||
var/turf/origin_turf = get_turf(owner)
|
||||
do_smoke(range = 2, holder = owner, location = origin_turf, smoke_type = /obj/effect/particle_effect/fluid/smoke/bad/brimdust)
|
||||
do_smoke(2, owner, origin_turf, effect_type = /obj/effect/particle_effect/fluid/smoke/bad/brimdust)
|
||||
|
||||
/// Smoke which applies brimdust to you, and is also bad for your lungs
|
||||
/obj/effect/particle_effect/fluid/smoke/bad/brimdust
|
||||
|
||||
@@ -99,7 +99,7 @@
|
||||
|
||||
/obj/item/organ/monster_core/on_mob_remove(mob/living/carbon/target_carbon, special, movement_flags)
|
||||
if (!inert && !special)
|
||||
owner.visible_message(span_notice("[src] rapidly decays as it's removed."))
|
||||
target_carbon?.visible_message(span_notice("[src] rapidly decays as it's removed."))
|
||||
go_inert()
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
return
|
||||
SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "inert"))
|
||||
|
||||
/obj/item/organ/monster_core/regenerative_core/on_life(seconds_per_tick, times_fired)
|
||||
/obj/item/organ/monster_core/regenerative_core/on_life(seconds_per_tick)
|
||||
. = ..()
|
||||
if (owner.health <= owner.crit_threshold)
|
||||
trigger_organ_action(TRIGGER_FORCE_AVAILABLE)
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
user_status = /datum/status_effect/lobster_rush
|
||||
actions_types = list(/datum/action/cooldown/monster_core_action/adrenal_boost)
|
||||
|
||||
/obj/item/organ/monster_core/rush_gland/on_life(seconds_per_tick, times_fired)
|
||||
/obj/item/organ/monster_core/rush_gland/on_life(seconds_per_tick)
|
||||
. = ..()
|
||||
if (owner.health <= HEALTH_DANGER_ZONE)
|
||||
trigger_organ_action()
|
||||
|
||||
@@ -214,11 +214,8 @@
|
||||
pixel_x = base_pixel_x + rand(-4, 4)
|
||||
pixel_y = base_pixel_y + rand(-4, 4)
|
||||
|
||||
/obj/item/food/grown/ash_flora/shavings //So we can't craft bowls from everything.
|
||||
special_desc_requirement = EXAMINE_CHECK_JOB //SKYRAT EDIT
|
||||
special_desc_jobs = list("Botanist") //SKYRAT EDIT
|
||||
special_desc = "You feel this flora would be unwise to consume while already full." //SKYRAT EDIT
|
||||
grind_results = list(/datum/reagent/toxin/mushroom_powder = 5)
|
||||
/obj/item/food/grown/ash_flora/shavings/grind_results()
|
||||
return list(/datum/reagent/toxin/mushroom_powder = 5)
|
||||
|
||||
/obj/item/food/grown/ash_flora/mushroom_leaf
|
||||
name = "mushroom leaf"
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
desc = "I cry I pray mon Dieu."
|
||||
icon = 'icons/obj/mining_zones/artefacts.dmi'
|
||||
lefthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' //same sprite as lefthand
|
||||
righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
|
||||
icon_state = "cain_and_abel"
|
||||
inhand_icon_state = "cain_and_abel"
|
||||
attack_verb_continuous = list("attacks", "saws", "slices", "tears", "lacerates", "rips", "dices", "cuts")
|
||||
@@ -36,12 +36,13 @@
|
||||
var/throw_mode = THROW_MODE_CRYSTALS
|
||||
/// Flames we have up!
|
||||
var/list/current_wisps = list()
|
||||
/// Have we thrown the second dagger yet?
|
||||
var/dagger_thrown = FALSE
|
||||
/// Cooldown till we can throw blades again
|
||||
COOLDOWN_DECLARE(throw_cooldown)
|
||||
|
||||
/obj/item/cain_and_abel/Initialize(mapload)
|
||||
. = ..()
|
||||
AddComponent(/datum/component/two_handed, require_twohands = TRUE, force_unwielded = force, force_wielded = force)
|
||||
if (length(animation_steps))
|
||||
return
|
||||
|
||||
@@ -64,11 +65,10 @@
|
||||
source.RemoveElement(/datum/element/relay_attackers)
|
||||
|
||||
set_combo(new_value = 0, user = source)
|
||||
UnregisterSignal(source, list(COMSIG_ATOM_WAS_ATTACKED))
|
||||
UnregisterSignal(source, list(COMSIG_ATOM_WAS_ATTACKED, COMSIG_MOB_UPDATE_HELD_ITEMS))
|
||||
|
||||
/obj/item/cain_and_abel/equipped(mob/user, slot)
|
||||
. = ..()
|
||||
|
||||
if(!(slot & ITEM_SLOT_HANDS))
|
||||
unset_user(user)
|
||||
return
|
||||
@@ -77,6 +77,7 @@
|
||||
user.AddElement(/datum/element/relay_attackers)
|
||||
|
||||
RegisterSignal(user, COMSIG_ATOM_WAS_ATTACKED, PROC_REF(on_attacked))
|
||||
RegisterSignal(user, COMSIG_MOB_UPDATE_HELD_ITEMS, PROC_REF(on_updated_held_items))
|
||||
|
||||
/obj/item/cain_and_abel/proc/on_attacked(datum/source, atom/attacker, attack_flags)
|
||||
SIGNAL_HANDLER
|
||||
@@ -86,6 +87,10 @@
|
||||
if(get_dist(interacting_with, user) > 9 || interacting_with.z != user.z)
|
||||
return NONE
|
||||
|
||||
if(!check_wield(user))
|
||||
user.balloon_alert(user, "offhand busy!")
|
||||
return ITEM_INTERACT_BLOCKING
|
||||
|
||||
if(!length(current_wisps))
|
||||
user.balloon_alert(user, "no wisps!")
|
||||
return ITEM_INTERACT_BLOCKING
|
||||
@@ -94,6 +99,14 @@
|
||||
addtimer(CALLBACK(src, PROC_REF(fire_wisp), user, interacting_with), index * 0.15 SECONDS)
|
||||
return ITEM_INTERACT_SUCCESS
|
||||
|
||||
/obj/item/cain_and_abel/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers)
|
||||
. = ..()
|
||||
if (.)
|
||||
return
|
||||
if(!check_wield(user))
|
||||
user.balloon_alert(user, "offhand busy!")
|
||||
return TRUE
|
||||
|
||||
/obj/item/cain_and_abel/attack(mob/living/target, mob/living/carbon/human/user)
|
||||
if(!istype(target) || target.mob_size < MOB_SIZE_LARGE || target.stat == DEAD)
|
||||
attack_speed = CLICK_CD_MELEE
|
||||
@@ -129,6 +142,13 @@
|
||||
|
||||
combo_count = new_value
|
||||
|
||||
/obj/item/cain_and_abel/proc/on_updated_held_items(mob/living/source)
|
||||
SIGNAL_HANDLER
|
||||
update_dagger_icon()
|
||||
|
||||
/obj/item/cain_and_abel/proc/update_dagger_icon()
|
||||
inhand_icon_state = "[src::inhand_icon_state][(dagger_thrown || !check_wield(loc)) ? "_thrown" : ""]"
|
||||
|
||||
/obj/item/cain_and_abel/proc/add_wisp(mob/living/user)
|
||||
var/obj/effect/overlay/blood_wisp/new_wisp = new(src)
|
||||
current_wisps += new_wisp
|
||||
@@ -181,6 +201,18 @@
|
||||
animate(wisp_to_remove, alpha = 0, time = 0.2 SECONDS)
|
||||
QDEL_IN(wisp_to_remove, 0.2 SECONDS)
|
||||
|
||||
/obj/item/cain_and_abel/proc/check_wield(mob/living/user)
|
||||
if (!istype(user))
|
||||
return TRUE
|
||||
var/active_item = (src == user.get_active_held_item())
|
||||
var/obj/item/other_held = active_item ? user.get_inactive_held_item() : user.get_active_held_item()
|
||||
if (!isnull(other_held))
|
||||
return FALSE
|
||||
var/obj/item/bodypart/hand = active_item ? user.get_inactive_hand() : user.get_active_hand()
|
||||
if (!hand || hand.bodypart_disabled)
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/// Frame data for cain & abel wisps so we don't have to make list monstrocities
|
||||
/datum/abel_wisp_frame
|
||||
var/x = 0
|
||||
|
||||
@@ -10,12 +10,16 @@
|
||||
|
||||
/datum/action/cooldown/dagger_swing/Activate(atom/target_atom)
|
||||
var/mob/living/living_owner = owner
|
||||
var/obj/item/cain_and_abel = target
|
||||
var/obj/item/cain_and_abel/cain_and_abel = target
|
||||
|
||||
if(!living_owner.is_holding(cain_and_abel))
|
||||
owner.balloon_alert(owner, "must be held")
|
||||
return FALSE
|
||||
|
||||
if(!cain_and_abel.check_wield(owner))
|
||||
owner.balloon_alert(owner, "offhand busy!")
|
||||
return TRUE
|
||||
|
||||
living_owner.apply_status_effect(/datum/status_effect/dagger_swinging)
|
||||
|
||||
var/static/list/possible_sounds = list(
|
||||
|
||||
@@ -11,6 +11,10 @@
|
||||
user.balloon_alert(user, "unable!")
|
||||
return
|
||||
|
||||
if(!check_wield(user))
|
||||
user.balloon_alert(user, "offhand busy!")
|
||||
return
|
||||
|
||||
if(get_dist(target, user) > 9)
|
||||
user.balloon_alert(user, "too far away!")
|
||||
return
|
||||
@@ -52,7 +56,8 @@
|
||||
set_dagger_icon(thrown = FALSE)
|
||||
|
||||
/obj/item/cain_and_abel/proc/set_dagger_icon(thrown = FALSE)
|
||||
inhand_icon_state = "[src::inhand_icon_state][thrown ? "_thrown" : ""]"
|
||||
dagger_thrown = thrown
|
||||
update_dagger_icon()
|
||||
update_inhand_icon()
|
||||
|
||||
/obj/item/cain_and_abel/proc/reset_dagger_icon(datum/source)
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
var/mob/living/carbon/human/stored_owner = active_owner //to avoid infinite looping when dust unequips the pendant
|
||||
active_owner = null
|
||||
to_chat(stored_owner, span_userdanger("You feel your life rapidly slipping away from you!"))
|
||||
stored_owner.dust(TRUE, TRUE)
|
||||
stored_owner.dust(just_ash = TRUE, drop_items = TRUE)
|
||||
|
||||
/obj/item/clothing/neck/necklace/memento_mori/proc/check_health(mob/living/source)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
@@ -40,7 +40,6 @@
|
||||
to_chat(user, span_warning("The snake carving seems to come alive, if only for a moment, before returning to its dormant state, almost as if it finds you incapable of holding its oath."))
|
||||
return
|
||||
var/mob/living/carbon/itemUser = user
|
||||
var/usedHand = itemUser.get_held_index_of_item(src)
|
||||
if(itemUser.has_status_effect(/datum/status_effect/hippocratic_oath))
|
||||
to_chat(user, span_warning("You can't possibly handle the responsibility of more than one rod!"))
|
||||
return
|
||||
@@ -56,9 +55,12 @@
|
||||
to_chat(itemUser, failText)
|
||||
return
|
||||
|
||||
to_chat(itemUser, span_notice("The snake, satisfied with your oath, attaches itself and the rod to your forearm with an inseparable grip. Your thoughts seem to only revolve around the core idea of helping others, and harm is nothing more than a distant, wicked memory..."))
|
||||
var/datum/status_effect/hippocratic_oath/effect = itemUser.apply_status_effect(/datum/status_effect/hippocratic_oath)
|
||||
effect.hand = usedHand
|
||||
apply_oath(itemUser)
|
||||
|
||||
/obj/item/rod_of_asclepius/proc/apply_oath(mob/living/carbon/user)
|
||||
to_chat(user, span_notice("The snake, satisfied with your oath, attaches itself and the rod to your forearm with an inseparable grip. Your thoughts seem to only revolve around the core idea of helping others, and harm is nothing more than a distant, wicked memory..."))
|
||||
var/datum/status_effect/hippocratic_oath/effect = user.apply_status_effect(/datum/status_effect/hippocratic_oath)
|
||||
effect.hand = user.get_held_index_of_item(src)
|
||||
activated()
|
||||
|
||||
/obj/item/rod_of_asclepius/proc/activated()
|
||||
|
||||
@@ -220,6 +220,10 @@
|
||||
|
||||
consumer.set_eye_color("#FEE5A3")
|
||||
consumer.set_species(/datum/species/lizard)
|
||||
consumer.dna.add_mutation(/datum/mutation/firebreath, MUTATION_SOURCE_MUTATOR)
|
||||
var/obj/item/organ/wings/functional/dragon/wings = new()
|
||||
wings.Insert(consumer)
|
||||
|
||||
if(2)
|
||||
to_chat(user, span_danger("Your flesh begins to melt! Miraculously, you seem fine otherwise."))
|
||||
consumer.set_species(/datum/species/skeleton)
|
||||
|
||||
@@ -66,7 +66,7 @@
|
||||
/obj/item/melee/cleaving_saw/attack(mob/living/target, mob/living/carbon/human/user, list/modifiers, list/attack_modifiers)
|
||||
var/is_open = HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)
|
||||
if(!is_open || swiping || !target.density || get_turf(target) == get_turf(user))
|
||||
for(var/found_faction in target.faction)
|
||||
for(var/found_faction in target.get_faction())
|
||||
if(!(found_faction in nemesis_factions))
|
||||
continue
|
||||
if(is_open)
|
||||
|
||||
@@ -151,7 +151,7 @@
|
||||
implant.radio.command = TRUE
|
||||
implant.radio.channels = AI.radio.channels
|
||||
for(var/channel in implant.radio.channels)
|
||||
implant.radio.secure_radio_connections[channel] = add_radio(implant.radio, GLOB.default_radio_channels[channel])
|
||||
LAZYSET(implant.radio.secure_radio_connections, channel, add_radio(implant.radio, GLOB.default_radio_channels[channel]))
|
||||
|
||||
/obj/item/organ/brain/cybernetic/ai/proc/undeploy(datum/source)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
@@ -142,7 +142,7 @@
|
||||
///Proximity monitor associated with this atom, needed for proximity checks.
|
||||
var/datum/proximity_monitor/proximity_monitor
|
||||
///Material container for materials
|
||||
var/datum/component/material_container/materials
|
||||
var/datum/material_container/materials
|
||||
/// What can be input into the machine?
|
||||
var/accepted_type = /obj/item/stack
|
||||
|
||||
@@ -150,8 +150,8 @@
|
||||
. = ..()
|
||||
proximity_monitor = new(src, 1)
|
||||
|
||||
materials = AddComponent( \
|
||||
/datum/component/material_container, \
|
||||
materials = new ( \
|
||||
src, \
|
||||
SSmaterials.materials_by_category[MAT_CATEGORY_SILO], \
|
||||
INFINITY, \
|
||||
MATCONTAINER_EXAMINE, \
|
||||
@@ -163,7 +163,8 @@
|
||||
selected_material = GET_MATERIAL_REF(/datum/material/iron)
|
||||
|
||||
/obj/machinery/mineral/processing_unit/Destroy()
|
||||
materials = null
|
||||
QDEL_NULL(proximity_monitor)
|
||||
QDEL_NULL(materials)
|
||||
mineral_machine = null
|
||||
stored_research = null
|
||||
return ..()
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
/// References the alloys the smelter can create
|
||||
var/datum/techweb/stored_research
|
||||
/// Linkage to the ORM silo
|
||||
var/datum/component/remote_materials/materials
|
||||
var/datum/remote_materials/materials
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/offstation
|
||||
circuit = /obj/item/circuitboard/machine/ore_redemption/offstation
|
||||
@@ -59,8 +59,8 @@
|
||||
local_signals = list(
|
||||
COMSIG_MATCONTAINER_ITEM_CONSUMED = TYPE_PROC_REF(/obj/machinery/mineral/ore_redemption, local_redeem_points)
|
||||
)
|
||||
materials = AddComponent( \
|
||||
/datum/component/remote_materials, \
|
||||
materials = new ( \
|
||||
src, \
|
||||
mapload, \
|
||||
mat_container_signals = local_signals \
|
||||
)
|
||||
@@ -70,7 +70,7 @@
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/Destroy()
|
||||
stored_research = null
|
||||
materials = null
|
||||
QDEL_NULL(materials)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/mineral/ore_redemption/examine(mob/user)
|
||||
@@ -92,7 +92,7 @@
|
||||
|
||||
/// Returns the amount of a specific alloy design, based on the accessible materials
|
||||
/obj/machinery/mineral/ore_redemption/proc/can_smelt_alloy(datum/design/D)
|
||||
var/datum/component/material_container/mat_container = materials.mat_container
|
||||
var/datum/material_container/mat_container = materials.mat_container
|
||||
if(!mat_container || D.make_reagent)
|
||||
return FALSE
|
||||
|
||||
@@ -119,7 +119,7 @@
|
||||
|
||||
/// Sends a message to the request consoles that signed up for ore updates
|
||||
/obj/machinery/mineral/ore_redemption/proc/send_console_message()
|
||||
var/datum/component/material_container/mat_container = materials.mat_container
|
||||
var/datum/material_container/mat_container = materials.mat_container
|
||||
if(!mat_container || !is_station_level(z))
|
||||
return
|
||||
|
||||
@@ -160,6 +160,7 @@
|
||||
gathered_ores += tool
|
||||
else if(tool.atom_storage && !tool.atom_storage.locked)
|
||||
tool.atom_storage.remove_type(/obj/item/stack/ore, src, check_adjacent = TRUE, user = user, inserted = gathered_ores)
|
||||
|
||||
if(!gathered_ores.len)
|
||||
return ..()
|
||||
|
||||
@@ -168,7 +169,7 @@
|
||||
if(isnull(smelted_ore))
|
||||
continue
|
||||
|
||||
if(materials.insert_item(smelted_ore, ore_multiplier) <= 0)
|
||||
if(materials.insert_item(smelted_ore, ore_multiplier, ID_DATA(user)) <= 0)
|
||||
unload_mineral(smelted_ore)
|
||||
|
||||
return ITEM_INTERACT_SUCCESS
|
||||
@@ -176,9 +177,13 @@
|
||||
/obj/machinery/mineral/ore_redemption/pickup_item(datum/source, atom/movable/target, direction)
|
||||
if(QDELETED(target))
|
||||
return
|
||||
|
||||
if(!materials.mat_container || panel_open || !powered())
|
||||
return
|
||||
|
||||
var/alist/user_data = null
|
||||
if (isliving(target.pulledby))
|
||||
user_data = ID_DATA(target.pulledby)
|
||||
//gethering the ore
|
||||
var/list/obj/item/stack/ore/ore_list = list()
|
||||
if(istype(target, /obj/structure/ore_box))
|
||||
@@ -196,7 +201,7 @@
|
||||
if(isnull(smelted_ore))
|
||||
continue
|
||||
|
||||
if(materials.insert_item(smelted_ore, ore_multiplier) <= 0)
|
||||
if(materials.insert_item(smelted_ore, ore_multiplier, user_data) <= 0)
|
||||
unload_mineral(smelted_ore) //if rejected unload
|
||||
|
||||
if(!console_notify_timer)
|
||||
@@ -245,7 +250,7 @@
|
||||
var/list/data = list()
|
||||
data["unclaimedPoints"] = points
|
||||
data["materials"] = list()
|
||||
var/datum/component/material_container/mat_container = materials.mat_container
|
||||
var/datum/material_container/mat_container = materials.mat_container
|
||||
if (mat_container)
|
||||
for(var/datum/material/material as anything in mat_container.materials)
|
||||
var/amount = mat_container.materials[material]
|
||||
@@ -305,7 +310,7 @@
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
var/datum/component/material_container/mat_container = materials.mat_container
|
||||
var/datum/material_container/mat_container = materials.mat_container
|
||||
switch(action)
|
||||
if("Claim")
|
||||
//requires silo but silo not in range
|
||||
|
||||
@@ -38,9 +38,9 @@
|
||||
/// List of all connected components that are on hold from accessing materials.
|
||||
var/list/holds = list()
|
||||
/// List of all components that are sharing ores with this silo.
|
||||
var/list/datum/component/remote_materials/ore_connected_machines = list()
|
||||
var/list/datum/remote_materials/ore_connected_machines = list()
|
||||
/// Material Container
|
||||
var/datum/component/material_container/materials
|
||||
var/datum/material_container/materials
|
||||
/// A list of names of bank account IDs that are banned from using this ore silo.
|
||||
var/list/banned_users = list()
|
||||
///The machine's internal radio, used to broadcast alerts.
|
||||
@@ -71,8 +71,8 @@
|
||||
/obj/machinery/ore_silo/Initialize(mapload)
|
||||
. = ..()
|
||||
|
||||
materials = AddComponent( \
|
||||
/datum/component/material_container, \
|
||||
materials = new ( \
|
||||
src, \
|
||||
SSmaterials.materials_by_category[MAT_CATEGORY_SILO], \
|
||||
INFINITY, \
|
||||
MATCONTAINER_EXAMINE, \
|
||||
@@ -95,11 +95,11 @@
|
||||
if (GLOB.ore_silo_default == src)
|
||||
GLOB.ore_silo_default = null
|
||||
|
||||
for(var/datum/component/remote_materials/mats as anything in ore_connected_machines)
|
||||
for(var/datum/remote_materials/mats as anything in ore_connected_machines)
|
||||
mats.disconnect()
|
||||
|
||||
ore_connected_machines = null
|
||||
materials = null
|
||||
QDEL_NULL(materials)
|
||||
QDEL_NULL(radio)
|
||||
|
||||
return ..()
|
||||
@@ -125,7 +125,7 @@
|
||||
/obj/machinery/ore_silo/examine(mob/user)
|
||||
. = ..()
|
||||
. += span_notice("It can be linked to techfabs, circuit printers and protolathes with a multitool.")
|
||||
. += span_notice("Its maintainence panel can be [EXAMINE_HINT("screwed")] [panel_open ? "closed" : "open"].")
|
||||
. += span_notice("Its maintenance panel can be [EXAMINE_HINT("screwed")] [panel_open ? "closed" : "open"].")
|
||||
if(panel_open)
|
||||
. += span_notice("The whole machine can be [EXAMINE_HINT("pried")] apart.")
|
||||
|
||||
@@ -146,14 +146,14 @@
|
||||
context[SCREENTIP_CONTEXT_LMB] = "Deconstruct"
|
||||
return CONTEXTUAL_SCREENTIP_SET
|
||||
|
||||
/obj/machinery/ore_silo/proc/on_item_consumed(datum/component/material_container/container, obj/item/item_inserted, last_inserted_id, mats_consumed, amount_inserted, atom/context, alist/user_data)
|
||||
/obj/machinery/ore_silo/proc/on_item_consumed(datum/material_container/container, obj/item/item_inserted, last_inserted_id, mats_consumed, amount_inserted, atom/context, alist/user_data)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
silo_log(context, "DEPOSITED", amount_inserted, item_inserted.name, mats_consumed, user_data)
|
||||
|
||||
SEND_SIGNAL(context, COMSIG_SILO_ITEM_CONSUMED, container, item_inserted, last_inserted_id, mats_consumed, amount_inserted)
|
||||
|
||||
/obj/machinery/ore_silo/proc/log_sheets_ejected(datum/component/material_container/container, obj/item/stack/sheet/sheets, atom/context, alist/user_data)
|
||||
/obj/machinery/ore_silo/proc/log_sheets_ejected(datum/material_container/container, obj/item/stack/sheet/sheets, atom/context, alist/user_data)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
silo_log(context, "WITHDRAWN", -sheets.amount * SHEET_MATERIAL_AMOUNT, "[sheets.name]", sheets.custom_materials, user_data)
|
||||
@@ -178,12 +178,12 @@
|
||||
* The logic for disconnecting a remote receptacle (RCD, fabricator, etc.) is collected here for sanity's sake
|
||||
* rather than being on specific types. Serves to agnosticize the remote_materials component somewhat rather than
|
||||
* snowflaking code for silos into the component.
|
||||
* * receptacle - The datum/component/remote_materials component that is getting connected.
|
||||
* * receptacle - The datum/remote_materials component that is getting connected.
|
||||
* * physical_receptacle - the actual object in the game world that was connected to our material supply. Typed as atom/movable for
|
||||
* future-proofing against anything that may conceivably one day have remote silo access, such as a cyborg, an implant, structures, vehicles,
|
||||
* and so-on.
|
||||
*/
|
||||
/obj/machinery/ore_silo/proc/connect_receptacle(datum/component/remote_materials/receptacle, atom/movable/physical_receptacle)
|
||||
/obj/machinery/ore_silo/proc/connect_receptacle(datum/remote_materials/receptacle, atom/movable/physical_receptacle)
|
||||
ore_connected_machines += receptacle
|
||||
receptacle.mat_container = src.materials
|
||||
receptacle.silo = src
|
||||
@@ -192,12 +192,12 @@
|
||||
/**
|
||||
* The logic for disconnecting a remote receptacle (RCD, fabricator, etc.) is collected here for sanity's sake
|
||||
* rather than being on specific types. Cleans up references to us and to the receptacle.
|
||||
* * receptacle - The datum/component/remote_materials component that is getting destroyed.
|
||||
* * receptacle - The datum/remote_materials component that is getting destroyed.
|
||||
* * physical_receptacle - the actual object in the game world that was connected to our material supply. Typed as atom/movable for
|
||||
* future-proofing against anything that may conceivably one day have remote silo access, such as a cyborg, an implant, structures, vehicles,
|
||||
* and so-on.
|
||||
*/
|
||||
/obj/machinery/ore_silo/proc/disconnect_receptacle(datum/component/remote_materials/receptacle, atom/movable/physical_receptacle)
|
||||
/obj/machinery/ore_silo/proc/disconnect_receptacle(datum/remote_materials/receptacle, atom/movable/physical_receptacle)
|
||||
ore_connected_machines -= receptacle
|
||||
receptacle.mat_container = null
|
||||
receptacle.silo = null
|
||||
@@ -249,7 +249,7 @@
|
||||
data["materials"] = materials.ui_data()
|
||||
|
||||
data["machines"] = list()
|
||||
for(var/datum/component/remote_materials/remote as anything in ore_connected_machines)
|
||||
for(var/datum/remote_materials/remote as anything in ore_connected_machines)
|
||||
var/atom/parent = remote.parent
|
||||
data["machines"] += list(
|
||||
list(
|
||||
@@ -294,7 +294,7 @@
|
||||
if(isnull(index))
|
||||
return
|
||||
|
||||
var/datum/component/remote_materials/remote = ore_connected_machines[index]
|
||||
var/datum/remote_materials/remote = ore_connected_machines[index]
|
||||
if(isnull(remote))
|
||||
return
|
||||
|
||||
@@ -310,7 +310,7 @@
|
||||
if(isnull(index))
|
||||
return
|
||||
|
||||
var/datum/component/remote_materials/remote = ore_connected_machines[index]
|
||||
var/datum/remote_materials/remote = ore_connected_machines[index]
|
||||
if(isnull(remote))
|
||||
return
|
||||
|
||||
|
||||
@@ -99,7 +99,7 @@
|
||||
var/stk_amt = list()
|
||||
var/stack_list[0] //Key: Type. Value: Instance of type.
|
||||
var/stack_amt = 50 //amount to stack before releassing
|
||||
var/datum/component/remote_materials/materials
|
||||
var/datum/remote_materials/materials
|
||||
var/force_connect = FALSE
|
||||
///Proximity monitor associated with this atom, needed for proximity checks.
|
||||
var/datum/proximity_monitor/proximity_monitor
|
||||
@@ -112,8 +112,8 @@
|
||||
/obj/machinery/mineral/stacking_machine/Initialize(mapload)
|
||||
. = ..()
|
||||
proximity_monitor = new(src, 1)
|
||||
materials = AddComponent(
|
||||
/datum/component/remote_materials, \
|
||||
materials = new (
|
||||
src, \
|
||||
mapload, \
|
||||
FALSE, \
|
||||
(mapload && force_connect) \
|
||||
@@ -123,7 +123,8 @@
|
||||
if(!isnull(console))
|
||||
console.machine = null
|
||||
console = null
|
||||
materials = null
|
||||
QDEL_NULL(proximity_monitor)
|
||||
QDEL_NULL(materials)
|
||||
return ..()
|
||||
|
||||
/obj/machinery/mineral/stacking_machine/HasProximity(atom/movable/entered)
|
||||
|
||||
@@ -553,46 +553,66 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
|
||||
|
||||
/obj/item/coin/gold
|
||||
custom_materials = list(/datum/material/gold = COIN_MATERIAL_AMOUNT)
|
||||
grind_results = list(/datum/reagent/gold = 4)
|
||||
|
||||
/obj/item/coin/gold/grind_results()
|
||||
return list(/datum/reagent/gold = 4)
|
||||
|
||||
/obj/item/coin/silver
|
||||
custom_materials = list(/datum/material/silver = COIN_MATERIAL_AMOUNT)
|
||||
grind_results = list(/datum/reagent/silver = 4)
|
||||
|
||||
/obj/item/coin/silver/grind_results()
|
||||
return list(/datum/reagent/silver = 4)
|
||||
|
||||
/obj/item/coin/diamond
|
||||
custom_materials = list(/datum/material/diamond = COIN_MATERIAL_AMOUNT)
|
||||
grind_results = list(/datum/reagent/carbon = 4)
|
||||
|
||||
/obj/item/coin/diamond/grind_results()
|
||||
return list(/datum/reagent/carbon = 4)
|
||||
|
||||
/obj/item/coin/plasma
|
||||
custom_materials = list(/datum/material/plasma = COIN_MATERIAL_AMOUNT)
|
||||
grind_results = list(/datum/reagent/toxin/plasma = 4)
|
||||
|
||||
/obj/item/coin/plasma/grind_results()
|
||||
return list(/datum/reagent/toxin/plasma = 4)
|
||||
|
||||
/obj/item/coin/uranium
|
||||
custom_materials = list(/datum/material/uranium = COIN_MATERIAL_AMOUNT)
|
||||
grind_results = list(/datum/reagent/uranium = 4)
|
||||
|
||||
/obj/item/coin/uranium/grind_results()
|
||||
return list(/datum/reagent/uranium = 4)
|
||||
|
||||
/obj/item/coin/titanium
|
||||
custom_materials = list(/datum/material/titanium = COIN_MATERIAL_AMOUNT)
|
||||
grind_results = list(/datum/reagent/flash_powder = 4)
|
||||
|
||||
/obj/item/coin/titanium/grind_results()
|
||||
return list(/datum/reagent/flash_powder = 4)
|
||||
|
||||
/obj/item/coin/bananium
|
||||
custom_materials = list(/datum/material/bananium = COIN_MATERIAL_AMOUNT)
|
||||
grind_results = list(/datum/reagent/consumable/nutriment/soup/clown_tears = 4)
|
||||
|
||||
/obj/item/coin/bananium/grind_results()
|
||||
return list(/datum/reagent/consumable/nutriment/soup/clown_tears = 4)
|
||||
|
||||
/obj/item/coin/adamantine
|
||||
custom_materials = list(/datum/material/adamantine = COIN_MATERIAL_AMOUNT)
|
||||
|
||||
/obj/item/coin/mythril
|
||||
custom_materials = list(/datum/material/mythril = COIN_MATERIAL_AMOUNT)
|
||||
grind_results = list(/datum/reagent/medicine/omnizine/godblood = 4)
|
||||
|
||||
/obj/item/coin/mythril/grind_results()
|
||||
return list(/datum/reagent/medicine/omnizine/godblood = 4)
|
||||
|
||||
/obj/item/coin/plastic
|
||||
custom_materials = list(/datum/material/plastic = COIN_MATERIAL_AMOUNT)
|
||||
grind_results = list(/datum/reagent/plastic_polymers = 4)
|
||||
|
||||
/obj/item/coin/plastic/grind_results()
|
||||
return list(/datum/reagent/plastic_polymers = 4)
|
||||
|
||||
/obj/item/coin/runite
|
||||
custom_materials = list(/datum/material/runite = COIN_MATERIAL_AMOUNT)
|
||||
grind_results = list(/datum/reagent/iron = 2, /datum/reagent/consumable/ethanol/ritual_wine = 2)
|
||||
|
||||
/obj/item/coin/runite/grind_results()
|
||||
return list(/datum/reagent/iron = 2, /datum/reagent/consumable/ethanol/ritual_wine = 2)
|
||||
|
||||
/obj/item/coin/twoheaded
|
||||
desc = "Hey, this coin's the same on both sides!"
|
||||
@@ -607,16 +627,20 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
|
||||
heads_name = "valid"
|
||||
material_flags = NONE
|
||||
override_material_worth = TRUE
|
||||
grind_results = list(/datum/reagent/ants = 2, /datum/reagent/consumable/eggyolk = 2)
|
||||
|
||||
/obj/item/coin/iron
|
||||
grind_results = list(/datum/reagent/iron = 4)
|
||||
/obj/item/coin/antagtoken/grind_results()
|
||||
return list(/datum/reagent/ants = 2, /datum/reagent/consumable/eggyolk = 2)
|
||||
|
||||
/obj/item/coin/iron/grind_results()
|
||||
return list(/datum/reagent/iron = 4)
|
||||
|
||||
/obj/item/coin/gold/debug
|
||||
custom_materials = list(/datum/material/gold = COIN_MATERIAL_AMOUNT)
|
||||
grind_results = list(/datum/reagent/gold/cursed = 4)
|
||||
desc = "If you got this somehow, be aware that it will dust you. Almost certainly."
|
||||
|
||||
/obj/item/coin/gold/debug/grind_results()
|
||||
return list(/datum/reagent/gold/cursed = 4)
|
||||
|
||||
/obj/item/coin/gold/debug/attack_self(mob/user)
|
||||
if(cooldown < world.time)
|
||||
if(string_attached) //does the coin have a wire attached
|
||||
@@ -657,10 +681,12 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
|
||||
heads_name = "heretic"
|
||||
has_action = TRUE
|
||||
material_flags = NONE
|
||||
grind_results = list(/datum/reagent/carbon = 5, /datum/reagent/toxin/plasma = 5, /datum/reagent/eldritch = 4)
|
||||
/// The range at which airlocks are effected.
|
||||
var/airlock_range = 5
|
||||
|
||||
/obj/item/coin/eldritch/grind_results()
|
||||
return list(/datum/reagent/carbon = 5, /datum/reagent/toxin/plasma = 5, /datum/reagent/eldritch = 4)
|
||||
|
||||
/obj/item/coin/eldritch/heads_action(mob/user)
|
||||
var/mob/living/living_user = user
|
||||
if(!IS_HERETIC(user))
|
||||
|
||||
@@ -40,12 +40,13 @@
|
||||
|
||||
/datum/voucher_set/mining/crusher_kit
|
||||
name = "Crusher Kit"
|
||||
description = "Contains a kinetic crusher and a pocket fire extinguisher. Kinetic crusher is a versatile melee mining tool capable both of mining and fighting local fauna, however it is difficult to use effectively for anyone but most skilled and/or suicidal miners."
|
||||
description = "Contains a kinetic crusher, expanded pocket oxygen tank and a pocket fire extinguisher. Kinetic crusher is a versatile melee mining tool capable both of mining and fighting local fauna, however it is difficult to use effectively for anyone but most skilled and/or suicidal miners."
|
||||
icon = 'icons/obj/mining.dmi'
|
||||
icon_state = "crusher"
|
||||
set_items = list(
|
||||
/obj/item/kinetic_crusher,
|
||||
/obj/item/extinguisher/mini,
|
||||
/obj/item/tank/internals/emergency_oxygen/engi,
|
||||
)
|
||||
|
||||
/datum/voucher_set/mining/extraction_kit
|
||||
|
||||
Reference in New Issue
Block a user