Merge pull request #3356 from Neerti/4/23/2017_ling_nerfs

Adjusts Changelings
This commit is contained in:
Anewbe
2017-04-25 22:04:37 -05:00
committed by GitHub
22 changed files with 140 additions and 41 deletions

View File

@@ -123,4 +123,6 @@ var/list/be_special_flags = list(
//casting costs
#define Sp_RECHARGE "recharge"
#define Sp_CHARGES "charges"
#define Sp_HOLDVAR "holdervar"
#define Sp_HOLDVAR "holdervar"
#define CHANGELING_STASIS_COST 20

View File

@@ -284,7 +284,7 @@
if(M.loc && M.locs[1] in hearturfs)
mobs |= M
else if(M.stat == DEAD)
else if(M.stat == DEAD && !M.forbid_seeing_deadchat)
switch(type)
if(1) //Audio messages use ghost_ears
if(M.is_preference_enabled(/datum/client_preference/ghost_ears))

View File

@@ -21,6 +21,7 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
var/armor_deployed = 0 //This is only used for changeling_generic_equip_all_slots() at the moment.
var/recursive_enhancement = 0 //Used to power up other abilities from the ling power with the same name.
var/list/purchased_powers_history = list() //Used for round-end report, includes respec uses too.
var/last_shriek = null // world.time when the ling last used a shriek.
/datum/changeling/New(var/gender=FEMALE)
..()

View File

@@ -32,7 +32,7 @@
return 1
if(M.head || M.wear_suit) //Make sure our slots aren't full
src << "<span class='warning'>We require nothing to be on our head, and we cannot wear any external suits.</span>"
src << "<span class='warning'>We require nothing to be on our head, and we cannot wear any external suits, or shoes.</span>"
return 0
var/obj/item/clothing/suit/A = new armor_type(src)
@@ -140,7 +140,7 @@
playsound(src, 'sound/effects/blobattack.ogg', 30, 1)
M.update_icons()
success = 1
sleep(20)
sleep(1 SECOND)
t = stuff_to_equip["w_uniform"]
if(!M.w_uniform && t)
@@ -150,7 +150,7 @@
playsound(src, 'sound/effects/blobattack.ogg', 30, 1)
M.update_icons()
success = 1
sleep(20)
sleep(1 SECOND)
t = stuff_to_equip["gloves"]
if(!M.gloves && t)
@@ -160,7 +160,7 @@
playsound(src, 'sound/effects/splat.ogg', 30, 1)
M.update_icons()
success = 1
sleep(20)
sleep(1 SECOND)
t = stuff_to_equip["shoes"]
if(!M.shoes && t)
@@ -170,7 +170,7 @@
playsound(src, 'sound/effects/splat.ogg', 30, 1)
M.update_icons()
success = 1
sleep(20)
sleep(1 SECOND)
t = stuff_to_equip["belt"]
if(!M.belt && t)
@@ -180,7 +180,7 @@
playsound(src, 'sound/effects/splat.ogg', 30, 1)
M.update_icons()
success = 1
sleep(20)
sleep(1 SECOND)
t = stuff_to_equip["glasses"]
if(!M.glasses && t)
@@ -190,7 +190,7 @@
playsound(src, 'sound/effects/splat.ogg', 30, 1)
M.update_icons()
success = 1
sleep(20)
sleep(1 SECOND)
t = stuff_to_equip["wear_mask"]
if(!M.wear_mask && t)
@@ -200,7 +200,7 @@
playsound(src, 'sound/effects/splat.ogg', 30, 1)
M.update_icons()
success = 1
sleep(20)
sleep(1 SECOND)
t = stuff_to_equip["back"]
if(!M.back && t)
@@ -210,7 +210,7 @@
playsound(src, 'sound/effects/blobattack.ogg', 30, 1)
M.update_icons()
success = 1
sleep(20)
sleep(1 SECOND)
t = stuff_to_equip["wear_suit"]
if(!M.wear_suit && t)
@@ -220,7 +220,7 @@
playsound(src, 'sound/effects/blobattack.ogg', 30, 1)
M.update_icons()
success = 1
sleep(20)
sleep(1 SECOND)
t = stuff_to_equip["wear_id"]
if(!M.wear_id && t)
@@ -230,7 +230,7 @@
playsound(src, 'sound/effects/splat.ogg', 30, 1)
M.update_icons()
success = 1
sleep(20)
sleep(1 SECOND)
var/feedback = english_list(grown_items_list, nothing_text = "nothing", and_text = " and ", comma_text = ", ", final_comma_text = "" )

View File

@@ -18,7 +18,7 @@ var/global/list/changeling_fabricated_clothing = list(
helptext = "The disguise we create offers no defensive ability. Each equipment slot that is empty will be filled with fabricated equipment. \
To remove our new fabricated clothing, use this ability again."
ability_icon_state = "ling_fabricate_clothing"
genomecost = 2
genomecost = 1
verbpath = /mob/proc/changeling_fabricate_clothing
//Grows biological versions of chameleon clothes.

View File

@@ -12,7 +12,7 @@
set category = "Changeling"
set name = "Regenerative Stasis (20)"
var/datum/changeling/changeling = changeling_power(20,1,100,DEAD)
var/datum/changeling/changeling = changeling_power(CHANGELING_STASIS_COST,1,100,DEAD)
if(!changeling)
return
@@ -28,6 +28,7 @@
C.update_canmove()
C.remove_changeling_powers()
changeling.chem_charges -= CHANGELING_STASIS_COST
if(C.suiciding)
C.suiciding = 0
@@ -35,7 +36,9 @@
if(C.stat != DEAD)
C.adjustOxyLoss(C.maxHealth * 2)
spawn(rand(800,2000))
C.forbid_seeing_deadchat = TRUE
spawn(rand(2 MINUTES, 4 MINUTES))
//The ling will now be able to choose when to revive
src.verbs += /mob/proc/changeling_revive
src << "<span class='notice'><font size='5'>We are ready to rise. Use the <b>Revive</b> verb when you are ready.</font></span>"

View File

@@ -29,6 +29,3 @@
src << "<span class='notice'>We have removed our evolutions from this form, and are now ready to readapt.</span>"
ling_datum.purchased_powers_history.Add("Re-adapt (Reset to [ling_datum.max_geneticpoints])")
//Now to lose the verb, so no unlimited resets.

View File

@@ -48,6 +48,7 @@
C.mind.changeling.purchased_powers -= C
feedback_add_details("changeling_powers","CR")
C.stat = CONSCIOUS
C.forbid_seeing_deadchat = FALSE
C.timeofdeath = null
src.verbs -= /mob/proc/changeling_revive
// re-add our changeling powers

View File

@@ -35,6 +35,14 @@
src << "<span class='danger'>You can't speak!</span>"
return 0
if(world.time < (changeling.last_shriek + 10 SECONDS) )
to_chat(src, "<span class='warning'>We are still recovering from our last shriek...</span>")
return 0
if(!isturf(loc))
to_chat(src, "<span class='warning'>Shrieking here would be a bad idea.</span>")
return 0
src.break_cloak() //No more invisible shrieking
changeling.chem_charges -= 20
@@ -47,6 +55,8 @@
message_admins("[key_name(src)] used Resonant Shriek ([src.x],[src.y],[src.z]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[src.x];Y=[src.y];Z=[src.z]'>JMP</a>).")
log_game("[key_name(src)] used Resonant Shriek.")
visible_message("<span class='notice'>[src] appears to shout.</span>")
for(var/mob/living/M in range(range, src))
if(iscarbon(M))
if(!M.mind || !M.mind.changeling)
@@ -73,11 +83,7 @@
L.on = 1
L.broken()
/* src.verbs -= /mob/proc/changeling_resonant_shriek
spawn(30 SECONDS)
src << "<span class='notice'>We are ready to use our resonant shriek once more.</span>"
src.verbs |= /mob/proc/changeling_resonant_shriek
Ability Cooldowns don't work properly right now, need to redo this when they are */
changeling.last_shriek = world.time
feedback_add_details("changeling_powers","RS")
return 1
@@ -101,6 +107,14 @@ Ability Cooldowns don't work properly right now, need to redo this when they are
src << "<span class='danger'>You can't speak!</span>"
return 0
if(world.time < (changeling.last_shriek + 10 SECONDS) )
to_chat(src, "<span class='warning'>We are still recovering from our last shriek...</span>")
return 0
if(!isturf(loc))
to_chat(src, "<span class='warning'>Shrieking here would be a bad idea.</span>")
return 0
src.break_cloak() //No more invisible shrieking
changeling.chem_charges -= 20
@@ -117,6 +131,8 @@ Ability Cooldowns don't work properly right now, need to redo this when they are
src << "<span class='notice'>We are extra loud.</span>"
src.mind.changeling.recursive_enhancement = 0
visible_message("<span class='notice'>[src] appears to shout.</span>")
src.attack_log += text("\[[time_stamp()]\] <font color='red'>Used Dissonant Shriek.</font>")
message_admins("[key_name(src)] used Dissonant Shriek ([src.x],[src.y],[src.z]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[src.x];Y=[src.y];Z=[src.z]'>JMP</a>).")
log_game("[key_name(src)] used Dissonant Shriek.")
@@ -126,9 +142,6 @@ Ability Cooldowns don't work properly right now, need to redo this when they are
L.broken()
empulse(get_turf(src), range_heavy, range_light, 1)
/* src.verbs -= /mob/proc/changeling_dissonant_shriek
spawn(30 SECONDS)
src << "<span class='notice'>We are ready to use our dissonant shriek once more.</span>"
src.verbs |= /mob/proc/changeling_dissonant_shriek
Ability Cooldowns don't work properly right now, need to redo this when they are */
changeling.last_shriek = world.time
return 1

View File

@@ -13,6 +13,10 @@
var/datum/changeling/changeling = changeling_power(5,1,0)
if(!changeling) return
if(!isturf(loc))
to_chat(src, "<span class='warning'>Transforming here would be a bad idea.</span>")
return 0
var/list/names = list()
for(var/datum/absorbed_dna/DNA in changeling.absorbed_dna)
names += "[DNA.name]"

View File

@@ -3,7 +3,7 @@
desc = "We rapidly shape the color of our skin and secrete easily reversible dye on our clothes, to blend in with our surroundings. \
We are undetectable, so long as we move slowly.(Toggle)"
helptext = "Running, and performing most acts will reveal us. Our chemical regeneration is halted while we are hidden."
enhancedtext = "True invisiblity while cloaked."
enhancedtext = "Can run while hidden."
ability_icon_state = "ling_camoflage"
genomecost = 3
verbpath = /mob/proc/changeling_visible_camouflage
@@ -31,20 +31,35 @@
var/old_regen_rate = H.mind.changeling.chem_recharge_rate
H << "<span class='notice'>We vanish from sight, and will remain hidden, so long as we move carefully.</span>"
H.set_m_intent("walk")
H.mind.changeling.cloaked = 1
H.mind.changeling.chem_recharge_rate = 0
animate(src,alpha = 255, alpha = 10, time = 10)
var/must_walk = TRUE
if(src.mind.changeling.recursive_enhancement)
H.invisibility = INVISIBILITY_OBSERVER
src << "<span class='notice'>We are now truly invisible.</span>"
must_walk = FALSE
to_chat(src, "<span class='notice'>We may move at our normal speed while hidden.</span>")
if(must_walk)
H.set_m_intent("walk")
var/remain_cloaked = TRUE
while(remain_cloaked) //This loop will keep going until the player uncloaks.
sleep(1 SECOND) // Sleep at the start so that if something invalidates a cloak, it will drop immediately after the check and not in one second.
if(H.m_intent != "walk" && must_walk) // Moving too fast uncloaks you.
remain_cloaked = 0
if(!H.mind.changeling.cloaked)
remain_cloaked = 0
if(H.stat) // Dead or unconscious lings can't stay cloaked.
remain_cloaked = 0
if(H.incapacitated(INCAPACITATION_DISABLED)) // Stunned lings also can't stay cloaked.
remain_cloaked = 0
while(H.m_intent == "walk" && H.mind.changeling.cloaked && !H.stat) //This loop will keep going until the player uncloaks.
if(mind.changeling.chem_recharge_rate != 0) //Without this, there is an exploit that can be done, if one buys engorged chem sacks while cloaked.
old_regen_rate += mind.changeling.chem_recharge_rate //Unfortunately, it has to occupy this part of the proc. This fixes it while at the same time
mind.changeling.chem_recharge_rate = 0 //making sure nobody loses out on their bonus regeneration after they're done hiding.
sleep(10)
H.invisibility = initial(invisibility)

View File

@@ -232,6 +232,8 @@ mob/living/proc/near_camera()
return TRACKING_TERMINATE
if(digitalcamo)
return TRACKING_TERMINATE
if(alpha < 127) // For lings and possible future alpha-based cloaks.
return TRACKING_TERMINATE
if(istype(loc,/obj/effect/dummy))
return TRACKING_TERMINATE

View File

@@ -1105,6 +1105,8 @@ var/global/list/obj/item/device/pda/PDAs = list()
if(M.stat == DEAD && M.client && (M.is_preference_enabled(/datum/client_preference/ghost_ears))) // src.client is so that ghosts don't have to listen to mice
if(istype(M, /mob/new_player))
continue
if(M.forbid_seeing_deadchat)
continue
M.show_message("<span class='game say'>PDA Message - <span class='name'>[owner]</span> -> <span class='name'>[P.owner]</span>: <span class='message'>[t]</span></span>")
if(!conversations.Find("\ref[P]"))

View File

@@ -212,7 +212,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
set name = "Ghost"
set desc = "Relinquish your life and enter the land of the dead."
if(stat == DEAD)
if(stat == DEAD && !forbid_seeing_deadchat)
announce_ghost_joinleave(ghostize(1))
else
var/response
@@ -223,7 +223,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
return
src.client.admin_ghost()
else
response = alert(src, "Are you -sure- you want to ghost?\n(You are alive. If you ghost, you won't be able to play this round for another 30 minutes! You can't change your mind so choose wisely!)", "Are you sure you want to ghost?", "Ghost", "Stay in body")
response = alert(src, "Are you -sure- you want to ghost?\n(You are alive, or otherwise have the potential to become alive. If you ghost, you won't be able to play this round until you respawn as a new character! You can't change your mind so choose wisely!)", "Are you sure you want to ghost?", "Ghost", "Stay in body")
if(response != "Ghost")
return
resting = 1

View File

@@ -101,7 +101,7 @@
/mob/living/silicon/ai/special_mentions()
return list("AI") // AI door!
// Converts specific characters, like *, |, and _ to formatted output.
// Converts specific characters, like +, |, and _ to formatted output.
/mob/proc/say_emphasis(var/message)
message = encode_html_emphasis(message, "|", "i")
message = encode_html_emphasis(message, "+", "b")

View File

@@ -41,6 +41,13 @@
species.handle_death(src)
animate_tail_stop()
//Handle snowflake ling stuff.
if(mind && mind.changeling)
// If the ling is capable of revival, don't allow them to see deadchat.
if(mind.changeling.chem_charges >= CHANGELING_STASIS_COST)
if(mind.changeling.max_geneticpoints >= 0) // Absorbed lings don't count, as they can't revive.
forbid_seeing_deadchat = TRUE
//Handle brain slugs.
var/obj/item/organ/external/Hd = get_organ(BP_HEAD)
var/mob/living/simple_animal/borer/B

View File

@@ -141,7 +141,7 @@ proc/get_radio_key_from_channel(var/channel)
//Redirect to say_dead if talker is dead
if(stat)
if(stat == DEAD)
if(stat == DEAD && !forbid_seeing_deadchat)
return say_dead(message)
return
@@ -308,7 +308,7 @@ proc/get_radio_key_from_channel(var/channel)
if(M && src) //If we still exist, when the spawn processes
var/dst = get_dist(get_turf(M),get_turf(src))
if(dst <= message_range || M.stat == DEAD) //Inside normal message range, or dead with ears (handled in the view proc)
if(dst <= message_range || (M.stat == DEAD && !forbid_seeing_deadchat)) //Inside normal message range, or dead with ears (handled in the view proc)
M << speech_bubble
M.hear_say(message, verb, speaking, alt_name, italics, src, speech_sound, sound_vol)

View File

@@ -207,3 +207,4 @@
var/list/active_genes=list()
var/mob_size = MOB_MEDIUM
var/forbid_seeing_deadchat = FALSE // Used for lings to not see deadchat, and to have ghosting behave as if they were not really dead.

View File

@@ -390,10 +390,16 @@ proc/is_blind(A)
else
name = realname
if(subject && subject.forbid_seeing_deadchat && !subject.client.holder)
return // Can't talk in deadchat if you can't see it.
for(var/mob/M in player_list)
if(M.client && ((!istype(M, /mob/new_player) && M.stat == DEAD) || (M.client.holder && !is_mentor(M.client))) && M.is_preference_enabled(/datum/client_preference/show_dsay))
var/follow
var/lname
if(M.forbid_seeing_deadchat && !M.client.holder)
continue
if(subject)
if(M.is_key_ignored(subject.client.key)) // If we're ignored, do nothing.
continue

View File

@@ -199,7 +199,7 @@
if(S.victim == mob)
return
if(mob.stat==DEAD && isliving(mob))
if(mob.stat==DEAD && isliving(mob) && !mob.forbid_seeing_deadchat)
mob.ghostize()
return

View File

@@ -0,0 +1,45 @@
################################
# Example Changelog File
#
# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
#
# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
# When it is, any changes listed below will disappear.
#
# Valid Prefixes:
# bugfix
# wip (For works in progress)
# tweak
# soundadd
# sounddel
# rscadd (general adding of nice things)
# rscdel (general deleting of nice things)
# imageadd
# imagedel
# maptweak
# spellcheck (typo fixes)
# experiment
#################################
# Your name.
author: Neerti
# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
delete-after: True
# Any changes you've made. See valid prefix list above.
# INDENT WITH TWO SPACES. NOT TABS. SPACES.
# SCREW THIS UP AND IT WON'T WORK.
# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
changes:
- tweak: "Fabricate Clothing for Changelings costs one point instead of two, and is fabricated twice as fast."
- tweak: "Dead changelings can no longer hear deadchat or freely ghost."
- tweak: "Shrieks now share a 10 second cooldown."
- tweak: "Lings cannot transform or shriek inside containers such as closets and pipes."
- tweak: "Regen. Stasis timer adjusted to be between 2 to 4 minutes."
- tweak: "Visible Camo. should end if the user is stunned."
- rscadd: "Visible Camo. now blocks AI tracking when active."
- rscdel: "Recursive Visible Camo. no longer gives true invis."
- rscadd: "Recursive Visible Camo. will allow the changeling to run while cloaked instead."
- rscadd: "Ling chemical meter on HUD now has a blinking exclaimation mark if below 20 chemicals, to warn that they cannot revive if they should die while still below 20."

Binary file not shown.

Before

Width:  |  Height:  |  Size: 137 KiB

After

Width:  |  Height:  |  Size: 166 KiB