Files
MrMelbertandGitHub 4b9b820390 Replaces bespoke holy whip-vampire interaction with silver material interaction (#96967)
## About The Pull Request

The holy whip no longer arbitrarily does 2x damage to vampires

The holy whip is now made out of silver, and thus applies bonus burn
damage when hitting vampires

The damage amount has gone down slightly (36 brute -> 18 brute + 12
burn) but it's slightly offset by the fact that the silver burn damage
is calculated against different armor

Silver itself now does more damage on average (from 5 flat to 4-16 based
on material volume) and is no longer completely blocked by any form of
clothing, instead blocked by wound armor

## Why It's Good For The Game

Tying these hardcoded debuffs to more broad game systems is more
sandboxy, which I think is more fun. It establishes consistent rules
that players can follow without needing niche code knowledge or extra
examine tooltips

Yeah it's a bit weaker in practice... but the balance doesn't really
matter anyways since it's a niche Halloween interaction

## Changelog

🆑 Melbert
balance: "Holy whip" null rod no longer arbitrarily does 2x brute damage
to vampires
balance: "Holy whip" null rod is now made of silver, which does bonus
burn damage to vampires (~1.67x damage now)
balance: Silver material weapons deal more burn damage to vampires on
average now (from 5 flat to 4-16, depending on volume of silver in the
weapon)
balance: Silver material weapons are no longer completely blocked by any
form of clothing, instead now reduced / blocked by wound armor
/🆑
2026-07-16 16:06:09 +02:00

959 lines
34 KiB
Plaintext

///Has no special properties.
/datum/material/iron
name = "iron"
desc = "Common iron ore often found in sedimentary and igneous layers of the crust."
color = "#B6BEC2"
mat_flags = MATERIAL_SILO_STORED | MATERIAL_BASIC_RECIPES | MATERIAL_CLASS_METAL | MATERIAL_CLASS_RIGID
mat_properties = list(
MATERIAL_DENSITY = 6,
MATERIAL_HARDNESS = 6,
MATERIAL_FLEXIBILITY = 2,
MATERIAL_REFLECTIVITY = 3,
MATERIAL_ELECTRICAL = 6,
MATERIAL_THERMAL = 7,
MATERIAL_CHEMICAL = 3,
)
sheet_type = /obj/item/stack/sheet/iron
ore_type = /obj/item/stack/ore/iron
material_reagent = /datum/reagent/iron
value_per_unit = 5 / SHEET_MATERIAL_AMOUNT
mat_rust_resistance = RUST_RESISTANCE_BASIC
mineral_rarity = MATERIAL_RARITY_COMMON
points_per_unit = 1 / SHEET_MATERIAL_AMOUNT
points_per_boulder_unit = 1 / SHEET_MATERIAL_AMOUNT
minimum_value_override = 0
tradable = TRUE
tradable_base_quantity = MATERIAL_QUANTITY_COMMON
/datum/material/iron/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item)
. = ..()
if(!HAS_TRAIT(victim, TRAIT_ROCK_EATER))
victim.apply_damage(10, BRUTE, BODY_ZONE_HEAD, wound_bonus = 5)
return TRUE
///Breaks extremely easily but is transparent.
/datum/material/glass
name = "glass"
desc = "Glass forged by melting sand."
color = "#6292AF"
alpha = 150
mat_flags = MATERIAL_SILO_STORED | MATERIAL_BASIC_RECIPES | MATERIAL_CLASS_CRYSTAL | MATERIAL_CLASS_RIGID
mat_properties = list(
MATERIAL_DENSITY = 4,
MATERIAL_HARDNESS = 4,
MATERIAL_FLEXIBILITY = 0,
MATERIAL_REFLECTIVITY = 7,
MATERIAL_ELECTRICAL = 0,
MATERIAL_THERMAL = 4,
MATERIAL_CHEMICAL = 8,
)
material_reagent = /datum/reagent/silicon
sheet_type = /obj/item/stack/sheet/glass
ore_type = /obj/item/stack/ore/glass/basalt
shard_type = /obj/item/shard
debris_type = /obj/effect/decal/cleanable/glass
value_per_unit = 5 / SHEET_MATERIAL_AMOUNT
minimum_value_override = 0
tradable = TRUE
tradable_base_quantity = MATERIAL_QUANTITY_COMMON
mineral_rarity = MATERIAL_RARITY_COMMON
points_per_unit = 1 / SHEET_MATERIAL_AMOUNT
points_per_boulder_unit = 1 / SHEET_MATERIAL_AMOUNT
texture_layer_icon_state = "shine"
/datum/material/glass/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item)
. = ..()
if(!HAS_TRAIT(victim, TRAIT_ROCK_EATER))
victim.apply_damage(10, BRUTE, BODY_ZONE_HEAD, wound_bonus = 5, sharpness = TRUE) //cronch
return TRUE
/datum/material/glass/on_main_applied(atom/source, mat_amount, multiplier)
. = ..()
if(isobj(source) && !isstack(source) && (source.material_flags & MATERIAL_AFFECT_STATISTICS))
source.AddElement(/datum/element/can_shatter, shard_type, round(mat_amount / SHEET_MATERIAL_AMOUNT * multiplier), SFX_SHATTER)
/datum/material/glass/on_main_removed(atom/source, mat_amount, multiplier)
. = ..()
if(isobj(source) && !isstack(source) && (source.material_flags & MATERIAL_AFFECT_STATISTICS))
source.RemoveElement(/datum/element/can_shatter, shard_type, round(mat_amount / SHEET_MATERIAL_AMOUNT * multiplier), SFX_SHATTER)
/// Has no special properties. Could be good against vampires in the future perhaps.
/datum/material/silver
name = "silver"
desc = "A precious metal known for being hated by oversized bats and dogs."
color = "#B5BCBB"
mat_flags = MATERIAL_SILO_STORED | MATERIAL_BASIC_RECIPES | MATERIAL_CLASS_METAL | MATERIAL_CLASS_RIGID
mat_properties = list(
MATERIAL_DENSITY = 7,
MATERIAL_HARDNESS = 4,
MATERIAL_FLEXIBILITY = 3,
MATERIAL_REFLECTIVITY = 8,
MATERIAL_ELECTRICAL = 9,
MATERIAL_THERMAL = 4,
MATERIAL_CHEMICAL = 4,
MATERIAL_VAMPIRES_BANE = 8,
)
sheet_type = /obj/item/stack/sheet/mineral/silver
ore_type = /obj/item/stack/ore/silver
material_reagent = /datum/reagent/silver
value_per_unit = 50 / SHEET_MATERIAL_AMOUNT
tradable = TRUE
tradable_base_quantity = MATERIAL_QUANTITY_UNCOMMON
mineral_rarity = MATERIAL_RARITY_SEMIPRECIOUS
points_per_unit = 16 / SHEET_MATERIAL_AMOUNT
points_per_boulder_unit = 3.5 / SHEET_MATERIAL_AMOUNT
texture_layer_icon_state = "shine"
/datum/material/silver/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item)
. = ..()
if(!HAS_TRAIT(victim, TRAIT_ROCK_EATER))
victim.apply_damage(10, BRUTE, BODY_ZONE_HEAD, wound_bonus = 5)
return TRUE
///Slight force increase
/datum/material/gold
name = "gold"
desc = "All that glitters is not gold."
color = "#E6BB45"
mat_properties = list(
MATERIAL_DENSITY = 9,
MATERIAL_HARDNESS = 3,
MATERIAL_FLEXIBILITY = 3,
MATERIAL_REFLECTIVITY = 6,
MATERIAL_ELECTRICAL = 8,
MATERIAL_THERMAL = 8,
MATERIAL_CHEMICAL = 2,
)
mat_flags = MATERIAL_SILO_STORED | MATERIAL_BASIC_RECIPES | MATERIAL_CLASS_METAL | MATERIAL_CLASS_RIGID
sheet_type = /obj/item/stack/sheet/mineral/gold
ore_type = /obj/item/stack/ore/gold
material_reagent = /datum/reagent/gold
value_per_unit = 125 / SHEET_MATERIAL_AMOUNT
tradable = TRUE
tradable_base_quantity = MATERIAL_QUANTITY_RARE
mineral_rarity = MATERIAL_RARITY_PRECIOUS
points_per_unit = 18 / SHEET_MATERIAL_AMOUNT
points_per_boulder_unit = 4 / SHEET_MATERIAL_AMOUNT
texture_layer_icon_state = "shine"
/datum/material/gold/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item)
. = ..()
if(!HAS_TRAIT(victim, TRAIT_ROCK_EATER))
victim.apply_damage(10, BRUTE, BODY_ZONE_HEAD, wound_bonus = 5)
return TRUE
///Has no special properties
/datum/material/diamond
name = "diamond"
desc = "Highly pressurized carbon."
color = "#C9D8F2"
mat_flags = MATERIAL_SILO_STORED | MATERIAL_BASIC_RECIPES | MATERIAL_CLASS_CRYSTAL | MATERIAL_CLASS_RIGID
mat_properties = list(
MATERIAL_DENSITY = 4, // Wow these are light
MATERIAL_HARDNESS = 9,
MATERIAL_FLEXIBILITY = 0,
MATERIAL_REFLECTIVITY = 10,
MATERIAL_ELECTRICAL = 0, // Did you know they're also an *extremely* potent insulator, only beaten by some synthetic compounds?
MATERIAL_THERMAL = 9,
MATERIAL_CHEMICAL = 4,
)
sheet_type = /obj/item/stack/sheet/mineral/diamond
ore_type = /obj/item/stack/ore/diamond
material_reagent = /datum/reagent/carbon
alpha = 132
starlight_color = COLOR_BLUE_LIGHT
value_per_unit = 500 / SHEET_MATERIAL_AMOUNT
tradable = TRUE
tradable_base_quantity = MATERIAL_QUANTITY_EXOTIC
mineral_rarity = MATERIAL_RARITY_RARE
points_per_unit = 50 / SHEET_MATERIAL_AMOUNT
points_per_boulder_unit = 10 / SHEET_MATERIAL_AMOUNT
/datum/material/diamond/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item)
. = ..()
if(!HAS_TRAIT(victim, TRAIT_ROCK_EATER))
victim.apply_damage(15, BRUTE, BODY_ZONE_HEAD, wound_bonus = 7)
return TRUE
/// Is slightly radioactive
/datum/material/uranium
name = "uranium"
desc = "Very spicy rocks."
color = "#2C992C"
mat_flags = MATERIAL_SILO_STORED | MATERIAL_BASIC_RECIPES | MATERIAL_CLASS_METAL | MATERIAL_CLASS_RIGID
mat_properties = list(
MATERIAL_DENSITY = 9,
MATERIAL_HARDNESS = 5,
MATERIAL_FLEXIBILITY = 1,
MATERIAL_REFLECTIVITY = 0, // Its a bar of glowing stone
MATERIAL_ELECTRICAL = 6,
MATERIAL_THERMAL = 6,
MATERIAL_CHEMICAL = 6,
MATERIAL_BEAUTY = 0.3, // Overriden cause its ~shiny~
MATERIAL_RADIOACTIVITY = 4,
)
sheet_type = /obj/item/stack/sheet/mineral/uranium
ore_type = /obj/item/stack/ore/uranium
material_reagent = /datum/reagent/uranium
value_per_unit = 100 / SHEET_MATERIAL_AMOUNT
tradable = TRUE
tradable_base_quantity = MATERIAL_QUANTITY_RARE
mineral_rarity = MATERIAL_RARITY_SEMIPRECIOUS
points_per_unit = 30 / SHEET_MATERIAL_AMOUNT
points_per_boulder_unit = 3.5 / SHEET_MATERIAL_AMOUNT
/// Adds firestacks on hit (Still needs support to turn into gas on destruction)
/datum/material/plasma
name = "plasma"
desc = "Isn't plasma a state of matter? Oh whatever."
color = "#BA3692"
mat_flags = MATERIAL_SILO_STORED | MATERIAL_BASIC_RECIPES | MATERIAL_CLASS_CRYSTAL | MATERIAL_CLASS_RIGID
mat_properties = list(
MATERIAL_DENSITY = 6,
MATERIAL_HARDNESS = 4,
MATERIAL_FLEXIBILITY = 0,
MATERIAL_REFLECTIVITY = 8,
MATERIAL_ELECTRICAL = 10,
MATERIAL_THERMAL = 8,
MATERIAL_CHEMICAL = 0,
MATERIAL_FLAMMABILITY = 10, // Literally sets itself on fire from any excitement
MATERIAL_FIRESTACKER = 1,
)
sheet_type = /obj/item/stack/sheet/mineral/plasma
ore_type = /obj/item/stack/ore/plasma
material_reagent = /datum/reagent/toxin/plasma
value_per_unit = 200 / SHEET_MATERIAL_AMOUNT
mineral_rarity = MATERIAL_RARITY_PRECIOUS
points_per_unit = 15 / SHEET_MATERIAL_AMOUNT
points_per_boulder_unit = 2 / SHEET_MATERIAL_AMOUNT
/datum/material/plasma/on_applied(atom/source, mat_amount, multiplier, from_slot)
. = ..()
source.AddComponent(/datum/component/combustible_flooder, GAS_PLASMA, mat_amount * 0.05 * multiplier) //Empty temp arg, fully dependent on whatever ignited it.
if(istype(source, /obj/item/fishing_rod))
ADD_TRAIT(source, TRAIT_ROD_LAVA_USABLE, REF(src))
/datum/material/plasma/on_removed(atom/source, mat_amount, multiplier, from_slot)
. = ..()
qdel(source.GetComponent(/datum/component/combustible_flooder))
if(istype(source, /obj/item/fishing_rod))
ADD_TRAIT(source, TRAIT_ROD_LAVA_USABLE, REF(src))
/// Can cause bluespace effects on use. (Teleportation)
/datum/material/bluespace
name = "bluespace crystal"
desc = "Crystals with bluespace properties."
color = "#2E50B7"
alpha = 200
starlight_color = COLOR_BLUE
mat_flags = MATERIAL_SILO_STORED | MATERIAL_BASIC_RECIPES | MATERIAL_CLASS_CRYSTAL | MATERIAL_CLASS_RIGID
mat_properties = list(
MATERIAL_DENSITY = 2,
MATERIAL_HARDNESS = 8,
MATERIAL_FLEXIBILITY = 0,
MATERIAL_REFLECTIVITY = 10,
MATERIAL_ELECTRICAL = 10,
MATERIAL_THERMAL = 4,
MATERIAL_CHEMICAL = 4,
MATERIAL_BEAUTY = 0.5, // Absolutely mesmerizing
MATERIAL_TELEPORTING = 5,
)
sheet_type = /obj/item/stack/sheet/bluespace_crystal
ore_type = /obj/item/stack/ore/bluespace_crystal
material_reagent = /datum/reagent/bluespace
value_per_unit = 300 / SHEET_MATERIAL_AMOUNT
mineral_rarity = MATERIAL_RARITY_RARE
points_per_unit = 50 / SHEET_MATERIAL_AMOUNT
points_per_boulder_unit = 10 / SHEET_MATERIAL_AMOUNT
tradable = TRUE
tradable_base_quantity = MATERIAL_QUANTITY_EXOTIC
texture_layer_icon_state = "shine"
/datum/material/bluespace/on_main_applied(atom/source, mat_amount, multiplier)
. = ..()
if(istype(source, /obj/item/fishing_rod))
RegisterSignal(source, COMSIG_ROD_BEGIN_FISHING, PROC_REF(on_begin_fishing))
/datum/material/bluespace/proc/on_begin_fishing(obj/item/fishing_rod/rod, datum/fishing_challenge/challenge)
SIGNAL_HANDLER
if(prob(67))
return
var/list/elegible_fish_sources = assoc_to_values(GLOB.preset_fish_sources)
for(var/datum/fish_source/source as anything in elegible_fish_sources)
if(source.fish_source_flags & FISH_SOURCE_FLAG_NO_BLUESPACE_ROD)
elegible_fish_sources -= source
var/datum/fish_source/new_source = pick(elegible_fish_sources)
challenge.register_reward_signals(new_source)
/datum/material/bluespace/on_main_removed(atom/source, mat_amount, multiplier)
. = ..()
if(istype(source, /obj/item/fishing_rod))
UnregisterSignal(source, COMSIG_ROD_BEGIN_FISHING)
///Honks and slips
/datum/material/bananium
name = "bananium"
desc = "Material with hilarious properties."
color = list(460/255, 464/255, 0, 0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0) //obnoxiously bright yellow //It's literally perfect I can't change it
greyscale_color = "#FFF269"
mat_flags = MATERIAL_SILO_STORED | MATERIAL_BASIC_RECIPES | MATERIAL_CLASS_METAL | MATERIAL_CLASS_RIGID
mat_properties = list(
MATERIAL_DENSITY = 4,
MATERIAL_HARDNESS = 6,
MATERIAL_FLEXIBILITY = 2,
MATERIAL_REFLECTIVITY = 4,
MATERIAL_ELECTRICAL = 1, // ...Rubbery?
MATERIAL_THERMAL = 6,
MATERIAL_CHEMICAL = 6,
MATERIAL_BEAUTY = 0.5, // Honk
)
sheet_type = /obj/item/stack/sheet/mineral/bananium
ore_type = /obj/item/stack/ore/bananium
material_reagent = /datum/reagent/consumable/banana
value_per_unit = 1000 / SHEET_MATERIAL_AMOUNT
mineral_rarity = MATERIAL_RARITY_UNDISCOVERED
points_per_unit = 60 / SHEET_MATERIAL_AMOUNT
points_per_boulder_unit = 15 / SHEET_MATERIAL_AMOUNT
/datum/material/bananium/on_applied(atom/source, mat_amount, multiplier, from_slot)
. = ..()
source.LoadComponent(/datum/component/squeak, list('sound/items/bikehorn.ogg'=1), 50 * multiplier, falloff_exponent = 20)
source.AddComponent(/datum/component/slippery, min(mat_amount / 10 * multiplier, 80 * multiplier))
/datum/material/bananium/on_main_applied(atom/source, mat_amount, multiplier)
. = ..()
if(istype(source, /obj/item/fishing_rod))
RegisterSignal(source, COMSIG_ROD_BEGIN_FISHING, PROC_REF(on_begin_fishing))
/datum/material/bananium/proc/on_begin_fishing(obj/item/fishing_rod/rod, datum/fishing_challenge/challenge)
SIGNAL_HANDLER
if(prob(40))
RegisterSignal(challenge, COMSIG_FISHING_CHALLENGE_ROLL_REWARD, PROC_REF(roll_funny_fish))
/datum/material/bananium/proc/roll_funny_fish(datum/source, obj/item/fishing_rod/rod, mob/fisherman, atom/location, list/rewards)
SIGNAL_HANDLER
var/static/list/funny_fish = list(
/obj/item/fish/clownfish = 5,
/obj/item/fish/clownfish/lube = 3,
/obj/item/fish/soul = 2,
/obj/item/fish/skin_crab = 2,
/obj/item/fish/donkfish = 2,
)
rewards += pick_weight(funny_fish)
/datum/material/bananium/on_removed(atom/source, mat_amount, multiplier, from_slot)
. = ..()
qdel(source.GetComponent(/datum/component/slippery))
qdel(source.GetComponent(/datum/component/squeak))
/datum/material/bananium/on_main_removed(atom/source, mat_amount, multiplier)
. = ..()
if(istype(source, /obj/item/fishing_rod))
UnregisterSignal(source, COMSIG_ROD_BEGIN_FISHING)
///Mediocre force increase
/datum/material/titanium
name = "titanium"
desc = "Titanium"
color = "#EFEFEF"
mat_properties = list(
MATERIAL_DENSITY = 5,
MATERIAL_HARDNESS = 7,
MATERIAL_FLEXIBILITY = 2,
MATERIAL_REFLECTIVITY = 8,
MATERIAL_ELECTRICAL = 5,
MATERIAL_THERMAL = 4,
MATERIAL_CHEMICAL = 6,
)
mat_flags = MATERIAL_SILO_STORED | MATERIAL_BASIC_RECIPES | MATERIAL_CLASS_METAL | MATERIAL_CLASS_RIGID
sheet_type = /obj/item/stack/sheet/mineral/titanium
ore_type = /obj/item/stack/ore/titanium
value_per_unit = 125 / SHEET_MATERIAL_AMOUNT
points_per_boulder_unit = 3 / SHEET_MATERIAL_AMOUNT
tradable = TRUE
tradable_base_quantity = MATERIAL_QUANTITY_UNCOMMON
mat_rust_resistance = RUST_RESISTANCE_TITANIUM
mineral_rarity = MATERIAL_RARITY_SEMIPRECIOUS
texture_layer_icon_state = "shine"
/datum/material/titanium/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item)
. = ..()
if(!HAS_TRAIT(victim, TRAIT_ROCK_EATER))
victim.apply_damage(15, BRUTE, BODY_ZONE_HEAD, wound_bonus = 7)
return TRUE
/datum/material/runite
name = "runite"
desc = "Runite"
color = "#526F77"
mat_flags = MATERIAL_BASIC_RECIPES | MATERIAL_CLASS_METAL | MATERIAL_CLASS_RIGID
mat_properties = list(
MATERIAL_DENSITY = 9,
MATERIAL_HARDNESS = 9,
MATERIAL_FLEXIBILITY = 1,
MATERIAL_REFLECTIVITY = 0,
MATERIAL_ELECTRICAL = 1,
MATERIAL_THERMAL = 0,
MATERIAL_CHEMICAL = 9,
)
sheet_type = /obj/item/stack/sheet/mineral/runite
value_per_unit = 600 / SHEET_MATERIAL_AMOUNT
mineral_rarity = MATERIAL_RARITY_UNDISCOVERED
points_per_unit = 100 / SHEET_MATERIAL_AMOUNT
points_per_boulder_unit = 20 / SHEET_MATERIAL_AMOUNT
/datum/material/runite/on_applied(atom/source, mat_amount, multiplier, from_slot)
. = ..()
if(istype(source, /obj/item/fishing_rod))
ADD_TRAIT(source, TRAIT_ROD_REMOVE_FISHING_DUD, REF(src)) //light-absorbing, environment-cancelling fishing rod.
/datum/material/runite/on_removed(atom/source, mat_amount, multiplier, from_slot)
. = ..()
if(istype(source, /obj/item/fishing_rod))
REMOVE_TRAIT(source, TRAIT_ROD_REMOVE_FISHING_DUD, REF(src)) //light-absorbing, environment-cancelling fishing rod.
/datum/material/runite/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item)
. = ..()
if(!HAS_TRAIT(victim, TRAIT_ROCK_EATER))
victim.apply_damage(20, BRUTE, BODY_ZONE_HEAD, wound_bonus = 10)
return TRUE
///Force decrease
/datum/material/plastic
name = "plastic"
desc = "Plastic"
color = "#BFB9AC"
mat_flags = MATERIAL_SILO_STORED | MATERIAL_BASIC_RECIPES | MATERIAL_CLASS_POLYMER | MATERIAL_CLASS_RIGID
mat_properties = list(
MATERIAL_DENSITY = 3,
MATERIAL_HARDNESS = 2,
MATERIAL_FLEXIBILITY = 5,
MATERIAL_REFLECTIVITY = 3,
MATERIAL_ELECTRICAL = 1,
MATERIAL_THERMAL = 4,
MATERIAL_CHEMICAL = 4,
MATERIAL_FLAMMABILITY = 4,
)
sheet_type = /obj/item/stack/sheet/plastic
ore_type = /obj/item/stack/ore/slag // No plastic or coal ore, so we use slag.
material_reagent = /datum/reagent/plastic_polymers
value_per_unit = 25 / SHEET_MATERIAL_AMOUNT
mineral_rarity = MATERIAL_RARITY_UNDISCOVERED // Nobody's found oil on lavaland yet.
points_per_unit = 4 / SHEET_MATERIAL_AMOUNT
points_per_boulder_unit = 4 / SHEET_MATERIAL_AMOUNT
/// Force decrease and mushy sound effect. (Not yet implemented)
/datum/material/biomass
name = "biomass"
desc = "Organic matter."
color = "#735b4d"
value_per_unit = 50 / SHEET_MATERIAL_AMOUNT
/datum/material/wood
name = "wood"
desc = "Flexible, durable, but flammable. Hard to come across in space."
color = "#855932"
mat_flags = MATERIAL_BASIC_RECIPES | MATERIAL_CLASS_ORGANIC | MATERIAL_CLASS_RIGID
mat_properties = list(
MATERIAL_DENSITY = 2,
MATERIAL_HARDNESS = 4,
MATERIAL_FLEXIBILITY = 4,
MATERIAL_REFLECTIVITY = 1,
MATERIAL_ELECTRICAL = 8,
MATERIAL_THERMAL = 3,
MATERIAL_CHEMICAL = 1,
MATERIAL_FLAMMABILITY = 6,
MATERIAL_BEAUTY = 0.1, // Pretty patterns
)
sheet_type = /obj/item/stack/sheet/mineral/wood
material_reagent = /datum/reagent/cellulose
value_per_unit = 20 / SHEET_MATERIAL_AMOUNT
texture_layer_icon_state = "woodgrain"
/datum/material/wood/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item)
. = ..()
if(!HAS_TRAIT(victim, TRAIT_ROCK_EATER))
victim.apply_damage(5, BRUTE, BODY_ZONE_HEAD)
return TRUE
/// Stronk force increase
/datum/material/adamantine
name = "adamantine"
desc = "A powerful material made out of magic, I mean science!"
color = "#2B7A74"
mat_properties = list(
MATERIAL_DENSITY = 7,
MATERIAL_HARDNESS = 9,
MATERIAL_FLEXIBILITY = 3,
MATERIAL_REFLECTIVITY = 6,
MATERIAL_ELECTRICAL = 6,
MATERIAL_THERMAL = 1,
MATERIAL_CHEMICAL = 9,
)
mat_flags = MATERIAL_BASIC_RECIPES | MATERIAL_CLASS_METAL | MATERIAL_CLASS_RIGID
sheet_type = /obj/item/stack/sheet/mineral/adamantine
value_per_unit = 500 / SHEET_MATERIAL_AMOUNT
mineral_rarity = MATERIAL_RARITY_UNDISCOVERED // Doesn't naturally spawn on lavaland.
points_per_unit = 100 / SHEET_MATERIAL_AMOUNT
points_per_boulder_unit = 20 / SHEET_MATERIAL_AMOUNT // If it ever needs it, we'll give it
/datum/material/adamantine/on_applied(atom/source, mat_amount, multiplier, from_slot)
. = ..()
if(istype(source, /obj/item/fishing_rod))
ADD_TRAIT(source, TRAIT_ROD_REMOVE_FISHING_DUD, REF(src)) // light-absorbing, environment-cancelling fishing rod.
/datum/material/adamantine/on_removed(atom/source, mat_amount, multiplier, from_slot)
. = ..()
if(istype(source, /obj/item/fishing_rod))
REMOVE_TRAIT(source, TRAIT_ROD_REMOVE_FISHING_DUD, REF(src)) // light-absorbing, environment-cancelling fishing rod.
/datum/material/adamantine/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item)
. = ..()
if(!HAS_TRAIT(victim, TRAIT_ROCK_EATER))
victim.apply_damage(20, BRUTE, BODY_ZONE_HEAD, wound_bonus = 10)
return TRUE
/// RPG Magic.
/datum/material/mythril
name = "mythril"
desc = "How this even exists is byond me"
color = "#f2d5d7"
mat_flags = MATERIAL_BASIC_RECIPES | MATERIAL_CLASS_METAL | MATERIAL_CLASS_RIGID
mat_properties = list(
MATERIAL_DENSITY = 4,
MATERIAL_HARDNESS = 10,
MATERIAL_FLEXIBILITY = 4,
MATERIAL_REFLECTIVITY = 8,
MATERIAL_ELECTRICAL = 6,
MATERIAL_THERMAL = 4,
MATERIAL_CHEMICAL = 9,
MATERIAL_BEAUTY = 0.5,
MATERIAL_INTEGRITY = 2, // This is magic, I ain't gotta explain shit
)
sheet_type = /obj/item/stack/sheet/mineral/mythril
value_per_unit = 1500 / SHEET_MATERIAL_AMOUNT
mineral_rarity = MATERIAL_RARITY_UNDISCOVERED // Doesn't naturally spawn on lavaland.
points_per_unit = 100 / SHEET_MATERIAL_AMOUNT
points_per_boulder_unit = 20 / SHEET_MATERIAL_AMOUNT
/datum/material/mythril/on_applied(atom/source, mat_amount, multiplier, from_slot)
. = ..()
if(isitem(source))
source.AddComponent(/datum/component/fantasy)
ADD_TRAIT(source, TRAIT_INNATELY_FANTASTICAL_ITEM, REF(src)) // DO THIS LAST OR WE WILL NEVER GET OUR BONUSES!!!
/datum/material/mythril/on_removed(atom/source, mat_amount, multiplier, from_slot)
. = ..()
if(isitem(source))
REMOVE_TRAIT(source, TRAIT_INNATELY_FANTASTICAL_ITEM, REF(src)) // DO THIS FIRST OR WE WILL NEVER GET OUR BONUSES DELETED!!!
qdel(source.GetComponent(/datum/component/fantasy))
/datum/material/mythril/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item)
. = ..()
if(!HAS_TRAIT(victim, TRAIT_ROCK_EATER))
victim.apply_damage(20, BRUTE, BODY_ZONE_HEAD, wound_bonus = 10)
return TRUE
//formed when freon react with o2, emits a lot of plasma when heated
/datum/material/hot_ice
name = "hot ice"
desc = "A weird kind of ice, feels warm to the touch"
color = "#88cdf1"
alpha = 150
starlight_color = COLOR_BLUE_LIGHT
mat_flags = MATERIAL_BASIC_RECIPES | MATERIAL_CLASS_CRYSTAL
mat_properties = list(
MATERIAL_DENSITY = 4,
MATERIAL_HARDNESS = 2,
MATERIAL_FLEXIBILITY = 0,
MATERIAL_REFLECTIVITY = 8,
MATERIAL_ELECTRICAL = 9,
MATERIAL_THERMAL = 8,
MATERIAL_CHEMICAL = 4,
MATERIAL_FLAMMABILITY = 10,
MATERIAL_FIRESTACKER = 1,
)
sheet_type = /obj/item/stack/sheet/hot_ice
material_reagent = /datum/reagent/toxin/hot_ice
value_per_unit = 400 / SHEET_MATERIAL_AMOUNT
/datum/material/hot_ice/on_applied(atom/source, mat_amount, multiplier, from_slot)
. = ..()
source.AddComponent(/datum/component/combustible_flooder, GAS_PLASMA, mat_amount * 1.5 * multiplier, (mat_amount * 0.2 + 300) * multiplier)
/datum/material/hot_ice/on_removed(atom/source, mat_amount, multiplier, from_slot)
. = ..()
qdel(source.GetComponent(/datum/component/combustible_flooder))
// It's basically adamantine, but it isn't!
/datum/material/metalhydrogen
name = "Metal Hydrogen"
desc = "Solid metallic hydrogen. Some say it should be impossible"
color = "#62708A"
starlight_color = COLOR_MODERATE_BLUE
mat_flags = MATERIAL_BASIC_RECIPES | MATERIAL_CLASS_METAL | MATERIAL_CLASS_RIGID
mat_properties = list(
MATERIAL_DENSITY = 3,
MATERIAL_HARDNESS = 10,
MATERIAL_FLEXIBILITY = 1,
MATERIAL_REFLECTIVITY = 8,
MATERIAL_ELECTRICAL = 2,
MATERIAL_THERMAL = 2,
MATERIAL_CHEMICAL = 8,
)
sheet_type = /obj/item/stack/sheet/mineral/metal_hydrogen
material_reagent = /datum/reagent/hydrogen
value_per_unit = 700 / SHEET_MATERIAL_AMOUNT
/datum/material/metalhydrogen/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item)
. = ..()
if(!HAS_TRAIT(victim, TRAIT_ROCK_EATER))
victim.apply_damage(15, BRUTE, BODY_ZONE_HEAD, wound_bonus = 7)
return TRUE
//I don't like sand. It's coarse, and rough, and irritating, and it gets everywhere.
/datum/material/sand
name = "sand"
desc = "You know, it's amazing just how structurally sound sand can be."
color = "#EDC9AF"
mat_flags = MATERIAL_BASIC_RECIPES | MATERIAL_CLASS_AMORPHOUS
mat_properties = list(
MATERIAL_DENSITY = 3,
MATERIAL_HARDNESS = 0,
MATERIAL_FLEXIBILITY = 0,
MATERIAL_REFLECTIVITY = 7,
MATERIAL_ELECTRICAL = 1,
MATERIAL_THERMAL = 8,
MATERIAL_CHEMICAL = 4,
)
ore_type = /obj/item/stack/ore/glass
material_reagent = /datum/reagent/silicon
value_per_unit = 2 / SHEET_MATERIAL_AMOUNT
turf_sound_override = FOOTSTEP_SAND
texture_layer_icon_state = "sand"
mat_rust_resistance = RUST_RESISTANCE_BASIC
/datum/material/sand/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item)
. = ..()
victim.adjust_disgust(17)
return TRUE
//And now for our lavaland dwelling friends, sand, but in stone form! Truly revolutionary.
/datum/material/sandstone
name = "sandstone"
desc = "Bialtaakid 'ant taerif ma hdha."
color = "#ECD5A8"
mat_flags = MATERIAL_BASIC_RECIPES
mat_properties = list(
MATERIAL_DENSITY = 4,
MATERIAL_HARDNESS = 3,
MATERIAL_FLEXIBILITY = 0,
MATERIAL_REFLECTIVITY = 2,
MATERIAL_ELECTRICAL = 2,
MATERIAL_THERMAL = 6,
MATERIAL_CHEMICAL = 6,
)
sheet_type = /obj/item/stack/sheet/mineral/sandstone
material_reagent = /datum/reagent/silicon
value_per_unit = 5 / SHEET_MATERIAL_AMOUNT
turf_sound_override = FOOTSTEP_WOOD
texture_layer_icon_state = "brick"
mat_rust_resistance = RUST_RESISTANCE_BASIC
/datum/material/snow
name = "snow"
desc = "There's no business like snow business."
color = COLOR_WHITE
mat_flags = MATERIAL_BASIC_RECIPES | MATERIAL_CLASS_AMORPHOUS
mat_properties = list(
MATERIAL_DENSITY = 2,
MATERIAL_HARDNESS = 1,
MATERIAL_FLEXIBILITY = 0,
MATERIAL_REFLECTIVITY = 6,
MATERIAL_ELECTRICAL = 6,
MATERIAL_THERMAL = 6,
MATERIAL_CHEMICAL = 1,
)
sheet_type = /obj/item/stack/sheet/mineral/snow
material_reagent = /datum/reagent/consumable/ice
turf_sound_override = FOOTSTEP_SAND
texture_layer_icon_state = "sand"
mat_rust_resistance = RUST_RESISTANCE_ORGANIC
/datum/material/runedmetal
name = "runed metal"
desc = "Mir'ntrath barhah Nar'sie."
color = "#504742"
mat_flags = MATERIAL_BASIC_RECIPES | MATERIAL_CLASS_METAL | MATERIAL_CLASS_RIGID
mat_properties = list(
MATERIAL_DENSITY = 7,
MATERIAL_HARDNESS = 7,
MATERIAL_FLEXIBILITY = 3,
MATERIAL_REFLECTIVITY = 2,
MATERIAL_ELECTRICAL = 5,
MATERIAL_THERMAL = 1,
MATERIAL_CHEMICAL = 8,
)
material_reagent = list(/datum/reagent/iron = 1, /datum/reagent/fuel/unholywater = 2)
sheet_type = /obj/item/stack/sheet/runed_metal
value_per_unit = 1500 / SHEET_MATERIAL_AMOUNT
texture_layer_icon_state = "runed"
/datum/material/runedmetal/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item)
. = ..()
if(!HAS_TRAIT(victim, TRAIT_ROCK_EATER))
victim.apply_damage(10, BRUTE, BODY_ZONE_HEAD, wound_bonus = 5)
return TRUE
/datum/material/bronze
name = "bronze"
desc = "Clock Cult? Never heard of it."
color = "#876223"
mat_flags = MATERIAL_BASIC_RECIPES | MATERIAL_CLASS_METAL | MATERIAL_CLASS_RIGID
mat_properties = list(
MATERIAL_DENSITY = 8, // Bronze is *very* dense, almost as dense as lead
MATERIAL_HARDNESS = 5,
MATERIAL_FLEXIBILITY = 3,
MATERIAL_REFLECTIVITY = 7,
MATERIAL_ELECTRICAL = 8,
MATERIAL_THERMAL = 8,
MATERIAL_CHEMICAL = 5,
)
sheet_type = /obj/item/stack/sheet/bronze
material_reagent = list(/datum/reagent/iron = 0.75, /datum/reagent/copper = 0.25)
value_per_unit = 50 / SHEET_MATERIAL_AMOUNT
/datum/material/paper
name = "paper"
desc = "Ten thousand folds of pure starchy power."
color = "#E5DCD5"
mat_flags = MATERIAL_BASIC_RECIPES | MATERIAL_CLASS_ORGANIC
mat_properties = list(
MATERIAL_DENSITY = 0,
MATERIAL_HARDNESS = 0,
MATERIAL_FLEXIBILITY = 8,
MATERIAL_REFLECTIVITY = 1,
MATERIAL_ELECTRICAL = 4,
MATERIAL_THERMAL = 4,
MATERIAL_CHEMICAL = 0,
MATERIAL_FLAMMABILITY = 8,
MATERIAL_BEAUTY = 0.3, // Origami is beautiful
)
material_reagent = /datum/reagent/cellulose
sheet_type = /obj/item/stack/sheet/paperframes
value_per_unit = 5 / SHEET_MATERIAL_AMOUNT
turf_sound_override = FOOTSTEP_SAND
texture_layer_icon_state = "paper"
/datum/material/paper/on_main_applied(atom/source, mat_amount, multiplier)
. = ..()
if(!isobj(source) || !(source.material_flags & MATERIAL_AFFECT_STATISTICS))
return
var/obj/paper = source
paper.obj_flags |= UNIQUE_RENAME
if(istype(paper, /obj/item/fishing_rod))
RegisterSignal(paper, COMSIG_ROD_BEGIN_FISHING, PROC_REF(on_begin_fishing))
/datum/material/paper/proc/on_begin_fishing(obj/item/fishing_rod/rod, datum/fishing_challenge/challenge)
SIGNAL_HANDLER
if(prob(40)) //consider the default reward and it's 15%
RegisterSignal(challenge, COMSIG_FISHING_CHALLENGE_ROLL_REWARD, PROC_REF(roll_stickman))
/datum/material/paper/proc/roll_stickman(datum/source, obj/item/fishing_rod/rod, mob/fisherman, atom/location, list/rewards)
SIGNAL_HANDLER
rewards += pick(/mob/living/basic/stickman, /mob/living/basic/stickman/dog, /mob/living/basic/stickman/ranged)
/datum/material/paper/on_main_removed(atom/source, mat_amount, multiplier)
. = ..()
if(istype(source, /obj/item/fishing_rod) && (source.material_flags & MATERIAL_AFFECT_STATISTICS))
UnregisterSignal(source, COMSIG_ROD_BEGIN_FISHING)
/datum/material/cardboard
name = "cardboard"
desc = "They say cardboard is used by hobos to make incredible things."
color = "#5F625C"
mat_flags = MATERIAL_BASIC_RECIPES | MATERIAL_CLASS_ORGANIC
mat_properties = list(
MATERIAL_DENSITY = 1,
MATERIAL_HARDNESS = 0,
MATERIAL_FLEXIBILITY = 6,
MATERIAL_REFLECTIVITY = 1,
MATERIAL_ELECTRICAL = 4,
MATERIAL_THERMAL = 4,
MATERIAL_CHEMICAL = 2,
MATERIAL_FLAMMABILITY = 6,
)
sheet_type = /obj/item/stack/sheet/cardboard
material_reagent = /datum/reagent/cellulose
value_per_unit = 6 / SHEET_MATERIAL_AMOUNT
/datum/material/cardboard/on_main_applied(atom/source, mat_amount, multiplier)
. = ..()
if(isobj(source) && source.material_flags & MATERIAL_AFFECT_STATISTICS)
var/obj/cardboard = source
cardboard.obj_flags |= UNIQUE_RENAME
/datum/material/bone
name = "bone"
desc = "Man, building with this will make you the coolest caveman on the block."
color = "#e3dac9"
mat_flags = MATERIAL_BASIC_RECIPES | MATERIAL_CLASS_ORGANIC | MATERIAL_CLASS_RIGID
mat_properties = list(
MATERIAL_DENSITY = 3,
MATERIAL_HARDNESS = 5,
MATERIAL_FLEXIBILITY = 2,
MATERIAL_REFLECTIVITY = 4,
MATERIAL_ELECTRICAL = 3,
MATERIAL_THERMAL = 4,
MATERIAL_CHEMICAL = 2,
)
sheet_type = /obj/item/stack/sheet/bone
material_reagent = /datum/reagent/bone_dust
value_per_unit = 100 / SHEET_MATERIAL_AMOUNT
/datum/material/bone/on_main_applied(atom/source, mat_amount, multiplier)
. = ..()
if(istype(source, /obj/item/fishing_rod))
RegisterSignal(source, COMSIG_ROD_BEGIN_FISHING, PROC_REF(on_begin_fishing))
else if(istype(source, /obj/item/fish))
ADD_TRAIT(source, TRAIT_FISH_MADE_OF_BONE, REF(src))
/datum/material/bone/proc/on_begin_fishing(obj/item/fishing_rod/rod, datum/fishing_challenge/challenge)
SIGNAL_HANDLER
if(prob(40))
RegisterSignal(challenge, COMSIG_FISHING_CHALLENGE_ROLL_REWARD, PROC_REF(roll_bones))
/datum/material/bone/proc/roll_bones(datum/source, obj/item/fishing_rod/rod, mob/fisherman, atom/location, list/rewards)
SIGNAL_HANDLER
var/static/list/bones = list(
/obj/item/fish/boned = 65,
/obj/item/fish/mastodon = 8,
/mob/living/basic/skeleton = 6,
/mob/living/basic/skeleton/ice = 6,
/mob/living/basic/skeleton/templar = 6,
/obj/item/instrument/trumpet/spectral/one_doot = 3,
/obj/item/instrument/saxophone/spectral/one_doot = 3,
/obj/item/instrument/trombone/spectral/one_doot = 3,
)
rewards += pick_weight(bones)
/datum/material/bone/on_main_removed(atom/source, mat_amount, multiplier)
. = ..()
if(istype(source, /obj/item/fishing_rod))
UnregisterSignal(source, COMSIG_ROD_BEGIN_FISHING)
else if(istype(source, /obj/item/fish))
REMOVE_TRAIT(source, TRAIT_FISH_MADE_OF_BONE, REF(src))
/datum/material/bamboo
name = "bamboo"
desc = "If it's good enough for pandas, it's good enough for you."
color = "#87a852"
mat_flags = MATERIAL_BASIC_RECIPES | MATERIAL_CLASS_ORGANIC | MATERIAL_CLASS_RIGID
mat_properties = list(
MATERIAL_DENSITY = 3, // Denser and bendier than wood, but pretty much the same otherwise
MATERIAL_HARDNESS = 4,
MATERIAL_FLEXIBILITY = 5,
MATERIAL_REFLECTIVITY = 1,
MATERIAL_ELECTRICAL = 6,
MATERIAL_THERMAL = 3,
MATERIAL_CHEMICAL = 1,
MATERIAL_FLAMMABILITY = 6,
MATERIAL_BEAUTY = 0.2, // Prettier patterns
)
sheet_type = /obj/item/stack/sheet/mineral/bamboo
material_reagent = /datum/reagent/cellulose
value_per_unit = 5 / SHEET_MATERIAL_AMOUNT
turf_sound_override = FOOTSTEP_WOOD
texture_layer_icon_state = "bamboo"
/datum/material/zaukerite
name = "zaukerite"
desc = "A light absorbing crystal"
color = COLOR_ALMOST_BLACK
mat_flags = MATERIAL_BASIC_RECIPES | MATERIAL_CLASS_CRYSTAL | MATERIAL_CLASS_RIGID
mat_properties = list(
MATERIAL_DENSITY = 1,
MATERIAL_HARDNESS = 9,
MATERIAL_FLEXIBILITY = 0,
MATERIAL_REFLECTIVITY = 0,
MATERIAL_ELECTRICAL = 1,
MATERIAL_THERMAL = 9,
MATERIAL_CHEMICAL = 0,
)
sheet_type = /obj/item/stack/sheet/mineral/zaukerite
material_reagent = /datum/reagent/toxin/plasma
value_per_unit = 900 / SHEET_MATERIAL_AMOUNT
/datum/material/zaukerite/on_applied(atom/source, mat_amount, multiplier, from_slot)
. = ..()
if(istype(source, /obj/item/fishing_rod))
ADD_TRAIT(source, TRAIT_ROD_IGNORE_ENVIRONMENT, REF(src)) //light-absorbing, environment-cancelling fishing rod.
/datum/material/zaukerite/on_removed(atom/source, mat_amount, multiplier, from_slot)
. = ..()
if(istype(source, /obj/item/fishing_rod))
REMOVE_TRAIT(source, TRAIT_ROD_IGNORE_ENVIRONMENT, REF(src)) //light-absorbing, environment-cancelling fishing rod.
/datum/material/zaukerite/on_accidental_mat_consumption(mob/living/carbon/victim, obj/item/source_item)
. = ..()
if(!HAS_TRAIT(victim, TRAIT_ROCK_EATER))
victim.apply_damage(30, BURN, BODY_ZONE_HEAD, wound_bonus = 5)
return TRUE
/// Evil and very unstable version of bluespace crystals
/datum/material/telecrystal
name = "telecrystal"
desc = "An ominous-looking gemstone capable of transporting objects vast distances through bluespace."
color = "#BD1B28"
alpha = 200
starlight_color = COLOR_SYNDIE_RED
mat_flags = MATERIAL_BASIC_RECIPES | MATERIAL_CLASS_CRYSTAL | MATERIAL_CLASS_RIGID
mat_properties = list(
MATERIAL_DENSITY = 1,
MATERIAL_HARDNESS = 4,
MATERIAL_FLEXIBILITY = 0,
MATERIAL_REFLECTIVITY = 10,
MATERIAL_ELECTRICAL = 10,
MATERIAL_THERMAL = 2,
MATERIAL_CHEMICAL = 8,
MATERIAL_BEAUTY = -0.5, // very evil bad no good
MATERIAL_TELEPORTING = 8,
MATERIAL_PENETRATING = TRUE,
)
sheet_type = /obj/item/stack/sheet/telepolycrystal
material_reagent = list(/datum/reagent/bluespace = 1, /datum/reagent/medicine/stimulants = 1) // We don't have liquid telecrystals and I don't wanna risk it
value_per_unit = 1200 / SHEET_MATERIAL_AMOUNT
texture_layer_icon_state = "shine"
/datum/material/telecrystal/on_main_applied(atom/source, mat_amount, multiplier)
. = ..()
if(istype(source, /obj/item/fishing_rod))
RegisterSignal(source, COMSIG_ROD_BEGIN_FISHING, PROC_REF(on_begin_fishing))
/datum/material/telecrystal/on_main_removed(atom/source, mat_amount, multiplier)
. = ..()
if(istype(source, /obj/item/fishing_rod))
UnregisterSignal(source, COMSIG_ROD_BEGIN_FISHING)
/datum/material/telecrystal/proc/on_begin_fishing(obj/item/fishing_rod/rod, datum/fishing_challenge/challenge)
SIGNAL_HANDLER
// Oops, all chainsawfish!
challenge.register_reward_signals(GLOB.preset_fish_sources[/datum/fish_source/portal/syndicate])
/datum/material/rock
name = "rock"
desc = "Marble maybe?"
color = "#919191"
mat_flags = MATERIAL_BASIC_RECIPES | MATERIAL_CLASS_RIGID
mat_properties = list(
MATERIAL_DENSITY = 2,
MATERIAL_HARDNESS = 4,
MATERIAL_FLEXIBILITY = 0,
MATERIAL_REFLECTIVITY = 0,
MATERIAL_ELECTRICAL = 0,
MATERIAL_THERMAL = 1,
MATERIAL_CHEMICAL = 0,
MATERIAL_BEAUTY = 0.8,
)
texture_layer_icon_state = "sand"