Files
GS13NG/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
T

226 lines
6.4 KiB
Plaintext

/obj/machinery/gibber
name = "gibber"
desc = "The name isn't descriptive enough?"
icon = 'icons/obj/kitchen.dmi'
icon_state = "grinder"
density = TRUE
use_power = IDLE_POWER_USE
idle_power_usage = 2
active_power_usage = 500
circuit = /obj/item/circuitboard/machine/gibber
var/operating = FALSE //Is it on?
var/dirty = FALSE // Does it need cleaning?
var/gibtime = 40 // Time from starting until meat appears
var/meat_produced = 0
var/ignore_clothing = FALSE
/obj/machinery/gibber/Initialize()
. = ..()
add_overlay("grjam")
/obj/machinery/gibber/RefreshParts()
var/gib_time = 40
for(var/obj/item/stock_parts/matter_bin/B in component_parts)
meat_produced += B.rating
for(var/obj/item/stock_parts/manipulator/M in component_parts)
gib_time -= 5 * M.rating
gibtime = gib_time
if(M.rating >= 2)
ignore_clothing = TRUE
/obj/machinery/gibber/update_icon()
cut_overlays()
if (dirty)
add_overlay("grbloody")
if(stat & (NOPOWER|BROKEN))
return
if (!occupant)
add_overlay("grjam")
else if (operating)
add_overlay("gruse")
else
add_overlay("gridle")
/obj/machinery/gibber/attack_paw(mob/user)
return attack_hand(user)
/obj/machinery/gibber/container_resist(mob/living/user)
go_out()
/obj/machinery/gibber/relaymove(mob/living/user)
go_out()
/obj/machinery/gibber/attack_hand(mob/user)
. = ..()
if(.)
return
if(stat & (NOPOWER|BROKEN))
return
if(operating)
to_chat(user, "<span class='danger'>It's locked and running.</span>")
return
if(!anchored)
to_chat(user, "<span class='notice'>[src] cannot be used unless bolted to the ground.</span>")
return
if(user.pulling && user.a_intent == INTENT_GRAB && isliving(user.pulling))
var/mob/living/L = user.pulling
if(!iscarbon(L))
to_chat(user, "<span class='danger'>This item is not suitable for the gibber!</span>")
return
var/mob/living/carbon/C = L
if(C.buckled ||C.has_buckled_mobs())
to_chat(user, "<span class='warning'>[C] is attached to something!</span>")
return
if(!ignore_clothing)
for(var/obj/item/I in C.held_items + C.get_equipped_items())
if(!HAS_TRAIT(I, TRAIT_NODROP))
to_chat(user, "<span class='danger'>Subject may not have abiotic items on.</span>")
return
user.visible_message("<span class='danger'>[user] starts to put [C] into the gibber!</span>")
add_fingerprint(user)
if(do_after(user, gibtime, target = src))
if(C && user.pulling == C && !C.buckled && !C.has_buckled_mobs() && !occupant)
user.visible_message("<span class='danger'>[user] stuffs [C] into the gibber!</span>")
C.forceMove(src)
occupant = C
update_icon()
else
startgibbing(user)
/obj/machinery/gibber/attackby(obj/item/P, mob/user, params)
if(default_deconstruction_screwdriver(user, "grinder_open", "grinder", P))
return
else if(default_pry_open(P))
return
else if(default_unfasten_wrench(user, P))
return
else if(default_deconstruction_crowbar(P))
return
else
return ..()
/obj/machinery/gibber/verb/eject()
set category = "Object"
set name = "empty gibber"
set src in oview(1)
if(usr.incapacitated())
return
src.go_out()
add_fingerprint(usr)
return
/obj/machinery/gibber/proc/go_out()
dropContents()
update_icon()
/obj/machinery/gibber/proc/startgibbing(mob/user)
if(src.operating)
return
if(!src.occupant)
visible_message("<span class='italics'>You hear a loud metallic grinding sound.</span>")
return
use_power(1000)
visible_message("<span class='italics'>You hear a loud squelchy grinding sound.</span>")
playsound(src.loc, 'sound/machines/juicer.ogg', 50, 1)
operating = TRUE
update_icon()
var/offset = prob(50) ? -2 : 2
animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 200) //start shaking
var/mob/living/mob_occupant = occupant
var/sourcename = mob_occupant.real_name
var/sourcejob
if(ishuman(occupant))
var/mob/living/carbon/human/gibee = occupant
sourcejob = gibee.job
var/sourcenutriment = mob_occupant.nutrition / 15
var/gibtype = /obj/effect/decal/cleanable/blood/gibs
var/typeofmeat = /obj/item/reagent_containers/food/snacks/meat/slab/human
var/typeofskin
var/obj/item/reagent_containers/food/snacks/meat/slab/allmeat[meat_produced]
var/obj/item/stack/sheet/animalhide/skin
var/list/datum/disease/diseases = mob_occupant.get_static_viruses()
if(ishuman(occupant))
var/mob/living/carbon/human/gibee = occupant
if(gibee.dna && gibee.dna.species)
typeofmeat = gibee.dna.species.meat
typeofskin = gibee.dna.species.skinned_type
else if(iscarbon(occupant))
var/mob/living/carbon/C = occupant
typeofmeat = C.type_of_meat
gibtype = C.gib_type
if(ismonkey(C))
typeofskin = /obj/item/stack/sheet/animalhide/monkey
else if(isalien(C))
typeofskin = /obj/item/stack/sheet/animalhide/xeno
for (var/i=1 to meat_produced)
var/obj/item/reagent_containers/food/snacks/meat/slab/newmeat = new typeofmeat
newmeat.name = "[sourcename] [newmeat.name]"
if(istype(newmeat))
newmeat.subjectname = sourcename
newmeat.reagents.add_reagent ("nutriment", sourcenutriment / meat_produced) // Thehehe. Fat guys go first
if(sourcejob)
newmeat.subjectjob = sourcejob
allmeat[i] = newmeat
if(typeofskin)
skin = new typeofskin
log_combat(user, occupant, "gibbed")
mob_occupant.death(1)
mob_occupant.ghostize()
qdel(src.occupant)
addtimer(CALLBACK(src, .proc/make_meat, skin, allmeat, meat_produced, gibtype, diseases), gibtime)
/obj/machinery/gibber/proc/make_meat(obj/item/stack/sheet/animalhide/skin, list/obj/item/reagent_containers/food/snacks/meat/slab/allmeat, meat_produced, gibtype, list/datum/disease/diseases)
playsound(src.loc, 'sound/effects/splat.ogg', 50, 1)
operating = FALSE
var/turf/T = get_turf(src)
var/list/turf/nearby_turfs = RANGE_TURFS(3,T) - T
if(skin)
skin.forceMove(loc)
skin.throw_at(pick(nearby_turfs),meat_produced,3)
for (var/i=1 to meat_produced)
var/obj/item/meatslab = allmeat[i]
meatslab.forceMove(loc)
meatslab.throw_at(pick(nearby_turfs),i,3)
for (var/turfs=1 to meat_produced)
var/turf/gibturf = pick(nearby_turfs)
if (!gibturf.density && src in view(gibturf))
new gibtype(gibturf,i,diseases)
pixel_x = initial(pixel_x) //return to its spot after shaking
operating = FALSE
update_icon()
//auto-gibs anything that bumps into it
/obj/machinery/gibber/autogibber
var/input_dir = NORTH
/obj/machinery/gibber/autogibber/Bumped(atom/movable/AM)
var/atom/input = get_step(src, input_dir)
if(ismob(AM))
var/mob/M = AM
if(M.loc == input)
M.forceMove(src)
M.gib()