Implemented #1107.

This commit is contained in:
cib
2012-05-22 11:24:42 +02:00
parent cb02054845
commit 56b178f396
6 changed files with 99 additions and 14 deletions
+9
View File
@@ -20,6 +20,12 @@ datum/mind
var/rev_cooldown = 0
proc/transfer_to(mob/new_character)
// multikey information is stored in the mob, not the mind, so
// we need to clean this stuff up to avoid multikey alerts
current.lastKnownIP = null
current.computer_id = null
if(current)
current.mind = null
@@ -28,6 +34,9 @@ datum/mind
new_character.key = key
// mob/Login() will handle setting the new mob's lastKnownIP and
// computer_id for us
proc/store_memory(new_text)
memory += "[new_text]<BR>"
+26 -11
View File
@@ -11,7 +11,9 @@
var
var/datum/mind/first_host = null
var/list/datum/mind/first_hosts = list()
var/list/assigned_hosts = list()
const
prob_int_murder_target = 50 // intercept names the assassination target half the time
prob_right_murder_target_l = 25 // lower bound on probability of naming right assassination target
@@ -41,23 +43,34 @@
if(!..())
return 0
// for every 10 players, get 1 meme, and for each meme, get a host
// also make sure that there's at least one meme and one host
recommended_enemies = max(src.num_players() / 10 * 2, 2)
var/list/datum/mind/possible_memes = get_players_for_role(BE_MEME)
if(possible_memes.len < 2)
log_admin("MODE FAILURE: MEME. NOT ENOUGH MEME CANDIDATES.")
return 0 // not enough candidates for meme
var/datum/mind/meme = pick(possible_memes)
possible_memes.Remove(meme)
// for each 2 possible memes, add one meme and one host
while(possible_memes.len >= 2)
var/datum/mind/meme = pick(possible_memes)
possible_memes.Remove(meme)
first_host = pick(possible_memes)
var/datum/mind/first_host = pick(possible_memes)
possible_memes.Remove(first_host)
modePlayer += meme
modePlayer += first_host
memes += meme
modePlayer += meme
modePlayer += first_host
memes += meme
first_hosts += first_host
meme.assigned_role = "MODE" //So they aren't chosen for other jobs.
meme.special_role = "Meme"
// so that we can later know which host belongs to which meme
assigned_hosts[meme.key] = first_host
meme.assigned_role = "MODE" //So they aren't chosen for other jobs.
meme.special_role = "Meme"
return 1
@@ -72,6 +85,9 @@
var/mob/original = meme.current
meme.transfer_to(M)
M.clearHUD()
// get the host for this meme
var/datum/mind/first_host = assigned_hosts[meme.key]
M.enter_host(first_host.current)
forge_meme_objectives(meme, first_host)
@@ -79,7 +95,7 @@
break
// TODO: make it possible to have multiple memes with multiple hosts
log_admin("Created [memes.len] memes.")
spawn (rand(waittime_l, waittime_h))
send_intercept()
@@ -135,7 +151,6 @@
var/attuned = 0
if((meme.current) && istype(meme.current,/mob/living/parasite/meme))
world << "<B>The meme was [meme.current.key].</B>"
world << "<B>The first host was [src:first_host.current.key].</B>"
world << "<B>The last host was [meme.current:host.key].</B>"
world << "<B>Hosts attuned: [attuned]</B>"
+21
View File
@@ -134,6 +134,26 @@ var/global/BSACooldown = 0
M.change_mob_type( /mob/living/simple_animal/constructwraith , null, null, delmob)
if("shade")
M.change_mob_type( /mob/living/simple_animal/shade , null, null, delmob)
if("meme")
var/mob/living/parasite/meme/newmeme = new
M.mind.transfer_to(newmeme)
newmeme.clearHUD()
var/found = 0
for(var/mob/living/carbon/human/H in world) if(H.client && !H.parasites.len)
found = 1
newmeme.enter_host(H)
log_admin("[H] has become [newmeme.key]'s host")
break
// if there was no host, abort
if(!found)
newmeme.mind.transfer_to(M)
log_admin("Failed to find host for meme [M.key]. Aborting.")
if(href_list["view_player_info"])
show_player_info(href_list["view_player_info"])
@@ -2435,6 +2455,7 @@ var/global/BSACooldown = 0
body += "<A href='?src=\ref[src];simplemake=constructbuilder;mob=\ref[M]'>Builder</A> , "
body += "<A href='?src=\ref[src];simplemake=constructwraith;mob=\ref[M]'>Wraith</A> \] "
body += "<A href='?src=\ref[src];simplemake=shade;mob=\ref[M]'>Shade</A>"
body += "<A href='?src=\ref[src];simplemake=meme;mob=\ref[M]'>Meme</A>"
body += "<br>"
if (M.client)
+1 -1
View File
@@ -892,7 +892,7 @@
switch(alert("You sure you wish to edit this mob's appearance?",,"Yes","No"))
if("No")
return
if(istype(M,/mob/living/carbon/human/tajaran) || istype(M,/mob/living/carbon/human/birdman))
if(istype(M,/mob/living/carbon/human/tajaran))
usr << "\red Humanoid aliens do not have an editable appearance... yet!"
else
var/new_facial = input("Please select facial hair color.", "Character Generation") as color
+22
View File
@@ -252,6 +252,28 @@
dat += "<tr><td><i>Changeling not found!</i></td></tr>"
dat += "</table>"
if(ticker.mode.memes.len > 0)
dat += "<br><table cellspacing=5><tr><td><B>Memes</B></td><td></td><td></td></tr>"
for(var/datum/mind/meme in ticker.mode.memes)
var/mob/living/parasite/meme/M = meme.current
if(M)
dat += "<tr><td><a href='?src=\ref[src];adminplayeropts=\ref[M]'>[M.key]</a>[M.client ? "" : " <i>(logged out)</i>"][M.stat == 2 ? " <b><font color=red>(DEAD)</font></b>" : ""]</td>"
dat += "<td><A href='?src=\ref[usr];priv_msg=\ref[M]'>PM</A></td>"
dat += "<td><A HREF='?src=\ref[src];traitor=\ref[M]'>Show Objective</A></td></tr>"
// need this check because the meme may be possessing someone right now
if(istype(M))
dat += "\t<td>Attuned: "
for(var/mob/attuned in M.indoctrinated)
if(attuned.key)
dat += "[attuned.real_name]([attuned.key]) "
else
dat += "[attuned.real_name] "
else
dat += "<tr><td><i>Changeling not found!</i></td></tr>"
dat += "</table>"
if(ticker.mode.wizards.len > 0)
dat += "<br><table cellspacing=5><tr><td><B>Wizards</B></td><td></td><td></td></tr>"
for(var/datum/mind/wizard in ticker.mode.wizards)
+20 -2
View File
@@ -90,8 +90,8 @@ mob/living/parasite/meme/Life()
src.death()
return
if(host.blinded) src.blinded = 1
else src.blinded = 0
if(host.blinded && host.stat != 1) src.blinded = 1
else src.blinded = 0
mob/living/parasite/meme/death()
@@ -382,10 +382,15 @@ mob/living/parasite/meme/verb/SubtleJump(mob/living/carbon/human/target as mob i
src << "<b>Your target doesn't seem to hear you..</b>"
return
if(target.parasites.len > 0)
src << "<b>Your target already is possessed by something..</b>"
return
src.exit_host()
src.enter_host(target)
usr << "<b>You successfully jumped to [target]."
log_admin("[src.key] has jumped to [target]")
// Jump to a distant target through a shout
mob/living/parasite/meme/verb/ObviousJump(mob/living/carbon/human/target as mob in world)
@@ -415,10 +420,15 @@ mob/living/parasite/meme/verb/ObviousJump(mob/living/carbon/human/target as mob
src << "<b>Your target doesn't seem to hear you..</b>"
return
if(target.parasites.len > 0)
src << "<b>Your target already is possessed by something..</b>"
return
src.exit_host()
src.enter_host(target)
usr << "<b>You successfully jumped to [target]."
log_admin("[src.key] has jumped to [target]")
// Jump to an attuned mob for free
mob/living/parasite/meme/verb/AttunedJump(mob/living/carbon/human/target as mob in world)
@@ -441,6 +451,8 @@ mob/living/parasite/meme/verb/AttunedJump(mob/living/carbon/human/target as mob
usr << "<b>You successfully jumped to [target]."
log_admin("[src.key] has jumped to [target]")
// ATTUNE a mob, adding it to the indoctrinated list
mob/living/parasite/meme/verb/Attune()
set category = "Meme"
@@ -459,6 +471,8 @@ mob/living/parasite/meme/verb/Attune()
usr << "<b>You successfully indoctrinated [host]."
host << "\red Your head feels a bit roomier.."
log_admin("[src.key] has attuned [host]")
// Enables the mob to take a lot more damage
mob/living/parasite/meme/verb/Analgesic()
set category = "Meme"
@@ -511,8 +525,12 @@ mob/living/parasite/meme/verb/Possession()
host_mind.current.clearHUD()
host.update_clothing()
log_admin("[meme_mind.key] has taken possession of [host]([host_mind.key])")
sleep(600)
log_admin("[meme_mind.key] has lost possession of [host]([host_mind.key])")
meme_mind.transfer_to(src)
host_mind.transfer_to(host)
meme_mind.current.clearHUD()