/
appendix_golem.dm
82 lines (72 loc) · 2.91 KB
/
appendix_golem.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
/obj/item/organ/internal/appendix/golem
name = "internal forge"
desc = "This expanded digestive chamber allows golems to smelt minerals, provided that they are immersed in lava."
icon_state = "ethereal_heart-off"
color = COLOR_GOLEM_GRAY
organ_flags = ORGAN_MINERAL
/// Action which performs smelting
var/datum/action/cooldown/internal_smelting/smelter
/obj/item/organ/internal/appendix/golem/Initialize(mapload)
. = ..()
smelter = new(src)
/obj/item/organ/internal/appendix/golem/on_mob_insert(mob/living/carbon/organ_owner)
. = ..()
RegisterSignal(owner, COMSIG_MOVABLE_MOVED, PROC_REF(check_for_lava))
/// Give the action while in lava
/obj/item/organ/internal/appendix/golem/proc/check_for_lava(mob/living/owner)
SIGNAL_HANDLER
if (!islava(owner.loc))
smelter.Remove(owner)
return
if (smelter.owner != owner)
smelter.Grant(owner)
/obj/item/organ/internal/appendix/golem/on_mob_remove(mob/living/carbon/organ_owner)
UnregisterSignal(organ_owner, COMSIG_MOVABLE_MOVED)
smelter?.Remove(organ_owner) // Might have been deleted by Destroy already
return ..()
/obj/item/organ/internal/appendix/golem/Destroy()
QDEL_NULL(smelter)
return ..()
/// Lets golems smelt ore with their organs
/datum/action/cooldown/internal_smelting
name = "Internal Forge"
desc = "While stood in lava you can use your internal forge to smelt ores into processed bars."
button_icon = 'icons/obj/stack_objects.dmi'
button_icon_state = "sheet-adamantine_2"
check_flags = AB_CHECK_HANDS_BLOCKED | AB_CHECK_LYING | AB_CHECK_CONSCIOUS | AB_CHECK_INCAPACITATED
/// Time it takes to smelt one ore into one result
var/smelt_speed = 2 SECONDS
/// Amount to speed up by every completion
var/speed_up_interval = 0.2 SECONDS
/// Minimum time to take to smelt one ore into one result
var/minimum_smelt_speed = 1 SECONDS
/datum/action/cooldown/internal_smelting/IsAvailable(feedback)
. = ..()
if (!.)
return FALSE
if (!islava(owner.loc))
if (feedback)
owner.balloon_alert(owner, "requires lava!")
return FALSE
return TRUE
/datum/action/cooldown/internal_smelting/Activate(mob/target)
. = ..()
smelt_speed = initial(smelt_speed)
smelt_held(target)
/// Smelt an item held in one hand and put the result in the other
/datum/action/cooldown/internal_smelting/proc/smelt_held(mob/target)
var/obj/item/stack/ore/held_ore = locate(/obj/item/stack/ore) in target.held_items
if (!held_ore?.refined_type)
target.balloon_alert(target, "nothing to smelt!")
return
target.balloon_alert(owner, "smelting...")
if (!do_after(target, smelt_speed, target = held_ore, timed_action_flags = IGNORE_USER_LOC_CHANGE, extra_checks = CALLBACK(src, PROC_REF(IsAvailable), FALSE), interaction_key = REF(src)))
return
var/obj/item/smelted = new held_ore.refined_type
held_ore.use(1)
target.put_in_hands(smelted)
if (!held_ore)
target.balloon_alert(target, "no ore left!")
return
smelt_speed = max(smelt_speed - speed_up_interval, minimum_smelt_speed)
smelt_held(target)