mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-23 03:57:13 +01:00
Fixed and improved object mind transfer. It will work properly now.
Fixed teleporting randomly on clown planet z level (with hand tele). Probably won't work on extended but who cares. Some misc improvements to code words. Cut down on the amount of chloralhydrate in the sleepypen since it was fatal, apparently. Fixed observing. Entry shuttle starts with less sleepers than before. Some more wip stuff. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@1670 316c924e-a436-60f5-8080-3fe189b3f50e
This commit is contained in:
@@ -9,34 +9,35 @@
|
||||
invocation_type = "whisper"
|
||||
range = 7
|
||||
var/list/protected_roles = list("Wizard","Fake Wizard","Changeling","Cultist") //which roles are immune to the spell
|
||||
var/list/compatible_mobs = list("/mob/living/carbon/human","/mob/living/carbon/monkey") //which types of mobs are affected by the spell. NOTE: change at your own risk
|
||||
var/base_spell_loss_chance = 5 //base probability of the wizard losing a spell in the process
|
||||
var/list/compatible_mobs = list(/mob/living/carbon/human,/mob/living/carbon/monkey) //which types of mobs are affected by the spell. NOTE: change at your own risk
|
||||
var/base_spell_loss_chance = 20 //base probability of the wizard losing a spell in the process
|
||||
var/spell_loss_chance_modifier = 7 //amount of probability of losing a spell added per spell (mind_transfer included)
|
||||
var/spell_loss_amount = 1 //the maximum amount of spells possible to lose during a single transfer
|
||||
var/msg_wait = 500 //how long in deciseconds it waits before telling that body doesn't feel right or mind swap robbed of a spell
|
||||
var/paralysis_amount_caster = 20 //how much the caster is paralysed for after the spell
|
||||
var/paralysis_amount_victim = 20 //how much the victim is paralysed for after the spell
|
||||
|
||||
/obj/proc_holder/spell/targeted/mind_transfer/cast(list/targets,mob/user = usr) //magnets, so mostly hardcoded
|
||||
/*
|
||||
Urist: I don't feel like figuring out how you store object spells so I'm leaving this for you to do.
|
||||
Make sure spells that are removed from spell_list are actually removed and deleted when mind transfering.
|
||||
Also, you never added distance checking after target is selected. I've went ahead and did that.
|
||||
*/
|
||||
/obj/proc_holder/spell/targeted/mind_transfer/cast(list/targets,mob/user = usr)
|
||||
if(!targets.len)
|
||||
user << "No mind found"
|
||||
user << "No mind found."
|
||||
return
|
||||
|
||||
if(targets.len > 1)
|
||||
user << "Too many minds! You're not a hive damnit!"
|
||||
user << "Too many minds! You're not a hive damnit!"//Whaa...aat?
|
||||
return
|
||||
|
||||
var/mob/target = targets[1]
|
||||
|
||||
if(!target.client || !target.mind)
|
||||
user << "They appear to be brain-dead."
|
||||
if(!(target in oview(range)))//If they are not in overview after selection. Do note that !() is necessary for in to work because ! takes precedence over it.
|
||||
user << "They are too far away!"
|
||||
return
|
||||
|
||||
if(target.mind.special_role in protected_roles)
|
||||
user << "Their mind is resisting your spell."
|
||||
return
|
||||
|
||||
if(!target.type in compatible_mobs)
|
||||
if(!(target.type in compatible_mobs))
|
||||
user << "Their mind isn't compatible with yours."
|
||||
return
|
||||
|
||||
@@ -44,59 +45,81 @@
|
||||
user << "You didn't study necromancy back at the Space Wizard Federation academy."
|
||||
return
|
||||
|
||||
var/mob/victim = target //mostly copypastaed, I have little idea how this works
|
||||
var/mob/caster = user
|
||||
//losing spells
|
||||
if(!target.client || !target.mind)
|
||||
//if(!target.mind)//Good for testing.
|
||||
user << "They appear to be brain-dead."
|
||||
return
|
||||
|
||||
if(usr.spell_list.len)
|
||||
for(var/i=1,i<=spell_loss_amount,i++)
|
||||
var/spell_loss_chance = base_spell_loss_chance
|
||||
var/list/checked_spells = usr.spell_list
|
||||
checked_spells -= src //MT can't be lost //doesn't work
|
||||
if(target.mind.special_role in protected_roles)
|
||||
user << "Their mind is resisting your spell."
|
||||
return
|
||||
|
||||
for(var/j=1,j<=checked_spells.len,j++)
|
||||
if(prob(spell_loss_chance))
|
||||
if(checked_spells.len)
|
||||
usr.spell_list -= pick(checked_spells)
|
||||
spawn(msg_wait)
|
||||
victim << "The mind transfer has robbed you of a spell."
|
||||
break
|
||||
else
|
||||
spell_loss_chance += spell_loss_chance_modifier
|
||||
var/mob/victim = target//The target of the spell whos body will be transferred to.
|
||||
var/mob/caster = user//The wizard/whomever doing the body transferring.
|
||||
//To properly transfer clients so no-one gets kicked off the game, we need a host mob.
|
||||
var/mob/dead/observer/temp_ghost = new(victim)
|
||||
|
||||
var/mob/dead/observer/temp_ghost = new /mob/dead/observer(target) //To properly transfer clients so no-one gets kicked off the game.
|
||||
//SPELL LOSS BEGIN
|
||||
//NOTE: The caster must ALWAYS keep mind transfer, even when other spells are lost.
|
||||
var/obj/proc_holder/spell/targeted/mind_transfer/m_transfer = locate() in user.spell_list//Find mind transfer directly.
|
||||
var/list/checked_spells = user.spell_list
|
||||
checked_spells -= m_transfer //Remove Mind Transfer from the list.
|
||||
|
||||
if(caster.mind.special_verbs.len)//Removes any special verbs from the original caster.
|
||||
for(var/V in caster.mind.special_verbs)
|
||||
caster.verbs -= V
|
||||
victim.client.mob = temp_ghost
|
||||
if(victim.mind.special_verbs.len)//Removes any special verbs from the original target.
|
||||
if(caster.spell_list.len)//If they have any spells left over after mind transfer is taken out. If they don't, we don't need this.
|
||||
for(var/i=spell_loss_amount,(i>0&&checked_spells.len),i--)//While spell loss amount is greater than zero and checked_spells has spells in it, run this proc.
|
||||
for(var/j=checked_spells.len,(j>0&&checked_spells.len),j--)//While the spell list to check is greater than zero and has spells in it, run this proc.
|
||||
if(prob(base_spell_loss_chance))
|
||||
checked_spells -= pick(checked_spells)//Pick a random spell to remove.
|
||||
spawn(msg_wait)
|
||||
victim << "The mind transfer has robbed you of a spell."
|
||||
break//Spell lost. Break loop, going back to the previous for() statement.
|
||||
else//Or keep checking, adding spell chance modifier to increase chance of losing a spell.
|
||||
base_spell_loss_chance += spell_loss_chance_modifier
|
||||
|
||||
checked_spells += m_transfer//Add back Mind Transfer.
|
||||
user.spell_list = checked_spells//Set user spell list to whatever the new list is.
|
||||
//SPELL LOSS END
|
||||
|
||||
//MIND TRANSFER BEGIN
|
||||
if(caster.mind.special_verbs.len)//If the caster had any special verbs, remove them from the mob verb list.
|
||||
for(var/V in caster.mind.special_verbs)//Since the caster is using an object spell system, this is mostly moot.
|
||||
caster.verbs -= V//But a safety nontheless.
|
||||
|
||||
if(victim.mind.special_verbs.len)//Now remove all of the victim's verbs.
|
||||
for(var/V in victim.mind.special_verbs)
|
||||
victim.verbs -= V
|
||||
|
||||
temp_ghost.spell_list = victim.spell_list
|
||||
temp_ghost.mind = victim.mind
|
||||
temp_ghost.key = victim.key//Throw the victim into the ghost temporarily.
|
||||
temp_ghost.mind = victim.mind//Tranfer the victim's mind into the ghost.
|
||||
temp_ghost.spell_list = victim.spell_list//If they have spells, transfer them. Now we basically have a backup mob.
|
||||
|
||||
caster.client.mob = victim
|
||||
victim.spell_list = caster.spell_list
|
||||
victim.mind = caster.mind
|
||||
if(victim.mind.special_verbs.len)//Adds verbs for the original caster if needed.
|
||||
for(var/V in caster.mind.special_verbs)
|
||||
victim.key = caster.key//Now we throw the caste into the victim's body.
|
||||
victim.mind = caster.mind//Do the same for their mind and spell list.
|
||||
victim.spell_list = caster.spell_list//Now they are inside the victim's body.
|
||||
|
||||
if(victim.mind.special_verbs.len)//To add all the special verbs for the original caster.
|
||||
for(var/V in caster.mind.special_verbs)//Not too important but could come into play.
|
||||
caster.verbs += V
|
||||
|
||||
temp_ghost.client.mob = caster
|
||||
caster.key = temp_ghost.key//Tranfer the original victim, now in a ghost, into the caster's body.
|
||||
caster.mind = temp_ghost.mind//Along with their mind and spell list.
|
||||
caster.spell_list = temp_ghost.spell_list
|
||||
caster.mind = temp_ghost.mind
|
||||
if(caster.mind.special_verbs.len)//Adds verbs for original target if needed.
|
||||
|
||||
if(caster.mind.special_verbs.len)//If they had any special verbs, we add them here.
|
||||
for(var/V in caster.mind.special_verbs)
|
||||
caster.verbs += V
|
||||
//MIND TRANSFER END
|
||||
|
||||
//Now we update mind current mob so we know what body they are in for end round reporting.
|
||||
caster.mind.current = caster
|
||||
victim.mind.current = victim
|
||||
|
||||
//Here we paralyze both mobs and knock them out for a time.
|
||||
caster.paralysis += paralysis_amount_caster
|
||||
victim.paralysis += paralysis_amount_victim
|
||||
|
||||
//After a certain amount of time the victim gets a message about being in a different body.
|
||||
spawn(msg_wait)
|
||||
caster << "Your body doesn't feel like itself."
|
||||
caster << "\red You feel woozy and lightheaded. <b>Your body doesn't seem like your own.</b>"
|
||||
|
||||
del(temp_ghost)
|
||||
Reference in New Issue
Block a user