mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-10 18:22:39 +00:00
88 lines
3.2 KiB
Plaintext
88 lines
3.2 KiB
Plaintext
/// Grinds down various objects into their reagent components. Returns true if any reagents were gained from the attempt.
|
|
/proc/grind_items_to_reagents(var/list/holdingitems,var/datum/reagents/R)
|
|
var/start_volume = R.total_volume
|
|
|
|
for(var/obj/item/O in holdingitems)
|
|
var/remaining_volume = R.maximum_volume - R.total_volume
|
|
if(remaining_volume <= 0)
|
|
break
|
|
|
|
//CHOMPedit start
|
|
if(istype(O,/obj/item/stack/material/supermatter))
|
|
var/regrets = 0
|
|
for(var/obj/item/stack/material/supermatter/S in holdingitems)
|
|
regrets += S.get_amount()
|
|
puny_protons(regrets, R.my_atom, holdingitems)
|
|
return
|
|
//CHOMPedit end
|
|
|
|
if(GLOB.sheet_reagents[O.type])
|
|
var/obj/item/stack/stack = O
|
|
if(istype(stack))
|
|
var/list/sheet_components = GLOB.sheet_reagents[stack.type]
|
|
// Some stacks can be made into other stacks with a multiplier. This handles that.
|
|
var/remove_amount = stack.reagents_per_sheet()
|
|
var/amount_to_take = max(0,min(stack.get_amount(),round(remaining_volume/remove_amount)))
|
|
if(amount_to_take)
|
|
stack.use(amount_to_take)
|
|
if(QDELETED(stack))
|
|
holdingitems -= stack
|
|
if(islist(sheet_components))
|
|
amount_to_take = (amount_to_take/(sheet_components.len))
|
|
for(var/i in sheet_components)
|
|
R.add_reagent(i, (amount_to_take*remove_amount))
|
|
else
|
|
R.add_reagent(sheet_components, (amount_to_take*remove_amount))
|
|
continue
|
|
|
|
else if(GLOB.ore_reagents[O.type])
|
|
var/obj/item/ore/D = O
|
|
if(istype(D))
|
|
var/list/ore_components = GLOB.ore_reagents[D.type]
|
|
if(remaining_volume >= REAGENTS_PER_ORE)
|
|
holdingitems -= D
|
|
qdel(D)
|
|
if(islist(ore_components))
|
|
var/amount_to_take = (REAGENTS_PER_ORE/(ore_components.len))
|
|
for(var/i in ore_components)
|
|
R.add_reagent(i, amount_to_take)
|
|
else
|
|
R.add_reagent(ore_components, REAGENTS_PER_ORE)
|
|
continue
|
|
|
|
else if(O.reagents && O.reagents.total_volume > 0)
|
|
O.reagents.trans_to_obj(R.my_atom, min(O.reagents.total_volume, remaining_volume))
|
|
if(O.reagents.total_volume == 0)
|
|
holdingitems -= O
|
|
qdel(O)
|
|
if (R.total_volume >= R.maximum_volume)
|
|
break
|
|
|
|
else
|
|
// Cronch
|
|
holdingitems -= O
|
|
qdel(O)
|
|
|
|
return (R.total_volume > start_volume)
|
|
|
|
// CHOMPedit start: Repurposed coffee grinders and supermatter do not mix.
|
|
/proc/puny_protons(regrets = 0, var/atom/our_atom, var/list/holdingitems)
|
|
our_atom.set_light(0)
|
|
if(regrets > 0) // If you thought grinding supermatter would end well. Values taken from ex_act() for the supermatter stacks.
|
|
SSradiation.radiate(get_turf(our_atom), 15 + regrets * 4)
|
|
explosion(get_turf(our_atom), round(regrets / 12) , round(regrets / 6), round(regrets / 3), round(regrets / 25))
|
|
qdel(our_atom)
|
|
return
|
|
|
|
else // If you added supermatter but didn't try grinding it, or somehow this is negative.
|
|
for(var/obj/item/stack/material/supermatter/S in holdingitems)
|
|
S.loc = our_atom.loc
|
|
holdingitems -= S
|
|
regrets += S.get_amount()
|
|
SSradiation.radiate(get_turf(our_atom), 15 + regrets)
|
|
our_atom.visible_message(span_warning("\The [our_atom] glows brightly, bursting into flames and flashing into ash."),\
|
|
span_warning("You hear an unearthly shriek, burning heat washing over you."))
|
|
new /obj/effect/decal/cleanable/ash(our_atom.loc)
|
|
qdel(our_atom)
|
|
// CHOMPedit end
|