From c5cbfa64e5931e0cc8f971a95cc80f4a24478cee Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Wed, 24 Jun 2020 20:45:17 +0200 Subject: [PATCH 1/3] Porting further material datum features and improvements. --- code/__DEFINES/_flags/_flags.dm | 17 +- code/__DEFINES/_flags/item_flags.dm | 1 + code/__DEFINES/dcs/signals.dm | 2 + code/__DEFINES/food.dm | 6 +- code/__DEFINES/footsteps.dm | 9 + code/__DEFINES/is_helpers.dm | 2 + code/__DEFINES/materials.dm | 7 +- code/__DEFINES/traits.dm | 8 + code/_onclick/other_mobs.dm | 2 +- code/controllers/subsystem/materials.dm | 30 ++- code/datums/components/edible.dm | 243 ++++++++++++++++++ code/datums/components/radioactive.dm | 5 +- code/datums/elements/beauty.dm | 7 +- code/datums/materials/_material.dm | 62 ++++- code/datums/materials/basemats.dm | 173 ++++++++++--- code/datums/materials/meat.dm | 32 +++ code/datums/materials/pizza.dm | 30 +++ code/game/atoms.dm | 25 +- code/game/machinery/autolathe.dm | 23 +- code/game/machinery/sheetifier.dm | 44 ++++ .../game/mecha/equipment/tools/other_tools.dm | 8 +- code/game/objects/items.dm | 1 + .../circuitboards/machine_circuitboards.dm | 8 + code/game/objects/items/stacks/rods.dm | 1 - .../objects/items/stacks/sheets/mineral.dm | 15 +- .../items/stacks/sheets/sheet_types.dm | 68 ++++- .../objects/items/stacks/sheets/sheets.dm | 12 +- code/game/objects/items/stacks/stack.dm | 31 ++- .../objects/items/stacks/tiles/tile_types.dm | 33 ++- code/game/objects/structures/girders.dm | 14 +- code/game/objects/structures/watercloset.dm | 17 +- code/game/turfs/simulated/floor.dm | 15 +- code/game/turfs/simulated/floor/plating.dm | 14 +- .../turfs/simulated/wall/material_walls.dm | 22 ++ code/game/turfs/turf.dm | 3 + .../bloodsucker/items/bloodsucker_organs.dm | 4 - code/modules/arousal/genitals.dm | 2 +- code/modules/food_and_drinks/food.dm | 3 - .../food_and_drinks/food/snacks/meat.dm | 1 + .../food_and_drinks/food/snacks_pizza.dm | 11 + .../mining/equipment/regenerative_core.dm | 3 - code/modules/mining/ores_coins.dm | 1 - code/modules/mob/living/brain/brain_item.dm | 3 - .../modules/mob/living/carbon/alien/organs.dm | 15 +- .../carbon/alien/special/alien_embryo.dm | 6 +- .../carbon/human/species_types/dwarves.dm | 6 +- .../mob/living/silicon/robot/robot_modules.dm | 2 +- .../boxes_magazines/_box_magazine.dm | 12 +- .../machine_designs_all_misc.dm | 9 + .../modules/research/machinery/_production.dm | 2 +- .../techweb/nodes/engineering_nodes.dm | 4 +- code/modules/surgery/organ_manipulation.dm | 9 +- code/modules/surgery/organs/appendix.dm | 6 - code/modules/surgery/organs/heart.dm | 8 +- code/modules/surgery/organs/liver.dm | 6 +- code/modules/surgery/organs/lungs.dm | 7 +- code/modules/surgery/organs/organ_internal.dm | 63 ++--- code/modules/surgery/organs/tongue.dm | 1 + icons/materials/composite.dmi | Bin 0 -> 2954 bytes icons/obj/machines/sheetifier.dmi | Bin 0 -> 2784 bytes icons/obj/stack_objects.dmi | Bin 46527 -> 50017 bytes icons/obj/tiles.dmi | Bin 16723 -> 17102 bytes icons/turf/floors.dmi | Bin 341205 -> 341396 bytes icons/turf/walls/materialwall.dmi | Bin 0 -> 507 bytes sound/effects/meatslap.ogg | Bin 0 -> 12414 bytes tgstation.dme | 5 + 66 files changed, 945 insertions(+), 234 deletions(-) create mode 100644 code/datums/components/edible.dm create mode 100644 code/datums/materials/meat.dm create mode 100644 code/datums/materials/pizza.dm create mode 100644 code/game/machinery/sheetifier.dm create mode 100644 code/game/turfs/simulated/wall/material_walls.dm create mode 100644 icons/materials/composite.dmi create mode 100644 icons/obj/machines/sheetifier.dmi create mode 100644 icons/turf/walls/materialwall.dmi create mode 100644 sound/effects/meatslap.ogg diff --git a/code/__DEFINES/_flags/_flags.dm b/code/__DEFINES/_flags/_flags.dm index b1324000b8..7daf9fa8a3 100644 --- a/code/__DEFINES/_flags/_flags.dm +++ b/code/__DEFINES/_flags/_flags.dm @@ -145,4 +145,19 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 /// If the thing can reflect light (lasers/energy) #define RICOCHET_SHINY (1<<0) /// If the thing can reflect matter (bullets/bomb shrapnel) -#define RICOCHET_HARD (1<<1) \ No newline at end of file +#define RICOCHET_HARD (1<<1) + +#define KEEP_TOGETHER_ORIGINAL "keep_together_original" + +//setter for KEEP_TOGETHER to allow for multiple sources to set and unset it +#define ADD_KEEP_TOGETHER(x, source)\ + if ((x.appearance_flags & KEEP_TOGETHER) && !HAS_TRAIT(x, TRAIT_KEEP_TOGETHER)) ADD_TRAIT(x, TRAIT_KEEP_TOGETHER, KEEP_TOGETHER_ORIGINAL); \ + ADD_TRAIT(x, TRAIT_KEEP_TOGETHER, source);\ + x.appearance_flags |= KEEP_TOGETHER + +#define REMOVE_KEEP_TOGETHER(x, source)\ + REMOVE_TRAIT(x, TRAIT_KEEP_TOGETHER, source);\ + if(HAS_TRAIT_FROM_ONLY(x, TRAIT_KEEP_TOGETHER, KEEP_TOGETHER_ORIGINAL))\ + REMOVE_TRAIT(x, TRAIT_KEEP_TOGETHER, KEEP_TOGETHER_ORIGINAL);\ + else if(!HAS_TRAIT(x, TRAIT_KEEP_TOGETHER))\ + x.appearance_flags &= ~KEEP_TOGETHER diff --git a/code/__DEFINES/_flags/item_flags.dm b/code/__DEFINES/_flags/item_flags.dm index c6a3886ed3..b3b65bcf59 100644 --- a/code/__DEFINES/_flags/item_flags.dm +++ b/code/__DEFINES/_flags/item_flags.dm @@ -52,3 +52,4 @@ #define ORGAN_VITAL (1<<4) //Currently only the brain #define ORGAN_NO_SPOIL (1<<5) //Do not spoil under any circumstances #define ORGAN_NO_DISMEMBERMENT (1<<6) //Immune to disembowelment. +#define ORGAN_EDIBLE (1<<5) //is a snack? :D \ No newline at end of file diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index 8a88f2dbb6..38524d0e0c 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -35,6 +35,7 @@ #define COMSIG_PARENT_ATTACKBY "atom_attackby" //from base of atom/attackby(): (/obj/item, /mob/living, params) #define COMPONENT_NO_AFTERATTACK 1 //Return this in response if you don't want afterattack to be called #define COMSIG_ATOM_HULK_ATTACK "hulk_attack" //from base of atom/attack_hulk(): (/mob/living/carbon/human) +#define COMSIG_ATOM_ATTACK_ANIMAL "attack_animal" //from base of atom/animal_attack(): (/mob/user) #define COMSIG_PARENT_EXAMINE "atom_examine" //from base of atom/examine(): (/mob, list/examine_return_text) #define COMSIG_ATOM_GET_EXAMINE_NAME "atom_examine_name" //from base of atom/get_examine_name(): (/mob, list/overrides) //Positions for overrides list @@ -280,6 +281,7 @@ #define COMSIG_ITEM_IMBUE_SOUL "item_imbue_soul" //return a truthy value to prevent ensouling, checked in /obj/effect/proc_holder/spell/targeted/lichdom/cast(): (mob/user) #define COMSIG_ITEM_HIT_REACT "item_hit_react" //from base of obj/item/hit_reaction(): (list/args) #define COMSIG_ITEM_WEARERCROSSED "wearer_crossed" //called on item when crossed by something (): (/atom/movable) +#define COMSIG_ITEM_MICROWAVE_ACT "microwave_act" //called on item when microwaved (): (obj/machinery/microwave/M) #define COMSIG_ITEM_WORN_OVERLAYS "item_worn_overlays" //from base of obj/item/worn_overlays(): (isinhands, icon_file, used_state, style_flags, list/overlays) // THE FOLLOWING TWO BLOCKS SHOULD RETURN BLOCK FLAGS AS DEFINED IN __DEFINES/combat.dm! #define COMSIG_ITEM_CHECK_BLOCK "check_block" //from base of obj/item/check_block(): (mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) diff --git a/code/__DEFINES/food.dm b/code/__DEFINES/food.dm index a347fd7327..77e8d82aca 100644 --- a/code/__DEFINES/food.dm +++ b/code/__DEFINES/food.dm @@ -18,4 +18,8 @@ #define DRINK_VERYGOOD 3 #define DRINK_FANTASTIC 4 #define FOOD_AMAZING 5 -#define RACE_DRINK 6 \ No newline at end of file +#define RACE_DRINK 6 + +#define FOOD_IN_CONTAINER (1<<0) + +#define STOP_SERVING_BREAKFAST (15 MINUTES) diff --git a/code/__DEFINES/footsteps.dm b/code/__DEFINES/footsteps.dm index 5acda2274c..2dd66b9833 100644 --- a/code/__DEFINES/footsteps.dm +++ b/code/__DEFINES/footsteps.dm @@ -6,6 +6,7 @@ #define FOOTSTEP_GRASS "grass" #define FOOTSTEP_WATER "water" #define FOOTSTEP_LAVA "lava" +#define FOOTSTEP_MEAT "meat" //barefoot sounds #define FOOTSTEP_WOOD_BAREFOOT "woodbarefoot" #define FOOTSTEP_WOOD_CLAW "woodclaw" @@ -89,6 +90,8 @@ GLOBAL_LIST_INIT(footstep, list( 'sound/effects/footstep/lava1.ogg', 'sound/effects/footstep/lava2.ogg', 'sound/effects/footstep/lava3.ogg'), 100, 0), + FOOTSTEP_MEAT = list(list( + 'sound/effects/meatslap.ogg'), 100, 0) )) //bare footsteps lists @@ -131,6 +134,8 @@ GLOBAL_LIST_INIT(barefootstep, list( 'sound/effects/footstep/lava1.ogg', 'sound/effects/footstep/lava2.ogg', 'sound/effects/footstep/lava3.ogg'), 100, 0), + FOOTSTEP_MEAT = list(list( + 'sound/effects/meatslap.ogg'), 100, 0) )) //claw footsteps lists @@ -173,6 +178,8 @@ GLOBAL_LIST_INIT(clawfootstep, list( 'sound/effects/footstep/lava1.ogg', 'sound/effects/footstep/lava2.ogg', 'sound/effects/footstep/lava3.ogg'), 100, 0), + FOOTSTEP_MEAT = list(list( + 'sound/effects/meatslap.ogg'), 100, 0) )) //heavy footsteps list @@ -189,4 +196,6 @@ GLOBAL_LIST_INIT(heavyfootstep, list( 'sound/effects/footstep/lava1.ogg', 'sound/effects/footstep/lava2.ogg', 'sound/effects/footstep/lava3.ogg'), 100, 0), + FOOTSTEP_MEAT = list(list( + 'sound/effects/meatslap.ogg'), 100, 0) )) diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index de9ada7560..90c7c34f8d 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -135,6 +135,8 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list( #define iscat(A) (istype(A, /mob/living/simple_animal/pet/cat)) +#define isdog(A) (istype(A, /mob/living/simple_animal/pet/dog)) + #define iscorgi(A) (istype(A, /mob/living/simple_animal/pet/dog/corgi)) #define ishostile(A) (istype(A, /mob/living/simple_animal/hostile)) diff --git a/code/__DEFINES/materials.dm b/code/__DEFINES/materials.dm index e2ae22345f..e7e62aafe1 100644 --- a/code/__DEFINES/materials.dm +++ b/code/__DEFINES/materials.dm @@ -4,8 +4,13 @@ /// Hard materials, such as iron or metal #define MAT_CATEGORY_RIGID "rigid material" +///Use this flag on TRUE if you want the basic recipes +#define MAT_CATEGORY_BASE_RECIPES "basic recipes" + /// Flag for atoms, this flag ensures it isn't re-colored by materials. Useful for snowflake icons such as default toolboxes. #define MATERIAL_COLOR (1<<0) #define MATERIAL_ADD_PREFIX (1<<1) #define MATERIAL_EFFECTS (1<<2) -#define MATERIAL_AFFECT_STATISTICS (1<<3) \ No newline at end of file +#define MATERIAL_AFFECT_STATISTICS (1<<3) + +#define MATERIAL_SOURCE(mat) "[mat.name]_material" \ No newline at end of file diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 3977b3c085..eb86c52301 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -61,6 +61,12 @@ } while (0) #define HAS_TRAIT(target, trait) (target.status_traits ? (target.status_traits[trait] ? TRUE : FALSE) : FALSE) #define HAS_TRAIT_FROM(target, trait, source) (target.status_traits ? (target.status_traits[trait] ? (source in target.status_traits[trait]) : FALSE) : FALSE) +#define HAS_TRAIT_FROM_ONLY(target, trait, source) (\ + target.status_traits ?\ + (target.status_traits[trait] ?\ + ((source in target.status_traits[trait]) && (length(target.status_traits) == 1))\ + : FALSE)\ + : FALSE) #define HAS_TRAIT_NOT_FROM(target, trait, source) (target.status_traits ? (target.status_traits[trait] ? (length(target.status_traits[trait] - source) > 0) : FALSE) : FALSE) //mob traits @@ -226,6 +232,8 @@ #define VEHICLE_TRAIT "vehicle" // inherited from riding vehicles #define INNATE_TRAIT "innate" +///Used for managing KEEP_TOGETHER in [appearance_flags] +#define TRAIT_KEEP_TOGETHER "keep-together" // item traits #define TRAIT_NODROP "nodrop" diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index d4ec44a641..059f9d518e 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -108,7 +108,7 @@ A.attack_animal(src) /atom/proc/attack_animal(mob/user) - return + SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_ANIMAL, user) /mob/living/RestrainedClickOn(atom/A) return diff --git a/code/controllers/subsystem/materials.dm b/code/controllers/subsystem/materials.dm index 96d733e8da..23d5a7a2b7 100644 --- a/code/controllers/subsystem/materials.dm +++ b/code/controllers/subsystem/materials.dm @@ -10,24 +10,52 @@ SUBSYSTEM_DEF(materials) var/list/materials ///Dictionary of category || list of material refs var/list/materials_by_category + ///Dictionary of category || list of material types, mostly used by rnd machines like autolathes. + var/list/materialtypes_by_category + ///A cache of all material combinations that have been used + var/list/list/material_combos ///List of stackcrafting recipes for materials using rigid materials var/list/rigid_stack_recipes = list( new /datum/stack_recipe("chair", /obj/structure/chair/greyscale, one_per_turf = TRUE, on_floor = TRUE, applies_mats = TRUE), new /datum/stack_recipe("toilet", /obj/structure/toilet/greyscale, one_per_turf = TRUE, on_floor = TRUE, applies_mats = TRUE), new /datum/stack_recipe("sink", /obj/structure/sink/greyscale, one_per_turf = TRUE, on_floor = TRUE, applies_mats = TRUE), + new /datum/stack_recipe("Floor tile", /obj/item/stack/tile/material, 1, 4, 20, applies_mats = TRUE) ) ///Ran on initialize, populated the materials and materials_by_category dictionaries with their appropiate vars (See these variables for more info) /datum/controller/subsystem/materials/proc/InitializeMaterials() materials = list() materials_by_category = list() + materialtypes_by_category = list() + material_combos = list() for(var/type in subtypesof(/datum/material)) var/datum/material/ref = new type materials[type] = ref for(var/c in ref.categories) materials_by_category[c] += list(ref) + materialtypes_by_category[c] += list(type) /datum/controller/subsystem/materials/proc/GetMaterialRef(datum/material/fakemat) if(!materials) InitializeMaterials() - return materials[fakemat] || fakemat \ No newline at end of file + return materials[fakemat] || fakemat + + +///Returns a list to be used as an object's custom_materials. Lists will be cached and re-used based on the parameters. +/datum/controller/subsystem/materials/proc/FindOrCreateMaterialCombo(list/materials_declaration, multiplier) + if(!material_combos) + InitializeMaterials() + var/list/combo_params = list() + for(var/x in materials_declaration) + var/datum/material/mat = x + var/path_name = ispath(mat) ? "[mat]" : "[mat.type]" + combo_params += "[path_name]=[materials_declaration[mat] * multiplier]" + sortTim(combo_params, /proc/cmp_text_asc) // We have to sort now in case the declaration was not in order + var/combo_index = combo_params.Join("-") + var/list/combo = material_combos[combo_index] + if(!combo) + combo = list() + for(var/mat in materials_declaration) + combo[GetMaterialRef(mat)] = materials_declaration[mat] * multiplier + material_combos[combo_index] = combo + return combo diff --git a/code/datums/components/edible.dm b/code/datums/components/edible.dm new file mode 100644 index 0000000000..b2b75ab032 --- /dev/null +++ b/code/datums/components/edible.dm @@ -0,0 +1,243 @@ +/*! +This component makes it possible to make things edible. What this means is that you can take a bite or force someone to take a bite (in the case of items). +These items take a specific time to eat, and can do most of the things our original food items could. +Behavior that's still missing from this component that original food items had that should either be put into seperate components or somewhere else: + Components: + Drying component (jerky etc) + Customizable component (custom pizzas etc) + Processable component (Slicing and cooking behavior essentialy, making it go from item A to B when conditions are met.) + Dunkable component (Dunking things into reagent containers to absorb a specific amount of reagents) + Misc: + Something for cakes (You can store things inside) +*/ +/datum/component/edible + ///Amount of reagents taken per bite + var/bite_consumption = 2 + ///Amount of bites taken so far + var/bitecount = 0 + ///Flags for food + var/food_flags = NONE + ///Bitfield of the types of this food + var/foodtypes = NONE + ///Amount of seconds it takes to eat this food + var/eat_time = 30 + ///Defines how much it lowers someones satiety (Need to eat, essentialy) + var/junkiness = 0 + ///Message to send when eating + var/list/eatverbs + ///Callback to be ran for when you take a bite of something + var/datum/callback/after_eat + ///Last time we checked for food likes + var/last_check_time + +/datum/component/edible/Initialize(list/initial_reagents, food_flags = NONE, foodtypes = NONE, volume = 50, eat_time = 30, list/tastes, list/eatverbs = list("bite","chew","nibble","gnaw","gobble","chomp"), bite_consumption = 2, datum/callback/after_eat) + if(!isatom(parent)) + return COMPONENT_INCOMPATIBLE + + RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/examine) + RegisterSignal(parent, COMSIG_ATOM_ATTACK_ANIMAL, .proc/UseByAnimal) + if(isitem(parent)) + RegisterSignal(parent, COMSIG_ITEM_ATTACK, .proc/UseFromHand) + else if(isturf(parent)) + RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, .proc/TryToEatTurf) + + src.bite_consumption = bite_consumption + src.food_flags = food_flags + src.foodtypes = foodtypes + src.eat_time = eat_time + src.eatverbs = eatverbs + src.junkiness = junkiness + src.after_eat = after_eat + + var/atom/owner = parent + + owner.create_reagents(volume, INJECTABLE) + + if(initial_reagents) + for(var/rid in initial_reagents) + var/amount = initial_reagents[rid] + if(tastes && tastes.len && (rid == /datum/reagent/consumable/nutriment || rid == /datum/reagent/consumable/nutriment/vitamin)) + owner.reagents.add_reagent(rid, amount, tastes.Copy()) + else + owner.reagents.add_reagent(rid, amount) + +/datum/component/edible/proc/examine(datum/source, mob/user, list/examine_list) + if(!(food_flags & FOOD_IN_CONTAINER)) + switch (bitecount) + if (0) + return + if(1) + examine_list += "[parent] was bitten by someone!" + if(2,3) + examine_list += "[parent] was bitten [bitecount] times!" + else + examine_list += "[parent] was bitten multiple times!" + +/datum/component/edible/proc/UseFromHand(obj/item/source, mob/living/M, mob/living/user) + return TryToEat(M, user) + +/datum/component/edible/proc/TryToEatTurf(datum/source, mob/user) + return TryToEat(user, user) + +///All the checks for the act of eating itself and +/datum/component/edible/proc/TryToEat(mob/living/eater, mob/living/feeder) + + set waitfor = FALSE + + var/atom/owner = parent + + if(feeder.a_intent == INTENT_HARM) + return + if(!owner.reagents.total_volume)//Shouldn't be needed but it checks to see if it has anything left in it. + to_chat(feeder, "None of [owner] left, oh no!") + if(isturf(parent)) + var/turf/T = parent + T.ScrapeAway(1, CHANGETURF_INHERIT_AIR) + else + qdel(parent) + return + if(!CanConsume(eater, feeder)) + return + var/fullness = eater.nutrition + 10 //The theoretical fullness of the person eating if they were to eat this + for(var/datum/reagent/consumable/C in eater.reagents.reagent_list) //we add the nutrition value of what we're currently digesting + fullness += C.nutriment_factor * C.volume / C.metabolization_rate + + . = COMPONENT_ITEM_NO_ATTACK //Point of no return I suppose + + if(eater == feeder)//If you're eating it yourself. + if(!do_mob(feeder, eater, eat_time)) //Gotta pass the minimal eat time + return + var/eatverb = pick(eatverbs) + if(junkiness && eater.satiety < -150 && eater.nutrition > NUTRITION_LEVEL_STARVING + 50 && !HAS_TRAIT(eater, TRAIT_VORACIOUS)) + to_chat(eater, "You don't feel like eating any more junk food at the moment!") + return + else if(fullness <= 50) + eater.visible_message("[eater] hungrily [eatverb]s \the [parent], gobbling it down!", "You hungrily [eatverb] \the [parent], gobbling it down!") + else if(fullness > 50 && fullness < 150) + eater.visible_message("[eater] hungrily [eatverb]s \the [parent].", "You hungrily [eatverb] \the [parent].") + else if(fullness > 150 && fullness < 500) + eater.visible_message("[eater] [eatverb]s \the [parent].", "You [eatverb] \the [parent].") + else if(fullness > 500 && fullness < 600) + eater.visible_message("[eater] unwillingly [eatverb]s a bit of \the [parent].", "You unwillingly [eatverb] a bit of \the [parent].") + else if(fullness > (600 * (1 + eater.overeatduration / 2000))) // The more you eat - the more you can eat + eater.visible_message("[eater] cannot force any more of \the [parent] to go down [eater.p_their()] throat!", "You cannot force any more of \the [parent] to go down your throat!") + return + else //If you're feeding it to someone else. + if(isbrain(eater)) + to_chat(feeder, "[eater] doesn't seem to have a mouth!") + return + if(fullness <= (600 * (1 + eater.overeatduration / 1000))) + eater.visible_message("[feeder] attempts to feed [eater] [parent].", \ + "[feeder] attempts to feed you [parent].") + else + eater.visible_message("[feeder] cannot force any more of [parent] down [eater]'s throat!", \ + "[feeder] cannot force any more of [parent] down your throat!") + return + if(!do_mob(feeder, eater)) //Wait 3 seconds before you can feed + return + + log_combat(feeder, eater, "fed", owner.reagents.log_list()) + eater.visible_message("[feeder] forces [eater] to eat [parent]!", \ + "[feeder] forces you to eat [parent]!") + + TakeBite(eater, feeder) + +///This function lets the eater take a bite and transfers the reagents to the eater. +/datum/component/edible/proc/TakeBite(mob/living/eater, mob/living/feeder) + + var/atom/owner = parent + + if(!owner?.reagents) + return FALSE + if(eater.satiety > -200) + eater.satiety -= junkiness + playsound(eater.loc,'sound/items/eatfood.ogg', rand(10,50), TRUE) + if(owner.reagents.total_volume) + SEND_SIGNAL(parent, COMSIG_FOOD_EATEN, eater, feeder) + var/fraction = min(bite_consumption / owner.reagents.total_volume, 1) + owner.reagents.trans_to(eater, bite_consumption, transfered_by = feeder, method = INGEST) + bitecount++ + On_Consume(eater) + checkLiked(fraction, eater) + + //Invoke our after eat callback if it is valid + if(after_eat) + after_eat.Invoke(eater, feeder) + + return TRUE + +///Checks whether or not the eater can actually consume the food +/datum/component/edible/proc/CanConsume(mob/living/eater, mob/living/feeder) + if(!iscarbon(eater)) + return FALSE + var/mob/living/carbon/C = eater + var/covered = "" + if(C.is_mouth_covered(head_only = 1)) + covered = "headgear" + else if(C.is_mouth_covered(mask_only = 1)) + covered = "mask" + if(covered) + var/who = (isnull(feeder) || eater == feeder) ? "your" : "[eater.p_their()]" + to_chat(feeder, "You have to remove [who] [covered] first!") + return FALSE + return TRUE + +///Check foodtypes to see if we should send a moodlet +/datum/component/edible/proc/checkLiked(var/fraction, mob/M) + if(last_check_time + 50 > world.time) + return FALSE + if(!ishuman(M)) + return FALSE + var/mob/living/carbon/human/H = M + if(HAS_TRAIT(H, TRAIT_AGEUSIA) && foodtypes & H.dna.species.toxic_food) + to_chat(H, "You don't feel so good...") + H.adjust_disgust(25 + 30 * fraction) + else + if(foodtypes & H.dna.species.toxic_food) + to_chat(H,"What the hell was that thing?!") + H.adjust_disgust(25 + 30 * fraction) + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "toxic_food", /datum/mood_event/disgusting_food) + else if(foodtypes & H.dna.species.disliked_food) + to_chat(H,"That didn't taste very good...") + H.adjust_disgust(11 + 15 * fraction) + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "gross_food", /datum/mood_event/gross_food) + else if(foodtypes & H.dna.species.liked_food) + to_chat(H,"I love this taste!") + H.adjust_disgust(-5 + -2.5 * fraction) + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "fav_food", /datum/mood_event/favorite_food) + if((foodtypes & BREAKFAST) && world.time - SSticker.round_start_time < STOP_SERVING_BREAKFAST) + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "breakfast", /datum/mood_event/breakfast) + last_check_time = world.time + +///Delete the item when it is fully eaten +/datum/component/edible/proc/On_Consume(mob/living/eater) + + var/atom/owner = parent + + if(!eater) + return + if(!owner.reagents.total_volume) + if(isturf(parent)) + var/turf/T = parent + T.ScrapeAway(1, CHANGETURF_INHERIT_AIR) + else + qdel(parent) + +///Ability to feed food to puppers +/datum/component/edible/proc/UseByAnimal(datum/source, mob/user) + + var/atom/owner = parent + + if(!isdog(user)) + return + var/mob/living/L = user + if(bitecount == 0 || prob(50)) + L.emote("me", 1, "nibbles away at \the [parent]") + bitecount++ + . = COMPONENT_ITEM_NO_ATTACK + L.taste(owner.reagents) // why should carbons get all the fun? + if(bitecount >= 5) + var/sattisfaction_text = pick("burps from enjoyment", "yaps for more", "woofs twice", "looks at the area where \the [parent] was") + if(sattisfaction_text) + L.emote("me", 1, "[sattisfaction_text]") + qdel(parent) diff --git a/code/datums/components/radioactive.dm b/code/datums/components/radioactive.dm index decc2dd65c..f12e8bf007 100644 --- a/code/datums/components/radioactive.dm +++ b/code/datums/components/radioactive.dm @@ -69,8 +69,9 @@ out += "[out ? " and it " : "[master] "]seems to be glowing a bit." if(RAD_AMOUNT_HIGH to INFINITY) //At this level the object can contaminate other objects out += "[out ? " and it " : "[master] "]hurts to look at." - else - out += "." + if(!LAZYLEN(out)) + return + out += "." examine_list += out.Join() /datum/component/radioactive/proc/rad_attack(datum/source, atom/movable/target, mob/living/user) diff --git a/code/datums/elements/beauty.dm b/code/datums/elements/beauty.dm index 8acfda73e1..8895026967 100644 --- a/code/datums/elements/beauty.dm +++ b/code/datums/elements/beauty.dm @@ -8,8 +8,11 @@ if(. == ELEMENT_INCOMPATIBLE || !isatom(target) || isarea(target)) return ELEMENT_INCOMPATIBLE beauty = beautyamount - RegisterSignal(target, COMSIG_ENTER_AREA, .proc/enter_area) - RegisterSignal(target, COMSIG_EXIT_AREA, .proc/exit_area) + + if(ismovable(target)) + RegisterSignal(target, COMSIG_ENTER_AREA, .proc/enter_area) + RegisterSignal(target, COMSIG_EXIT_AREA, .proc/exit_area) + var/area/A = get_area(target) if(A) enter_area(null, A) diff --git a/code/datums/materials/_material.dm b/code/datums/materials/_material.dm index 1a8ce755e1..5148aab4ac 100644 --- a/code/datums/materials/_material.dm +++ b/code/datums/materials/_material.dm @@ -6,8 +6,6 @@ Simple datum which is instanced once per type and is used for every object of sa /datum/material var/name = "material" var/desc = "its..stuff." - ///Var that's mostly used by science machines to identify specific materials, should most likely be phased out at some point - var/id = "mat" ///Base color of the material, is used for greyscale. Item isn't changed in color if this is null. var/color ///Base alpha of the material, is used for greyscale icons. @@ -26,6 +24,20 @@ Simple datum which is instanced once per type and is used for every object of sa var/armor_modifiers = list("melee" = 1, "bullet" = 1, "laser" = 1, "energy" = 1, "bomb" = 1, "bio" = 1, "rad" = 1, "fire" = 1, "acid" = 1) ///How beautiful is this material per unit? var/beauty_modifier = 0 + ///Can be used to override the sound items make, lets add some SLOSHing. + var/item_sound_override + ///Can be used to override the stepsound a turf makes. MORE SLOOOSH + var/turf_sound_override + ///what texture icon state to overlay + var/texture_layer_icon_state + ///a cached filter for the texture icon + var/cached_texture_filter + +/datum/material/New() + . = ..() + if(texture_layer_icon_state) + var/texture_icon = icon('icons/materials/composite.dmi', texture_layer_icon_state) + cached_texture_filter = filter(type="layer", icon=texture_icon, blend_mode = BLEND_INSET_OVERLAY) ///This proc is called when the material is added to an object. /datum/material/proc/on_applied(atom/source, amount, material_flags) @@ -34,16 +46,27 @@ Simple datum which is instanced once per type and is used for every object of sa source.add_atom_colour(color, FIXED_COLOUR_PRIORITY) if(alpha) source.alpha = alpha + if(texture_layer_icon_state) + ADD_KEEP_TOGETHER(source, MATERIAL_SOURCE(src)) + source.filters += cached_texture_filter if(material_flags & MATERIAL_ADD_PREFIX) source.name = "[name] [source.name]" - if(istype(source, /obj)) //objs - on_applied_obj(source, amount, material_flags) - if(beauty_modifier) addtimer(CALLBACK(source, /datum.proc/_AddElement, list(/datum/element/beauty, beauty_modifier * amount)), 0) + if(istype(source, /obj)) //objs + on_applied_obj(source, amount, material_flags) + + else if(isturf(source, /turf)) //turfs + on_applied_turf(source, amount, material_flags) + + source.mat_update_desc(src) + +///This proc is called when a material updates an object's description +/atom/proc/mat_update_desc(/datum/material/mat) + return ///This proc is called when the material is added to an object specifically. /datum/material/proc/on_applied_obj(var/obj/o, amount, material_flags) if(material_flags & MATERIAL_AFFECT_STATISTICS) @@ -61,6 +84,24 @@ Simple datum which is instanced once per type and is used for every object of sa for(var/i in current_armor) temp_armor_list[i] = current_armor[i] * armor_modifiers[i] o.armor = getArmor(arglist(temp_armor_list)) + if(!isitem(o)) + return + var/obj/item/I = o + if(!item_sound_override) + return + I.hitsound = item_sound_override + I.usesound = item_sound_override + I.throwhitsound = item_sound_override + +/datum/material/proc/on_applied_turf(var/turf/T, amount, material_flags) + if(isopenturf(T)) + if(!turf_sound_override) + return + var/turf/open/O = T + O.footstep = turf_sound_override + O.barefootstep = turf_sound_override + O.clawfootstep = turf_sound_override + O.heavyfootstep = turf_sound_override ///This proc is called when the material is removed from an object. /datum/material/proc/on_removed(atom/source, material_flags) @@ -68,6 +109,9 @@ Simple datum which is instanced once per type and is used for every object of sa if(color) source.remove_atom_colour(FIXED_COLOUR_PRIORITY, color) source.alpha = initial(source.alpha) + if(texture_layer_icon_state) + source.filters -= cached_texture_filter + REMOVE_KEEP_TOGETHER(source, MATERIAL_SOURCE(src)) if(material_flags & MATERIAL_ADD_PREFIX) source.name = initial(source.name) @@ -75,10 +119,16 @@ Simple datum which is instanced once per type and is used for every object of sa if(istype(source, /obj)) //objs on_removed_obj(source, material_flags) + else if(istype(source, /turf)) //turfs + on_removed_turf(source, material_flags) + ///This proc is called when the material is removed from an object specifically. -/datum/material/proc/on_removed_obj(var/obj/o, amount, material_flags) +/datum/material/proc/on_removed_obj(obj/o, material_flags) if(material_flags & MATERIAL_AFFECT_STATISTICS) var/new_max_integrity = initial(o.max_integrity) o.modify_max_integrity(new_max_integrity) o.force = initial(o.force) o.throwforce = initial(o.throwforce) + +/datum/material/proc/on_removed_turf(turf/T, material_flags) + return diff --git a/code/datums/materials/basemats.dm b/code/datums/materials/basemats.dm index d4921a04d2..721af65449 100644 --- a/code/datums/materials/basemats.dm +++ b/code/datums/materials/basemats.dm @@ -1,21 +1,19 @@ ///Has no special properties. /datum/material/iron name = "iron" - id = "iron" desc = "Common iron ore often found in sedimentary and igneous layers of the crust." color = "#878687" - categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE) + categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) sheet_type = /obj/item/stack/sheet/metal value_per_unit = 0.0025 ///Breaks extremely easily but is transparent. /datum/material/glass name = "glass" - id = "glass" desc = "Glass forged by melting sand." color = "#88cdf1" alpha = 150 - categories = list(MAT_CATEGORY_RIGID = TRUE) + categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) integrity_modifier = 0.1 sheet_type = /obj/item/stack/sheet/glass value_per_unit = 0.0025 @@ -30,10 +28,9 @@ Unless you know what you're doing, only use the first three numbers. They're in ///Has no special properties. Could be good against vampires in the future perhaps. /datum/material/silver name = "silver" - id = "silver" desc = "Silver" color = list(255/255, 284/255, 302/255,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0) - categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE) + categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) sheet_type = /obj/item/stack/sheet/mineral/silver value_per_unit = 0.025 beauty_modifier = 0.075 @@ -41,11 +38,10 @@ Unless you know what you're doing, only use the first three numbers. They're in ///Slight force increase /datum/material/gold name = "gold" - id = "gold" desc = "Gold" color = list(340/255, 240/255, 50/255,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0) //gold is shiny, but not as bright as bananium strength_modifier = 1.2 - categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE) + categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) sheet_type = /obj/item/stack/sheet/mineral/gold value_per_unit = 0.0625 beauty_modifier = 0.15 @@ -54,11 +50,10 @@ Unless you know what you're doing, only use the first three numbers. They're in ///Has no special properties /datum/material/diamond name = "diamond" - id = "diamond" desc = "Highly pressurized carbon" color = list(48/255, 272/255, 301/255,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0) alpha = 132 - categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE) + categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) sheet_type = /obj/item/stack/sheet/mineral/diamond value_per_unit = 0.25 beauty_modifier = 0.3 @@ -67,10 +62,9 @@ Unless you know what you're doing, only use the first three numbers. They're in ///Is slightly radioactive /datum/material/uranium name = "uranium" - id = "uranium" desc = "Uranium" color = rgb(48, 237, 26) - categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE) + categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) sheet_type = /obj/item/stack/sheet/mineral/uranium value_per_unit = 0.05 beauty_modifier = 0.3 //It shines so beautiful @@ -88,10 +82,9 @@ Unless you know what you're doing, only use the first three numbers. They're in ///Adds firestacks on hit (Still needs support to turn into gas on destruction) /datum/material/plasma name = "plasma" - id = "plasma" desc = "Isn't plasma a state of matter? Oh whatever." color = list(298/255, 46/255, 352/255,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0) - categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE) + categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) sheet_type = /obj/item/stack/sheet/mineral/plasma value_per_unit = 0.1 beauty_modifier = 0.15 @@ -111,7 +104,6 @@ Unless you know what you're doing, only use the first three numbers. They're in ///Can cause bluespace effects on use. (Teleportation) (Not yet implemented) /datum/material/bluespace name = "bluespace crystal" - id = "bluespace_crystal" desc = "Crystals with bluespace properties" color = list(119/255, 217/255, 396/255,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0) alpha = 200 @@ -123,10 +115,9 @@ Unless you know what you're doing, only use the first three numbers. They're in ///Honks and slips /datum/material/bananium name = "bananium" - id = "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 - categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE) + categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) sheet_type = /obj/item/stack/sheet/mineral/bananium value_per_unit = 0.5 beauty_modifier = 0.5 @@ -146,11 +137,10 @@ Unless you know what you're doing, only use the first three numbers. They're in ///Mediocre force increase /datum/material/titanium name = "titanium" - id = "titanium" desc = "Titanium" color = "#b3c0c7" strength_modifier = 1.3 - categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE) + categories = list(MAT_CATEGORY_ORE = TRUE, MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) sheet_type = /obj/item/stack/sheet/mineral/titanium value_per_unit = 0.0625 beauty_modifier = 0.05 @@ -158,11 +148,10 @@ Unless you know what you're doing, only use the first three numbers. They're in /datum/material/runite name = "runite" - id = "runite" desc = "Runite" color = "#3F9995" strength_modifier = 1.3 - categories = list(MAT_CATEGORY_RIGID = TRUE) + categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) sheet_type = /obj/item/stack/sheet/mineral/runite beauty_modifier = 0.5 armor_modifiers = list("melee" = 1.35, "bullet" = 2, "laser" = 0.5, "energy" = 1.25, "bomb" = 1.25, "bio" = 1, "rad" = 1, "fire" = 1.4, "acid" = 1) //rune is weak against magic lasers but strong against bullets. This is the combat triangle. @@ -170,7 +159,6 @@ Unless you know what you're doing, only use the first three numbers. They're in ///Force decrease /datum/material/plastic name = "plastic" - id = "plastic" desc = "Plastic" color = "#caccd9" strength_modifier = 0.85 @@ -182,7 +170,6 @@ Unless you know what you're doing, only use the first three numbers. They're in ///Force decrease and mushy sound effect. (Not yet implemented) /datum/material/biomass name = "biomass" - id = "biomass" desc = "Organic matter" color = "#735b4d" strength_modifier = 0.8 @@ -190,12 +177,11 @@ Unless you know what you're doing, only use the first three numbers. They're in /datum/material/wood name = "wood" - id = "wood" desc = "Flexible, durable, but flamable. Hard to come across in space." color = "#bb8e53" strength_modifier = 0.5 sheet_type = /obj/item/stack/sheet/mineral/wood - categories = list(MAT_CATEGORY_RIGID = TRUE) + categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) value_per_unit = 0.06 beauty_modifier = 0.1 armor_modifiers = list("melee" = 1.1, "bullet" = 1.1, "laser" = 0.4, "energy" = 0.4, "bomb" = 1, "bio" = 0.2, "rad" = 0, "fire" = 0, "acid" = 0.3) @@ -215,11 +201,10 @@ Unless you know what you're doing, only use the first three numbers. They're in ///Stronk force increase /datum/material/adamantine name = "adamantine" - id = "adamantine" desc = "A powerful material made out of magic, I mean science!" color = "#6d7e8e" strength_modifier = 1.5 - categories = list(MAT_CATEGORY_RIGID = TRUE) + categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) sheet_type = /obj/item/stack/sheet/mineral/adamantine value_per_unit = 0.25 beauty_modifier = 0.4 @@ -228,10 +213,9 @@ Unless you know what you're doing, only use the first three numbers. They're in ///RPG Magic. (Admin only) /datum/material/mythril name = "mythril" - id = "mythril" desc = "How this even exists is byond me" color = "#f2d5d7" - categories = list(MAT_CATEGORY_RIGID = TRUE) + categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) sheet_type = /obj/item/stack/sheet/mineral/mythril value_per_unit = 0.75 beauty_modifier = 0.5 @@ -246,3 +230,134 @@ Unless you know what you're doing, only use the first three numbers. They're in . = ..() if(istype(source, /obj/item)) qdel(source.GetComponent(/datum/component/fantasy)) + +//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" + categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) + sheet_type = /obj/item/stack/sheet/sandblock + value_per_unit = 0.001 + strength_modifier = 0.5 + integrity_modifier = 0.1 + armor_modifiers = list("melee" = 0.25, "bullet" = 0.25, "laser" = 1.25, "energy" = 0.25, "bomb" = 0.25, "bio" = 0.25, "rad" = 1.5, "fire" = 1.5, "acid" = 1.5) + beauty_modifier = 0.25 + turf_sound_override = FOOTSTEP_SAND + texture_layer_icon_state = "sand" + +//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 = "#B77D31" + categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) + sheet_type = /obj/item/stack/sheet/mineral/sandstone + value_per_unit = 0.0025 + armor_modifiers = list("melee" = 0.5, "bullet" = 0.5, "laser" = 1.25, "energy" = 0.5, "bomb" = 0.5, "bio" = 0.25, "rad" = 1.5, "fire" = 1.5, "acid" = 1.5) + beauty_modifier = 0.3 + turf_sound_override = FOOTSTEP_WOOD + texture_layer_icon_state = "brick" + +/datum/material/snow + name = "snow" + desc = "There's no business like snow business." + color = "#FFFFFF" + categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) + sheet_type = /obj/item/stack/sheet/mineral/snow + value_per_unit = 0.0025 + armor_modifiers = list("melee" = 0.25, "bullet" = 0.25, "laser" = 0.25, "energy" = 0.25, "bomb" = 0.25, "bio" = 0.25, "rad" = 1.5, "fire" = 0.25, "acid" = 1.5) + beauty_modifier = 0.3 + turf_sound_override = FOOTSTEP_SAND + texture_layer_icon_state = "sand" + +/datum/material/runedmetal + name = "runed metal" + desc = "Mir'ntrath barhah Nar'sie." + color = "#3C3434" + categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) + sheet_type = /obj/item/stack/sheet/runed_metal + value_per_unit = 0.75 + armor_modifiers = list("melee" = 1.2, "bullet" = 1.2, "laser" = 1, "energy" = 1, "bomb" = 1.2, "bio" = 1.2, "rad" = 1.5, "fire" = 1.5, "acid" = 1.5) + beauty_modifier = -0.15 + texture_layer_icon_state = "runed" + +/datum/material/bronze + name = "bronze" + desc = "Clock Cult? Never heard of it." + color = "#92661A" + categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) + sheet_type = /obj/item/stack/tile/bronze + value_per_unit = 0.025 + armor_modifiers = list("melee" = 1, "bullet" = 1, "laser" = 1, "energy" = 1, "bomb" = 1, "bio" = 1, "rad" = 1.5, "fire" = 1.5, "acid" = 1.5) + beauty_modifier = 0.2 + +/datum/material/paper + name = "paper" + desc = "Ten thousand folds of pure starchy power." + color = "#E5DCD5" + categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) + sheet_type = /obj/item/stack/sheet/paperframes + value_per_unit = 0.0025 + armor_modifiers = list("melee" = 0.1, "bullet" = 0.1, "laser" = 0.1, "energy" = 0.1, "bomb" = 0.1, "bio" = 0.1, "rad" = 1.5, "fire" = 0, "acid" = 1.5) + beauty_modifier = 0.3 + turf_sound_override = FOOTSTEP_SAND + texture_layer_icon_state = "paper" + +/datum/material/paper/on_applied_obj(obj/source, amount, material_flags) + . = ..() + if(material_flags & MATERIAL_AFFECT_STATISTICS) + var/obj/paper = source + paper.resistance_flags |= FLAMMABLE + paper.obj_flags |= UNIQUE_RENAME + +/datum/material/paper/on_removed_obj(obj/source, material_flags) + if(material_flags & MATERIAL_AFFECT_STATISTICS) + var/obj/paper = source + paper.resistance_flags &= ~FLAMMABLE + return ..() + +/datum/material/cardboard + name = "cardboard" + desc = "They say cardboard is used by hobos to make incredible things." + color = "#5F625C" + categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) + sheet_type = /obj/item/stack/sheet/cardboard + value_per_unit = 0.003 + armor_modifiers = list("melee" = 0.25, "bullet" = 0.25, "laser" = 0.25, "energy" = 0.25, "bomb" = 0.25, "bio" = 0.25, "rad" = 1.5, "fire" = 0, "acid" = 1.5) + beauty_modifier = -0.1 + +/datum/material/cardboard/on_applied_obj(obj/source, amount, material_flags) + . = ..() + if(material_flags & MATERIAL_AFFECT_STATISTICS) + var/obj/cardboard = source + cardboard.resistance_flags |= FLAMMABLE + cardboard.obj_flags |= UNIQUE_RENAME + +/datum/material/cardboard/on_removed_obj(obj/source, material_flags) + if(material_flags & MATERIAL_AFFECT_STATISTICS) + var/obj/cardboard = source + cardboard.resistance_flags &= ~FLAMMABLE + return ..() + +/datum/material/bone + name = "bone" + desc = "Man, building with this will make you the coolest caveman on the block." + color = "#e3dac9" + categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) + sheet_type = /obj/item/stack/sheet/bone + value_per_unit = 0.05 + armor_modifiers = list("melee" = 1.2, "bullet" = 0.75, "laser" = 0.75, "energy" = 1.2, "bomb" = 1, "bio" = 1, "rad" = 1.5, "fire" = 1.5, "acid" = 1.5) + beauty_modifier = -0.2 + +/datum/material/bamboo + name = "bamboo" + desc = "If it's good enough for pandas, it's good enough for you." + color = "#339933" + categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) + sheet_type = /obj/item/stack/sheet/mineral/bamboo + value_per_unit = 0.0025 + armor_modifiers = list("melee" = 0.5, "bullet" = 0.5, "laser" = 0.5, "energy" = 0.5, "bomb" = 0.5, "bio" = 0.51, "rad" = 1.5, "fire" = 0.5, "acid" = 1.5) + beauty_modifier = 0.2 + turf_sound_override = FOOTSTEP_WOOD + texture_layer_icon_state = "bamboo" diff --git a/code/datums/materials/meat.dm b/code/datums/materials/meat.dm new file mode 100644 index 0000000000..14a373f2d2 --- /dev/null +++ b/code/datums/materials/meat.dm @@ -0,0 +1,32 @@ +///It's gross, gets the name of it's owner, and is all kinds of fucked up +/datum/material/meat + name = "meat" + desc = "Meat" + color = rgb(214, 67, 67) + categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) + sheet_type = /obj/item/stack/sheet/meat + value_per_unit = 0.05 + beauty_modifier = -0.3 + strength_modifier = 0.7 + armor_modifiers = list("melee" = 0.3, "bullet" = 0.3, "laser" = 1.2, "energy" = 1.2, "bomb" = 0.3, "bio" = 0, "rad" = 0.7, "fire" = 1, "acid" = 1) + item_sound_override = 'sound/effects/meatslap.ogg' + turf_sound_override = FOOTSTEP_MEAT + texture_layer_icon_state = "meat" + +/datum/material/meat/on_removed(atom/source, material_flags) + . = ..() + qdel(source.GetComponent(/datum/component/edible)) + +/datum/material/meat/on_applied_obj(obj/O, amount, material_flags) + . = ..() + O.obj_flags |= UNIQUE_RENAME //So you can name it after the person its made from, a depressing comprimise. + make_edible(O, amount, material_flags) + +/datum/material/meat/on_applied_turf(turf/T, amount, material_flags) + . = ..() + make_edible(T, amount, material_flags) + +/datum/material/meat/proc/make_edible(atom/source, amount, material_flags) + var/nutriment_count = 3 * (amount / MINERAL_MATERIAL_AMOUNT) + var/oil_count = 2 * (amount / MINERAL_MATERIAL_AMOUNT) + source.AddComponent(/datum/component/edible, list(/datum/reagent/consumable/nutriment = nutriment_count, /datum/reagent/consumable/cooking_oil = oil_count), null, RAW | MEAT | GROSS, null, 30, list("Fleshy")) diff --git a/code/datums/materials/pizza.dm b/code/datums/materials/pizza.dm new file mode 100644 index 0000000000..2a9542234f --- /dev/null +++ b/code/datums/materials/pizza.dm @@ -0,0 +1,30 @@ +/datum/material/pizza + name = "pizza" + desc = "~Jamme, jamme, n'coppa, jamme ja! Jamme, jamme, n'coppa jamme ja, funi-culi funi-cala funi-culi funi-cala!! Jamme jamme ja funiculi funicula!~" + color = "#FF9F23" + categories = list(MAT_CATEGORY_RIGID = TRUE, MAT_CATEGORY_BASE_RECIPES = TRUE) + sheet_type = /obj/item/stack/sheet/pizza + value_per_unit = 0.05 + beauty_modifier = 0.1 + strength_modifier = 0.7 + armor_modifiers = list("melee" = 0.3, "bullet" = 0.3, "laser" = 1.2, "energy" = 1.2, "bomb" = 0.3, "bio" = 0, "rad" = 0.7, "fire" = 1, "acid" = 1) + item_sound_override = 'sound/effects/meatslap.ogg' + turf_sound_override = FOOTSTEP_MEAT + texture_layer_icon_state = "pizza" + +/datum/material/pizza/on_removed(atom/source, material_flags) + . = ..() + qdel(source.GetComponent(/datum/component/edible)) + +/datum/material/pizza/on_applied_obj(obj/O, amount, material_flags) + . = ..() + make_edible(O, amount, material_flags) + +/datum/material/pizza/on_applied_turf(turf/T, amount, material_flags) + . = ..() + make_edible(T, amount, material_flags) + +/datum/material/pizza/proc/make_edible(atom/source, amount, material_flags) + var/nutriment_count = 3 * (amount / MINERAL_MATERIAL_AMOUNT) + var/oil_count = 2 * (amount / MINERAL_MATERIAL_AMOUNT) + source.AddComponent(/datum/component/edible, list(/datum/reagent/consumable/nutriment = nutriment_count, /datum/reagent/consumable/cooking_oil = oil_count), null, GRAIN | MEAT | DAIRY | VEGETABLES, null, 30, list("crust", "tomato", "cheese", "meat")) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index e3f4829d3d..d498362c85 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -48,6 +48,7 @@ var/rad_insulation = RAD_NO_INSULATION ///The custom materials this atom is made of, used by a lot of things like furniture, walls, and floors (if I finish the functionality, that is.) + ///The list referenced by this var can be shared by multiple objects and should not be directly modified. Instead, use [set_custom_materials][/atom/proc/set_custom_materials]. var/list/custom_materials ///Bitfield for how the atom handles materials. var/material_flags = NONE @@ -114,11 +115,8 @@ if (canSmoothWith) canSmoothWith = typelist("canSmoothWith", canSmoothWith) - var/temp_list = list() - for(var/i in custom_materials) - temp_list[SSmaterials.GetMaterialRef(i)] = custom_materials[i] //Get the proper instanced version - custom_materials = null //Null the list to prepare for applying the materials properly - set_custom_materials(temp_list) + // apply materials properly from the default custom_materials value + set_custom_materials(custom_materials) ComponentInitialize() @@ -1006,26 +1004,21 @@ Proc for attack log creation, because really why not ///Sets the custom materials for an item. /atom/proc/set_custom_materials(var/list/materials, multiplier = 1) - - if(!materials) - materials = custom_materials - if(custom_materials) //Only runs if custom materials existed at first. Should usually be the case but check anyways for(var/i in custom_materials) var/datum/material/custom_material = SSmaterials.GetMaterialRef(i) custom_material.on_removed(src, material_flags) //Remove the current materials if(!length(materials)) + custom_materials = null return - custom_materials = list() //Reset the list + if(material_flags & MATERIAL_EFFECTS) + for(var/x in materials) + var/datum/material/custom_material = SSmaterials.GetMaterialRef(x) + custom_material.on_applied(src, materials[x] * multiplier * material_modifier, material_flags) - for(var/x in materials) - var/datum/material/custom_material = SSmaterials.GetMaterialRef(x) - - if(material_flags & MATERIAL_EFFECTS) - custom_material.on_applied(src, materials[custom_material] * multiplier * material_modifier, material_flags) - custom_materials[custom_material] += materials[x] * multiplier + custom_materials = SSmaterials.FindOrCreateMaterialCombo(materials, multiplier) /** * Returns true if this atom has gravity for the passed in turf diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 4eeb6b8b0f..1f0687151d 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -46,29 +46,16 @@ "Dinnerware", "Imported" ) - var/list/allowed_materials = list( - /datum/material/iron, - /datum/material/glass, - /datum/material/gold, - /datum/material/silver, - /datum/material/diamond, - /datum/material/uranium, - /datum/material/plasma, - /datum/material/bluespace, - /datum/material/bananium, - /datum/material/titanium, - /datum/material/runite, - /datum/material/plastic, - /datum/material/adamantine, - /datum/material/mythril, - /datum/material/wood - ) + var/list/allowed_materials /// Base print speed var/base_print_speed = 10 /obj/machinery/autolathe/Initialize() - AddComponent(/datum/component/material_container, allowed_materials, _show_on_examine=TRUE, _after_insert=CALLBACK(src, .proc/AfterMaterialInsert)) + var/list/mats = allowed_materials + if(!mats) + mats = SSmaterials.materialtypes_by_category[MAT_CATEGORY_RIGID] + AddComponent(/datum/component/material_container, mats, _show_on_examine=TRUE, _after_insert=CALLBACK(src, .proc/AfterMaterialInsert)) . = ..() wires = new /datum/wires/autolathe(src) stored_research = new stored_research diff --git a/code/game/machinery/sheetifier.dm b/code/game/machinery/sheetifier.dm new file mode 100644 index 0000000000..7b83401194 --- /dev/null +++ b/code/game/machinery/sheetifier.dm @@ -0,0 +1,44 @@ +/obj/machinery/sheetifier + name = "Sheet-meister 2000" + desc = "A very sheety machine" + icon = 'icons/obj/machines/sheetifier.dmi' + icon_state = "base_machine" + density = TRUE + use_power = IDLE_POWER_USE + idle_power_usage = 10 + active_power_usage = 100 + circuit = /obj/item/circuitboard/machine/sheetifier + layer = BELOW_OBJ_LAYER + var/busy_processing = FALSE + +/obj/machinery/sheetifier/Initialize() + . = ..() + AddComponent(/datum/component/material_container, list(/datum/material/meat), MINERAL_MATERIAL_AMOUNT * MAX_STACK_SIZE * 2, TRUE, /obj/item/reagent_containers/food/snacks/meat/slab, CALLBACK(src, .proc/CanInsertMaterials), CALLBACK(src, .proc/AfterInsertMaterials)) + +/obj/machinery/sheetifier/update_overlays() + . = ..() + if(stat & (BROKEN|NOPOWER)) + return + var/mutable_appearance/on_overlay = mutable_appearance(icon, "buttons_on") + . += on_overlay + +/obj/machinery/sheetifier/update_icon_state() + icon_state = "base_machine[busy_processing ? "_processing" : ""]" + +/obj/machinery/sheetifier/proc/CanInsertMaterials() + return !busy_processing + +/obj/machinery/sheetifier/proc/AfterInsertMaterials(item_inserted, id_inserted, amount_inserted) + busy_processing = TRUE + update_icon() + var/datum/material/last_inserted_material = id_inserted + var/mutable_appearance/processing_overlay = mutable_appearance(icon, "processing") + processing_overlay.color = last_inserted_material.color + flick_overlay_static(processing_overlay, src, 64) + addtimer(CALLBACK(src, .proc/finish_processing), 64) + +/obj/machinery/sheetifier/proc/finish_processing() + busy_processing = FALSE + update_icon() + var/datum/component/material_container/materials = GetComponent(/datum/component/material_container) + materials.retrieve_all() //Returns all as sheets diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index 4ddb5281ea..c13cb1d1c6 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -388,7 +388,7 @@ /obj/item/mecha_parts/mecha_equipment/generator/get_equip_info() var/output = ..() if(output) - return "[output] \[[fuel]: [round(fuel.amount*fuel.mats_per_stack,0.1)] cm3\] - [equip_ready?"A":"Dea"]ctivate" + return "[output] \[[fuel]: [round(fuel.amount*MINERAL_MATERIAL_AMOUNT,0.1)] cm3\] - [equip_ready?"A":"Dea"]ctivate" /obj/item/mecha_parts/mecha_equipment/generator/action(target) if(chassis) @@ -398,9 +398,9 @@ /obj/item/mecha_parts/mecha_equipment/generator/proc/load_fuel(var/obj/item/stack/sheet/P) if(P.type == fuel.type && P.amount > 0) - var/to_load = max(max_fuel - fuel.amount*fuel.mats_per_stack,0) + var/to_load = max(max_fuel - fuel.amount*MINERAL_MATERIAL_AMOUNT,0) if(to_load) - var/units = min(max(round(to_load / P.mats_per_stack),1),P.amount) + var/units = min(max(round(to_load / MINERAL_MATERIAL_AMOUNT),1),P.amount) fuel.amount += units P.use(units) occupant_message("[units] unit\s of [fuel] successfully loaded.") @@ -454,7 +454,7 @@ if(cur_charge < chassis.cell.maxcharge) use_fuel = fuel_per_cycle_active chassis.give_power(power_per_cycle) - fuel.amount -= min(use_fuel/fuel.mats_per_stack,fuel.amount) + fuel.amount -= min(use_fuel/MINERAL_MATERIAL_AMOUNT,fuel.amount) update_equip_info() return 1 diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 60bae4016a..79e0eceb8f 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -778,6 +778,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb ..() /obj/item/proc/microwave_act(obj/machinery/microwave/M) + SEND_SIGNAL(src, COMSIG_ITEM_MICROWAVE_ACT, M) if(istype(M) && M.dirty < 100) M.dirty++ diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index ea839ae12d..56eb25f953 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -61,6 +61,14 @@ name = "Experimental Clone Pod (Machine Board)" build_path = /obj/machinery/clonepod/experimental +/obj/item/circuitboard/machine/sheetifier + name = "Sheet-meister 2000 (Machine Board)" + icon_state = "supply" + build_path = /obj/machinery/sheetifier + req_components = list( + /obj/item/stock_parts/manipulator = 2, + /obj/item/stock_parts/matter_bin = 2) + /obj/item/circuitboard/machine/abductor name = "alien board (Report This)" icon_state = "abductor_mod" diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index 6fdea26683..efcc075110 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -17,7 +17,6 @@ GLOBAL_LIST_INIT(rod_recipes, list ( \ throw_speed = 3 throw_range = 7 custom_materials = list(/datum/material/iron=1000) - mats_per_stack = 1000 max_amount = 50 attack_verb = list("hit", "bludgeoned", "whacked") hitsound = 'sound/weapons/grenadelaunch.ogg' diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index d28ae52b52..f5843a7df2 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -39,9 +39,11 @@ GLOBAL_LIST_INIT(sandstone_recipes, list ( \ item_state = "sheet-sandstone" throw_speed = 3 throw_range = 5 - custom_materials = list(/datum/material/glass=MINERAL_MATERIAL_AMOUNT) + custom_materials = list(/datum/material/sandstone=MINERAL_MATERIAL_AMOUNT) sheettype = "sandstone" merge_type = /obj/item/stack/sheet/mineral/sandstone + walltype = /turf/closed/wall/mineral/sandstone + material_type = /datum/material/sandstone /obj/item/stack/sheet/mineral/sandstone/get_main_recipes() . = ..() @@ -107,6 +109,7 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( \ point_value = 25 merge_type = /obj/item/stack/sheet/mineral/diamond material_type = /datum/material/diamond + walltype = /turf/closed/wall/mineral/diamond GLOBAL_LIST_INIT(diamond_recipes, list ( \ new/datum/stack_recipe("diamond door", /obj/structure/mineral_door/transparent/diamond, 10, one_per_turf = 1, on_floor = 1), \ @@ -135,6 +138,7 @@ GLOBAL_LIST_INIT(diamond_recipes, list ( \ point_value = 20 merge_type = /obj/item/stack/sheet/mineral/uranium material_type = /datum/material/uranium + walltype = /turf/closed/wall/mineral/uranium GLOBAL_LIST_INIT(uranium_recipes, list ( \ new/datum/stack_recipe("uranium door", /obj/structure/mineral_door/uranium, 10, one_per_turf = 1, on_floor = 1), \ @@ -163,6 +167,7 @@ GLOBAL_LIST_INIT(uranium_recipes, list ( \ point_value = 20 merge_type = /obj/item/stack/sheet/mineral/plasma material_type = /datum/material/plasma + walltype = /turf/closed/wall/mineral/plasma /obj/item/stack/sheet/mineral/plasma/suicide_act(mob/living/carbon/user) user.visible_message("[user] begins licking \the [src]! It looks like [user.p_theyre()] trying to commit suicide!") @@ -205,6 +210,7 @@ GLOBAL_LIST_INIT(plasma_recipes, list ( \ point_value = 20 merge_type = /obj/item/stack/sheet/mineral/gold material_type = /datum/material/gold + walltype = /turf/closed/wall/mineral/gold GLOBAL_LIST_INIT(gold_recipes, list ( \ new/datum/stack_recipe("golden door", /obj/structure/mineral_door/gold, 10, one_per_turf = 1, on_floor = 1), \ @@ -236,6 +242,7 @@ GLOBAL_LIST_INIT(gold_recipes, list ( \ merge_type = /obj/item/stack/sheet/mineral/silver material_type = /datum/material/silver tableVariant = /obj/structure/table/optable + walltype = /turf/closed/wall/mineral/silver GLOBAL_LIST_INIT(silver_recipes, list ( \ new/datum/stack_recipe("silver door", /obj/structure/mineral_door/silver, 10, one_per_turf = 1, on_floor = 1), \ @@ -266,6 +273,7 @@ GLOBAL_LIST_INIT(silver_recipes, list ( \ point_value = 50 merge_type = /obj/item/stack/sheet/mineral/bananium material_type = /datum/material/bananium + walltype = /turf/closed/wall/mineral/bananium GLOBAL_LIST_INIT(bananium_recipes, list ( \ new/datum/stack_recipe("bananium tile", /obj/item/stack/tile/mineral/bananium, 1, 4, 20), \ @@ -294,6 +302,7 @@ GLOBAL_LIST_INIT(bananium_recipes, list ( \ point_value = 20 merge_type = /obj/item/stack/sheet/mineral/titanium material_type = /datum/material/titanium + walltype = /turf/closed/wall/mineral/titanium GLOBAL_LIST_INIT(titanium_recipes, list ( \ new/datum/stack_recipe("titanium tile", /obj/item/stack/tile/mineral/titanium, 1, 4, 20), \ @@ -324,6 +333,7 @@ GLOBAL_LIST_INIT(titanium_recipes, list ( \ custom_materials = list(/datum/material/titanium=MINERAL_MATERIAL_AMOUNT, /datum/material/plasma=MINERAL_MATERIAL_AMOUNT) point_value = 45 merge_type = /obj/item/stack/sheet/mineral/plastitanium + walltype = /turf/closed/wall/mineral/plastitanium /obj/item/stack/sheet/mineral/plastitanium/fifty amount = 50 @@ -390,11 +400,14 @@ GLOBAL_LIST_INIT(adamantine_recipes, list( name = "snow" icon_state = "sheet-snow" item_state = "sheet-snow" + custom_materials = list(/datum/material/snow = MINERAL_MATERIAL_AMOUNT) singular_name = "snow block" force = 1 throwforce = 2 grind_results = list(/datum/reagent/consumable/ice = 20) merge_type = /obj/item/stack/sheet/mineral/snow + walltype = /turf/closed/wall/mineral/snow + material_type = /datum/material/snow GLOBAL_LIST_INIT(snow_recipes, list ( \ new/datum/stack_recipe("Snow Wall", /turf/closed/wall/mineral/snow, 5, one_per_turf = 1, on_floor = 1), \ diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index c11b619431..f0a57fddb2 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -205,7 +205,7 @@ GLOBAL_LIST_INIT(plasteel_recipes, list ( \ desc = "This sheet is an alloy of iron and plasma." icon_state = "sheet-plasteel" item_state = "sheet-metal" - custom_materials = list(/datum/material/iron=2000, /datum/material/plasma=2000) + custom_materials = list(/datum/material/iron=MINERAL_MATERIAL_AMOUNT, /datum/material/plasma=MINERAL_MATERIAL_AMOUNT) throwforce = 10 flags_1 = CONDUCT_1 armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 80) @@ -289,6 +289,7 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \ novariants = TRUE material_type = /datum/material/wood grind_results = list(/datum/reagent/carbon = 20) + walltype = /turf/closed/wall/mineral/wood /obj/item/stack/sheet/mineral/wood/attackby(obj/item/W, mob/user, params) // NOTE: sheet_types.dm is where the WOOD stack lives. Maybe move this over there. // Taken from /obj/item/stack/rods/attackby in [rods.dm] @@ -344,11 +345,13 @@ GLOBAL_LIST_INIT(bamboo_recipes, list ( \ icon_state = "sheet-bamboo" item_state = "sheet-bamboo" icon = 'icons/obj/stack_objects.dmi' + custom_materials = list(/datum/material/bamboo = MINERAL_MATERIAL_AMOUNT) throwforce = 15 armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 0) resistance_flags = FLAMMABLE merge_type = /obj/item/stack/sheet/mineral/bamboo grind_results = list(/datum/reagent/carbon = 5) + material_type = /datum/material/bamboo /obj/item/stack/sheet/mineral/bamboo/get_main_recipes() . = ..() @@ -513,12 +516,14 @@ GLOBAL_LIST_INIT(cardboard_recipes, list ( \ desc = "Large sheets of card, like boxes folded flat." singular_name = "cardboard sheet" icon_state = "sheet-card" + custom_materials = list(/datum/material/cardboard = MINERAL_MATERIAL_AMOUNT) item_state = "sheet-card" resistance_flags = FLAMMABLE force = 0 throwforce = 0 merge_type = /obj/item/stack/sheet/cardboard novariants = TRUE + material_type = /datum/material/cardboard /obj/item/stack/sheet/cardboard/get_main_recipes() . = ..() @@ -558,10 +563,12 @@ GLOBAL_LIST_INIT(runed_metal_recipes, list ( \ icon_state = "sheet-runed" item_state = "sheet-runed" icon = 'icons/obj/stack_objects.dmi' + custom_materials = list(/datum/material/runedmetal = MINERAL_MATERIAL_AMOUNT) sheettype = "runed" merge_type = /obj/item/stack/sheet/runed_metal novariants = TRUE grind_results = list(/datum/reagent/iron = 5, /datum/reagent/blood = 15) + material_type = /datum/material/runedmetal /obj/item/stack/sheet/runed_metal/ratvar_act() new /obj/item/stack/tile/brass(loc, amount) @@ -680,6 +687,7 @@ GLOBAL_LIST_INIT(bronze_recipes, list ( \ icon_state = "sheet-brass" item_state = "sheet-brass" icon = 'icons/obj/stack_objects.dmi' + custom_materials = list(/datum/material/bronze = MINERAL_MATERIAL_AMOUNT) resistance_flags = FIRE_PROOF | ACID_PROOF throwforce = 10 max_amount = 50 @@ -690,6 +698,7 @@ GLOBAL_LIST_INIT(bronze_recipes, list ( \ grind_results = list(/datum/reagent/iron = 5, /datum/reagent/copper = 3) //we have no "tin" reagent so this is the closest thing merge_type = /obj/item/stack/tile/bronze tableVariant = /obj/structure/table/bronze + material_type = /datum/material/bronze /obj/item/stack/tile/bronze/attack_self(mob/living/user) if(is_servant_of_ratvar(user)) //still lets them build with it, just gives a message @@ -737,6 +746,7 @@ GLOBAL_LIST_INIT(bone_recipes, list( icon = 'icons/obj/mining.dmi' icon_state = "bone" item_state = "sheet-bone" + custom_materials = list(/datum/material/bone = MINERAL_MATERIAL_AMOUNT) singular_name = "bone" desc = "Someone's been drinking their milk." force = 7 @@ -747,6 +757,7 @@ GLOBAL_LIST_INIT(bone_recipes, list( throw_range = 3 grind_results = list(/datum/reagent/carbon = 10) merge_type = /obj/item/stack/sheet/bone + material_type = /datum/material/bone /obj/item/stack/sheet/bone/get_main_recipes() . = ..() @@ -774,6 +785,7 @@ GLOBAL_LIST_INIT(plastic_recipes, list( custom_materials = list(/datum/material/plastic=MINERAL_MATERIAL_AMOUNT) throwforce = 7 grind_results = list(/datum/reagent/glitter/white = 60) + material_type = /datum/material/plastic merge_type = /obj/item/stack/sheet/plastic /obj/item/stack/sheet/plastic/fifty @@ -799,9 +811,11 @@ new /datum/stack_recipe("paper frame door", /obj/structure/mineral_door/paperfra singular_name = "paper frame" icon_state = "sheet-paper" item_state = "sheet-paper" + custom_materials = list(/datum/material/paper = MINERAL_MATERIAL_AMOUNT) merge_type = /obj/item/stack/sheet/paperframes resistance_flags = FLAMMABLE merge_type = /obj/item/stack/sheet/paperframes + material_type = /datum/material/paper /obj/item/stack/sheet/paperframes/get_main_recipes() . = ..() @@ -842,3 +856,55 @@ new /datum/stack_recipe("paper frame door", /obj/structure/mineral_door/paperfra merge_type = /obj/item/stack/sheet/cotton/durathread pull_effort = 70 loom_result = /obj/item/stack/sheet/durathread + +/obj/item/stack/sheet/meat + name = "meat sheets" + desc = "Something's bloody meat compressed into a nice solid sheet" + singular_name = "meat sheet" + icon_state = "sheet-meat" + material_flags = MATERIAL_COLOR + custom_materials = list(/datum/material/meat = MINERAL_MATERIAL_AMOUNT) + merge_type = /obj/item/stack/sheet/meat + material_type = /datum/material/meat + material_modifier = 1 //None of that wussy stuff + +/obj/item/stack/sheet/meat/fifty + amount = 50 +/obj/item/stack/sheet/meat/twenty + amount = 20 +/obj/item/stack/sheet/meat/five + amount = 5 + +/obj/item/stack/sheet/pizza + name = "pepperoni sheetzzas" + desc = "It's a delicious pepperoni sheetzza!" + singular_name = "pepperoni sheetzza" + icon_state = "sheet-pizza" + custom_materials = list(/datum/material/pizza = MINERAL_MATERIAL_AMOUNT) + merge_type = /obj/item/stack/sheet/pizza + material_type = /datum/material/pizza + material_modifier = 1 + +/obj/item/stack/sheet/pizza/fifty + amount = 50 +/obj/item/stack/sheet/pizza/twenty + amount = 20 +/obj/item/stack/sheet/pizza/five + amount = 5 + +/obj/item/stack/sheet/sandblock + name = "blocks of sand" + desc = "You're too old to be playing with sandcastles. Now you build... sandstations." + singular_name = "block of sand" + icon_state = "sheet-sandstone" + custom_materials = list(/datum/material/sand = MINERAL_MATERIAL_AMOUNT) + merge_type = /obj/item/stack/sheet/sandblock + material_type = /datum/material/sand + material_modifier = 1 + +/obj/item/stack/sheet/sandblock/fifty + amount = 50 +/obj/item/stack/sheet/sandblock/twenty + amount = 20 +/obj/item/stack/sheet/sandblock/five + amount = 5 diff --git a/code/game/objects/items/stacks/sheets/sheets.dm b/code/game/objects/items/stacks/sheets/sheets.dm index dfba533247..57c8ba75d8 100644 --- a/code/game/objects/items/stacks/sheets/sheets.dm +++ b/code/game/objects/items/stacks/sheets/sheets.dm @@ -10,10 +10,14 @@ throw_range = 3 attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "smashed") novariants = FALSE - mats_per_stack = MINERAL_MATERIAL_AMOUNT - var/sheettype = null //this is used for girders in the creation of walls/false walls - var/point_value = 0 //turn-in value for the gulag stacker - loosely relative to its rarity - var/shard_type // the shard debris typepath left over by solar panels and windows etc. + ///this is used for girders in the creation of walls/false walls + var/sheettype = null + ///turn-in value for the gulag stacker - loosely relative to its rarity + var/point_value = 0 + /// the shard debris typepath left over by solar panels and windows etc. + var/shard_type + ///What type of wall does this sheet spawn + var/walltype /obj/item/stack/sheet/Initialize(mapload, new_amount, merge) . = ..() diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 2c8e700316..b124908bf2 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -22,7 +22,7 @@ var/merge_type = null // This path and its children should merge with this stack, defaults to src.type var/full_w_class = WEIGHT_CLASS_NORMAL //The weight class the stack should have at amount > 2/3rds max_amount var/novariants = TRUE //Determines whether the item should update it's sprites based on amount. - var/mats_per_stack = 0 + var/list/mats_per_unit //list that tells you how much is in a single unit. ///Datum material type that this stack is made of var/material_type //NOTE: When adding grind_results, the amounts should be for an INDIVIDUAL ITEM - these amounts will be multiplied by the stack size in on_grind() @@ -47,8 +47,11 @@ if(!merge_type) merge_type = type if(custom_materials && custom_materials.len) + mats_per_unit = list() + var/in_process_mat_list = custom_materials.Copy() for(var/i in custom_materials) - custom_materials[SSmaterials.GetMaterialRef(i)] = mats_per_stack * amount + mats_per_unit[SSmaterials.GetMaterialRef(i)] = in_process_mat_list[i] + custom_materials[i] *= amount . = ..() if(merge) for(var/obj/item/stack/S in loc) @@ -60,7 +63,7 @@ var/datum/material/M = SSmaterials.GetMaterialRef(material_type) //First/main material for(var/i in M.categories) switch(i) - if(MAT_CATEGORY_RIGID) + if(MAT_CATEGORY_BASE_RECIPES) var/list/temp = SSmaterials.rigid_stack_recipes.Copy() recipes += temp update_weight() @@ -309,16 +312,19 @@ /obj/item/stack/use(used, transfer = FALSE, check = TRUE) // return 0 = borked; return 1 = had enough if(check && zero_amount()) - return FALSE + return TRUE if (is_cyborg) return source.use_charge(used * cost) if (amount < used) return FALSE amount -= used - if(check) - zero_amount() - for(var/i in custom_materials) - custom_materials[i] = amount * mats_per_stack + if(check && zero_amount()) + return FALSE + if(length(mats_per_unit)) + var/temp_materials = custom_materials.Copy() + for(var/i in mats_per_unit) + temp_materials[i] = mats_per_unit[i] * src.amount + set_custom_materials(temp_materials) update_icon() update_weight() return TRUE @@ -350,10 +356,11 @@ source.add_charge(amount * cost) else src.amount += amount - if(custom_materials && custom_materials.len) - for(var/i in custom_materials) - custom_materials[SSmaterials.GetMaterialRef(i)] = MINERAL_MATERIAL_AMOUNT * src.amount - set_custom_materials() //Refresh + if(length(mats_per_unit)) + var/temp_materials = custom_materials.Copy() + for(var/i in mats_per_unit) + temp_materials[i] = mats_per_unit[i] * src.amount + set_custom_materials(temp_materials) update_icon() update_weight() diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 0635c55ca3..13fca1e8fe 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -9,16 +9,35 @@ throw_speed = 3 throw_range = 7 max_amount = 60 - mats_per_stack = 500 var/turf_type = null var/mineralType = null novariants = TRUE + var/human_maxHealth = 100 /obj/item/stack/tile/Initialize(mapload, amount) . = ..() pixel_x = rand(-3, 3) pixel_y = rand(-3, 3) //randomize a little +/obj/item/stack/tile/examine(mob/user) + . = ..() + if(throwforce && !is_cyborg) //do not want to divide by zero or show the message to borgs who can't throw + var/verb + switch(CEILING(human_maxHealth / throwforce, 1)) //throws to crit a human + if(1 to 3) + verb = "superb" + if(4 to 6) + verb = "great" + if(7 to 9) + verb = "good" + if(10 to 12) + verb = "fairly decent" + if(13 to 15) + verb = "mediocre" + if(!verb) + return + . += "Those could work as a [verb] throwing weapon." + /obj/item/stack/tile/attackby(obj/item/W, mob/user, params) if (istype(W, /obj/item/weldingtool)) @@ -470,7 +489,7 @@ /obj/item/stack/tile/plasteel name = "floor tile" singular_name = "floor tile" - desc = "Those could work as a pretty decent throwing weapon." + desc = "The ground you walk on." icon_state = "tile" force = 6 custom_materials = list(/datum/material/iron=500) @@ -482,7 +501,15 @@ resistance_flags = FIRE_PROOF /obj/item/stack/tile/plasteel/cyborg - desc = "The ground you walk on." //Not the usual floor tile desc as that refers to throwing, Cyborgs can't do that - RR custom_materials = null // All other Borg versions of items have no Metal or Glass - RR is_cyborg = 1 cost = 125 + +/obj/item/stack/tile/material + name = "floor tile" + singular_name = "floor tile" + desc = "The ground you walk on." + throwforce = 10 + icon_state = "material_tile" + turf_type = /turf/open/floor/material + material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index cacf361722..ff62b9cc48 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -170,7 +170,7 @@ qdel(src) return - if(S.sheettype && S.sheettype != "runed") + if(S.sheettype != "runed") var/M = S.sheettype if(state == GIRDER_DISPLACED) var/F = text2path("/obj/structure/falsewall/[M]") @@ -188,9 +188,13 @@ transfer_fingerprints_to(FW) qdel(src) else - var/F = text2path("/turf/closed/wall/mineral/[M]") + var/list/material_list + var/F = S.walltype if(!F) - return + F = /turf/closed/wall/material + if(S.material_type) + material_list = list() + material_list[SSmaterials.GetMaterialRef(S.material_type)] = MINERAL_MATERIAL_AMOUNT * 2 if(S.get_amount() < 2) to_chat(user, "You need at least two sheets to add plating!") return @@ -201,7 +205,9 @@ S.use(2) to_chat(user, "You add the plating.") var/turf/T = get_turf(src) - T.PlaceOnTop(F) + var/turf/newturf = T.PlaceOnTop(F) + if(material_list) + newturf.set_custom_materials(material_list) transfer_fingerprints_to(T) qdel(src) return diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 5eecc6962a..41e7c6c60f 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -157,8 +157,7 @@ secret_type = /obj/effect/spawner/lootdrop/prison_loot_toilet /obj/structure/toilet/greyscale - - material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR + material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_EFFECTS buildstacktype = null /obj/structure/urinal @@ -582,6 +581,12 @@ G.use(1) return + if(istype(O, /obj/item/stack/ore/glass)) + new /obj/item/stack/sheet/sandblock(loc) + to_chat(user, "You wet the sand in the sink and form it into a block.") + O.use(1) + return + if(!istype(O)) return if(O.item_flags & ABSTRACT) //Abstract items like grabs won't wash. No-drop items will though because it's still technically an item in your hand. @@ -702,11 +707,6 @@ icon_state = "puddle" resistance_flags = UNACIDABLE -/obj/structure/sink/greyscale - icon_state = "sink_greyscale" - material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR - buildstacktype = null - //ATTACK HAND IGNORING PARENT RETURN VALUE /obj/structure/sink/puddle/attack_hand(mob/M) icon_state = "puddle-splash" @@ -722,7 +722,8 @@ qdel(src) /obj/structure/sink/greyscale - material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR + icon_state = "sink_greyscale" + material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_EFFECTS buildstacktype = null //Shower Curtains// diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 75603a1116..bdca384bd0 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -189,9 +189,12 @@ if(user && !silent) to_chat(user, "You remove the floor tile.") if(floor_tile && make_tile) - new floor_tile(src) + spawn_tile() return make_plating() +/turf/open/floor/proc/spawn_tile() + new floor_tile(src) + /turf/open/floor/singularity_pull(S, current_size) . = ..() switch(current_size) @@ -293,3 +296,13 @@ return TRUE return FALSE + +/turf/open/floor/material + name = "floor" + icon_state = "materialfloor" + material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS + +/turf/open/floor/material/spawn_tile() + for(var/i in custom_materials) + var/datum/material/M = i + new M.sheet_type(src, FLOOR(custom_materials[M] / MINERAL_MATERIAL_AMOUNT, 1)) diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm index 8e0eace9cd..f26a4b827a 100644 --- a/code/game/turfs/simulated/floor/plating.dm +++ b/code/game/turfs/simulated/floor/plating.dm @@ -76,11 +76,15 @@ var/obj/item/stack/tile/W = C if(!W.use(1)) return - var/turf/open/floor/T = PlaceOnTop(W.turf_type, flags = CHANGETURF_INHERIT_AIR) - if(istype(W, /obj/item/stack/tile/light)) //TODO: get rid of this ugly check somehow - var/obj/item/stack/tile/light/L = W - var/turf/open/floor/light/F = T - F.state = L.state + if(istype(W, /obj/item/stack/tile/material)) + var/turf/newturf = PlaceOnTop(/turf/open/floor/material, flags = CHANGETURF_INHERIT_AIR) + newturf.set_custom_materials(W.custom_materials) + else if(W.turf_type) + var/turf/open/floor/T = PlaceOnTop(W.turf_type, flags = CHANGETURF_INHERIT_AIR) + if(istype(W, /obj/item/stack/tile/light)) //TODO: get rid of this ugly check somehow + var/obj/item/stack/tile/light/L = W + var/turf/open/floor/light/F = T + F.state = L.state playsound(src, 'sound/weapons/genhit.ogg', 50, 1) else to_chat(user, "This section is too damaged to support a tile! Use a welder to fix the damage.") diff --git a/code/game/turfs/simulated/wall/material_walls.dm b/code/game/turfs/simulated/wall/material_walls.dm new file mode 100644 index 0000000000..d3952609e0 --- /dev/null +++ b/code/game/turfs/simulated/wall/material_walls.dm @@ -0,0 +1,22 @@ +/turf/closed/wall/material + name = "wall" + desc = "A huge chunk of material used to separate rooms." + icon = 'icons/turf/walls/materialwall.dmi' + icon_state = "wall" + canSmoothWith = list(/turf/closed/wall/material) + smooth = SMOOTH_TRUE + material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR | MATERIAL_AFFECT_STATISTICS + +/turf/closed/wall/material/break_wall() + for(var/i in custom_materials) + var/datum/material/M = i + new M.sheet_type(src, FLOOR(custom_materials[M] / MINERAL_MATERIAL_AMOUNT, 1)) + return new girder_type(src) + +/turf/closed/wall/material/devastate_wall() + for(var/i in custom_materials) + var/datum/material/M = i + new M.sheet_type(src, FLOOR(custom_materials[M] / MINERAL_MATERIAL_AMOUNT, 1)) + +/turf/closed/wall/material/mat_update_desc(mat) + desc = "A huge chunk of [mat] used to separate rooms." diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 88f6dd6962..5db289bd31 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -85,6 +85,9 @@ if (opacity) has_opaque_atom = TRUE + // apply materials properly from the default custom_materials value + set_custom_materials(custom_materials) + ComponentInitialize() return INITIALIZE_HINT_NORMAL diff --git a/code/modules/antagonists/bloodsucker/items/bloodsucker_organs.dm b/code/modules/antagonists/bloodsucker/items/bloodsucker_organs.dm index 640c53946f..25de64fe34 100644 --- a/code/modules/antagonists/bloodsucker/items/bloodsucker_organs.dm +++ b/code/modules/antagonists/bloodsucker/items/bloodsucker_organs.dm @@ -31,10 +31,6 @@ beating = 0 var/fakingit = 0 -/obj/item/organ/heart/vampheart/prepare_eat() - ..() - // Do cool stuff for eating vamp heart? - /obj/item/organ/heart/vampheart/Restart() beating = 0 // DONT run ..(). We don't want to start beating again. return 0 diff --git a/code/modules/arousal/genitals.dm b/code/modules/arousal/genitals.dm index fb254a2dcc..4d2e5e6fef 100644 --- a/code/modules/arousal/genitals.dm +++ b/code/modules/arousal/genitals.dm @@ -1,7 +1,7 @@ /obj/item/organ/genital color = "#fcccb3" w_class = WEIGHT_CLASS_SMALL - organ_flags = ORGAN_NO_DISMEMBERMENT + organ_flags = ORGAN_NO_DISMEMBERMENT|ORGAN_EDIBLE var/shape var/sensitivity = 1 // wow if this were ever used that'd be cool but it's not but i'm keeping it for my unshit code var/genital_flags //see citadel_defines.dm diff --git a/code/modules/food_and_drinks/food.dm b/code/modules/food_and_drinks/food.dm index 203eb3eef6..f83a1222fd 100644 --- a/code/modules/food_and_drinks/food.dm +++ b/code/modules/food_and_drinks/food.dm @@ -6,7 +6,6 @@ /// get_random_food proc. //////////////////////////////////////////////////////////////////////////////// -#define STOP_SERVING_BREAKFAST (15 MINUTES) /obj/item/reagent_containers/food possible_transfer_amounts = list() @@ -51,5 +50,3 @@ if((foodtype & BREAKFAST) && world.time - SSticker.round_start_time < STOP_SERVING_BREAKFAST) SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "breakfast", /datum/mood_event/breakfast) last_check_time = world.time - -#undef STOP_SERVING_BREAKFAST diff --git a/code/modules/food_and_drinks/food/snacks/meat.dm b/code/modules/food_and_drinks/food/snacks/meat.dm index b8fa64a7bc..a35dcc1dc4 100644 --- a/code/modules/food_and_drinks/food/snacks/meat.dm +++ b/code/modules/food_and_drinks/food/snacks/meat.dm @@ -1,6 +1,7 @@ /obj/item/reagent_containers/food/snacks/meat var/subjectname = "" var/subjectjob = null + custom_materials = list(/datum/material/meat = MINERAL_MATERIAL_AMOUNT * 4) /obj/item/reagent_containers/food/snacks/meat/slab name = "meat" diff --git a/code/modules/food_and_drinks/food/snacks_pizza.dm b/code/modules/food_and_drinks/food/snacks_pizza.dm index ebc67a28c1..f30c182963 100644 --- a/code/modules/food_and_drinks/food/snacks_pizza.dm +++ b/code/modules/food_and_drinks/food/snacks_pizza.dm @@ -10,6 +10,17 @@ tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1) foodtype = GRAIN | DAIRY | VEGETABLES +/obj/item/reagent_containers/food/snacks/pizzaslice/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/kitchen/rollingpin)) + if(!isturf(loc)) + to_chat(user, "You need to put [src] on a surface to roll it out!") + return + new /obj/item/stack/sheet/pizza(loc) + to_chat(user, "You smoosh [src] into a cheesy sheet.") + qdel(src) + return + return ..() + /obj/item/reagent_containers/food/snacks/pizzaslice icon = 'icons/obj/food/pizzaspaghetti.dmi' list_reagents = list(/datum/reagent/consumable/nutriment = 5) diff --git a/code/modules/mining/equipment/regenerative_core.dm b/code/modules/mining/equipment/regenerative_core.dm index 439929b9c1..1de3a86702 100644 --- a/code/modules/mining/equipment/regenerative_core.dm +++ b/code/modules/mining/equipment/regenerative_core.dm @@ -111,9 +111,6 @@ go_inert() return ..() -/obj/item/organ/regenerative_core/prepare_eat() - return null - /*************************Legion core********************/ /obj/item/organ/regenerative_core/legion desc = "A strange rock that crackles with power. It can be used to heal completely, but it will rapidly decay into uselessness." diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index f6b7110803..f429230453 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -17,7 +17,6 @@ var/points = 0 //How many points this ore gets you from the ore redemption machine var/refined_type = null //What this ore defaults to being refined into novariants = TRUE // Ore stacks handle their icon updates themselves to keep the illusion that there's more going - mats_per_stack = MINERAL_MATERIAL_AMOUNT var/list/stack_overlays /obj/item/stack/ore/update_overlays() diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index 687442c1f8..4fda02317e 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -76,9 +76,6 @@ REMOVE_SKILL_MODIFIER_BODY(/datum/skill_modifier/heavy_brain_damage, null, C) C.update_hair() -/obj/item/organ/brain/prepare_eat() - return // Too important to eat. - /obj/item/organ/brain/proc/transfer_identity(mob/living/L) name = "[L.name]'s brain" if(brainmob) diff --git a/code/modules/mob/living/carbon/alien/organs.dm b/code/modules/mob/living/carbon/alien/organs.dm index 8485fece85..8e3966eb03 100644 --- a/code/modules/mob/living/carbon/alien/organs.dm +++ b/code/modules/mob/living/carbon/alien/organs.dm @@ -1,7 +1,8 @@ /obj/item/organ/alien icon_state = "xgibmid2" + food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/toxin/acid = 10) var/list/alien_powers = list() - organ_flags = ORGAN_NO_SPOIL + organ_flags = ORGAN_NO_SPOIL|ORGAN_EDIBLE /obj/item/organ/alien/Initialize() . = ..() @@ -26,12 +27,6 @@ owner.RemoveAbility(P) ..() -/obj/item/organ/alien/prepare_eat() - var/obj/S = ..() - S.reagents.add_reagent(/datum/reagent/toxin/acid, 10) - return S - - /obj/item/organ/alien/plasmavessel name = "plasma vessel" icon_state = "plasma" @@ -39,17 +34,13 @@ zone = BODY_ZONE_CHEST slot = "plasmavessel" alien_powers = list(/obj/effect/proc_holder/alien/plant, /obj/effect/proc_holder/alien/transfer) + food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/toxin/plasma = 10) var/storedPlasma = 100 var/max_plasma = 250 var/heal_rate = 5 var/plasma_rate = 10 -/obj/item/organ/alien/plasmavessel/prepare_eat() - var/obj/S = ..() - S.reagents.add_reagent(/datum/reagent/toxin/plasma, storedPlasma/10) - return S - /obj/item/organ/alien/plasmavessel/large name = "large plasma vessel" icon_state = "plasma_large" diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm index 9bb50bdf42..bb92eb79bd 100644 --- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm +++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm @@ -4,6 +4,7 @@ name = "alien embryo" icon = 'icons/mob/alien.dmi' icon_state = "larva0_dead" + food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/toxin/acid = 10) var/stage = 0 var/bursting = FALSE @@ -16,11 +17,6 @@ if(prob(10)) AttemptGrow(0) -/obj/item/organ/body_egg/alien_embryo/prepare_eat() - var/obj/S = ..() - S.reagents.add_reagent(/datum/reagent/toxin/acid, 10) - return S - /obj/item/organ/body_egg/alien_embryo/on_life() . = ..() if(!owner) diff --git a/code/modules/mob/living/carbon/human/species_types/dwarves.dm b/code/modules/mob/living/carbon/human/species_types/dwarves.dm index bc5f198b4d..7ca057711e 100644 --- a/code/modules/mob/living/carbon/human/species_types/dwarves.dm +++ b/code/modules/mob/living/carbon/human/species_types/dwarves.dm @@ -89,11 +89,7 @@ GLOBAL_LIST_INIT(dwarf_last, world.file2list("strings/names/dwarf_last.txt")) // //These count in on_life ticks which should be 2 seconds per every increment of 1 in a perfect world. var/dwarf_eth_ticker = 0 //Currently set =< 1, that means this will fire the proc around every 2 seconds var/last_alcohol_spam - -/obj/item/organ/dwarfgland/prepare_eat() - var/obj/S = ..() - S.reagents.add_reagent(/datum/reagent/consumable/ethanol, stored_alcohol/10) - return S + food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/ethanol = 10) /obj/item/organ/dwarfgland/on_life() //Primary loop to hook into to start delayed loops for other loops.. . = ..() diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index cb43a8489a..9e1e7a1b89 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -128,7 +128,7 @@ S.source = get_or_create_estorage(/datum/robot_energy_storage/wrapping_paper) if(S && S.source) - S.custom_materials = null + S.set_custom_materials(null) S.is_cyborg = 1 if(I.loc != src) diff --git a/code/modules/projectiles/boxes_magazines/_box_magazine.dm b/code/modules/projectiles/boxes_magazines/_box_magazine.dm index 8ebddaa24f..9ea030da99 100644 --- a/code/modules/projectiles/boxes_magazines/_box_magazine.dm +++ b/code/modules/projectiles/boxes_magazines/_box_magazine.dm @@ -114,11 +114,13 @@ /obj/item/ammo_box/update_icon() . = ..() desc = "[initial(desc)] There [stored_ammo.len == 1 ? "is" : "are"] [stored_ammo.len] shell\s left!" - for (var/material in bullet_cost) - var/material_amount = bullet_cost[material] - material_amount = (material_amount*stored_ammo.len) + base_cost[material] - custom_materials[material] = material_amount - set_custom_materials(custom_materials)//make sure we setup the correct properties again + if(length(bullet_cost)) + var/temp_materials = custom_materials.Copy() + for (var/material in bullet_cost) + var/material_amount = bullet_cost[material] + material_amount = (material_amount*stored_ammo.len) + base_cost[material] + temp_materials[material] = material_amount + set_custom_materials(temp_materials) /obj/item/ammo_box/update_icon_state() switch(multiple_sprites) diff --git a/code/modules/research/designs/machine_desings/machine_designs_all_misc.dm b/code/modules/research/designs/machine_desings/machine_designs_all_misc.dm index 804556cb04..e0702be689 100644 --- a/code/modules/research/designs/machine_desings/machine_designs_all_misc.dm +++ b/code/modules/research/designs/machine_desings/machine_designs_all_misc.dm @@ -154,3 +154,12 @@ build_path = /obj/item/circuitboard/machine/shuttle/heater category = list ("Shuttle Machinery") departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/board/sheetifier + name = "Sheetifier" + desc = "This machine turns weird things into sheets." + id = "sheetifier" + build_path = /obj/item/circuitboard/machine/sheetifier + category = list ("Misc. Machinery") + departmental_flags = DEPARTMENTAL_FLAG_ALL + diff --git a/code/modules/research/machinery/_production.dm b/code/modules/research/machinery/_production.dm index a5df3f4d12..5a50120833 100644 --- a/code/modules/research/machinery/_production.dm +++ b/code/modules/research/machinery/_production.dm @@ -96,7 +96,7 @@ for(var/i in 1 to amount) var/obj/O = new path(get_turf(src)) if(efficient_with(O.type)) - O.set_custom_materials(matlist.Copy()) + O.set_custom_materials(matlist) O.rnd_crafted(src) SSblackbox.record_feedback("nested tally", "item_printed", amount, list("[type]", "[path]")) investigate_log("[key_name(user)] built [amount] of [path] at [src]([type]).", INVESTIGATE_RESEARCH) diff --git a/code/modules/research/techweb/nodes/engineering_nodes.dm b/code/modules/research/techweb/nodes/engineering_nodes.dm index eac8c2faf2..d024823c85 100644 --- a/code/modules/research/techweb/nodes/engineering_nodes.dm +++ b/code/modules/research/techweb/nodes/engineering_nodes.dm @@ -16,7 +16,9 @@ display_name = "Advanced Engineering" description = "Pushing the boundaries of physics, one chainsaw-fist at a time." prereq_ids = list("engineering", "emp_basic") - design_ids = list("engine_goggles", "magboots", "forcefield_projector", "weldingmask" , "rcd_loaded", "rpd", "tray_goggles_prescription", "engine_goggles_prescription", "mesons_prescription", "rcd_upgrade_frames", "rcd_upgrade_simple_circuits", "rcd_ammo_large") + design_ids = list("engine_goggles", "magboots", "forcefield_projector", "weldingmask" , "rcd_loaded", "rpd", + "tray_goggles_prescription", "engine_goggles_prescription", "mesons_prescription", "rcd_upgrade_frames", + "rcd_upgrade_simple_circuits", "rcd_ammo_large", "sheetifier") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 4000) /datum/techweb_node/anomaly diff --git a/code/modules/surgery/organ_manipulation.dm b/code/modules/surgery/organ_manipulation.dm index f493137424..4ce51ae119 100644 --- a/code/modules/surgery/organ_manipulation.dm +++ b/code/modules/surgery/organ_manipulation.dm @@ -61,7 +61,7 @@ time = 64 name = "manipulate organs" repeatable = 1 - implements = list(/obj/item/organ = 100, /obj/item/reagent_containers/food/snacks/organ = 0, /obj/item/organ_storage = 100) + implements = list(/obj/item/organ = 100, /obj/item/organ_storage = 100) var/implements_extract = list(TOOL_HEMOSTAT = 100, TOOL_CROWBAR = 55) var/current_type var/obj/item/organ/I = null @@ -85,6 +85,10 @@ if(target_zone != I.zone || target.getorganslot(I.slot)) to_chat(user, "There is no room for [I] in [target]'s [parse_zone(target_zone)]!") return -1 + var/obj/item/organ/meatslab = tool + if(!meatslab.useable) + to_chat(user, "[I] seems to have been chewed on, you can't use this!") + return -1 display_results(user, target, "You begin to insert [tool] into [target]'s [parse_zone(target_zone)]...", "[user] begins to insert [tool] into [target]'s [parse_zone(target_zone)].", "[user] begins to insert something into [target]'s [parse_zone(target_zone)].") @@ -111,9 +115,6 @@ else return -1 - else if(istype(tool, /obj/item/reagent_containers/food/snacks/organ)) - to_chat(user, "[tool] was bitten by someone! It's too damaged to use!") - return -1 /datum/surgery_step/manipulate_organs/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) if(current_type == "insert") if(istype(tool, /obj/item/organ_storage)) diff --git a/code/modules/surgery/organs/appendix.dm b/code/modules/surgery/organs/appendix.dm index c737e8bc30..782991d79c 100644 --- a/code/modules/surgery/organs/appendix.dm +++ b/code/modules/surgery/organs/appendix.dm @@ -37,9 +37,3 @@ ..() if(inflamed) M.ForceContractDisease(new /datum/disease/appendicitis(), FALSE, TRUE) - -/obj/item/organ/appendix/prepare_eat() - var/obj/S = ..() - if(inflamed) - S.reagents.add_reagent(/datum/reagent/toxin/bad_food, 5) - return S diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm index 465c10c4cd..e251abfd35 100644 --- a/code/modules/surgery/organs/heart.dm +++ b/code/modules/surgery/organs/heart.dm @@ -61,10 +61,10 @@ return "a healthy" return "an unstable" -/obj/item/organ/heart/prepare_eat() - var/obj/S = ..() - S.icon_state = "[icon_base]-off" - return S +/obj/item/organ/heart/OnEatFrom(eater, feeder) + . = ..() + beating = FALSE + update_icon() /obj/item/organ/heart/on_life() . = ..() diff --git a/code/modules/surgery/organs/liver.dm b/code/modules/surgery/organs/liver.dm index b24034ca4a..2465b63800 100755 --- a/code/modules/surgery/organs/liver.dm +++ b/code/modules/surgery/organs/liver.dm @@ -23,6 +23,7 @@ var/toxLethality = LIVER_DEFAULT_TOX_LETHALITY//affects how much damage toxins do to the liver var/filterToxins = TRUE //whether to filter toxins var/cachedmoveCalc = 1 + food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/iron = 5) /obj/item/organ/liver/on_life() . = ..() @@ -44,11 +45,6 @@ if(damage > 10 && prob(damage/3))//the higher the damage the higher the probability to_chat(owner, "You feel a dull pain in your abdomen.") -/obj/item/organ/liver/prepare_eat() - var/obj/S = ..() - S.reagents.add_reagent(/datum/reagent/iron, 5) - return S - /obj/item/organ/liver/applyOrganDamage(d, maximum = maxHealth) . = ..() if(!. || QDELETED(owner)) diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index b3020ae13f..949eef62d0 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -24,6 +24,8 @@ now_fixed = "Your lungs seem to once again be able to hold air." high_threshold_cleared = "The constriction around your chest loosens as your breathing calms down." + food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/medicine/salbutamol = 5) + //Breath damage var/safe_oxygen_min = 16 // Minimum safe partial pressure of O2, in kPa @@ -458,11 +460,6 @@ else if(!(organ_flags & ORGAN_FAILING)) failed = FALSE -/obj/item/organ/lungs/prepare_eat() - var/obj/S = ..() - S.reagents.add_reagent(/datum/reagent/medicine/salbutamol, 5) - return S - /obj/item/organ/lungs/ipc name = "ipc lungs" icon_state = "lungs-c" diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 761ebc17a2..0378340117 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -8,7 +8,7 @@ var/zone = BODY_ZONE_CHEST var/slot // DO NOT add slots with matching names to different zones - it will break internal_organs_slot list! - var/organ_flags = NONE + var/organ_flags = ORGAN_EDIBLE var/maxHealth = STANDARD_ORGAN_THRESHOLD var/damage = 0 //total damage this organ has sustained ///Healing factor and decay factor function on % of maxhealth, and do not work by applying a static number per tick @@ -25,7 +25,23 @@ var/now_fixed var/high_threshold_cleared var/low_threshold_cleared - rad_flags = RAD_NO_CONTAMINATE + + ///When you take a bite you cant jam it in for surgery anymore. + var/useable = TRUE + var/list/food_reagents = list(/datum/reagent/consumable/nutriment = 5) + +/obj/item/organ/Initialize() + . = ..() + if(organ_flags & ORGAN_EDIBLE) + AddComponent(/datum/component/edible, food_reagents, null, RAW | MEAT | GROSS, null, 10, null, null, null, CALLBACK(src, .proc/OnEatFrom)) + START_PROCESSING(SSobj, src) + +/obj/item/organ/Destroy() + if(owner) + // The special flag is important, because otherwise mobs can die + // while undergoing transformation into different mobs. + Remove(TRUE) + return ..() /obj/item/organ/proc/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE) if(!iscarbon(M) || owner == M) @@ -157,47 +173,8 @@ if(damage > high_threshold) . += "[src] is starting to look discolored." - -/obj/item/organ/proc/prepare_eat() - var/obj/item/reagent_containers/food/snacks/organ/S = new - S.name = name - S.desc = desc - S.icon = icon - S.icon_state = icon_state - S.w_class = w_class - - return S - -/obj/item/reagent_containers/food/snacks/organ - name = "appendix" - icon_state = "appendix" - icon = 'icons/obj/surgery.dmi' - list_reagents = list(/datum/reagent/consumable/nutriment = 5) - foodtype = RAW | MEAT | GROSS - - -/obj/item/organ/Initialize() - . = ..() - START_PROCESSING(SSobj, src) - -/obj/item/organ/Destroy() - if(owner) - // The special flag is important, because otherwise mobs can die - // while undergoing transformation into different mobs. - Remove(TRUE) - return ..() - -/obj/item/organ/attack(mob/living/carbon/M, mob/user) - if(M == user && ishuman(user)) - var/mob/living/carbon/human/H = user - if(status == ORGAN_ORGANIC) - var/obj/item/reagent_containers/food/snacks/S = prepare_eat() - if(S) - qdel(src) - if(H.put_in_active_hand(S)) - S.attack(H, H) - else - ..() +/obj/item/organ/proc/OnEatFrom(eater, feeder) + useable = FALSE //You can't use it anymore after eating it you spaztic /obj/item/organ/item_action_slot_check(slot,mob/user) return //so we don't grant the organ's action to mobs who pick up the organ. diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index f8547dda6e..1c4a2d3043 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -252,6 +252,7 @@ name = "robotic voicebox" desc = "A voice synthesizer that can interface with organic lifeforms." status = ORGAN_ROBOTIC + organ_flags = ORGAN_NO_SPOIL icon_state = "tonguerobot" say_mod = "states" attack_verb = list("beeped", "booped") diff --git a/icons/materials/composite.dmi b/icons/materials/composite.dmi new file mode 100644 index 0000000000000000000000000000000000000000..a2a92b6eb7e57a19a92711e59e12386f11253379 GIT binary patch literal 2954 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 AUH||9 literal 0 HcmV?d00001 diff --git a/icons/obj/machines/sheetifier.dmi b/icons/obj/machines/sheetifier.dmi new file mode 100644 index 0000000000000000000000000000000000000000..46d8b06babcd41f6e47fb8be74a8e662339a25c7 GIT binary patch literal 2784 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 G=>GuZ9J=Mupo9p5C?(z92!}2S=~R%EzK8$s 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 literal 16723 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 UmYhc5pC!P^NGOU|i5dp{UyI7$mH+?% diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi index 477120870be2b54db9fa5474d3a5c0ba2fb30381..20963e7fbe32ab9636ff15833c0c08f72c156c2e 100644 GIT binary patch delta 15850 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

