Merge pull request #1130 from CIB/master

Meme fixes
This commit is contained in:
Albert Iordache
2012-05-22 06:52:43 -07:00
8 changed files with 140 additions and 16 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>"
+28 -1
View File
@@ -134,6 +134,32 @@ 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)
message_admins("[H] has become [newmeme.key]'s host")
break
// if there was no host, abort
if(!found)
newmeme.mind.transfer_to(M)
message_admins("Failed to find host for meme [M.key]. Aborting.")
ticker.mode.memes += newmeme
if(delmob)
del(M)
if(href_list["view_player_info"])
show_player_info(href_list["view_player_info"])
@@ -2434,7 +2460,8 @@ var/global/BSACooldown = 0
body += "\[ Construct: <A href='?src=\ref[src];simplemake=constructarmoured;mob=\ref[M]'>Armoured</A> , "
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=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
+24
View File
@@ -252,6 +252,30 @@
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)
// BUG: For some reason, the memes themselves aren't showing up, even though the list isn't empty
// and the "Meme" header is displayed
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)
@@ -1008,6 +1008,13 @@
stat = 1
if (sleeping > 0)
if(stat == 0)
// BUG: this doesn't seem to happen ever.. probably when you hit sleep willingly,
// it automatically adjusts your stat without calling this proc
// show them a message so they know what's going on
src << "\blue You feel very drowsy.. Your eyelids become heavy..."
handle_dreams()
adjustHalLoss(-5)
blinded = 1
+39 -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,16 @@ 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]")
message_admins("[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 +421,16 @@ 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]")
message_admins("[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 +453,9 @@ 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]")
message_admins("[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 +474,9 @@ 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]")
message_admins("[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 +529,16 @@ mob/living/parasite/meme/verb/Possession()
host_mind.current.clearHUD()
host.update_clothing()
dummy << "\blue You feel very drowsy.. Your eyelids become heavy..."
log_admin("[meme_mind.key] has taken possession of [host]([host_mind.key])")
message_admins("[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])")
message_admins("[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()
@@ -546,6 +572,17 @@ mob/living/parasite/meme/verb/Show_Points()
usr << "<b>Meme Points: [src.meme_points]/[MAXIMUM_MEME_POINTS]</b>"
// Stat panel to show meme points, copypasted from alien
/mob/living/parasite/meme/Stat()
..()
statpanel("Status")
if (client && client.holder)
stat(null, "([x], [y], [z])")
if (client && client.statpanel == "Status")
stat(null, "Meme Points: [src.meme_points]")
// Game mode helpers, used for theft objectives
// --------------------------------------------
mob/living/parasite/check_contents_for(t)
+6 -1
View File
@@ -48,7 +48,11 @@ should be listed in the changelog upon commit though. Thanks. -->
<!-- To take advantage of the pretty new format (well it was new when I wrote this anyway), open the "add-to-changelog.html" file in any browser and add the stuff and then generate the html code and paste it here -->
<div class="commit sansserif">
<h2 class="date">22 May 2012</h2>
<h2 class="date">22 May 2012</h2>
<h3 class="author">cib updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Worked out a few problems with meme. They now can see, even if their mob is sleeping. Their actions are properly tracked in admin logs. Their points recharge slightly faster, and can now be seen in the Status tab.</li>
</ul>
<h3 class="author">Erthilo updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Money can now be split and stacked properly. Carry some with you! Still not used for anything!</li>
@@ -88,6 +92,7 @@ should be listed in the changelog upon commit though. Thanks. -->
<ul class="changes bgimages16">
<li class="rscadd">You can now right-click pick up items and open/close closets items. This means cyborgs can now open/close closets with a bit of fiddling!</li>
<li class="rscadd">Added confirmation pop-up for character slot deletion.</li>
>>>>>>> ebc2b0ed1f7d59caf31b582fd31c950bbde35f8f
</ul>
</div>