Adds action buttons for spiders, refactors action code, nurse spiders can set a hereditary directive for their children to follow

This commit is contained in:
XDTM
2017-09-28 23:01:41 +02:00
committed by CitadelStationBot
parent d25894447e
commit 9b5a2f7490
13 changed files with 302 additions and 138 deletions

View File

@@ -485,7 +485,7 @@
/datum/action/spell_action/New(Target) /datum/action/spell_action/New(Target)
..() ..()
var/obj/effect/proc_holder/spell/S = target var/obj/effect/proc_holder/S = target
S.action = src S.action = src
name = S.name name = S.name
desc = S.desc desc = S.desc
@@ -495,36 +495,40 @@
button.name = name button.name = name
/datum/action/spell_action/Destroy() /datum/action/spell_action/Destroy()
var/obj/effect/proc_holder/spell/S = target var/obj/effect/proc_holder/S = target
S.action = null S.action = null
return ..() return ..()
/datum/action/spell_action/Trigger() /datum/action/spell_action/Trigger()
if(!..()) if(!..())
return 0 return FALSE
if(target) if(target)
var/obj/effect/proc_holder/spell = target var/obj/effect/proc_holder/S = target
spell.Click() S.Click()
return 1 return TRUE
/datum/action/spell_action/IsAvailable() /datum/action/spell_action/IsAvailable()
if(!target) if(!target)
return 0 return FALSE
var/obj/effect/proc_holder/spell/spell = target return TRUE
if(owner)
return spell.can_cast(owner)
return 0
/datum/action/spell_action/spell/IsAvailable()
if(!target)
return FALSE
var/obj/effect/proc_holder/spell/S = target
if(owner)
return S.can_cast(owner)
return FALSE
/datum/action/spell_action/alien /datum/action/spell_action/alien
/datum/action/spell_action/alien/IsAvailable() /datum/action/spell_action/alien/IsAvailable()
if(!target) if(!target)
return 0 return FALSE
var/obj/effect/proc_holder/alien/ab = target var/obj/effect/proc_holder/alien/ab = target
if(owner) if(owner)
return ab.cost_check(ab.check_turf,owner,1) return ab.cost_check(ab.check_turf,owner,1)
return 0 return FALSE

View File

@@ -52,6 +52,7 @@
icon_state = "eggs" icon_state = "eggs"
var/amount_grown = 0 var/amount_grown = 0
var/player_spiders = 0 var/player_spiders = 0
var/directive = "" //Message from the mother
var/poison_type = "toxin" var/poison_type = "toxin"
var/poison_per_bite = 5 var/poison_per_bite = 5
var/list/faction = list("spiders") var/list/faction = list("spiders")
@@ -71,6 +72,7 @@
S.poison_type = poison_type S.poison_type = poison_type
S.poison_per_bite = poison_per_bite S.poison_per_bite = poison_per_bite
S.faction = faction.Copy() S.faction = faction.Copy()
S.directive = directive
if(player_spiders) if(player_spiders)
S.player_spiders = 1 S.player_spiders = 1
qdel(src) qdel(src)
@@ -87,6 +89,7 @@
var/obj/machinery/atmospherics/components/unary/vent_pump/entry_vent var/obj/machinery/atmospherics/components/unary/vent_pump/entry_vent
var/travelling_in_vent = 0 var/travelling_in_vent = 0
var/player_spiders = 0 var/player_spiders = 0
var/directive = "" //Message from the mother
var/poison_type = "toxin" var/poison_type = "toxin"
var/poison_per_bite = 5 var/poison_per_bite = 5
var/list/faction = list("spiders") var/list/faction = list("spiders")
@@ -192,6 +195,7 @@
S.poison_per_bite = poison_per_bite S.poison_per_bite = poison_per_bite
S.poison_type = poison_type S.poison_type = poison_type
S.faction = faction.Copy() S.faction = faction.Copy()
S.directive = directive
if(player_spiders) if(player_spiders)
S.playable_spider = TRUE S.playable_spider = TRUE
notify_ghosts("Spider [S.name] can be controlled", null, enter_link="<a href=?src=\ref[S];activate=1>(Click to play)</a>", source=S, action=NOTIFY_ATTACK) notify_ghosts("Spider [S.name] can be controlled", null, enter_link="<a href=?src=\ref[S];activate=1>(Click to play)</a>", source=S, action=NOTIFY_ATTACK)