GpDc*J%zD&awbf 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 literal 0 HcmV?d00001 diff --git a/sound/effects/meatslap.ogg b/sound/effects/meatslap.ogg new file mode 100644 index 0000000000000000000000000000000000000000..3d8ea7df1ac45551b57b584903cdc324f3126dc8 GIT binary patch literal 12414 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 literal 0 HcmV?d00001 diff --git a/tgstation.dme b/tgstation.dme index 78cce84a0c..7559e432f4 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -405,6 +405,7 @@ #include "code\datums\components\construction.dm" #include "code\datums\components\dejavu.dm" #include "code\datums\components\earprotection.dm" +#include "code\datums\components\edible.dm" #include "code\datums\components\edit_complainer.dm" #include "code\datums\components\embedded.dm" #include "code\datums\components\explodable.dm" @@ -579,6 +580,8 @@ #include "code\datums\martial\wrestling.dm" #include "code\datums\materials\_material.dm" #include "code\datums\materials\basemats.dm" +#include "code\datums\materials\meat.dm" +#include "code\datums\materials\pizza.dm" #include "code\datums\mood_events\beauty_events.dm" #include "code\datums\mood_events\drink_events.dm" #include "code\datums\mood_events\drug_events.dm" @@ -761,6 +764,7 @@ #include "code\game\machinery\rechargestation.dm" #include "code\game\machinery\recycler.dm" #include "code\game\machinery\requests_console.dm" +#include "code\game\machinery\sheetifier.dm" #include "code\game\machinery\shieldgen.dm" #include "code\game\machinery\Sleeper.dm" #include "code\game\machinery\slotmachine.dm" @@ -1272,6 +1276,7 @@ #include "code\game\turfs\simulated\floor\plating\asteroid.dm" #include "code\game\turfs\simulated\floor\plating\dirt.dm" #include "code\game\turfs\simulated\floor\plating\misc_plating.dm" +#include "code\game\turfs\simulated\wall\material_walls.dm" #include "code\game\turfs\simulated\wall\mineral_walls.dm" #include "code\game\turfs\simulated\wall\misc_walls.dm" #include "code\game\turfs\simulated\wall\reinf_walls.dm" From ba794a32831b2eefe09b443a3f0d8a2b3844cc9a Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Wed, 24 Jun 2020 21:22:08 +0200 Subject: [PATCH 2/3] Looks like there are chunks of reagents updates I gotta port later. --- code/datums/components/edible.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/datums/components/edible.dm b/code/datums/components/edible.dm index b2b75ab032..e70c791f98 100644 --- a/code/datums/components/edible.dm +++ b/code/datums/components/edible.dm @@ -155,7 +155,8 @@ Behavior that's still missing from this component that original food items had t if(owner.reagents.total_volume) SEND_SIGNAL(parent, COMSIG_FOOD_EATEN, eater, feeder) var/fraction = min(bite_consumption / owner.reagents.total_volume, 1) - owner.reagents.trans_to(eater, bite_consumption, transfered_by = feeder, method = INGEST) + reagents.reaction(M, INGEST, fraction) + owner.reagents.trans_to(eater, bite_consumption) bitecount++ On_Consume(eater) checkLiked(fraction, eater) From 04902e1fc5ec36a3375d172acdc9e7f9ad5a8a8f Mon Sep 17 00:00:00 2001 From: Ghommie <42542238+Ghommie@users.noreply.github.com> Date: Wed, 24 Jun 2020 23:32:31 +0200 Subject: [PATCH 3/3] Whoops --- code/datums/components/edible.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/components/edible.dm b/code/datums/components/edible.dm index e70c791f98..47e60a1ee1 100644 --- a/code/datums/components/edible.dm +++ b/code/datums/components/edible.dm @@ -155,7 +155,7 @@ Behavior that's still missing from this component that original food items had t if(owner.reagents.total_volume) SEND_SIGNAL(parent, COMSIG_FOOD_EATEN, eater, feeder) var/fraction = min(bite_consumption / owner.reagents.total_volume, 1) - reagents.reaction(M, INGEST, fraction) + owner.reagents.reaction(eater, INGEST, fraction) owner.reagents.trans_to(eater, bite_consumption) bitecount++ On_Consume(eater)