The rest of the offering stuff
This commit is contained in:
@@ -84,6 +84,88 @@
|
||||
REMOVE_TRAIT(owner, TRAIT_SOOTHED_THROAT, "[STATUS_EFFECT_TRAIT]_[id]")
|
||||
return ..()
|
||||
|
||||
// this status effect is used to negotiate the high-fiving capabilities of all concerned parties
|
||||
/datum/status_effect/offering
|
||||
id = "offering"
|
||||
duration = -1
|
||||
tick_interval = -1
|
||||
status_type = STATUS_EFFECT_UNIQUE
|
||||
alert_type = null
|
||||
/// The people who were offered this item at the start
|
||||
var/list/possible_takers
|
||||
/// The actual item being offered
|
||||
var/obj/item/offered_item
|
||||
/// The type of alert given to people when offered, in case you need to override some behavior (like for high-fives)
|
||||
var/give_alert_type = /atom/movable/screen/alert/give
|
||||
|
||||
/datum/status_effect/offering/on_creation(mob/living/new_owner, obj/item/offer, give_alert_override)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
|
||||
offered_item = offer
|
||||
if(give_alert_override)
|
||||
give_alert_type = give_alert_override
|
||||
|
||||
for(var/mob/living/carbon/possible_taker in orange(1, owner))
|
||||
if(!owner.CanReach(possible_taker) || IS_DEAD_OR_INCAP(possible_taker) || !possible_taker.can_hold_items())
|
||||
continue
|
||||
register_candidate(possible_taker)
|
||||
|
||||
if(!possible_takers) // no one around
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
RegisterSignal(owner, COMSIG_MOVABLE_MOVED, .proc/check_owner_in_range)
|
||||
RegisterSignal(offered_item, list(COMSIG_PARENT_QDELETING, COMSIG_ITEM_DROPPED), .proc/dropped_item)
|
||||
//RegisterSignal(owner, COMSIG_PARENT_EXAMINE_MORE, .proc/check_fake_out)
|
||||
|
||||
/datum/status_effect/offering/Destroy()
|
||||
for(var/i in possible_takers)
|
||||
var/mob/living/carbon/removed_taker = i
|
||||
remove_candidate(removed_taker)
|
||||
LAZYCLEARLIST(possible_takers)
|
||||
return ..()
|
||||
|
||||
/// Hook up the specified carbon mob to be offered the item in question, give them the alert and signals and all
|
||||
/datum/status_effect/offering/proc/register_candidate(mob/living/carbon/possible_candidate)
|
||||
var/atom/movable/screen/alert/give/G = possible_candidate.throw_alert("[owner]", give_alert_type)
|
||||
if(!G)
|
||||
return
|
||||
LAZYADD(possible_takers, possible_candidate)
|
||||
RegisterSignal(possible_candidate, COMSIG_MOVABLE_MOVED, .proc/check_taker_in_range)
|
||||
G.setup(possible_candidate, owner, offered_item)
|
||||
|
||||
/// Remove the alert and signals for the specified carbon mob. Automatically removes the status effect when we lost the last taker
|
||||
/datum/status_effect/offering/proc/remove_candidate(mob/living/carbon/removed_candidate)
|
||||
removed_candidate.clear_alert("[owner]")
|
||||
LAZYREMOVE(possible_takers, removed_candidate)
|
||||
UnregisterSignal(removed_candidate, COMSIG_MOVABLE_MOVED)
|
||||
if(!possible_takers && !QDELING(src))
|
||||
qdel(src)
|
||||
|
||||
/// One of our possible takers moved, see if they left us hanging
|
||||
/datum/status_effect/offering/proc/check_taker_in_range(mob/living/carbon/taker)
|
||||
SIGNAL_HANDLER
|
||||
if(owner.CanReach(taker) && !IS_DEAD_OR_INCAP(taker))
|
||||
return
|
||||
|
||||
remove_candidate(taker)
|
||||
|
||||
/// The offerer moved, see if anyone is out of range now
|
||||
/datum/status_effect/offering/proc/check_owner_in_range(mob/living/carbon/source)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
for(var/i in possible_takers)
|
||||
var/mob/living/carbon/checking_taker = i
|
||||
if(!istype(checking_taker) || !owner.CanReach(checking_taker) || IS_DEAD_OR_INCAP(checking_taker))
|
||||
remove_candidate(checking_taker)
|
||||
|
||||
/// We lost the item, give it up
|
||||
/datum/status_effect/offering/proc/dropped_item(obj/item/source)
|
||||
SIGNAL_HANDLER
|
||||
qdel(src)
|
||||
|
||||
/datum/status_effect/offering/secret_handshake
|
||||
id = "secret_handshake"
|
||||
alert_type = /atom/movable/screen/alert/give/secret_handshake
|
||||
|
||||
@@ -25,11 +25,11 @@
|
||||
/datum/status_effect/proc/on_creation(mob/living/new_owner, ...)
|
||||
if(new_owner)
|
||||
owner = new_owner
|
||||
if(owner)
|
||||
LAZYADD(owner.status_effects, src)
|
||||
if(!owner || !on_apply())
|
||||
if(QDELETED(owner) || !on_apply())
|
||||
qdel(src)
|
||||
return
|
||||
if(owner)
|
||||
LAZYADD(owner.status_effects, src)
|
||||
if(duration != -1)
|
||||
duration = world.time + duration
|
||||
next_tick = world.time + tick_interval
|
||||
|
||||
Reference in New Issue
Block a user