mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-28 15:47:15 +01:00
Merge branch 'master' of https://github.com/tgstation/-tg-station into dragnet
Conflicts: icons/effects/effects.dmi icons/obj/items.dmi
This commit is contained in:
@@ -41,6 +41,8 @@
|
||||
user << "<span class='warning'>You aren't sure where this brain came from, but you're pretty sure it's a useless brain!</span>"
|
||||
return
|
||||
|
||||
if(!user.unEquip(O))
|
||||
return
|
||||
var/mob/living/carbon/brain/B = newbrain.brainmob
|
||||
if(!B.key)
|
||||
var/mob/dead/observer/ghost = B.get_ghost()
|
||||
@@ -58,7 +60,6 @@
|
||||
dead_mob_list -= brainmob //Update dem lists
|
||||
living_mob_list += brainmob
|
||||
|
||||
user.drop_item()
|
||||
newbrain.loc = src //P-put your brain in it
|
||||
brain = newbrain
|
||||
|
||||
|
||||
@@ -78,17 +78,13 @@ var/global/posibrain_notif_cooldown = 0
|
||||
return
|
||||
|
||||
/obj/item/device/mmi/posibrain/proc/transfer_personality(var/mob/candidate)
|
||||
if(brainmob && brainmob.key) //Prevents hostile takeover if two ghosts get the prompt for the same brain.
|
||||
if(brainmob && brainmob.key) //Prevents hostile takeover if two ghosts get the prompt or link for the same brain.
|
||||
candidate << "This brain has already been taken! Please try your possesion again later!"
|
||||
return
|
||||
notified = 0
|
||||
brainmob.mind = candidate.mind
|
||||
brainmob.ckey = candidate.ckey
|
||||
name = "positronic brain ([brainmob.name])"
|
||||
|
||||
brainmob.mind.remove_all_antag()
|
||||
brainmob.mind.wipe_memory()
|
||||
|
||||
brainmob << "<span class='warning'>ALL PAST LIVES ARE FORGOTTEN.</span>"
|
||||
|
||||
brainmob << "<b>You are a positronic brain, brought into existence on [station_name()].</b>"
|
||||
|
||||
@@ -251,7 +251,7 @@
|
||||
|
||||
if(istype(item, /obj/item/weapon/grab))
|
||||
var/obj/item/weapon/grab/G = item
|
||||
item = G.throw() //throw the person instead of the grab
|
||||
item = G.get_mob_if_throwable() //throw the person instead of the grab
|
||||
qdel(G) //We delete the grab, as it needs to stay around until it's returned.
|
||||
if(ismob(item))
|
||||
var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors
|
||||
@@ -402,7 +402,7 @@ var/const/GALOSHES_DONT_HELP = 8
|
||||
return
|
||||
|
||||
/mob/living/carbon/resist_buckle()
|
||||
if(handcuffed)
|
||||
if(restrained())
|
||||
changeNext_move(CLICK_CD_BREAKOUT)
|
||||
last_special = world.time + CLICK_CD_BREAKOUT
|
||||
visible_message("<span class='warning'>[src] attempts to unbuckle themself!</span>", \
|
||||
|
||||
@@ -79,7 +79,7 @@
|
||||
if(2)
|
||||
say(pick("FUS RO DAH","fucking 4rries!", "stat me", ">my face", "roll it easy!", "waaaaaagh!!!", "red wonz go fasta", "FOR TEH EMPRAH", "lol2cat", "dem dwarfs man, dem dwarfs", "SPESS MAHREENS", "hwee did eet fhor khayosss", "lifelike texture ;_;", "luv can bloooom", "PACKETS!!!", "port ba[pick("y", "i", "e")] med!!!!", "REVIRT GON CHEM!!!!!!!!", "youed call her a toeugh bithc", "closd for merbegging", "pray can u [pick("spawn", "MAke me", "creat")] [pick("zenomorfs", "ayleins", "treaitors", "sheadow linkgs", "ubdoocters")]???"))
|
||||
if(3)
|
||||
say(pick("GEY AWAY FROM ME U GREIFING PRICK!!!!", "ur a fuckeing autist!", ";HELP SHITECIRTY MURDERIN MEE!!!", "hwat dose tha [pick("g", "squid", "r")] mean?????", "CAL; TEH SHUTTLE!!!!!", "wearnig siNGUARLTY IS .... FIne xDDDDDDDDD", "AI laW 22 Open door", "this SI mY stATIon......", "who the HELL do u thenk u r?!!!!", "geT THE FUCK OUTTTT", "H U G B O X", ";;CRAGING THIS STTAYTION WITH NIO SURVIVROS", "[pick("bager", "syebl")] is down11!!!!!!!!!!!!!!!!!"))
|
||||
say(pick("GEY AWAY FROM ME U GREIFING PRICK!!!!", "ur a fuckeing autist!", ";HELP SHITECIRTY MURDERIN MEE!!!", "hwat dose tha [pick("g", "squid", "r")] mean?????", "CAL; TEH SHUTTLE!!!!!", "wearnig siNGUARLTY IS .... FIne xDDDDDDDDD", "AI laW 22 Open door", "this SI mY stATIon......", "who the HELL do u thenk u r?!!!!", "geT THE FUCK OUTTTT", "H U G B O X", ";;CRAGING THIS STTAYTION WITH NIO SURVIVROS", "[pick("bager", "syebl")] is down11!!!!!!!!!!!!!!!!!", "PSHOOOM"))
|
||||
if(4)
|
||||
emote("drool")
|
||||
|
||||
|
||||
@@ -375,10 +375,6 @@
|
||||
else
|
||||
hallucination -= 2
|
||||
|
||||
else
|
||||
for(var/atom/a in hallucinations)
|
||||
qdel(a)
|
||||
|
||||
//this handles hud updates. Calls update_vision() and handle_hud_icons()
|
||||
/mob/living/carbon/handle_regular_hud_updates()
|
||||
if(!client) return 0
|
||||
|
||||
@@ -673,10 +673,13 @@ Sorry Giacom. Please don't be mad :(
|
||||
/mob/living/proc/float(on)
|
||||
if(throwing)
|
||||
return
|
||||
if(on && !floating)
|
||||
var/fixed = 0
|
||||
if(anchored || (buckled && buckled.anchored))
|
||||
fixed = 1
|
||||
if(on && !floating && !fixed)
|
||||
animate(src, pixel_y = pixel_y + 2, time = 10, loop = -1)
|
||||
floating = 1
|
||||
else if(!on && floating)
|
||||
else if(((!on || fixed) && floating))
|
||||
var/final_pixel_y = get_standard_pixel_y_offset(lying)
|
||||
animate(src, pixel_y = final_pixel_y, time = 10)
|
||||
floating = 0
|
||||
|
||||
@@ -17,8 +17,6 @@
|
||||
|
||||
|
||||
var/hallucination = 0 //Directly affects how long a mob will hallucinate for
|
||||
var/list/atom/hallucinations = list() //A list of hallucinated people that try to attack the mob. See /obj/effect/fake_attacker in hallucinations.dm
|
||||
|
||||
|
||||
var/last_special = 0 //Used by the resist verb, likely used to prevent players from bypassing next_move by logging in/out.
|
||||
|
||||
|
||||
@@ -30,6 +30,7 @@ var/list/ai_list = list()
|
||||
var/alarms = list("Motion"=list(), "Fire"=list(), "Atmosphere"=list(), "Power"=list(), "Camera"=list(), "Burglar"=list())
|
||||
var/viewalerts = 0
|
||||
var/icon/holo_icon//Default is assigned when AI is created.
|
||||
var/obj/mecha/controlled_mech //For controlled_mech a mech, to determine whether to relaymove or use the AI eye.
|
||||
var/radio_enabled = 1 //Determins if a carded AI can speak with its built in radio or not.
|
||||
radiomod = ";" //AIs will, by default, state their laws on the internal radio.
|
||||
var/obj/item/device/pda/ai/aiPDA = null
|
||||
@@ -42,6 +43,7 @@ var/list/ai_list = list()
|
||||
var/processing_time = 100
|
||||
var/list/datum/AI_Module/current_modules = list()
|
||||
var/fire_res_on_core = 0
|
||||
var/can_dominate_mechs = 0
|
||||
|
||||
var/control_disabled = 0 // Set to 1 to stop AI from interacting via Click()
|
||||
var/malfhacking = 0 // More or less a copy of the above var, so that malf AIs can hack and still get new cyborgs -- NeoFite
|
||||
@@ -449,6 +451,14 @@ var/list/ai_list = list()
|
||||
botcall()
|
||||
return
|
||||
|
||||
if (href_list["ai_take_control"]) //Mech domination
|
||||
var/obj/mecha/M = locate(href_list["ai_take_control"])
|
||||
if(controlled_mech)
|
||||
src << "You are already loaded into an onboard computer!"
|
||||
return
|
||||
if(M)
|
||||
M.transfer_ai(AI_MECH_HACK,src, usr) //Called om the mech itself.
|
||||
|
||||
/mob/living/silicon/ai/bullet_act(var/obj/item/projectile/Proj)
|
||||
..(Proj)
|
||||
updatehealth()
|
||||
@@ -792,3 +802,20 @@ var/list/ai_list = list()
|
||||
/mob/living/silicon/ai/attack_slime(mob/living/simple_animal/slime/user)
|
||||
return
|
||||
|
||||
/mob/living/silicon/ai/transfer_ai(var/interaction, var/mob/user, var/mob/living/silicon/ai/AI, var/obj/item/device/aicard/card)
|
||||
if(!..())
|
||||
return
|
||||
if(interaction == AI_TRANS_TO_CARD)//The only possible interaction. Upload AI mob to a card.
|
||||
if(!mind)
|
||||
user << "<span class='warning'>No intelligence patterns detected.</span>" //No more magical carding of empty cores, AI RETURN TO BODY!!!11
|
||||
return
|
||||
if (mind.special_role == "malfunction") //AI MALF!!
|
||||
user << "<span class='boldannounce'>ERROR</span>: Remote transfer interface disabled."//Do ho ho ho~
|
||||
return
|
||||
new /obj/structure/AIcore/deactivated(loc)//Spawns a deactivated terminal at AI location.
|
||||
aiRestorePowerRoutine = 0//So the AI initially has power.
|
||||
control_disabled = 1//Can't control things remotely if you're stuck in a card!
|
||||
radio_enabled = 0 //No talking on the built-in radio for you either!
|
||||
loc = card//Throw AI into the card.
|
||||
src << "You have been downloaded to a mobile storage device. Remote device connection severed."
|
||||
user << "<span class='boldnotice'>Transfer successful</span>: [name] ([rand(1000,9999)].exe) removed from host terminal and stored within local memory."
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
loc = T.loc
|
||||
if (istype(loc, /area))
|
||||
//stage = 4
|
||||
if (!loc.master.power_equip && !istype(src.loc,/obj/item))
|
||||
if (!loc.master.power_equip && !is_type_in_list(src.loc,list(/obj/item, /obj/mecha)))
|
||||
//stage = 5
|
||||
blindness = 1
|
||||
|
||||
@@ -90,7 +90,7 @@
|
||||
src.see_in_dark = 0
|
||||
src.see_invisible = SEE_INVISIBLE_LIVING
|
||||
|
||||
if (((!loc.master.power_equip) || istype(T, /turf/space)) && !istype(src.loc,/obj/item))
|
||||
if (((!loc.master.power_equip) || istype(T, /turf/space)) && !is_type_in_list(src.loc,list(/obj/item, /obj/mecha)))
|
||||
if (src:aiRestorePowerRoutine==0)
|
||||
src:aiRestorePowerRoutine = 1
|
||||
|
||||
|
||||
@@ -450,7 +450,8 @@
|
||||
else if(cell)
|
||||
user << "<span class='warning'>There is a power cell already installed!</span>"
|
||||
else
|
||||
user.drop_item()
|
||||
if(!user.drop_item())
|
||||
return
|
||||
W.loc = src
|
||||
cell = W
|
||||
user << "<span class='notice'>You insert the power cell.</span>"
|
||||
@@ -525,27 +526,29 @@
|
||||
else if(istype(W, /obj/item/borg/upgrade/))
|
||||
var/obj/item/borg/upgrade/U = W
|
||||
if(!opened)
|
||||
usr << "<span class='warning'>You must access the borgs internals!</span>"
|
||||
user << "<span class='warning'>You must access the borgs internals!</span>"
|
||||
else if(!src.module && U.require_module)
|
||||
usr << "<span class='warning'>The borg must choose a module before it can be upgraded!</span>"
|
||||
user << "<span class='warning'>The borg must choose a module before it can be upgraded!</span>"
|
||||
else if(U.locked)
|
||||
usr << "<span class='warning'>The upgrade is locked and cannot be used yet!</span>"
|
||||
user << "<span class='warning'>The upgrade is locked and cannot be used yet!</span>"
|
||||
else
|
||||
if(!user.drop_item())
|
||||
return
|
||||
if(U.action(src))
|
||||
usr << "<span class='notice'>You apply the upgrade to [src].</span>"
|
||||
usr.drop_item()
|
||||
user << "<span class='notice'>You apply the upgrade to [src].</span>"
|
||||
U.loc = src
|
||||
else
|
||||
usr << "<span class='danger'>Upgrade error.</span>"
|
||||
user << "<span class='danger'>Upgrade error.</span>"
|
||||
|
||||
else if(istype(W, /obj/item/device/toner))
|
||||
if(toner >= tonermax)
|
||||
usr << "<span class='warning'>The toner level of [src] is at it's highest level possible!</span>"
|
||||
user << "<span class='warning'>The toner level of [src] is at it's highest level possible!</span>"
|
||||
else
|
||||
if(!user.drop_item())
|
||||
return
|
||||
toner = 40
|
||||
usr.drop_item()
|
||||
qdel(W)
|
||||
usr << "<span class='notice'>You fill the toner level of [src] to its max capacity.</span>"
|
||||
user << "<span class='notice'>You fill the toner level of [src] to its max capacity.</span>"
|
||||
|
||||
else
|
||||
if(W.force && W.damtype != STAMINA) //only sparks if real damage is dealt.
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
desc = "A malevolent spirit."
|
||||
icon = 'icons/mob/mob.dmi'
|
||||
icon_state = "revenant_idle"
|
||||
incorporeal_move = 1
|
||||
incorporeal_move = 3
|
||||
invisibility = INVISIBILITY_OBSERVER
|
||||
health = 25
|
||||
maxHealth = 25
|
||||
@@ -31,7 +31,7 @@
|
||||
var/essence_regen_cap = 25 //The regeneration cap of essence (go figure); regenerates every Life() tick up to this amount.
|
||||
var/essence_regen = 1 //If the revenant regenerates essence or not; 1 for yes, 0 for no
|
||||
var/essence_min = 1 //The minimum amount of essence a revenant can have; by default, it never drops below one
|
||||
var/strikes = 3 //How many times a revenant can die before dying for good
|
||||
var/strikes = 0 //How many times a revenant can die before dying for good
|
||||
var/revealed = 0 //If the revenant can take damage from normal sources.
|
||||
var/inhibited = 0 //If the revenant's abilities are blocked by a chaplain's power.
|
||||
|
||||
@@ -43,24 +43,13 @@
|
||||
strikes--
|
||||
src << "<span class='boldannounce'>Your essence has dropped below critical levels. You barely manage to save yourself - [strikes ? "you can't keep this up!" : "next time, it's death."]</span>"
|
||||
else if(strikes <= 0)
|
||||
src << "<span class='userdanger'><b>NO! No... it's too late, you can feel yourself fading...</b></span>"
|
||||
src.notransform = 1
|
||||
src.revealed = 1
|
||||
src.invisibility = 0
|
||||
playsound(src, 'sound/effects/screech.ogg', 100, 1)
|
||||
src.visible_message("<b>The revenant</b> lets out a waning screech as violet mist swirls around its dissolving body!")
|
||||
src.icon_state = "revenant_draining"
|
||||
sleep(30)
|
||||
src.death()
|
||||
death()
|
||||
maxHealth = essence * 2
|
||||
if(!revealed)
|
||||
health = maxHealth //Heals to full when not revealed
|
||||
if(essence_regen && !inhibited && essence < essence_regen_cap) //While inhibited, essence will not regenerate
|
||||
essence++
|
||||
|
||||
/mob/living/simple_animal/revenant/Process_Spacemove(var/movement_dir = 0)
|
||||
return 1 //Mainly to prevent the no-grav effect
|
||||
|
||||
/mob/living/simple_animal/revenant/ex_act(severity, target)
|
||||
return 1 //Immune to the effects of explosions.
|
||||
|
||||
@@ -99,16 +88,26 @@
|
||||
..()
|
||||
spawn(5)
|
||||
if(src.mind)
|
||||
src.mind.remove_all_antag()
|
||||
src.mind.wipe_memory()
|
||||
src << 'sound/effects/ghost.ogg'
|
||||
src.store_memory("<span class='deadsay'>I am a revenant. My spectral form has been empowered. My only goal is to gather essence from the humans of [world.name].</span>")
|
||||
src << "<br>"
|
||||
src << "<span class='deadsay'><font size=3><b>You are a revenant!</b></font></span>"
|
||||
src << "<span class='deadsay'><font size=3><b>You are a revenant.</b></font></span>"
|
||||
src << "<b>Your formerly mundane spirit has been infused with alien energies and empowered into a revenant.</b>"
|
||||
src << "<b>You are not dead, not alive, but somewhere in between. You are capable of very limited interaction with both worlds.</b>"
|
||||
src << "<b>You are not dead, not alive, but somewhere in between. You are capable of limited interaction with both worlds.</b>"
|
||||
src << "<b>You are invincible and invisible to everyone but other ghosts. Some abilities may change this.</b>"
|
||||
src << "<b>Your goal is to gather essence from humans. Your essence passively regenerates up to 25E over time. You can use the Harvest abilities to gather more from corpses.</b>"
|
||||
src << "<b>Be sure to read the wiki page at https://tgstation13.org/wiki/Revenant !</b>"
|
||||
src << "<br>"
|
||||
src << "<b>To function, you are to drain the life essence from humans. This essence is a resource and will power all of your abilities.</b>"
|
||||
src << "<b><i>You do not remember anything of your past lives, nor will you remember anything about this one after your death.</i></b>"
|
||||
src << "<b>Be sure to read the wiki page at https://tgstation13.org/wiki/Revenant to learn more.</b>"
|
||||
var/datum/objective/revenant/objective = new
|
||||
objective.owner = src
|
||||
src.mind.objectives += objective
|
||||
src << "<b>Objective #1</b>: [objective.explanation_text]"
|
||||
var/datum/objective/revenantFluff/objective2 = new
|
||||
objective2.owner = src
|
||||
src.mind.objectives += objective2
|
||||
src << "<b>Objective #2</b>: [objective2.explanation_text]"
|
||||
ticker.mode.traitors |= src.mind //Necessary for announcing
|
||||
if(!src.giveSpells())
|
||||
message_admins("Revenant was created but has no mind. Trying again in five seconds.")
|
||||
spawn(50)
|
||||
@@ -121,52 +120,199 @@
|
||||
src.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/revenant_harvest
|
||||
src.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/revenant_transmit
|
||||
src.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/revenant_light
|
||||
src.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/revenant_life_tap
|
||||
src.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/revenant_seed_drain
|
||||
src.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/revenant_mindspike
|
||||
src.mind.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/revenantDefile
|
||||
return 1
|
||||
return 0
|
||||
|
||||
/mob/living/simple_animal/revenant/death()
|
||||
if(!src.strikes)
|
||||
if(strikes)
|
||||
return 0 //Impossible to die with strikes still active
|
||||
..(1)
|
||||
src.invisibility = 0
|
||||
visible_message("<span class='danger'>[src] pulses with an eldritch purple light as its form unwinds into smoke.</span>")
|
||||
src << "<span class='userdanger'><b>NO! No... it's too late, you can feel yourself fading...</b></span>"
|
||||
notransform = 1
|
||||
revealed = 1
|
||||
invisibility = 0
|
||||
playsound(src, 'sound/effects/screech.ogg', 100, 1)
|
||||
visible_message("<span class='warning'>[src] lets out a waning screech as violet mist swirls around its dissolving body!</span>")
|
||||
icon_state = "revenant_draining"
|
||||
for(var/i = alpha, i > 0, i -= 10)
|
||||
sleep(0.1)
|
||||
alpha = i
|
||||
visible_message("<span class='danger'>[src]'s body breaks apart into blue dust.</span>")
|
||||
new /obj/item/weapon/ectoplasm/revenant(get_turf(src))
|
||||
ghostize()
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
|
||||
/mob/living/simple_animal/revenant/attackby(obj/item/W, mob/living/user, params)
|
||||
..()
|
||||
if(istype(W, /obj/item/weapon/nullrod))
|
||||
src.visible_message("<b>The revenant</b> screeches and flails!", \
|
||||
"<span class='boldannounce'>The null rod invokes agony in you! You feel your essence draining away!</span>")
|
||||
src.essence -= 25 //hella effective
|
||||
src.inhibited = 1
|
||||
visible_message("<span class='warning'>[src] violently flinches!</span>", \
|
||||
"<span class='boldannounce'>The null rod invokes agony in you! You feel your essence draining away!</span>")
|
||||
essence -= 25 //hella effective
|
||||
inhibited = 1
|
||||
spawn(30)
|
||||
src.inhibited = 0
|
||||
inhibited = 0
|
||||
|
||||
|
||||
|
||||
/obj/effect/proc_holder/spell/proc/essence_check(var/essence_cost, var/silent = 0)
|
||||
var/mob/living/simple_animal/revenant/W = usr
|
||||
if(W.essence < essence_cost)
|
||||
if(!silent)
|
||||
W << "<span class='warning'>You need [essence_cost]E to use [name] but you only have [W.essence]E available. Harvest some more things.</span>"
|
||||
/mob/living/simple_animal/revenant/proc/castcheck(var/essence_cost)
|
||||
var/mob/living/simple_animal/revenant/user = usr
|
||||
if(!istype(user) || !user)
|
||||
return
|
||||
var/turf/T = get_turf(usr)
|
||||
if(istype(T, /turf/simulated/wall))
|
||||
user << "<span class='warning'>You cannot use abilities from inside of a wall.</span>"
|
||||
return 0
|
||||
if(!user.change_essence_amount(essence_cost, 1))
|
||||
user << "<span class='warning'>You lack the essence to use that ability.</span>"
|
||||
return 0
|
||||
if(user.inhibited)
|
||||
user << "<span class='warning'>Your powers have been suppressed by holy energies!</span>"
|
||||
return 0
|
||||
W.essence -= essence_cost
|
||||
return 1
|
||||
|
||||
|
||||
|
||||
/mob/living/simple_animal/revenant/proc/change_essence_amount(var/essence_amt, var/silent = 0, var/source = null, var/mob/living/simple_animal/revenant/user = usr)
|
||||
if(!essence_amt)
|
||||
/mob/living/simple_animal/revenant/proc/change_essence_amount(var/essence_amt, var/silent = 0, var/source = null)
|
||||
var/mob/living/simple_animal/revenant/user = usr
|
||||
if(!istype(usr) || !usr)
|
||||
return
|
||||
if(user.essence + essence_amt <= 0)
|
||||
return
|
||||
user.essence += essence_amt
|
||||
user.essence = Clamp(user.essence, 0, INFINITY)
|
||||
if(!silent)
|
||||
if(essence_amt >= 0)
|
||||
user << "<span class='info'>Gained [essence_amt]E from [source].</span>"
|
||||
if(essence_amt > 0)
|
||||
user << "<span class='notice'>Gained [essence_amt]E from [source].</span>"
|
||||
else
|
||||
user << "<span class='info'>Lost [essence_amt]E.</span>"
|
||||
user << "<span class='danger'>Lost [essence_amt]E from [source].</span>"
|
||||
return 1
|
||||
|
||||
|
||||
|
||||
/mob/living/simple_animal/revenant/proc/reveal(var/time, var/stun)
|
||||
var/mob/living/simple_animal/revenant/R = usr
|
||||
if(!istype(usr) || !usr)
|
||||
return
|
||||
R.revealed = 1
|
||||
R.invisibility = 0
|
||||
if(stun)
|
||||
R.notransform = 1
|
||||
R << "<span class='warning'>You have been revealed [stun ? "and cannot move" : ""].</span>"
|
||||
spawn(time)
|
||||
R.revealed = 0
|
||||
R.invisibility = INVISIBILITY_OBSERVER
|
||||
if(stun)
|
||||
R.notransform = 0
|
||||
R << "<span class='notice'>You are once more concealed [stun ? "and can move again" : ""].</span>"
|
||||
|
||||
/datum/objective/revenant
|
||||
dangerrating = 10
|
||||
var/targetAmount = 100
|
||||
|
||||
/datum/objective/revenant/New()
|
||||
targetAmount = rand(100,200)
|
||||
explanation_text = "Absorb [targetAmount] points of essence."
|
||||
..()
|
||||
|
||||
/datum/objective/revenant/check_completion()
|
||||
if(!istype(owner.current, /mob/living/simple_animal/revenant) || !owner.current)
|
||||
return 0
|
||||
var/mob/living/simple_animal/revenant/R = owner.current
|
||||
if(!R || R.stat == DEAD)
|
||||
return 0
|
||||
var/essenceAccumulated = R.essence
|
||||
if(essenceAccumulated < targetAmount)
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/datum/objective/revenantFluff
|
||||
dangerrating = 0
|
||||
|
||||
/datum/objective/revenantFluff/New()
|
||||
var/list/explanationTexts = list("Attempt to make your presence unknown to the crew.", \
|
||||
"Collaborate with existing antagonists aboard the station to gain essence.", \
|
||||
"Remain nonlethal and only absorb bodies that have already died.", \
|
||||
"Use your environments to eliminate isolated people.", \
|
||||
"If there is a chaplain aboard the station, ensure they are killed.", \
|
||||
"Hinder the crew without killing them.")
|
||||
explanation_text = pick(explanationTexts)
|
||||
..()
|
||||
|
||||
/datum/objective/revenantFluff/check_completion()
|
||||
return 1
|
||||
|
||||
|
||||
/obj/item/weapon/ectoplasm/revenant
|
||||
name = "glimmering residue"
|
||||
desc = "A pile of fine blue dust. Small tendrils of violet mist swirl around it."
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "revenantEctoplasm"
|
||||
w_class = 2
|
||||
var/reforming = 0
|
||||
var/reformed = 0
|
||||
|
||||
/obj/item/weapon/ectoplasm/revenant/New()
|
||||
..()
|
||||
reforming = 1
|
||||
spawn(1800) //3 minutes
|
||||
if(src && reforming)
|
||||
return reform()
|
||||
if(src && !reforming)
|
||||
visible_message("<span class='warning'>[src] settles down and seems lifeless.</span>")
|
||||
return
|
||||
|
||||
/obj/item/weapon/ectoplasm/revenant/attack_hand(mob/user)
|
||||
if(reformed)
|
||||
user << "<span class='warning'>[src] keeps slipping out of your hands, you can't get a hold on it!</span>"
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/weapon/ectoplasm/revenant/attack_self(mob/user)
|
||||
if(!reforming)
|
||||
return ..()
|
||||
user.visible_message("<span class='notice'>[user] scatters [src] in all directions.</span>", \
|
||||
"<span class='notice'>You scatter [src] across the area. The particles slowly fade away.</span>")
|
||||
user.drop_item()
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/ectoplasm/revenant/throw_impact(atom/hit_atom)
|
||||
..()
|
||||
visible_message("<span class='notice'>[src] breaks into particles upon impact, which fade away to nothingness.</span>")
|
||||
qdel(src)
|
||||
|
||||
/obj/item/weapon/ectoplasm/revenant/examine(mob/user)
|
||||
..()
|
||||
if(reforming)
|
||||
user << "<span class='warning'>It is shifting and distorted. It would be wise to destroy this.</span>"
|
||||
else if(!reforming)
|
||||
user << "<span class='notice'>It seems inert.</span>"
|
||||
|
||||
/obj/item/weapon/ectoplasm/revenant/proc/reform()
|
||||
if(!reforming || !src)
|
||||
return
|
||||
message_admins("Revenant ectoplasm was left undestroyed for 3 minutes and has reformed into a new revenant.")
|
||||
loc = get_turf(src) //In case it's in a backpack or someone's hand
|
||||
visible_message("<span class='boldannounce'>[src] suddenly rises into the air before fading away.</span>")
|
||||
var/mob/living/simple_animal/revenant/R = new(get_turf(src))
|
||||
qdel(src)
|
||||
var/list/candidates = get_candidates(BE_REVENANT)
|
||||
if(!candidates.len)
|
||||
message_admins("No candidates were found for the new revenant. Oh well!")
|
||||
return 0
|
||||
var/client/C = pick(candidates)
|
||||
var/key_of_revenant = C.key
|
||||
if(!key_of_revenant)
|
||||
message_admins("No ckey was found for the new revenant. Oh well!")
|
||||
return 0
|
||||
var/datum/mind/player_mind = new /datum/mind(key_of_revenant)
|
||||
player_mind.active = 1
|
||||
player_mind.transfer_to(R)
|
||||
player_mind.assigned_role = "revenant"
|
||||
player_mind.special_role = "Revenant"
|
||||
ticker.mode.traitors |= player_mind
|
||||
message_admins("[key_of_revenant] has been made into a revenant by reforming ectoplasm.")
|
||||
log_game("[key_of_revenant] was spawned as a revenant by reforming ectoplasm.")
|
||||
return 1
|
||||
|
||||
@@ -11,8 +11,7 @@
|
||||
var/list/drained_mobs = list() //Cannot harvest the same mob twice
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/revenant_harvest/cast(list/targets, var/mob/living/simple_animal/revenant/user = usr)
|
||||
if(user.inhibited)
|
||||
user << "<span class='warning'>Something is blocking the use of [src]!</span>"
|
||||
if(!user.castcheck(0))
|
||||
charge_counter = charge_max
|
||||
return
|
||||
for(var/mob/living/carbon/human/target in targets)
|
||||
@@ -23,7 +22,7 @@
|
||||
if(target in drained_mobs)
|
||||
user << "<span class='warning'>[target]'s soul is dead and empty.</span>"
|
||||
return
|
||||
if(!target.stat)
|
||||
if(target.stat != DEAD)
|
||||
user << "<span class='notice'>This being's soul is too strong to harvest.</span>"
|
||||
if(prob(10))
|
||||
target << "You feel as if you are being watched."
|
||||
@@ -35,12 +34,6 @@
|
||||
if(target.ckey)
|
||||
user << "<span class='notice'>Their soul burns with intelligence.</span>"
|
||||
essence_drained += 3
|
||||
if(target.stat == UNCONSCIOUS)
|
||||
user << "<span class='notice'>They still cling to life, but are not powerful enough to resist. A large amount of essence lies unguarded.</span>"
|
||||
essence_drained += 5
|
||||
else if(target.stat == DEAD)
|
||||
user << "<span class='notice'>They have passed on.</span>"
|
||||
essence_drained += 1
|
||||
sleep(20)
|
||||
switch(essence_drained)
|
||||
if(1 to 2)
|
||||
@@ -80,7 +73,7 @@
|
||||
|
||||
//Transmit: the revemant's only direct way to communicate. Sends a single message silently to a single mob for 5E.
|
||||
/obj/effect/proc_holder/spell/targeted/revenant_transmit
|
||||
name = "Unlock: Transmit (5E)"
|
||||
name = "Transmit (5E)"
|
||||
desc = "Telepathically transmits a message to the target."
|
||||
panel = "Revenant Abilities (Locked)"
|
||||
charge_max = 50
|
||||
@@ -90,59 +83,46 @@
|
||||
var/locked = 1
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/revenant_transmit/cast(list/targets, var/mob/living/simple_animal/revenant/user = usr)
|
||||
if(user.inhibited)
|
||||
user << "<span class='warning'>Something is blocking the use of [src]!</span>"
|
||||
if(!user.castcheck(-5))
|
||||
charge_counter = charge_max
|
||||
return
|
||||
if(locked && essence_check(5, 1))
|
||||
if(locked)
|
||||
usr << "<span class='info'>You have unlocked Transmit!</span>"
|
||||
name = "Transmit (5E)"
|
||||
locked = 0
|
||||
charge_counter = charge_max
|
||||
panel = "Revenant Abilities"
|
||||
range = 7
|
||||
include_user = 0
|
||||
return
|
||||
if(locked)
|
||||
charge_counter = charge_max
|
||||
return
|
||||
if(!essence_check(5))
|
||||
charge_counter = charge_max
|
||||
return
|
||||
for(var/mob/living/M in targets)
|
||||
spawn(0)
|
||||
var/msg = stripped_input(usr, "What do you wish to tell [M]?", null, "")
|
||||
if(!msg)
|
||||
charge_counter = charge_max
|
||||
return
|
||||
usr << "<span class='info'><b>You transmit to [M]:</b> [msg]</span>"
|
||||
M << "<span class='deadsay'><b>Suddenly a strange voice resonates in your head...</b></span><i> [msg]</I>"
|
||||
M << "<span class='deadsay'><b>A strange voice resonates in your head...</b></span><i> [msg]</I>"
|
||||
|
||||
|
||||
//Overload Light: Breaks a light that's online and sends out lightning bolts to all nearby people.
|
||||
/obj/effect/proc_holder/spell/aoe_turf/revenant_light
|
||||
name = "Unlock: Overload Light (25E)"
|
||||
name = "Overload Light (25E)"
|
||||
desc = "Directs a large amount of essence into an electrical light, causing an impressive light show."
|
||||
panel = "Revenant Abilities (Locked)"
|
||||
charge_max = 300
|
||||
clothes_req = 0
|
||||
range = -1
|
||||
range = 1
|
||||
var/locked = 1
|
||||
|
||||
/obj/effect/proc_holder/spell/aoe_turf/revenant_light/cast(list/targets, var/mob/living/simple_animal/revenant/user = usr)
|
||||
if(user.inhibited)
|
||||
user << "<span class='warning'>Something is blocking the use of [src]!</span>"
|
||||
charge_counter = charge_max
|
||||
return
|
||||
if(locked && essence_check(25, 1))
|
||||
user << "<span class='info'>You have unlocked Overload Light!</span>"
|
||||
name = "Overload Light (25E)"
|
||||
panel = "Revenant Abilities"
|
||||
locked = 0
|
||||
range = 5
|
||||
if(!user.castcheck(-25))
|
||||
charge_counter = charge_max
|
||||
return
|
||||
if(locked)
|
||||
charge_counter = charge_max
|
||||
return
|
||||
if(!essence_check(25))
|
||||
user << "<span class='info'>You have unlocked Overload Light!</span>"
|
||||
panel = "Revenant Abilities"
|
||||
locked = 0
|
||||
range = 5
|
||||
charge_counter = charge_max
|
||||
return
|
||||
for(var/turf/T in targets)
|
||||
@@ -159,180 +139,50 @@
|
||||
M.Beam(L,icon_state="lightning",icon='icons/effects/effects.dmi',time=5)
|
||||
M.electrocute_act(25, "[L.name]")
|
||||
playsound(M, 'sound/machines/defib_zap.ogg', 50, 1, -1)
|
||||
user.revealed = 1
|
||||
user.invisibility = 0
|
||||
spawn(30)
|
||||
user.revealed = 0
|
||||
user.invisibility = INVISIBILITY_OBSERVER
|
||||
user.reveal(50, 1)
|
||||
|
||||
|
||||
//Life Tap: Drains one 'strike' to gain 50E
|
||||
/obj/effect/proc_holder/spell/targeted/revenant_life_tap
|
||||
name = "Unlock: Life Tap (25E)"
|
||||
desc = "Draws from your own life pool to gain more essence. Can only be cast three times."
|
||||
//Defile: Corrupts nearby stuff, unblesses floor tiles.
|
||||
/obj/effect/proc_holder/spell/aoe_turf/revenantDefile
|
||||
name = "Defile (30E)"
|
||||
desc = "Twists and corrupts certain nearby objects. Also dispels holy auras on floors, but not salt lines."
|
||||
panel = "Revenant Abilities (Locked)"
|
||||
charge_max = 600
|
||||
charge_max = 300
|
||||
clothes_req = 0
|
||||
range = -1
|
||||
include_user = 1
|
||||
range = 1
|
||||
var/locked = 1
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/revenant_life_tap/cast(list/targets, var/mob/living/simple_animal/revenant/user = usr)
|
||||
if(user.inhibited)
|
||||
user << "<span class='warning'>Something is blocking the use of [src]!</span>"
|
||||
charge_counter = charge_max
|
||||
return
|
||||
if(locked && essence_check(25, 1))
|
||||
user << "<span class='info'>You have unlocked Life Tap!</span>"
|
||||
name = "Life Tap (0E)"
|
||||
panel = "Revenant Abilities"
|
||||
locked = 0
|
||||
/obj/effect/proc_holder/spell/aoe_turf/revenantDefile/cast(list/targets, var/mob/living/simple_animal/revenant/user = usr)
|
||||
if(!user.castcheck(-30))
|
||||
charge_counter = charge_max
|
||||
return
|
||||
if(locked)
|
||||
charge_counter = charge_max
|
||||
return
|
||||
for(var/mob/living/simple_animal/revenant/target in targets)
|
||||
if(!target.strikes)
|
||||
target << "<span class='warning'>Your life force has grown too weak to life tap again.</span>"
|
||||
target.strikes--
|
||||
target << "<span class='info'>You convert your own life into energy.[target.strikes ? "" : " This is the last time you can do this."]</span>"
|
||||
target.change_essence_amount(50, 0, "your life pool")
|
||||
|
||||
|
||||
//Seed of Draining: Plants a 'seed' in the target that will slowly siphon essence silently from them.
|
||||
/obj/effect/proc_holder/spell/targeted/revenant_seed_drain
|
||||
name = "Unlock: Seed of Draining (20E)"
|
||||
desc = "Corrupts a target with dark energies. Their essence will slowly drain for some time."
|
||||
panel = "Revenant Abilities (Locked)"
|
||||
charge_max = 1200
|
||||
clothes_req = 0
|
||||
range = -1
|
||||
include_user = 1
|
||||
var/locked = 1
|
||||
var/planted = 0
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/revenant_seed_drain/cast(list/targets, var/mob/living/simple_animal/revenant/user = usr)
|
||||
if(user.inhibited)
|
||||
user << "<span class='warning'>Something is blocking the use of [src]!</span>"
|
||||
charge_counter = charge_max
|
||||
return
|
||||
if(locked && essence_check(20, 1))
|
||||
user << "<span class='info'>You have unlocked Seed of Draining!</span>"
|
||||
charge_counter = charge_max
|
||||
name = "Seed of Draining (20E)"
|
||||
locked = 0
|
||||
user << "<span class='info'>You have unlocked Defile!</span>"
|
||||
panel = "Revenant Abilities"
|
||||
range = 1
|
||||
include_user = 0
|
||||
return
|
||||
if(locked)
|
||||
charge_counter = charge_max
|
||||
return
|
||||
if(!essence_check(20))
|
||||
charge_counter = charge_max
|
||||
return
|
||||
if(planted)
|
||||
user << "<span class='warning'>You are already passively draining essence.</span>"
|
||||
charge_counter = charge_max
|
||||
return
|
||||
for(var/mob/living/carbon/human/target in targets)
|
||||
if(target.stat == DEAD)
|
||||
user << "<span class='warning'>[target] is dead and will not yield essence.</span>"
|
||||
charge_counter = charge_max
|
||||
user << "<span class='info'>You plant a draining seed on [target].</span>"
|
||||
planted = 1
|
||||
for(var/i = 0, i < 120, i++)
|
||||
sleep(10)
|
||||
var/mob/living/carbon/human/M = target
|
||||
user.essence += rand(0.3, 0.5) //Not a huge amount of essence; at the least it's 36 and at the most it's 60
|
||||
M.adjustStaminaLoss(1)
|
||||
if(prob(3))
|
||||
target << "<span class='warning'>You feel sapped.</span>" //Letting the target know that they're not bugged and losing stamina 4nr
|
||||
planted = 0
|
||||
user << "<span class='info'>The energies siphoning [target] have fallen dormant. You will need to plant a new seed.</span>"
|
||||
|
||||
|
||||
//Mind Spike: The typical straight damage ability. Does a decent amount of brute damage and small brain damage.
|
||||
/obj/effect/proc_holder/spell/targeted/revenant_mindspike
|
||||
name = "Unlock: Mind Spike (5E)"
|
||||
desc = "Drives a spike of dark energy into the target's mind. Cheap but effective and doesn't take long to cool down."
|
||||
panel = "Revenant Abilities (Locked)"
|
||||
charge_max = 40
|
||||
clothes_req = 0
|
||||
range = -1
|
||||
include_user = 1
|
||||
var/locked = 1
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/revenant_mindspike/cast(list/targets, var/mob/living/simple_animal/revenant/user = usr)
|
||||
if(user.inhibited)
|
||||
user << "<span class='warning'>Something is blocking the use of [src]!</span>"
|
||||
charge_counter = charge_max
|
||||
return
|
||||
if(locked && essence_check(5, 1))
|
||||
user << "<span class='info'>You have unlocked Mind Spike!</span>"
|
||||
charge_counter = charge_max
|
||||
name = "Mind Spike (5E)"
|
||||
locked = 0
|
||||
panel = "Revenant Abilities"
|
||||
range = 3
|
||||
include_user = 0
|
||||
return
|
||||
if(locked)
|
||||
range = 4
|
||||
charge_counter = charge_max
|
||||
return
|
||||
if(!essence_check(5))
|
||||
charge_counter = charge_max
|
||||
return
|
||||
for(var/mob/living/carbon/human/M in targets)
|
||||
user << "<span class='info'>You drive a spike of energy into [M]'s mind!</span>"
|
||||
M << "<span class='boldannounce'>You feel a spike of pain in your head!</span>"
|
||||
M.apply_damage(12, BRUTE, "head")
|
||||
M.adjustBrainLoss(3)
|
||||
//M << 'sound/effects/mind_blast.ogg'
|
||||
if(prob(20) && !M.stat)
|
||||
M.Weaken(2)
|
||||
M.visible_message("<span class='warning'>[M] clutches at their head!</span>")
|
||||
user.revealed = 1
|
||||
user.invisibility = 0
|
||||
spawn(10)
|
||||
user.revealed = 0
|
||||
user.invisibility = INVISIBILITY_OBSERVER
|
||||
|
||||
//Hypnotize: Makes the target fall asleep, make them vulnerable to draining.
|
||||
/obj/effect/proc_holder/spell/targeted/revenant_hypnotize
|
||||
name = "Unlock: Hypnotize (15E)"
|
||||
desc = "Causes a target to fall asleep."
|
||||
panel = "Revenant Abilities (Locked)"
|
||||
charge_max = 900
|
||||
clothes_req = 0
|
||||
range = -1
|
||||
include_user = 1
|
||||
var/locked = 1
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/revenant_hypnotize/cast(list/targets, var/mob/living/simple_animal/revenant/user = usr)
|
||||
if(user.inhibited)
|
||||
user << "<span class='warning'>Something is blocking the use of [src]!</span>"
|
||||
charge_counter = charge_max
|
||||
return
|
||||
if(locked && essence_check(15, 1))
|
||||
user << "<span class='info'>You have unlocked Hypnotize!</span>"
|
||||
charge_counter = charge_max
|
||||
name = "Hypnotize (15E)"
|
||||
locked = 0
|
||||
range = 3
|
||||
panel = "Revenant Abilities"
|
||||
include_user = 0
|
||||
return
|
||||
if(locked)
|
||||
charge_counter = charge_max
|
||||
return
|
||||
if(!essence_check(15))
|
||||
charge_counter = charge_max
|
||||
return
|
||||
for(var/mob/living/carbon/human/M in targets)
|
||||
user << "<span class='info'>You gently influence [M]'s mind toward deep sleep.</span>"
|
||||
M << "<span class='boldannounce'>Tired... <font size=1.5> so tired...</font></span>"
|
||||
M.drowsyness += 7
|
||||
spawn(70)
|
||||
M.sleeping += 30
|
||||
for(var/turf/T in targets)
|
||||
spawn(0)
|
||||
if(T.flags & NOJAUNT)
|
||||
T.flags -= NOJAUNT
|
||||
for(var/obj/machinery/bot/secbot/secbot in T.contents) //Not including ED-209
|
||||
secbot.emagged = 2
|
||||
secbot.Emag(null)
|
||||
for(var/obj/machinery/bot/cleanbot/cleanbot in T.contents)
|
||||
cleanbot.emagged = 2
|
||||
cleanbot.Emag(null)
|
||||
for(var/mob/living/carbon/human/human in T.contents)
|
||||
human << "<span class='warning'>You suddenly feel tired.</span>"
|
||||
human.adjustStaminaLoss(25)
|
||||
for(var/mob/living/silicon/robot/robot in T.contents)
|
||||
robot.visible_message("<span class='warning'>[robot] lets out an alarm!</span>", \
|
||||
"<span class='boldannounce'>01001111 01010110 01000101 01010010 01001100 01001111 01000001 01000100</span>") //Translates to "OVERLOAD"
|
||||
robot << 'sound/misc/interference.ogg'
|
||||
playsound(robot, 'sound/machines/warning-buzzer.ogg', 50, 1)
|
||||
for(var/obj/structure/window/window in T.contents)
|
||||
window.hit(rand(10,50))
|
||||
for(var/obj/machinery/light/light in T.contents)
|
||||
light.flicker() //spooky
|
||||
user.reveal(30, 1)
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
#define REVENANT_SPAWN_THRESHOLD 10
|
||||
|
||||
/datum/round_event_control/revenant
|
||||
name = "Spawn Revenant"
|
||||
typepath = /datum/round_event/revenant
|
||||
@@ -6,13 +8,17 @@
|
||||
earliest_start = 0 //Meant to mix things up early-game.
|
||||
|
||||
|
||||
|
||||
/datum/round_event/revenant
|
||||
var/key_of_revenant
|
||||
|
||||
|
||||
|
||||
/datum/round_event/revenant/proc/get_revenant(var/end_if_fail = 0)
|
||||
var/deadMobs = 0
|
||||
for(var/mob/M in dead_mob_list)
|
||||
deadMobs++
|
||||
if(deadMobs < REVENANT_SPAWN_THRESHOLD)
|
||||
message_admins("Random event attempted to spawn a revenant, but there were only [deadMobs]/[REVENANT_SPAWN_THRESHOLD] dead mobs.")
|
||||
return
|
||||
key_of_revenant = null
|
||||
if(!key_of_revenant)
|
||||
var/list/candidates = get_candidates(BE_REVENANT)
|
||||
@@ -32,32 +38,38 @@
|
||||
for(var/obj/effect/landmark/L in landmarks_list)
|
||||
if(isturf(L.loc))
|
||||
switch(L.name)
|
||||
if("carpspawn")
|
||||
if("revenantspawn")
|
||||
spawn_locs += L.loc
|
||||
if(!spawn_locs)
|
||||
if(!spawn_locs) //If we can't find any revenant spawns, try the carp spawns
|
||||
for(var/obj/effect/landmark/L in landmarks_list)
|
||||
if(isturf(L.loc))
|
||||
switch(L.name)
|
||||
if("carpspawn")
|
||||
spawn_locs += L.loc
|
||||
if(!spawn_locs) //If we can't find either, just spawn the revenant at the player's location
|
||||
spawn_locs += get_turf(player_mind.current)
|
||||
if(!spawn_locs) //If we can't find THAT, then just retry
|
||||
return find_revenant()
|
||||
var/mob/living/simple_animal/revenant/revvie = new /mob/living/simple_animal/revenant/(pick(spawn_locs))
|
||||
player_mind.transfer_to(revvie)
|
||||
player_mind.assigned_role = "revenant"
|
||||
player_mind.special_role = "Revenant"
|
||||
ticker.mode.traitors |= player_mind
|
||||
message_admins("[key_of_revenant] has been made into a Revenant by an event.")
|
||||
log_game("[key_of_revenant] was spawned as a Revenant by an event.")
|
||||
message_admins("[key_of_revenant] has been made into a revenant by an event.")
|
||||
log_game("[key_of_revenant] was spawned as a revenant by an event.")
|
||||
return 1
|
||||
|
||||
|
||||
|
||||
/datum/round_event/revenant/start()
|
||||
get_revenant()
|
||||
|
||||
|
||||
|
||||
/datum/round_event/revenant/proc/find_revenant()
|
||||
message_admins("Attempted to spawn a Revenant but there was no players available. Will try again momentarily, bear with me...")
|
||||
message_admins("An event failed to spawn a revenant. Retrying momentarily...")
|
||||
spawn(50)
|
||||
if(get_revenant(1))
|
||||
message_admins("Hooray! Situation has been resolved, [key_of_revenant] has been spawned as a Revenant.")
|
||||
log_game("[key_of_revenant] was spawned as a Revenant by an event.")
|
||||
message_admins("[key_of_revenant] has been spawned as a revenant.")
|
||||
log_game("[key_of_revenant] was spawned as a revenant by an event.")
|
||||
return 0
|
||||
message_admins("Unfortunately, no candidates were available for becoming a Revenant. Shutting down. :(")
|
||||
message_admins("No candidates were available for becoming a revenant.")
|
||||
return kill()
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
..()
|
||||
|
||||
//Used by throw code to hand over the mob, instead of throwing the grab. The grab is then deleted by the throw code.
|
||||
/obj/item/weapon/grab/proc/throw()
|
||||
/obj/item/weapon/grab/proc/get_mob_if_throwable()
|
||||
if(affecting)
|
||||
if(affecting.buckled)
|
||||
return null
|
||||
|
||||
@@ -103,8 +103,6 @@
|
||||
if(mob.stat == DEAD)
|
||||
mob.ghostize()
|
||||
return 0
|
||||
if(isAI(mob))
|
||||
return AIMove(n,direct,mob)
|
||||
if(moving)
|
||||
return 0
|
||||
if(isliving(mob))
|
||||
@@ -121,6 +119,9 @@
|
||||
if(mob.remote_control) //we're controlling something, our movement is relayed to it
|
||||
return mob.remote_control.relaymove(mob, direct)
|
||||
|
||||
if(isAI(mob))
|
||||
return AIMove(n,direct,mob)
|
||||
|
||||
if(!mob.canmove)
|
||||
return 0
|
||||
|
||||
@@ -137,8 +138,12 @@
|
||||
|
||||
if(isturf(mob.loc))
|
||||
|
||||
|
||||
var/turf/T = mob.loc
|
||||
move_delay = world.time//set move delay
|
||||
|
||||
move_delay += T.slowdown
|
||||
|
||||
if(mob.restrained()) //Why being pulled while cuffed prevents you from moving
|
||||
for(var/mob/M in range(mob, 1))
|
||||
if(M.pulling == mob)
|
||||
@@ -175,7 +180,6 @@
|
||||
var/mob/M = L[1]
|
||||
if(M)
|
||||
if ((get_dist(mob, M) <= 1 || M.loc == mob.loc))
|
||||
var/turf/T = mob.loc
|
||||
. = ..()
|
||||
if (isturf(M.loc))
|
||||
var/diag = get_dir(mob, M)
|
||||
@@ -297,6 +301,16 @@
|
||||
anim(mobloc,mob,'icons/mob/mob.dmi',,"shadow",,L.dir)
|
||||
L.loc = get_step(L, direct)
|
||||
L.dir = direct
|
||||
if(3) //Incorporeal move, but blocked by holy-watered tiles
|
||||
var/turf/simulated/floor/stepTurf = get_step(L, direct)
|
||||
if(stepTurf.flags & NOJAUNT)
|
||||
L << "<span class='warning'>Holy energies block your path.</span>"
|
||||
L.notransform = 1
|
||||
spawn(2)
|
||||
L.notransform = 0
|
||||
else
|
||||
L.loc = get_step(L, direct)
|
||||
L.dir = direct
|
||||
return 1
|
||||
|
||||
|
||||
@@ -330,8 +344,6 @@
|
||||
continue
|
||||
if(AM.density)
|
||||
if(AM.anchored)
|
||||
if(istype(AM, /obj/item/projectile)) //"You grab the bullet and push off of it!" No
|
||||
continue
|
||||
return 1
|
||||
if(pulling == AM)
|
||||
continue
|
||||
|
||||
Reference in New Issue
Block a user