Makes golem runes use recruiter for recruitment (#37366)

* Makes golem runes use recruiter for recruitment.

* this was a bit redundant
This commit is contained in:
Peter Wedder
2025-01-13 15:33:45 +02:00
committed by GitHub
parent 8a412d798f
commit 6860ef2e4e
3 changed files with 65 additions and 74 deletions

View File

@@ -1732,8 +1732,6 @@ var/proccalls = 1
#define JINGLE_CLASSIC "Classics"
#define JINGLE_ALL "All"
#define GOLEM_RESPAWN_TIME 10 MINUTES //how much time must pass before someone who dies as an adamantine golem can use the golem rune again
#define BEESPECIES_NORMAL "bee"
#define BEESPECIES_VOX "chill bug"
#define BEESPECIES_HORNET "hornet"

View File

@@ -913,88 +913,82 @@
/obj/item/clothing/head/space/golem/dissolvable()
return 0
*/
/obj/effect/golem_rune
/obj/effect/decal/cleanable/golem_rune
anchored = 1
desc = "A strange rune used to create golems. It glows when spirits are nearby."
name = "rune"
desc = "A strange rune used to create golems. It draws in the souls of the dead."
name = "adamantine golem rune"
icon = 'icons/obj/rune.dmi'
icon_state = "golem"
mouse_opacity = 1 //So we can actually click these
plane = ABOVE_TURF_PLANE
layer = RUNE_LAYER
var/list/mob/dead/observer/ghosts[0]
mouse_opacity = 1
var/mob/creator = null
var/datum/recruiter/recruiter = null
var/recruiting = 0
persistent_type_replacement = /obj/effect/decal/cleanable/golem_rune/persistent
reagent = SLIMEJELLY
/obj/effect/golem_rune/New()
/obj/effect/decal/cleanable/golem_rune/New()
..()
processing_objects.Add(src)
if(!recruiter)
recruiter = new(src)
recruiter.display_name = "adamantine golem"
recruiter.role = ROLE_MINOR
recruiter.jobban_roles = list(ROLE_MINOR)
/obj/effect/golem_rune/process()
if(ghosts.len>0)
icon_state = "golem2"
// A player has their role set to Yes or Always
recruiter.player_volunteering = new /callback(src, nameof(src::recruiter_recruiting()))
// ", but No or Never
recruiter.player_not_volunteering = new /callback(src, nameof(src::recruiter_not_recruiting()))
recruiter.recruited = new /callback(src, nameof(src::recruiter_recruited()))
spawn(5 SECONDS)
try_recruit()
/obj/effect/decal/cleanable/golem_rune/proc/try_recruit()
if(recruiting || !src)
return
icon_state = "golem2"
recruiting = 1
src.visible_message("<span class='notice'>The [name] glows with arcane energies.</span>")
recruiter.request_player()
/obj/effect/decal/cleanable/golem_rune/proc/recruiter_recruiting(mob/dead/observer/player, controls)
to_chat(player, "<span class='recruit'>\The [src] is about to activate. You have been added to the list of potential ghosts. ([controls])</span>")
/obj/effect/decal/cleanable/golem_rune/proc/recruiter_not_recruiting(mob/dead/observer/player, controls)
to_chat(player, "<span class='recruit'>\The [src] is about to activate. ([controls])</span>")
/obj/effect/decal/cleanable/golem_rune/proc/recruiter_recruited(mob/dead/observer/player)
if(player)
var/mob/living/carbon/human/golem/G = new /mob/living/carbon/human/golem(get_turf(src))
G.real_name = G.species.makeName()
G.ckey = player.ckey
var/msg = "<span class='info'>You are an adamantine golem. You move slowly, but are highly resistant to heat and cold as well as impervious to burn damage. You are unable to wear most clothing, but can still use most tools. "
if(creator)
msg += "Serve [creator.name], and assist them in completing their goals at any cost."
else
msg += "You were born an unbound golem, free to do as you please."
msg += "</span>"
to_chat(G, msg)
playsound(src.loc, 'sound/effects/shock.ogg', 50, 1)
qdel(src)
else
src.visible_message("<span class='notice'>The energies of \the [name] go dormant for now.</span>")
recruiting = 0
icon_state = "golem"
spawn (5 MINUTES)
try_recruit()
/obj/effect/golem_rune/attack_hand(mob/living/user as mob)
var/mob/dead/observer/ghost
for(var/mob/dead/observer/O in src.loc)
if(!check_observer(O))
continue
ghost = O
break
if(!ghost)
to_chat(user, "The rune fizzles uselessly. There is no spirit nearby.")
return
var/mob/living/carbon/human/golem/G = new /mob/living/carbon/human/golem
G.real_name = G.species.makeName()
G.forceMove(src.loc) //we use move to get the entering procs - this fixes gravity
G.key = ghost.key
to_chat(G, "You are an adamantine golem. You move slowly, but are highly resistant to heat and cold as well as impervious to burn damage. You are unable to wear most clothing, but can still use most tools. Serve [user], and assist them in completing their goals at any cost.")
qdel (src)
if(ticker.mode.name == "sandbox")
G.CanBuild()
to_chat(G, "Sandbox tab enabled.")
/obj/effect/decal/cleanable/golem_rune/persistent
recruiter = 1
mouse_opacity = 0
/obj/effect/decal/cleanable/golem_rune/persistent/try_recruit()
return
/obj/effect/golem_rune/proc/announce_to_ghosts()
for(var/mob/dead/observer/O in player_list)
if(O.client)
var/area/A = get_area(src)
if(A)
to_chat(O, "<span class=\"recruit\">Golem rune created in [A.name]. ([formatGhostJump(src)] | <a href='?src=\ref[src];signup=\ref[O]'>Sign Up</a>)</span>")
/obj/effect/golem_rune/Topic(href,href_list)
if("signup" in href_list)
var/mob/dead/observer/O = locate(href_list["signup"])
volunteer(O)
/obj/effect/golem_rune/attack_ghost(var/mob/dead/observer/O)
if(!O)
return
volunteer(O)
/obj/effect/golem_rune/proc/check_observer(var/mob/dead/observer/O)
if(!O)
return 0
if(!O.client)
return 0
if(O.mind && O.mind.current && O.mind.current.stat != DEAD)
return 0
return 1
/obj/effect/golem_rune/proc/volunteer(var/mob/dead/observer/O)
if(O in ghosts)
ghosts.Remove(O)
to_chat(O, "<span class='warning'>You are no longer signed up to be a golem.</span>")
else
if(!check_observer(O))
to_chat(O, "<span class='warning'>You are not eligible.</span>")
return
if(O.key in has_died_as_golem)
if(world.time < has_died_as_golem[O.key] + GOLEM_RESPAWN_TIME)
to_chat(O, "<span class='warning'>You already died as a golem too recently. You must wait longer before you can become a golem again.</span>")
return
ghosts.Add(O)
to_chat(O, "<span class='notice'>You are signed up to be a golem.</span>")
/mob/living/carbon/slime/has_eyes()
return 0

View File

@@ -2120,9 +2120,8 @@
required_container = /obj/item/slime_extract/adamantine
/datum/chemical_reaction/slime_extract/slimegolem/on_reaction(var/datum/reagents/holder)
var/obj/effect/golem_rune/Z = new /obj/effect/golem_rune
Z.forceMove(get_turf(holder.my_atom))
Z.announce_to_ghosts()
var/obj/effect/decal/cleanable/golem_rune/Z = new /obj/effect/decal/cleanable/golem_rune(get_turf(holder.my_atom))
Z.creator = usr
..()
/datum/chemical_reaction/slime_extract/slimediamond2