-
-
Notifications
You must be signed in to change notification settings - Fork 444
/
Copy pathgrill.dm
161 lines (144 loc) · 5.34 KB
/
grill.dm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
//I JUST WANNA GRILL FOR GOD'S SAKE
#define GRILL_FUELUSAGE_IDLE 0.5
#define GRILL_FUELUSAGE_ACTIVE 5
/obj/machinery/grill
name = "grill"
desc = "Just like the old days."
icon = 'icons/obj/kitchen.dmi'
icon_state = "grill_open"
density = TRUE
layer = BELOW_OBJ_LAYER
use_power = NO_POWER_USE
var/grill_fuel = 0
var/obj/item/reagent_containers/food/grilled_item
var/grill_time = 0
var/datum/looping_sound/grill/grill_loop
/obj/machinery/grill/Initialize(mapload)
. = ..()
grill_loop = new(list(src), FALSE)
/obj/machinery/grill/update_icon_state()
. = ..()
if(grilled_item)
icon_state = "grill"
else if(grill_fuel > 0)
icon_state = "grill_on"
else
icon_state = "grill_open"
/obj/machinery/grill/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/stack/sheet/mineral/coal) || istype(I, /obj/item/stack/sheet/mineral/wood))
var/obj/item/stack/S = I
var/stackamount = S.get_amount()
to_chat(user, span_notice("You put [stackamount] [I]s in [src]."))
if(istype(I, /obj/item/stack/sheet/mineral/coal))
grill_fuel += (500 * stackamount)
else
grill_fuel += (50 * stackamount)
S.use(stackamount)
update_appearance(UPDATE_ICON)
return
if(I.resistance_flags & INDESTRUCTIBLE)
to_chat(user, span_warning("You don't feel it would be wise to grill [I]..."))
return ..()
if(istype(I, /obj/item/reagent_containers))
if(istype(I, /obj/item/reagent_containers/food) && !istype(I, /obj/item/reagent_containers/food/drinks))
var/obj/item/reagent_containers/food/food_item = I
if(HAS_TRAIT(food_item, TRAIT_NODROP) || (food_item.item_flags & (ABSTRACT | DROPDEL)))
return ..()
else if(food_item.foodtype & GRILLED)
to_chat(user, span_notice("[food_item] has already been grilled!"))
return
else if(grill_fuel <= 0)
to_chat(user, span_warning("There is not enough fuel!"))
return
else if(!grilled_item && user.transferItemToLoc(food_item, src))
grilled_item = food_item
RegisterSignal(grilled_item, COMSIG_GRILL_COMPLETED, PROC_REF(GrillCompleted))
grilled_item.foodtype |= GRILLED
to_chat(user, span_notice("You put the [grilled_item] on [src]."))
update_appearance(UPDATE_ICON)
grill_loop.start()
return
else
if(I.reagents.has_reagent(/datum/reagent/consumable/energy_drink/monkey_energy))
grill_fuel += (20 * (I.reagents.get_reagent_amount(/datum/reagent/consumable/energy_drink/monkey_energy)))
to_chat(user, span_notice("You pour the Monkey Energy in [src]."))
I.reagents.remove_reagent(/datum/reagent/consumable/energy_drink/monkey_energy, I.reagents.get_reagent_amount(/datum/reagent/consumable/energy_drink/monkey_energy))
update_appearance(UPDATE_ICON)
return
..()
/obj/machinery/grill/process(delta_time)
..()
update_appearance(UPDATE_ICON)
if(grill_fuel <= 0)
return
else
if(!grilled_item)
grill_fuel -= GRILL_FUELUSAGE_IDLE
if(DT_PROB(0.5, delta_time))
var/datum/effect_system/fluid_spread/smoke/bad/smoke = new
smoke.set_up(1, location = loc)
smoke.start()
if(grilled_item)
SEND_SIGNAL(grilled_item, COMSIG_ITEM_GRILLED, src, 1)
grill_time += delta_time
grilled_item.reagents.add_reagent(/datum/reagent/consumable/char, 0.1 * delta_time)
grill_fuel -= GRILL_FUELUSAGE_ACTIVE * delta_time
grilled_item.AddComponent(/datum/component/sizzle)
/obj/machinery/grill/Exited(atom/movable/AM)
if(AM == grilled_item)
finish_grill()
grilled_item = null
..()
/obj/machinery/grill/Destroy()
grilled_item = null
. = ..()
/obj/machinery/grill/handle_atom_del(atom/A)
if(A == grilled_item)
grilled_item = null
. = ..()
/obj/machinery/grill/wrench_act(mob/living/user, obj/item/I)
. = ..()
if(default_unfasten_wrench(user, I) != CANT_UNFASTEN)
return TRUE
/obj/machinery/grill/deconstruct(disassembled = TRUE)
finish_grill()
if(!(flags_1 & NODECONSTRUCT_1))
new /obj/item/stack/sheet/metal(loc, 5)
new /obj/item/stack/rods(loc, 5)
..()
/obj/machinery/grill/attack_ai(mob/user)
return
/obj/machinery/grill/attack_hand(mob/user)
if(grilled_item)
to_chat(user, span_notice("You take out [grilled_item] from [src]."))
grilled_item.forceMove(drop_location())
update_appearance(UPDATE_ICON)
return
return ..()
/obj/machinery/grill/proc/finish_grill()
switch(grill_time)
if(20 to 30) //no 0-20 to prevent spam
grilled_item.name = "lightly-grilled [grilled_item.name]"
grilled_item.desc = "[grilled_item.desc] It's been lightly grilled."
if(30 to 80)
grilled_item.name = "grilled [grilled_item.name]"
grilled_item.desc = "[grilled_item.desc] It's been grilled."
grilled_item.foodtype |= GRILLED
if(80 to 100)
grilled_item.name = "heavily grilled [grilled_item.name]"
grilled_item.desc = "[grilled_item.desc] It's been heavily grilled."
grilled_item.foodtype |= GRILLED
if(100 to INFINITY) //grill marks reach max alpha
grilled_item.name = "Powerfully Grilled [grilled_item.name]"
grilled_item.desc = "A [grilled_item.name]. Reminds you of your wife, wait, no, it's prettier!"
grilled_item.foodtype |= GRILLED
grill_time = 0
UnregisterSignal(grilled_item, COMSIG_GRILL_COMPLETED, PROC_REF(GrillCompleted))
grill_loop.stop()
///Called when a food is transformed by the grillable component
/obj/machinery/grill/proc/GrillCompleted(obj/item/source, atom/grilled_result)
grilled_item = grilled_result //use the new item!!
/obj/machinery/grill/unwrenched
anchored = FALSE
#undef GRILL_FUELUSAGE_IDLE
#undef GRILL_FUELUSAGE_ACTIVE