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:
nevimer
2026-02-12 23:50:09 -05:00
2374 changed files with 81136 additions and 52767 deletions
@@ -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)
+1 -1
View File
@@ -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))
+24 -14
View File
@@ -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()
+2 -5
View File
@@ -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
+5 -4
View File
@@ -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 ..()
+15 -10
View File
@@ -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
+16 -16
View File
@@ -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
+5 -4
View File
@@ -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)
+41 -15
View File
@@ -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))
+2 -1
View File
@@ -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