View File

@@ -353,6 +353,8 @@ h1.alert, h2.alert {color: #000000;}
.borer {color: #543354; font-style: italic;} .borer {color: #543354; font-style: italic;}
.changeling {color: #800080; font-style: italic;} .changeling {color: #800080; font-style: italic;}
.spider {color: #4d004d;}
.interface {color: #330033;} .interface {color: #330033;}
.sans {font-family: "Comic Sans MS", cursive, sans-serif;} .sans {font-family: "Comic Sans MS", cursive, sans-serif;}

View File

@@ -10,15 +10,15 @@ Doesn't work on other aliens/AI.*/
name = "Alien Power" name = "Alien Power"
panel = "Alien" panel = "Alien"
var/plasma_cost = 0 var/plasma_cost = 0
var/check_turf = 0 var/check_turf = FALSE
var/has_action = 1 has_action = TRUE
var/datum/action/spell_action/alien/action = null datum/action/spell_action/alien/action
var/action_icon = 'icons/mob/actions/actions_xeno.dmi' action_icon = 'icons/mob/actions/actions_xeno.dmi'
var/action_icon_state = "spell_default" action_icon_state = "spell_default"
var/action_background_icon_state = "bg_alien" action_background_icon_state = "bg_alien"
/obj/effect/proc_holder/alien/New() /obj/effect/proc_holder/alien/Initialize()
..() . = ..()
action = new(src) action = new(src)
/obj/effect/proc_holder/alien/Click() /obj/effect/proc_holder/alien/Click()
@@ -30,15 +30,20 @@ Doesn't work on other aliens/AI.*/
user.adjustPlasma(-plasma_cost) user.adjustPlasma(-plasma_cost)
return 1 return 1
/obj/effect/proc_holder/alien/proc/on_gain(mob/living/carbon/user) /obj/effect/proc_holder/alien/on_gain(mob/living/carbon/user)
return return
/obj/effect/proc_holder/alien/proc/on_lose(mob/living/carbon/user) /obj/effect/proc_holder/alien/on_lose(mob/living/carbon/user)
return return
/obj/effect/proc_holder/alien/proc/fire(mob/living/carbon/user) /obj/effect/proc_holder/alien/fire(mob/living/carbon/user)
return 1 return 1
/obj/effect/proc_holder/alien/get_panel_text()
. = ..()
if(plasma_cost > 0)
return "[plasma_cost]"
/obj/effect/proc_holder/alien/proc/cost_check(check_turf=0,mob/living/carbon/user,silent = 0) /obj/effect/proc_holder/alien/proc/cost_check(check_turf=0,mob/living/carbon/user,silent = 0)
if(user.stat) if(user.stat)
if(!silent) if(!silent)
@@ -168,7 +173,6 @@ Doesn't work on other aliens/AI.*/
if(user.getPlasma() > A.plasma_cost && A.corrode(O)) if(user.getPlasma() > A.plasma_cost && A.corrode(O))
user.adjustPlasma(-A.plasma_cost) user.adjustPlasma(-A.plasma_cost)
/obj/effect/proc_holder/alien/neurotoxin /obj/effect/proc_holder/alien/neurotoxin
name = "Spit Neurotoxin" name = "Spit Neurotoxin"
desc = "Spits neurotoxin at someone, paralyzing them for a short time." desc = "Spits neurotoxin at someone, paralyzing them for a short time."
@@ -179,7 +183,7 @@ Doesn't work on other aliens/AI.*/
var/message var/message
if(active) if(active)
message = "<span class='notice'>You empty your neurotoxin gland.</span>" message = "<span class='notice'>You empty your neurotoxin gland.</span>"
remove_ranged_ability(user,message) remove_ranged_ability(message)
else else
message = "<span class='notice'>You prepare your neurotoxin gland. <B>Left-click to fire at a target!</B></span>" message = "<span class='notice'>You prepare your neurotoxin gland. <B>Left-click to fire at a target!</B></span>"
add_ranged_ability(user, message, TRUE) add_ranged_ability(user, message, TRUE)
@@ -193,7 +197,7 @@ Doesn't work on other aliens/AI.*/
return return
var/p_cost = 50 var/p_cost = 50
if(!iscarbon(ranged_ability_user) || ranged_ability_user.lying || ranged_ability_user.stat) if(!iscarbon(ranged_ability_user) || ranged_ability_user.lying || ranged_ability_user.stat)
remove_ranged_ability(ranged_ability_user) remove_ranged_ability()
return return
var/mob/living/carbon/user = ranged_ability_user var/mob/living/carbon/user = ranged_ability_user
@@ -219,8 +223,7 @@ Doesn't work on other aliens/AI.*/
return TRUE return TRUE
/obj/effect/proc_holder/alien/neurotoxin/on_lose(mob/living/carbon/user) /obj/effect/proc_holder/alien/neurotoxin/on_lose(mob/living/carbon/user)
if(user.ranged_ability == src) remove_ranged_ability()
user.ranged_ability = null
/obj/effect/proc_holder/alien/neurotoxin/add_ranged_ability(mob/living/user, msg) /obj/effect/proc_holder/alien/neurotoxin/add_ranged_ability(mob/living/user, msg)
..() ..()
@@ -328,7 +331,3 @@ Doesn't work on other aliens/AI.*/
return 1 return 1
return 0 return 0
/proc/cmp_abilities_cost(obj/effect/proc_holder/alien/a, obj/effect/proc_holder/alien/b)
return b.plasma_cost - a.plasma_cost

View File

@@ -425,23 +425,6 @@
var/turf/target = get_turf(loc) var/turf/target = get_turf(loc)
I.throw_at(target,I.throw_range,I.throw_speed,src) I.throw_at(target,I.throw_range,I.throw_speed,src)
/mob/living/carbon/proc/AddAbility(obj/effect/proc_holder/alien/A)
abilities.Add(A)
A.on_gain(src)
if(A.has_action)
A.action.Grant(src)
sortInsert(abilities, /proc/cmp_abilities_cost, 0)
/mob/living/carbon/proc/RemoveAbility(obj/effect/proc_holder/alien/A)
abilities.Remove(A)
A.on_lose(src)
if(A.action)
A.action.Remove(src)
/mob/living/carbon/proc/add_abilities_to_panel()
for(var/obj/effect/proc_holder/alien/A in abilities)
statpanel("[A.panel]",A.plasma_cost > 0?"([A.plasma_cost])":"",A)
/mob/living/carbon/Stat() /mob/living/carbon/Stat()
..() ..()
if(statpanel("Status")) if(statpanel("Status"))

View File

@@ -35,7 +35,6 @@
has_limbs = 1 has_limbs = 1
var/obj/item/reagent_containers/food/snacks/meat/slab/type_of_meat = /obj/item/reagent_containers/food/snacks/meat/slab var/obj/item/reagent_containers/food/snacks/meat/slab/type_of_meat = /obj/item/reagent_containers/food/snacks/meat/slab
var/list/obj/effect/proc_holder/alien/abilities = list()
var/gib_type = /obj/effect/decal/cleanable/blood/gibs var/gib_type = /obj/effect/decal/cleanable/blood/gibs
var/rotate_on_lying = 1 var/rotate_on_lying = 1

View File

@@ -412,8 +412,9 @@
liver_failure() liver_failure()
else else
liver.failing = FALSE liver.failing = FALSE
else
if(((!(NOLIVER in dna.species.species_traits)) && (!liver))) if((dna && dna.species && (NOLIVER in dna.species.species_traits)))
return
liver_failure() liver_failure()
/mob/living/carbon/proc/undergoing_liver_failure() /mob/living/carbon/proc/undergoing_liver_failure()

View File

@@ -982,3 +982,19 @@
client.move_delay = world.time + movement_delay() client.move_delay = world.time + movement_delay()
lying_prev = lying lying_prev = lying
return canmove return canmove
/mob/living/proc/AddAbility(obj/effect/proc_holder/A)
abilities.Add(A)
A.on_gain(src)
if(A.has_action)
A.action.Grant(src)
/mob/living/proc/RemoveAbility(obj/effect/proc_holder/A)
abilities.Remove(A)
A.on_lose(src)
if(A.action)
A.action.Remove(src)
/mob/living/proc/add_abilities_to_panel()
for(var/obj/effect/proc_holder/A in abilities)
statpanel("[A.panel]",A.get_panel_text(),A)

View File

@@ -77,3 +77,5 @@
var/datum/language/selected_default_language var/datum/language/selected_default_language
var/last_words //used for database logging var/last_words //used for database logging
var/list/obj/effect/proc_holder/abilities = list()

View File

@@ -48,7 +48,21 @@
see_in_dark = 4 see_in_dark = 4
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
var/playable_spider = FALSE var/playable_spider = FALSE
<<<<<<< HEAD
devourable = TRUE devourable = TRUE
=======
var/datum/action/innate/spider/lay_web/lay_web
var/directive = "" //Message passed down to children, to relay the creator's orders
/mob/living/simple_animal/hostile/poison/giant_spider/Initialize()
. = ..()
lay_web = new
lay_web.Grant(src)
/mob/living/simple_animal/hostile/poison/giant_spider/Destroy()
QDEL_NULL(lay_web)
return ..()
>>>>>>> 152c890... Adds action buttons for spiders, refactors action code, nurse spiders can set a hereditary directive for their children to follow (#30572)
/mob/living/simple_animal/hostile/poison/giant_spider/Topic(href, href_list) /mob/living/simple_animal/hostile/poison/giant_spider/Topic(href, href_list)
if(href_list["activate"]) if(href_list["activate"])
@@ -56,6 +70,12 @@
if(istype(ghost) && playable_spider) if(istype(ghost) && playable_spider)
humanize_spider(ghost) humanize_spider(ghost)
/mob/living/simple_animal/hostile/poison/giant_spider/Login()
..()
if(directive)
to_chat(src, "<span class='notice'>Your mother left you a directive! Follow it at all costs.</span>")
to_chat(src, "<span class='spider'><b>[directive]</b></span>")
/mob/living/simple_animal/hostile/poison/giant_spider/attack_ghost(mob/user) /mob/living/simple_animal/hostile/poison/giant_spider/attack_ghost(mob/user)
if(!humanize_spider(user)) if(!humanize_spider(user))
return ..() return ..()
@@ -87,8 +107,26 @@
poison_per_bite = 3 poison_per_bite = 3
var/atom/movable/cocoon_target var/atom/movable/cocoon_target
var/fed = 0 var/fed = 0
var/obj/effect/proc_holder/wrap/wrap
var/datum/action/innate/spider/lay_eggs/lay_eggs
var/datum/action/innate/spider/set_directive/set_directive
var/static/list/consumed_mobs = list() //the tags of mobs that have been consumed by nurse spiders to lay eggs var/static/list/consumed_mobs = list() //the tags of mobs that have been consumed by nurse spiders to lay eggs
/mob/living/simple_animal/hostile/poison/giant_spider/nurse/Initialize()
. = ..()
wrap = new
AddAbility(wrap)
lay_eggs = new
lay_eggs.Grant(src)
set_directive = new
set_directive.Grant(src)
/mob/living/simple_animal/hostile/poison/giant_spider/nurse/Destroy()
RemoveAbility(wrap)
QDEL_NULL(lay_eggs)
QDEL_NULL(set_directive)
return ..()
//hunters have the most poison and move the fastest, so they can find prey //hunters have the most poison and move the fastest, so they can find prey
/mob/living/simple_animal/hostile/poison/giant_spider/hunter /mob/living/simple_animal/hostile/poison/giant_spider/hunter
desc = "Furry and black, it makes you shudder to look at it. This one has sparkling purple eyes." desc = "Furry and black, it makes you shudder to look at it. This one has sparkling purple eyes."
@@ -162,6 +200,9 @@
letmetalkpls = new letmetalkpls = new
letmetalkpls.Grant(src) letmetalkpls.Grant(src)
/mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife/Destroy()
QDEL_NULL(letmetalkpls)
return ..()
/mob/living/simple_animal/hostile/poison/giant_spider/ice //spiders dont usually like tempatures of 140 kelvin who knew /mob/living/simple_animal/hostile/poison/giant_spider/ice //spiders dont usually like tempatures of 140 kelvin who knew
name = "giant ice spider" name = "giant ice spider"
@@ -225,11 +266,11 @@
//second, spin a sticky spiderweb on this tile //second, spin a sticky spiderweb on this tile
var/obj/structure/spider/stickyweb/W = locate() in get_turf(src) var/obj/structure/spider/stickyweb/W = locate() in get_turf(src)
if(!W) if(!W)
Web() lay_web.Activate()
else else
//third, lay an egg cluster there //third, lay an egg cluster there
if(fed) if(fed)
LayEggs() lay_eggs.Activate()
else else
//fourthly, cocoon any nearby items so those pesky pinkskins can't use them //fourthly, cocoon any nearby items so those pesky pinkskins can't use them
for(var/obj/O in can_see) for(var/obj/O in can_see)
@@ -247,62 +288,28 @@
else if(busy == MOVING_TO_TARGET && cocoon_target) else if(busy == MOVING_TO_TARGET && cocoon_target)
if(get_dist(src, cocoon_target) <= 1) if(get_dist(src, cocoon_target) <= 1)
Wrap() cocoon()
else else
busy = SPIDER_IDLE busy = SPIDER_IDLE
stop_automated_movement = FALSE stop_automated_movement = FALSE
/mob/living/simple_animal/hostile/poison/giant_spider/verb/Web() /mob/living/simple_animal/hostile/poison/giant_spider/nurse/proc/cocoon()
set name = "Lay Web" if(stat != DEAD && cocoon_target && !cocoon_target.anchored)
set category = "Spider" if(cocoon_target == src)
set desc = "Spread a sticky web to slow down prey." to_chat(src, "<span class='warning'>You can't wrap yourself!</span>")
return
var/T = src.loc if(istype(cocoon_target, /mob/living/simple_animal/hostile/poison/giant_spider))
to_chat(src, "<span class='warning'>You can't wrap other spiders!</span>")
if(stat == DEAD) return
return if(!Adjacent(cocoon_target))
if(busy != SPINNING_WEB) to_chat(src, "<span class='warning'>You can't reach [cocoon_target]!</span>")
busy = SPINNING_WEB return
src.visible_message("<span class='notice'>\the [src] begins to secrete a sticky substance.</span>")
stop_automated_movement = 1
if(do_after(src, 40, target = T))
if(busy == SPINNING_WEB && src.loc == T)
new /obj/structure/spider/stickyweb(T)
busy = SPIDER_IDLE
stop_automated_movement = FALSE
/mob/living/simple_animal/hostile/poison/giant_spider/nurse/verb/Wrap()
set name = "Wrap"
set category = "Spider"
set desc = "Wrap up prey to feast upon and objects for safe keeping."
if(stat == DEAD)
return
if(!cocoon_target)
var/list/choices = list()
for(var/mob/living/L in view(1,src))
if(L == src || L.anchored)
continue
if(istype(L, /mob/living/simple_animal/hostile/poison/giant_spider))
continue
if(Adjacent(L))
choices += L
for(var/obj/O in src.loc)
if(O.anchored)
continue
if(Adjacent(O))
choices += O
var/temp_input = input(src,"What do you wish to cocoon?") in null|choices
if(temp_input && !cocoon_target)
cocoon_target = temp_input
if(stat != DEAD && cocoon_target && Adjacent(cocoon_target) && !cocoon_target.anchored)
if(busy == SPINNING_COCOON) if(busy == SPINNING_COCOON)
to_chat(src, "<span class='warning'>You're already spinning a cocoon!</span>")
return //we're already doing this, don't cancel out or anything return //we're already doing this, don't cancel out or anything
busy = SPINNING_COCOON busy = SPINNING_COCOON
visible_message("<span class='notice'>\the [src] begins to secrete a sticky substance around \the [cocoon_target].</span>") visible_message("<span class='notice'>[src] begins to secrete a sticky substance around [cocoon_target].</span>","<span class='notice'>You begin wrapping [cocoon_target] into a cocoon.</span>")
stop_automated_movement = TRUE stop_automated_movement = TRUE
walk(src,0) walk(src,0)
if(do_after(src, 50, target = cocoon_target)) if(do_after(src, 50, target = cocoon_target))
@@ -313,7 +320,8 @@
if(L.blood_volume && (L.stat != DEAD || !consumed_mobs[L.tag])) //if they're not dead, you can consume them anyway if(L.blood_volume && (L.stat != DEAD || !consumed_mobs[L.tag])) //if they're not dead, you can consume them anyway
consumed_mobs[L.tag] = TRUE consumed_mobs[L.tag] = TRUE
fed++ fed++
visible_message("<span class='danger'>\the [src] sticks a proboscis into \the [L] and sucks a viscous substance out.</span>") lay_eggs.UpdateButtonIcon(TRUE)
visible_message("<span class='danger'>[src] sticks a proboscis into [L] and sucks a viscous substance out.</span>","<span class='notice'>You suck the nutriment out of [L], feeding you enough to lay a cluster of eggs.</span>")
L.death() //you just ate them, they're dead. L.death() //you just ate them, they're dead.
else else
to_chat(src, "<span class='warning'>[L] cannot sate your hunger!</span>") to_chat(src, "<span class='warning'>[L] cannot sate your hunger!</span>")
@@ -325,35 +333,155 @@
busy = SPIDER_IDLE busy = SPIDER_IDLE
stop_automated_movement = FALSE stop_automated_movement = FALSE
/mob/living/simple_animal/hostile/poison/giant_spider/nurse/verb/LayEggs() /datum/action/innate/spider
set name = "Lay Eggs" icon_icon = 'icons/mob/actions/actions_animal.dmi'
set category = "Spider" background_icon_state = "bg_alien"
set desc = "Lay a clutch of eggs, but you must wrap a creature for feeding first."
var/obj/structure/spider/eggcluster/E = locate() in get_turf(src) /datum/action/innate/spider/lay_web
if(stat == DEAD) name = "Spin Web"
desc = "Spin a web to slow down potential prey."
check_flags = AB_CHECK_CONSCIOUS
button_icon_state = "lay_web"
/datum/action/innate/spider/lay_web/Activate()
if(!istype(owner, /mob/living/simple_animal/hostile/poison/giant_spider/nurse))
return return
var/mob/living/simple_animal/hostile/poison/giant_spider/nurse/S = owner
if(!isturf(S.loc))
return
var/turf/T = get_turf(S)
var/obj/structure/spider/stickyweb/W = locate() in T
if(W)
to_chat(S, "<span class='warning'>There's already a web here!</span>")
return
if(S.busy != SPINNING_WEB)
S.busy = SPINNING_WEB
S.visible_message("<span class='notice'>[S] begins to secrete a sticky substance.</span>","<span class='notice'>You begin to lay a web.</span>")
S.stop_automated_movement = TRUE
if(do_after(S, 40, target = T))
if(S.busy == SPINNING_WEB && S.loc == T)
new /obj/structure/spider/stickyweb(T)
S.busy = SPIDER_IDLE
S.stop_automated_movement = FALSE
else
to_chat(S, "<span class='warning'>You're already spinning a web!</span>")
/obj/effect/proc_holder/wrap
name = "Wrap"
panel = "Spider"
active = FALSE
datum/action/spell_action/action = null
desc = "Wrap something or someone in a cocoon. If it's a living being, you'll also consume them, allowing you to lay eggs."
ranged_mousepointer = 'icons/effects/wrap_target.dmi'
action_icon = 'icons/mob/actions/actions_animal.dmi'
action_icon_state = "wrap_0"
action_background_icon_state = "bg_alien"
/obj/effect/proc_holder/wrap/Initialize()
. = ..()
action = new(src)
/obj/effect/proc_holder/wrap/update_icon()
action.button_icon_state = "wrap_[active]"
action.UpdateButtonIcon()
/obj/effect/proc_holder/wrap/Click()
if(!istype(usr, /mob/living/simple_animal/hostile/poison/giant_spider/nurse))
return TRUE
var/mob/living/simple_animal/hostile/poison/giant_spider/nurse/user = usr
activate(user)
return TRUE
/obj/effect/proc_holder/wrap/proc/activate(mob/living/user)
var/message
if(active)
message = "<span class='notice'>You no longer prepare to wrap something in a cocoon.</span>"
remove_ranged_ability(message)
else
message = "<span class='notice'>You prepare to wrap something in a cocoon. <B>Left-click your target to start wrapping!</B></span>"
add_ranged_ability(user, message, TRUE)
return 1
/obj/effect/proc_holder/wrap/InterceptClickOn(mob/living/caller, params, atom/target)
if(..())
return
if(ranged_ability_user.incapacitated() || !istype(ranged_ability_user, /mob/living/simple_animal/hostile/poison/giant_spider/nurse))
remove_ranged_ability()
return
var/mob/living/simple_animal/hostile/poison/giant_spider/nurse/user = ranged_ability_user
if(user.Adjacent(target) && (ismob(target) || isobj(target)))
var/atom/movable/target_atom = target
if(target_atom.anchored)
return
user.cocoon_target = target_atom
INVOKE_ASYNC(user, /mob/living/simple_animal/hostile/poison/giant_spider/nurse/.proc/cocoon)
remove_ranged_ability()
return TRUE
/obj/effect/proc_holder/wrap/on_lose(mob/living/carbon/user)
remove_ranged_ability()
/datum/action/innate/spider/lay_eggs
name = "Lay Eggs"
desc = "Lay a cluster of eggs, which will soon grow into more spiders. You must wrap a living being to do this."
check_flags = AB_CHECK_CONSCIOUS
button_icon_state = "lay_eggs"
/datum/action/innate/spider/lay_eggs/IsAvailable()
if(..())
if(!istype(owner, /mob/living/simple_animal/hostile/poison/giant_spider/nurse))
return 0
var/mob/living/simple_animal/hostile/poison/giant_spider/nurse/S = owner
if(S.fed)
return 1
return 0
/datum/action/innate/spider/lay_eggs/Activate()
if(!istype(owner, /mob/living/simple_animal/hostile/poison/giant_spider/nurse))
return
var/mob/living/simple_animal/hostile/poison/giant_spider/nurse/S = owner
var/obj/structure/spider/eggcluster/E = locate() in get_turf(S)
if(E) if(E)
to_chat(src, "<span class='warning'>There is already a cluster of eggs here!</span>") to_chat(S, "<span class='warning'>There is already a cluster of eggs here!</span>")
else if(!fed) else if(!S.fed)
to_chat(src, "<span class='warning'>You are too hungry to do this!</span>") to_chat(S, "<span class='warning'>You are too hungry to do this!</span>")
else if(busy != LAYING_EGGS) else if(S.busy != LAYING_EGGS)
busy = LAYING_EGGS S.busy = LAYING_EGGS
src.visible_message("<span class='notice'>\the [src] begins to lay a cluster of eggs.</span>") S.visible_message("<span class='notice'>[S] begins to lay a cluster of eggs.</span>","<span class='notice'>You begin to lay a cluster of eggs.</span>")
stop_automated_movement = 1 S.stop_automated_movement = TRUE
if(do_after(src, 50, target = src.loc)) if(do_after(S, 50, target = get_turf(S)))
if(busy == LAYING_EGGS) if(S.busy == LAYING_EGGS)
E = locate() in get_turf(src) E = locate() in get_turf(S)
if(!E) if(!E || !isturf(S.loc))
var/obj/structure/spider/eggcluster/C = new /obj/structure/spider/eggcluster(src.loc) var/obj/structure/spider/eggcluster/C = new /obj/structure/spider/eggcluster(get_turf(S))
if(ckey) if(S.ckey)
C.player_spiders = 1 C.player_spiders = TRUE
C.poison_type = poison_type C.directive = S.directive
C.poison_per_bite = poison_per_bite C.poison_type = S.poison_type
C.faction = faction.Copy() C.poison_per_bite = S.poison_per_bite
fed-- C.faction = S.faction.Copy()
busy = SPIDER_IDLE S.fed--
stop_automated_movement = FALSE UpdateButtonIcon(TRUE)
S.busy = SPIDER_IDLE
S.stop_automated_movement = FALSE
/datum/action/innate/spider/set_directive
name = "Set Directive"
desc = "Set a directive for your children to follow."
check_flags = AB_CHECK_CONSCIOUS
button_icon_state = "directive"
/datum/action/innate/spider/set_directive/Activate()
if(!istype(owner, /mob/living/simple_animal/hostile/poison/giant_spider/nurse))
return
var/mob/living/simple_animal/hostile/poison/giant_spider/nurse/S = owner
S.directive = stripped_input(S, "Enter the new directive", "Create directive", "[S.directive]", MAX_MESSAGE_LEN)
/mob/living/simple_animal/hostile/poison/giant_spider/Login() /mob/living/simple_animal/hostile/poison/giant_spider/Login()
. = ..() . = ..()
@@ -365,7 +493,8 @@
/datum/action/innate/spider/comm /datum/action/innate/spider/comm
name = "Command" name = "Command"
button_icon_state = "cult_comms" desc = "Send a command to all living spiders."
button_icon_state = "command"
/datum/action/innate/spider/comm/IsAvailable() /datum/action/innate/spider/comm/IsAvailable()
if(!istype(owner, /mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife)) if(!istype(owner, /mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife))
@@ -373,19 +502,22 @@
return TRUE return TRUE
/datum/action/innate/spider/comm/Trigger() /datum/action/innate/spider/comm/Trigger()
var/input = stripped_input(usr, "Input a message for your legions to follow.", "Command", "") var/input = stripped_input(owner, "Input a command for your legions to follow.", "Command", "")
if(QDELETED(src) || !input || !IsAvailable()) if(QDELETED(src) || !input || !IsAvailable())
return FALSE return FALSE
spider_command(usr, input) spider_command(owner, input)
return TRUE return TRUE
/datum/action/innate/spider/comm/proc/spider_command(mob/living/user, message) /datum/action/innate/spider/comm/proc/spider_command(mob/living/user, message)
if(!message) if(!message)
return return
var/my_message var/my_message
my_message = "<FONT size = 3><b>COMMAND FROM SPIDER QUEEN:</b> [message]</FONT>" my_message = "<span class='spider'><b>Command from [user]:</b> [message]</span>"
for(var/mob/living/simple_animal/hostile/poison/giant_spider/M in GLOB.spidermobs) for(var/mob/living/simple_animal/hostile/poison/giant_spider/M in GLOB.spidermobs)
to_chat(M, my_message) to_chat(M, my_message)
for(var/M in GLOB.dead_mob_list)
var/link = FOLLOW_LINK(M, user)
to_chat(M, "[link] [my_message]")
log_talk(user, "SPIDERCOMMAND: [key_name(user)] : [message]",LOGSAY) log_talk(user, "SPIDERCOMMAND: [key_name(user)] : [message]",LOGSAY)
/mob/living/simple_animal/hostile/poison/giant_spider/handle_temperature_damage() /mob/living/simple_animal/hostile/poison/giant_spider/handle_temperature_damage()

View File

@@ -8,6 +8,28 @@
var/ranged_mousepointer var/ranged_mousepointer
var/mob/living/ranged_ability_user var/mob/living/ranged_ability_user
var/ranged_clickcd_override = -1 var/ranged_clickcd_override = -1
var/has_action = TRUE
var/datum/action/spell_action/action = null
var/action_icon = 'icons/mob/actions/actions_spells.dmi'
var/action_icon_state = "spell_default"
var/action_background_icon_state = "bg_spell"
/obj/effect/proc_holder/Initialize()
. = ..()
if(has_action)
action = new(src)
/obj/effect/proc_holder/proc/on_gain(mob/living/user)
return
/obj/effect/proc_holder/proc/on_lose(mob/living/user)
return
/obj/effect/proc_holder/proc/fire(mob/living/user)
return TRUE
/obj/effect/proc_holder/proc/get_panel_text()
return ""
GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for the badmin verb for now GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for the badmin verb for now
@@ -118,10 +140,10 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th
var/critfailchance = 0 var/critfailchance = 0
var/centcom_cancast = 1 //Whether or not the spell should be allowed on z2 var/centcom_cancast = 1 //Whether or not the spell should be allowed on z2
var/action_icon = 'icons/mob/actions/actions_spells.dmi' action_icon = 'icons/mob/actions/actions_spells.dmi'
var/action_icon_state = "spell_default" action_icon_state = "spell_default"
var/action_background_icon_state = "bg_spell" action_background_icon_state = "bg_spell"
var/datum/action/spell_action/action datum/action/spell_action/spell/action
/obj/effect/proc_holder/spell/proc/cast_check(skipcharge = 0,mob/user = usr) //checks if the spell can be cast based on its settings; skipcharge is used when an additional cast_check is called inside the spell /obj/effect/proc_holder/spell/proc/cast_check(skipcharge = 0,mob/user = usr) //checks if the spell can be cast based on its settings; skipcharge is used when an additional cast_check is called inside the spell

Binary file not shown.

After

Width:  |  Height:  |  Size: 599 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB