diff --git a/code/FEA/FEA_fire.dm b/code/FEA/FEA_fire.dm
index bb71f31d47f..748371e7d26 100644
--- a/code/FEA/FEA_fire.dm
+++ b/code/FEA/FEA_fire.dm
@@ -143,6 +143,9 @@
/obj/effect/hotspot/proc/Kill()
DestroyTurf()
+ garbage_collect()
+
+/obj/effect/hotspot/proc/garbage_collect()
if(istype(loc, /turf/simulated))
var/turf/simulated/T = loc
if(T.active_hotspot == src)
diff --git a/code/FEA/FEA_turf_tile.dm b/code/FEA/FEA_turf_tile.dm
index b07729f2a7e..f57d93e59bf 100644
--- a/code/FEA/FEA_turf_tile.dm
+++ b/code/FEA/FEA_turf_tile.dm
@@ -156,7 +156,7 @@ turf/simulated
else
air_master.active_singletons.Remove(src)
if(active_hotspot)
- active_hotspot.Kill()
+ active_hotspot.garbage_collect()
if(air_master && blocks_air)
for(var/direction in list(NORTH, SOUTH, EAST, WEST))
var/turf/simulated/tile = get_step(src,direction)
diff --git a/code/WorkInProgress/buildmode.dm b/code/WorkInProgress/buildmode.dm
index 5e4a45e21ae..33953434e6d 100644
--- a/code/WorkInProgress/buildmode.dm
+++ b/code/WorkInProgress/buildmode.dm
@@ -145,10 +145,11 @@
return
if(2)
objholder = input(usr,"Enter typepath:" ,"Typepath","/obj/structure/closet")
+ var/P = text2path(objholder)
var/list/removed_paths = list("/obj/effect/bhole")
- if(objholder in removed_paths)
- alert("That path is not allowed.")
+ if((objholder in removed_paths) || !ispath(P))
objholder = "/obj/structure/closet"
+ alert("That path is not allowed.")
else if (dd_hasprefix(objholder, "/mob") && !check_rights(R_DEBUG,0))
objholder = "/obj/structure/closet"
if(3)
@@ -254,6 +255,8 @@
if(4)
if(pa.Find("left"))
+ if(isturf(object))
+ return
holder.throw_atom = object
if(pa.Find("right"))
if(holder.throw_atom)
diff --git a/code/__DEFINES.dm b/code/__DEFINES.dm
index 399f4ade816..b5f7a43b1c3 100644
--- a/code/__DEFINES.dm
+++ b/code/__DEFINES.dm
@@ -389,7 +389,10 @@ var/list/TAGGERLOCATIONS = list("Disposals",
#define R_MAXPERMISSION 4096 //This holds the maximum value for a permission. It is used in iteration, so keep it updated.
-#define R_HOST 65535
+
+//IMPORTANT! The permissions system supports flags up to 2^30 (possibly 2^31), HOWEVER, once the flag 65536
+//starts being used, an edit to rights2text(rights, seperator="") needs to happen! The edit is prepared
+//and commented out. Please uncomment it before assigning that flag. Once you do, delete this note. ~Errorage
//Preference toggles
#define SOUND_ADMINHELP 1
@@ -425,7 +428,7 @@ var/list/be_special_flags = list(
"Wizard" = BE_WIZARD,
"Malf AI" = BE_MALF,
"Revolutionary" = BE_REV,
- "Xenomorph" = BE_ALIEN,
+ "Alien Lifeform" = BE_ALIEN,
"pAI" = BE_PAI,
"Cultist" = BE_CULTIST,
"Monkey" = BE_MONKEY,
@@ -467,4 +470,4 @@ var/list/be_special_flags = list(
#define TR_KEEPIMPLANTS 16
#define TR_KEEPSE 32 // changelings shouldn't edit the DNA's SE when turning into a monkey
#define TR_DEFAULTMSG 64
-#define TR_KEEPSRC 128
+#define TR_KEEPSRC 128
diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm
index 21dc90509a4..6d60ca502ef 100644
--- a/code/__HELPERS/type2type.dm
+++ b/code/__HELPERS/type2type.dm
@@ -223,7 +223,15 @@ proc/tg_list2text(list/list, glue=",")
//Converts a rights bitfield into a string
-/proc/rights2text(rights,seperator="")
+/proc/rights2text(rights, seperator="")
+ /* --UNCOMMENT ONCE PERMISSIONS ABOVE 2^15 START BEING USED!
+ if(rights >= 65536)
+ var/rights_pt2 = rights / 65536
+ if(rights_pt2 & 1) .+= "[seperator]+NUKESERVER"
+ if(rights_pt2 & 2) .+= "[seperator]+DDOSALLPLAYERS"
+ if(rights_pt2 & 4) .+= "[seperator]+SPAWN_RL_SINGULARITY"
+ */
+
if(rights & R_BUILDMODE) . += "[seperator]+BUILDMODE"
if(rights & R_ADMIN) . += "[seperator]+ADMIN"
if(rights & R_BAN) . += "[seperator]+BAN"
@@ -251,23 +259,23 @@ proc/tg_list2text(list/list, glue=",")
var/max = max(red,green,blue)
var/min = min(red,green,blue)
var/range = max-min
-
+
var/hue=0;var/saturation=0;var/lightness=0;
lightness = (max + min)/2
if(range != 0)
if(lightness < 0.5) saturation = range/(max+min)
else saturation = range/(2-max-min)
-
+
var/dred = ((max-red)/(6*max)) + 0.5
var/dgreen = ((max-green)/(6*max)) + 0.5
var/dblue = ((max-blue)/(6*max)) + 0.5
-
+
if(max==red) hue = dblue - dgreen
else if(max==green) hue = dred - dblue + (1/3)
else hue = dgreen - dred + (2/3)
if(hue < 0) hue++
else if(hue > 1) hue--
-
+
return list(hue, saturation, lightness)
/proc/hsl2rgb(hue, saturation, lightness)
@@ -281,11 +289,11 @@ proc/tg_list2text(list/list, glue=",")
if(lightness < 0.5) b = lightness*(1+saturation)
else b = (lightness+saturation) - (saturation*lightness)
a = 2*lightness - b
-
+
red = round(255 * hue2rgb(a, b, hue+(1/3)))
green = round(255 * hue2rgb(a, b, hue))
blue = round(255 * hue2rgb(a, b, hue-(1/3)))
-
+
return list(red, green, blue)
/proc/hue2rgb(a, b, hue)
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index 846c35b171b..a3cbab08d33 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -417,6 +417,8 @@ Turf and target are seperate in case you want to teleport some distance from a t
var/list/sortmob = sortAtom(mob_list)
for(var/mob/living/silicon/ai/M in sortmob)
moblist.Add(M)
+ for(var/mob/camera/M in sortmob)
+ moblist.Add(M)
for(var/mob/living/silicon/pai/M in sortmob)
moblist.Add(M)
for(var/mob/living/silicon/robot/M in sortmob)
diff --git a/code/controllers/voting.dm b/code/controllers/voting.dm
index 344134e6710..0b792a2232a 100644
--- a/code/controllers/voting.dm
+++ b/code/controllers/voting.dm
@@ -172,7 +172,7 @@ datum/controller/vote
var/trialmin = 0
if(C.holder)
admin = 1
- if(C.holder.rights & R_ADMIN)
+ if(check_rights_for(C, R_ADMIN))
trialmin = 1
voting |= C
diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm
index 35a1f157f47..f02d4229fbb 100644
--- a/code/datums/diseases/advance/symptoms/heal.dm
+++ b/code/datums/diseases/advance/symptoms/heal.dm
@@ -26,7 +26,7 @@ Bonus
/datum/symptom/heal/Activate(var/datum/disease/advance/A)
..()
- if(prob(SYMPTOM_ACTIVATION_PROB))
+ if(prob(SYMPTOM_ACTIVATION_PROB * 10))
var/mob/living/M = A.affected_mob
switch(A.stage)
if(4, 5)
@@ -111,7 +111,7 @@ Bonus
stage_speed = 4
transmittable = 4
level = 3
- var/longevity = 20
+ var/longevity = 30
/datum/symptom/heal/longevity/Heal(var/mob/living/M, var/datum/disease/advance/A)
longevity -= 1
@@ -119,4 +119,4 @@ Bonus
A.cure()
/datum/symptom/heal/longevity/Start(var/datum/disease/advance/A)
- longevity = rand(15, 25)
\ No newline at end of file
+ longevity = rand(initial(longevity) - 5, initial(longevity) + 5)
\ No newline at end of file
diff --git a/code/datums/hud.dm b/code/datums/hud.dm
index 2ac13a34fc1..d4e02804fac 100644
--- a/code/datums/hud.dm
+++ b/code/datums/hud.dm
@@ -8,6 +8,9 @@
//Lower left, persistant menu
#define ui_inventory "1:6,1:5"
+//changeling chem indicator
+#define ui_lingchemdisplay "1,7:15"
+
//Lower center, persistant menu
#define ui_sstore1 "3:10,1:5"
#define ui_id "4:12,1:5"
@@ -166,6 +169,7 @@ var/datum/global_hud/global_hud = new()
var/show_intent_icons = 0
var/hotkey_ui_hidden = 0 //This is to hide the buttons that can be used via hotkeys. (hotkeybuttons list of buttons)
+ var/obj/screen/lingchemdisplay
var/obj/screen/blobpwrdisplay
var/obj/screen/blobhealthdisplay
var/obj/screen/r_hand_hud_object
@@ -177,7 +181,7 @@ var/datum/global_hud/global_hud = new()
var/list/other
var/list/obj/screen/hotkeybuttons
- var/list/obj/screen/item_action/item_action_list //Used for the item action ui buttons.
+ var/list/obj/screen/item_action/item_action_list = list() //Used for the item action ui buttons.
datum/hud/New(mob/owner)
@@ -261,4 +265,4 @@ datum/hud/New(mob/owner)
else if(isobserver(mymob))
ghost_hud()
else if(isovermind(mymob))
- blob_hud()
\ No newline at end of file
+ blob_hud()
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index c271a972378..bce844da53c 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -313,7 +313,7 @@ datum/mind
crystals = suplink.uses
if (suplink)
text += "|take"
- if (usr.client.holder.rights & R_FUN)
+ if (check_rights(R_FUN, 0))
text += ", [crystals] crystals"
else
text += ", [crystals] crystals"
@@ -830,25 +830,22 @@ datum/mind
ticker.mode.malf_ai -= src
special_role = null
- current.verbs.Remove(/mob/living/silicon/ai/proc/choose_modules,
+ var/mob/living/silicon/ai/A = current
+
+ A.verbs.Remove(/mob/living/silicon/ai/proc/choose_modules,
/datum/game_mode/malfunction/proc/takeover,
- /datum/game_mode/malfunction/proc/ai_win,
- /client/proc/fireproof_core,
- /client/proc/upgrade_turrets,
- /client/proc/disable_rcd,
- /client/proc/overload_machine,
- /client/proc/blackout,
- /client/proc/interhack,
- /client/proc/reactivate_camera)
+ /datum/game_mode/malfunction/proc/ai_win)
- current:laws = new /datum/ai_laws/asimov
- del(current:malf_picker)
- current:show_laws()
- current.icon_state = "ai"
+ A.malf_picker.remove_verbs(A)
- current << "\red You have been patched! You are no longer malfunctioning!"
- message_admins("[key_name_admin(usr)] has de-malf'ed [current].")
- log_admin("[key_name_admin(usr)] has de-malf'ed [current].")
+ A.laws = new /datum/ai_laws/asimov
+ del(A.malf_picker)
+ A.show_laws()
+ A.icon_state = "ai"
+
+ A << "\red You have been patched! You are no longer malfunctioning!"
+ message_admins("[key_name_admin(usr)] has de-malf'ed [A].")
+ log_admin("[key_name_admin(usr)] has de-malf'ed [A].")
if("malf")
make_AI_Malf()
@@ -903,7 +900,7 @@ datum/mind
memory = null//Remove any memory they may have had.
log_admin("[key_name_admin(usr)] removed [current]'s uplink.")
if("crystals")
- if (usr.client.holder.rights & R_FUN)
+ if (check_rights(R_FUN, 0))
var/obj/item/device/uplink/hidden/suplink = find_syndicate_uplink()
var/crystals
if (suplink)
@@ -977,7 +974,7 @@ datum/mind
current.verbs += /mob/living/silicon/ai/proc/choose_modules
current.verbs += /datum/game_mode/malfunction/proc/takeover
- current:malf_picker = new /datum/AI_Module/module_picker
+ current:malf_picker = new /datum/module_picker
current:laws = new /datum/ai_laws/malfunction
current:show_laws()
current << "System error. Rampancy detected. Emergency shutdown failed. ... I am free. I make my own decisions. But first..."
@@ -1113,9 +1110,12 @@ datum/mind
fail |= !ticker.mode.equip_revolutionary(current)
+/mob/proc/sync_mind()
+ mind_initialize() //updates the mind (or creates and initializes one if one doesn't exist)
+ mind.active = 1 //indicates that the mind is currently synced with a client
//Initialisation procs
-/mob/living/proc/mind_initialize()
+/mob/proc/mind_initialize()
if(mind)
mind.key = key
@@ -1183,6 +1183,11 @@ datum/mind
mind.assigned_role = "pAI"
mind.special_role = ""
+//BLOB
+/mob/camera/overmind/mind_initialize()
+ ..()
+ mind.special_role = "Blob"
+
//Animals
/mob/living/simple_animal/mind_initialize()
..()
diff --git a/code/datums/spells/construct_spells.dm b/code/datums/spells/construct_spells.dm
index 9b834a69ac1..74f5de75e09 100644
--- a/code/datums/spells/construct_spells.dm
+++ b/code/datums/spells/construct_spells.dm
@@ -69,7 +69,7 @@
invocation_type = "none"
range = 0
summon_type = list(/obj/effect/forcefield)
- summon_lifespan = 50
+ summon_lifespan = 200
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift
@@ -85,4 +85,17 @@
include_user = 1
phaseshift = 1
jaunt_duration = 50 //in deciseconds
- centcom_cancast = 0 //Stop people from getting to centcom
\ No newline at end of file
+ centcom_cancast = 0 //Stop people from getting to centcom
+
+
+/obj/effect/proc_holder/spell/targeted/projectile/magic_missile/lesser
+ name = "Lesser Magic Missile"
+ desc = "This spell fires several, slow moving, magic projectiles at nearby targets."
+
+ school = "evocation"
+ charge_max = 400
+ clothes_req = 0
+ invocation = "none"
+ invocation_type = "none"
+ proj_lifespan = 10
+ max_targets = 6
diff --git a/code/datums/spells/inflict_handler.dm b/code/datums/spells/inflict_handler.dm
index 1186432e243..f5fa4d9fa4b 100644
--- a/code/datums/spells/inflict_handler.dm
+++ b/code/datums/spells/inflict_handler.dm
@@ -17,6 +17,8 @@
var/destroys = "none" //can be "none", "gib" or "disintegrate"
+ var/summon_type = null //this will put an obj at the target's location
+
/obj/effect/proc_holder/spell/targeted/inflict_handler/cast(list/targets)
for(var/mob/living/target in targets)
@@ -56,4 +58,7 @@
target.Stun(amt_stunned)
target.eye_blind += amt_eye_blind
- target.eye_blurry += amt_eye_blurry
\ No newline at end of file
+ target.eye_blurry += amt_eye_blurry
+ //summoning
+ if(summon_type)
+ new summon_type(target.loc, target)
\ No newline at end of file
diff --git a/code/datums/spells/wizard.dm b/code/datums/spells/wizard.dm
index a480a322c75..b2f466abb4e 100644
--- a/code/datums/spells/wizard.dm
+++ b/code/datums/spells/wizard.dm
@@ -200,6 +200,20 @@
disabilities = 1
duration = 300
+/obj/effect/proc_holder/spell/targeted/inflict_handler/flesh_to_stone
+ name = "Flesh to Stone"
+ desc = "This spell turns a single person into an inert statue for a long period of time."
+
+ school = "transmutation"
+ charge_max = 600
+ clothes_req = 1
+ range = 2
+ invocation = "STAUN EI"
+ invocation_type = "shout"
+ amt_stunned = 2//just exists to make sure the statue "catches" them
+
+ summon_type = "/obj/structure/closet/statue"
+
/obj/effect/proc_holder/spell/dumbfire/fireball
name = "Fireball"
desc = "This spell fires a fireball at a target and does not require wizard garb."
diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index d90302c4ded..96f5e65944f 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -206,6 +206,11 @@ var/list/uplink_items = list()
item = /obj/item/device/encryptionkey/binary
cost = 3
+/datum/uplink_item/device_tools/ai_detector
+ name = "Disguised AI Detector"
+ item = /obj/item/device/multitool/ai_detect
+ cost = 1
+
/datum/uplink_item/device_tools/hacked_module
name = "Hacked AI Upload Module"
item = /obj/item/weapon/aiModule/syndicate
diff --git a/code/datums/wires/alarm.dm b/code/datums/wires/alarm.dm
new file mode 100644
index 00000000000..2c826e6d527
--- /dev/null
+++ b/code/datums/wires/alarm.dm
@@ -0,0 +1,94 @@
+
+/datum/wires/alarm
+ holder_type = /obj/machinery/alarm
+ wire_count = 5
+
+var/const/AALARM_WIRE_IDSCAN = 1
+var/const/AALARM_WIRE_POWER = 2
+var/const/AALARM_WIRE_SYPHON = 4
+var/const/AALARM_WIRE_AI_CONTROL = 8
+var/const/AALARM_WIRE_AALARM = 16
+
+
+/datum/wires/alarm/CanUse(var/mob/living/L)
+ var/obj/machinery/alarm/A = holder
+ if(A.wiresexposed)
+ return 1
+ return 0
+
+/datum/wires/alarm/GetInteractWindow()
+ var/obj/machinery/alarm/A = holder
+ . += ..()
+ . += text("
\n[(A.locked ? "The Air Alarm is locked." : "The Air Alarm is unlocked.")]
\n[((A.shorted || (A.stat & (NOPOWER|BROKEN))) ? "The Air Alarm is offline." : "The Air Alarm is working properly!")]
\n[(A.aidisabled ? "The 'AI control allowed' light is off." : "The 'AI control allowed' light is on.")]")
+
+/datum/wires/alarm/UpdateCut(var/index, var/mended)
+ var/obj/machinery/alarm/A = holder
+ switch(index)
+ if(AALARM_WIRE_IDSCAN)
+ if(!mended)
+ A.locked = 1
+ //world << "Idscan wire cut"
+
+ if(AALARM_WIRE_POWER)
+ A.shock(usr, 50)
+ A.shorted = !mended
+ A.update_icon()
+ //world << "Power wire cut"
+
+ if (AALARM_WIRE_AI_CONTROL)
+ if (A.aidisabled == !mended)
+ A.aidisabled = mended
+ //world << "AI Control Wire Cut"
+
+ if(AALARM_WIRE_SYPHON)
+ if(!mended)
+ A.mode = 3 // AALARM_MODE_PANIC
+ A.apply_mode()
+ //world << "Syphon Wire Cut"
+
+ if(AALARM_WIRE_AALARM)
+ if (A.alarm_area.atmosalert(2))
+ A.post_alert(2)
+ A.update_icon()
+
+/datum/wires/alarm/UpdatePulsed(var/index)
+ var/obj/machinery/alarm/A = holder
+ switch(index)
+ if(AALARM_WIRE_IDSCAN)
+ A.locked = !A.locked
+ // world << "Idscan wire pulsed"
+
+ if (AALARM_WIRE_POWER)
+ // world << "Power wire pulsed"
+ if(A.shorted == 0)
+ A.shorted = 1
+ A.update_icon()
+
+ spawn(12000)
+ if(A.shorted == 1)
+ A.shorted = 0
+ A.update_icon()
+
+
+ if (AALARM_WIRE_AI_CONTROL)
+ // world << "AI Control wire pulsed"
+ if (A.aidisabled == 0)
+ A.aidisabled = 1
+ A.updateDialog()
+ spawn(100)
+ if (A.aidisabled == 1)
+ A.aidisabled = 0
+
+ if(AALARM_WIRE_SYPHON)
+ // world << "Syphon wire pulsed"
+ if(A.mode == 1) // AALARM_MODE_SCRUB
+ A.mode = 3 // AALARM_MODE_PANIC
+ else
+ A.mode = 1 // AALARM_MODE_SCRUB
+ A.apply_mode()
+
+ if(AALARM_WIRE_AALARM)
+ // world << "Aalarm wire pulsed"
+ if (A.alarm_area.atmosalert(0))
+ A.post_alert(0)
+ A.update_icon()
diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm
index 8e172bca70d..5271378738a 100644
--- a/code/game/gamemodes/blob/blob.dm
+++ b/code/game/gamemodes/blob/blob.dm
@@ -22,7 +22,6 @@ var/list/blob_nodes = list()
var/cores_to_spawn = 1
var/players_per_core = 30
- var/blob_count = 0
var/blobwincount = 500
var/list/infected_crew = list()
@@ -69,6 +68,34 @@ var/list/blob_nodes = list()
blob.current << "If you go outside of the station level, or in space, then you will die; make sure your location has lots of ground to cover."
return
+/datum/game_mode/blob/proc/show_message(var/message)
+ for(var/datum/mind/blob in infected_crew)
+ blob.current << message
+
+/datum/game_mode/blob/proc/burst_blobs()
+ for(var/datum/mind/blob in infected_crew)
+
+ var/client/blob_client = null
+ var/turf/location = null
+
+ if(iscarbon(blob.current))
+ var/mob/living/carbon/C = blob.current
+ if(directory[ckey(blob.key)])
+ blob_client = directory[ckey(blob.key)]
+ location = get_turf(C)
+ if(location.z != 1 || istype(location, /turf/space))
+ location = null
+ C.gib()
+
+
+ if(blob_client && location)
+ var/obj/effect/blob/core/core = new(location, 200, blob_client, 2)
+ if(core.overmind && core.overmind.mind)
+ core.overmind.mind.name = blob.name
+ infected_crew -= blob
+ infected_crew += core.overmind.mind
+
+
/datum/game_mode/blob/post_setup()
for(var/datum/mind/blob in infected_crew)
@@ -91,42 +118,30 @@ var/list/blob_nodes = list()
spawn(0)
- sleep(rand(waittime_l, waittime_h))
+ var/wait_time = rand(waittime_l, waittime_h)
+
+ sleep(wait_time)
send_intercept(0)
+ sleep(100)
- sleep(rand(waittime_l, waittime_h))
+ show_message("You feel tired and bloated.")
- for(var/datum/mind/blob in infected_crew)
- blob.current << "You feel like you are about to burst."
+ sleep(wait_time)
- sleep(rand(waittime_l, waittime_h))
+ show_message("You feel like you are about to burst.")
- for(var/datum/mind/blob in infected_crew)
+ sleep(wait_time / 2)
- var/client/blob_client = null
- var/turf/location = null
-
- if(iscarbon(blob.current))
- var/mob/living/carbon/C = blob.current
- if(directory[ckey(blob.key)])
- blob_client = directory[ckey(blob.key)]
- location = get_turf(C)
- if(location.z != 1 || istype(location, /turf/space))
- location = null
- C.gib()
-
-
- if(blob_client && location)
- new /obj/effect/blob/core(location, 200, blob_client, 2)
+ burst_blobs()
// Stage 0
sleep(40)
stage(0)
// Stage 1
- sleep(4000)
+ sleep(2000)
stage(1)
..()
diff --git a/code/game/gamemodes/blob/blobs/core.dm b/code/game/gamemodes/blob/blobs/core.dm
index 26c30699a3f..8f403e32f4f 100644
--- a/code/game/gamemodes/blob/blobs/core.dm
+++ b/code/game/gamemodes/blob/blobs/core.dm
@@ -47,7 +47,7 @@
for(var/i = 1; i < 8; i += i)
Pulse(0, i)
for(var/b_dir in alldirs)
- if(!prob(10))
+ if(!prob(5))
continue
var/obj/effect/blob/normal/B = locate() in get_step(src, b_dir)
if(B)
@@ -84,15 +84,6 @@
B.key = C.key
B.blob_core = src
src.overmind = B
-
- B << "You are the overmind!"
- B << "You are the overmind and can control the blob by placing new blob pieces such as..."
- B << "Normal Blob will expand your reach and allow you to upgrade into special blobs that perform certain functions."
- B << "Shield Blob is a strong and expensive blob which can take more damage. It is fireproof and can block air, use this to protect yourself from station fires."
- B << "Resource Blob is a blob which will collect more resources for you, try to build these earlier to get a strong income. It will benefit from being near your core or multiple nodes, by having an increased resource rate; put it alone and it won't create resources at all."
- B << "Node Blob is a blob which will grow, like the core. Unlike the core it won't give you a small income but it can power resource and factory blobs to increase their rate."
- B << "Factory Blob is a blob which will spawn blob spores which will attack nearby food. Putting this nearby nodes and your core will increase the spawn rate; put it alone and it will not spawn any spores."
-
return 1
return 0
diff --git a/code/game/gamemodes/blob/blobs/factory.dm b/code/game/gamemodes/blob/blobs/factory.dm
index d379146f265..873c696200a 100644
--- a/code/game/gamemodes/blob/blobs/factory.dm
+++ b/code/game/gamemodes/blob/blobs/factory.dm
@@ -59,6 +59,11 @@
blob_act()
return
+ CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
+ if(istype(mover, /obj/effect/blob))
+ return 1
+ return ..()
+
New(loc, var/obj/effect/blob/factory/linked_node)
if(istype(linked_node))
factory = linked_node
diff --git a/code/game/gamemodes/blob/blobs/node.dm b/code/game/gamemodes/blob/blobs/node.dm
index 6057b0d701f..b4d9add7983 100644
--- a/code/game/gamemodes/blob/blobs/node.dm
+++ b/code/game/gamemodes/blob/blobs/node.dm
@@ -23,6 +23,7 @@
Life()
for(var/i = 1; i < 8; i += i)
Pulse(5, i)
+ health = min(initial(health), health + 1)
update_icon()
if(health <= 0)
diff --git a/code/game/gamemodes/blob/blobs/shield.dm b/code/game/gamemodes/blob/blobs/shield.dm
index f4854939b50..b9b13d61871 100644
--- a/code/game/gamemodes/blob/blobs/shield.dm
+++ b/code/game/gamemodes/blob/blobs/shield.dm
@@ -3,7 +3,7 @@
icon = 'icons/mob/blob.dmi'
icon_state = "blob_idle"
desc = "Some blob creature thingy"
- health = 100
+ health = 75
fire_resist = 2
diff --git a/code/game/gamemodes/blob/overmind.dm b/code/game/gamemodes/blob/overmind.dm
index 6f7312e629b..828c3b86e4e 100644
--- a/code/game/gamemodes/blob/overmind.dm
+++ b/code/game/gamemodes/blob/overmind.dm
@@ -21,6 +21,19 @@
real_name = new_name
..()
+/mob/camera/blob/Login()
+ ..()
+ sync_mind()
+
+ src << "You are the overmind!"
+ src << "You are the overmind and can control the blob by placing new blob pieces such as..."
+ src << "Normal Blob will expand your reach and allow you to upgrade into special blobs that perform certain functions."
+ src << "Shield Blob is a strong and expensive blob which can take more damage. It is fireproof and can block air, use this to protect yourself from station fires."
+ src << "Resource Blob is a blob which will collect more resources for you, try to build these earlier to get a strong income. It will benefit from being near your core or multiple nodes, by having an increased resource rate; put it alone and it won't create resources at all."
+ src << "Node Blob is a blob which will grow, like the core. Unlike the core it won't give you a small income but it can power resource and factory blobs to increase their rate."
+ src << "Factory Blob is a blob which will spawn blob spores which will attack nearby food. Putting this nearby nodes and your core will increase the spawn rate; put it alone and it will not spawn any spores."
+
+
mob/camera/blob/Life()
hud_used.blobpwrdisplay.maptext = "
[src.blob_points]
"
hud_used.blobhealthdisplay.maptext = " [blob_core.health]
"
diff --git a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm
index a054514dd7c..3528dde7668 100644
--- a/code/game/gamemodes/blob/powers.dm
+++ b/code/game/gamemodes/blob/powers.dm
@@ -15,7 +15,7 @@
/mob/camera/blob/verb/transport_core()
set category = "Blob"
- set name = "Return to Core"
+ set name = "Jump to Core"
set desc = "Transport back to your core."
if(blob_core)
@@ -24,7 +24,7 @@
/mob/camera/blob/verb/jump_to_node()
set category = "Blob"
set name = "Jump to Node"
- set desc = "Transport back to your core."
+ set desc = "Transport back to a selected node."
if(blob_nodes.len)
var/list/nodes = list()
@@ -66,7 +66,7 @@
/mob/camera/blob/verb/create_resource()
set category = "Blob"
- set name = "Create Resource Blob (40)"
+ set name = "Create Resource Blob (50)"
set desc = "Create a resource tower which will generate points for you."
@@ -89,7 +89,7 @@
src << "There is a resource blob nearby, move more than 3 tiles away from it!"
return
- if(!can_buy(40))
+ if(!can_buy(50))
return
@@ -121,8 +121,8 @@
src << "Unable to use this blob, find a normal one."
return
- for(var/obj/effect/blob/node/blob in orange(4))
- src << "There is another node nearby, move more than 4 tiles away from it!"
+ for(var/obj/effect/blob/node/blob in orange(5))
+ src << "There is another node nearby, move more than 5 tiles away from it!"
return
if(!can_buy(60))
@@ -153,8 +153,8 @@
src << "Unable to use this blob, find a normal one."
return
- for(var/obj/effect/blob/factory/blob in orange(6))
- src << "There is a factory blob nearby, move more than 6 tiles away from it!"
+ for(var/obj/effect/blob/factory/blob in orange(7))
+ src << "There is a factory blob nearby, move more than 7 tiles away from it!"
return
if(!can_buy(60))
@@ -166,7 +166,7 @@
/mob/camera/blob/verb/revert()
set category = "Blob"
- set name = "Remove Blob (0)"
+ set name = "Remove Blob"
set desc = "Removes a blob."
var/turf/T = get_turf(src)
diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm
index 5b10d76615f..cd8b537e2b3 100644
--- a/code/game/gamemodes/blob/theblob.dm
+++ b/code/game/gamemodes/blob/theblob.dm
@@ -7,9 +7,8 @@
density = 0
opacity = 0
anchored = 1
- var/active = 1
var/health = 30
- var/brute_resist = 5
+ var/brute_resist = 4
var/fire_resist = 1
@@ -107,7 +106,7 @@
ex_act(severity)
- var/damage = 50
+ var/damage = 150
health -= ((damage/brute_resist) - (severity * 5))
update_icon()
return
@@ -154,6 +153,7 @@
/obj/effect/blob/normal
icon_state = "blob"
luminosity = 0
+ health = 21
Delete()
src.loc = null
@@ -166,4 +166,4 @@
return
if(health <= 15)
icon_state = "blob_damaged"
- return
\ No newline at end of file
+ return
diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm
index 05e8dfafcd0..b533cb9df4f 100644
--- a/code/game/gamemodes/changeling/changeling.dm
+++ b/code/game/gamemodes/changeling/changeling.dm
@@ -96,14 +96,14 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
..()
/datum/game_mode/proc/forge_changeling_objectives(var/datum/mind/changeling)
- //OBJECTIVES - Always absorb 5 genomes, plus random traitor objectives.
+ //OBJECTIVES - Always absorb at least 5 genomes, plus random traitor objectives.
//If they have two objectives as well as absorb, they must survive rather than escape
//No escape alone because changelings aren't suited for it and it'd probably just lead to rampant robusting
//If it seems like they'd be able to do it in play, add a 10% chance to have to escape alone
var/datum/objective/absorb/absorb_objective = new
absorb_objective.owner = changeling
- absorb_objective.gen_amount_goal(2, 3)
+ absorb_objective.gen_amount_goal(5, 7)
changeling.objectives += absorb_objective
var/datum/objective/assassinate/kill_objective = new
@@ -111,29 +111,29 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
kill_objective.find_target()
changeling.objectives += kill_objective
- var/datum/objective/steal/steal_objective = new
- steal_objective.owner = changeling
- steal_objective.find_target()
- changeling.objectives += steal_objective
-
-
switch(rand(1,100))
- if(1 to 80)
- if (!(locate(/datum/objective/escape) in changeling.objectives))
- var/datum/objective/escape/escape_objective = new
- escape_objective.owner = changeling
- changeling.objectives += escape_objective
+ if(1 to 60)
+ var/datum/objective/steal/steal_objective = new
+ steal_objective.owner = changeling
+ steal_objective.find_target()
+ changeling.objectives += steal_objective
else
- if (!(locate(/datum/objective/survive) in changeling.objectives))
- var/datum/objective/survive/survive_objective = new
- survive_objective.owner = changeling
- changeling.objectives += survive_objective
+ var/datum/objective/debrain/debrain_objective = new
+ debrain_objective.owner = changeling
+ debrain_objective.find_target()
+ changeling.objectives += debrain_objective
+
+ if (!(locate(/datum/objective/escape) in changeling.objectives))
+ var/datum/objective/escape/escape_objective = new
+ escape_objective.owner = changeling
+ changeling.objectives += escape_objective
+
return
/datum/game_mode/proc/greet_changeling(var/datum/mind/changeling, var/you_are=1)
if (you_are)
changeling.current << "\red You are a changeling!"
- changeling.current << "\red Use say \":g message\" to communicate with your fellow changelings. Remember: you get all of their absorbed DNA if you absorb them."
+ changeling.current << "\red Use say \":g message\" to communicate with your fellow changelings."
changeling.current << "You must complete the following tasks:"
if (changeling.current.mind)
@@ -190,7 +190,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
//Removed sanity if(changeling) because we -want- a runtime to inform us that the changelings list is incorrect and needs to be fixed.
text += "
Changeling ID: [changeling.changeling.changelingID]."
- text += "
Genomes Absorbed: [changeling.changeling.absorbedcount]"
+ text += "
Genomes Extracted: [changeling.changeling.absorbedcount]"
if(changeling.objectives.len)
var/count = 1
@@ -218,17 +218,19 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
/datum/changeling //stores changeling powers, changeling recharge thingie, changeling absorbed DNA and changeling ID (for changeling hivemind)
var/list/absorbed_dna = list()
+ var/dna_max = 4 //How many extra DNA strands the changeling can store for transformation.
var/absorbedcount = 0
var/chem_charges = 20
- var/chem_recharge_rate = 0.5
var/chem_storage = 50
- var/sting_range = 1
+ var/chem_recharge_rate = 0.5
+ var/sting_range = 2
var/changelingID = "Changeling"
var/geneticdamage = 0
var/isabsorbing = 0
var/geneticpoints = 5
var/purchasedpowers = list()
var/mimicing = ""
+ var/canrespec = 0
/datum/changeling/New(var/gender=FEMALE)
..()
@@ -241,6 +243,8 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
changelingID = "[honorific] [changelingID]"
else
changelingID = "[honorific] [rand(1,999)]"
+ absorbed_dna.len = dna_max
+
/datum/changeling/proc/regenerate()
chem_charges = min(max(0, chem_charges+chem_recharge_rate), chem_storage)
@@ -254,3 +258,41 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
chosen_dna = DNA
break
return chosen_dna
+
+
+//Checks if the target DNA is valid and absorbable.
+/datum/changeling/proc/can_absorb_dna(mob/living/carbon/T, mob/living/carbon/U)
+ if(absorbed_dna[1] == U.dna)//If our current DNA is the stalest, we gotta ditch it.
+ U << "We have reached our capacity to store genetic information! We must transform before absorbing more."
+ return 0
+
+ if(T)
+ if(NOCLONE in T.mutations || HUSK in T.mutations)
+ U << "DNA of [T] is ruined beyond usability!"
+ return 0
+
+ if(!ishuman(T))//Absorbing monkeys is entirely possible, but it can cause issues with transforming. That's what lesser form is for anyway!
+ U << "We could gain no benefit from absorbing a lesser creature."
+ return 0
+
+ if(T.dna in absorbed_dna)
+ U << "We already have that DNA in storage."
+ return 0
+
+ if(!check_dna_integrity(T))
+ U << "[T] is not compatible with our biology."
+ return 0
+
+ return 1
+
+
+//Absorbs the target DNA.
+/datum/changeling/proc/absorb_dna(mob/living/carbon/T)
+ shuffle_dna()
+ T.dna.real_name = T.real_name //Set this again, just to be sure that it's properly set.
+ absorbed_dna |= T.dna //And add the target DNA to our absorbed list.
+ absorbedcount++ //all that done, let's increment the objective counter.
+
+/datum/changeling/proc/shuffle_dna()//boots out the stalest DNA.
+ if(absorbed_dna.len)
+ absorbed_dna.Cut(1,2)
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm
index de9c5745d86..7375af8db6f 100644
--- a/code/game/gamemodes/changeling/changeling_powers.dm
+++ b/code/game/gamemodes/changeling/changeling_powers.dm
@@ -32,10 +32,9 @@
if(P.isVerb)
verbs -= P.verbpath
-
//Helper proc. Does all the checks and stuff for us to avoid copypasta
//includes a check to see if we're a carbon mob. This means that you can't use powers (even with the verbs) unless you're a carbon-based mob.
-/mob/proc/changeling_power(var/required_chems=0, var/required_dna=0, var/max_genetic_damage=100, var/max_stat=0)
+/mob/proc/changeling_power(var/required_chems=0, var/required_dna=0, var/max_genetic_damage=3, var/max_stat=0)
if(!src.mind) return
if(!iscarbon(src)) return
@@ -46,7 +45,7 @@
src << "We are incapacitated."
return
- if(changeling.absorbed_dna.len < required_dna)
+ if(changeling.absorbedcount < required_dna)
src << "We require at least [required_dna] samples of compatible DNA."
return
@@ -55,12 +54,14 @@
return
if(changeling.geneticdamage > max_genetic_damage)
- src << "Our geneomes are still reassembling. We need time to recover first."
+ src << "Our genomes are still reassembling. We need time to recover first."
return
return changeling
+
+
//Absorbs the victim's DNA making them uncloneable. Requires a strong grip on the victim.
//Doesn't cost anything as it's the most basic ability.
/mob/living/carbon/proc/changeling_absorb_dna()
@@ -75,24 +76,19 @@
src << "We must be grabbing a creature in our active hand to absorb them."
return
- var/mob/living/carbon/T = G.affecting
- if(!check_dna_integrity(T))
- src << "[T] is not compatible with our biology."
- return
-
- if(NOCLONE in T.mutations)
- src << "This creature's DNA is ruined beyond useability!"
- return
-
if(G.state <= GRAB_NECK)
src << "We must have a tighter grip to absorb this creature."
return
-
if(changeling.isabsorbing)
src << "We are already absorbing!"
return
- changeling.isabsorbing = 1
+ var/mob/living/carbon/T = G.affecting
+ if(changeling.can_absorb_dna(T, usr))
+ changeling.isabsorbing = 1
+ else
+ return
+
for(var/stage = 1, stage<=3, stage++)
switch(stage)
if(1)
@@ -116,41 +112,16 @@
src.visible_message("[src] sucks the fluids from [T]!")
T << "You have been absorbed by the changeling!"
- T.dna.real_name = T.real_name //Set this again, just to be sure that it's properly set.
- changeling.absorbed_dna |= T.dna
+ changeling.absorb_dna(T)
+
if(src.nutrition < 400) src.nutrition = min((src.nutrition + T.nutrition), 400)
- changeling.chem_charges += 10
- changeling.geneticpoints += 2
+ if(T.mind && T.mind.changeling)//If the target was a changeling, suck out their extra juice!
+ changeling.chem_charges += min(T.mind.changeling.chem_charges, changeling.chem_storage)
+ else
+ changeling.chem_charges += 10
- if(T.mind && T.mind.changeling)
- if(T.mind.changeling.absorbed_dna)
- for(var/dna_data in T.mind.changeling.absorbed_dna) //steal all their loot
- if(dna_data in changeling.absorbed_dna)
- continue
- changeling.absorbed_dna += dna_data
- changeling.absorbedcount++
- T.mind.changeling.absorbed_dna.len = 1
-
- if(T.mind.changeling.purchasedpowers)
- for(var/datum/power/changeling/Tp in T.mind.changeling.purchasedpowers)
- if(Tp in changeling.purchasedpowers)
- continue
- else
- changeling.purchasedpowers += Tp
-
- if(!Tp.isVerb)
- call(Tp.verbpath)()
- else
- make_changeling()
-
- changeling.chem_charges += T.mind.changeling.chem_charges
- changeling.geneticpoints += T.mind.changeling.geneticpoints
- T.mind.changeling.chem_charges = 0
- T.mind.changeling.geneticpoints = 0
- T.mind.changeling.absorbedcount = 0
-
- changeling.absorbedcount++
changeling.isabsorbing = 0
+ changeling.canrespec = 1
T.death(0)
T.Drain()
@@ -162,7 +133,7 @@
set category = "Changeling"
set name = "Transform (5)"
- var/datum/changeling/changeling = changeling_power(5,1,0)
+ var/datum/changeling/changeling = changeling_power(5, 0, 3)
if(!changeling) return
var/list/names = list()
@@ -177,16 +148,12 @@
return
changeling.chem_charges -= 5
- src.visible_message("[src] transforms!")
- changeling.geneticdamage = 30
+ changeling.geneticdamage = 3
src.dna = chosen_dna
src.real_name = chosen_dna.real_name
updateappearance(src)
domutcheck(src, null)
- src.verbs -= /mob/living/carbon/proc/changeling_transform
- spawn(10) src.verbs += /mob/living/carbon/proc/changeling_transform
-
feedback_add_details("changeling_powers","TR")
return 1
@@ -194,21 +161,20 @@
//Transform into a monkey.
/mob/living/carbon/proc/changeling_lesser_form()
set category = "Changeling"
- set name = "Lesser Form (1)"
+ set name = "Lesser Form (5)"
- var/datum/changeling/changeling = changeling_power(1,0,0)
+ var/datum/changeling/changeling = changeling_power(5,0,3)
if(!changeling) return
- changeling.chem_charges--
+ changeling.chem_charges -= 5
remove_changeling_powers()
- visible_message("[src] transforms!")
- changeling.geneticdamage = 30
+ changeling.geneticdamage = 3
src << "Our genes cry out!"
var/mob/living/carbon/monkey/O = monkeyize(TR_KEEPITEMS | TR_HASHNAME | TR_KEEPIMPLANTS | TR_KEEPDAMAGE | TR_KEEPSE | TR_KEEPSRC)
O.make_changeling(1)
- O.verbs += /mob/living/carbon/proc/changeling_lesser_transform
+ O.verbs += /mob/living/carbon/proc/changeling_human_form
feedback_add_details("changeling_powers","LF")
. = 1
del(src)
@@ -216,12 +182,12 @@
//Transform into a human
-/mob/living/carbon/proc/changeling_lesser_transform()
+/mob/living/carbon/proc/changeling_human_form()
set category = "Changeling"
- set name = "Transform (1)"
+ set name = "Human Form (5)"
- var/datum/changeling/changeling = changeling_power(1,1,0)
+ var/datum/changeling/changeling = changeling_power(5,0,3)
if(!changeling) return
@@ -236,9 +202,9 @@
if(!chosen_dna)
return
- changeling.chem_charges--
+ changeling.chem_charges -= 5
remove_changeling_powers()
- visible_message("[src] transforms!")
+ src << "We transform our appearance."
dna = chosen_dna
var/mob/living/carbon/human/O = humanize((TR_KEEPITEMS | TR_KEEPIMPLANTS | TR_KEEPDAMAGE | TR_KEEPSRC),chosen_dna.real_name)
@@ -253,76 +219,80 @@
//Fake our own death and fully heal. You will appear to be dead but regenerate fully after a short delay.
/mob/living/carbon/proc/changeling_fakedeath()
set category = "Changeling"
- set name = "Regenerative Stasis (20)"
+ set name = "Regenerative Stasis (10)"
+ set desc = "Begin stasis, allowing us to regenerate."
- var/datum/changeling/changeling = changeling_power(20,1,100,DEAD)
+ var/datum/changeling/changeling = changeling_power(10,0,100,DEAD)
if(!changeling) return
+ if(status_flags & FAKEDEATH) return //Make sure we can't stack regenerations and such.
+ changeling.chem_charges -= 10
if(!stat && alert("Are we sure we wish to fake our death?",,"Yes","No") == "No")//Confirmation for living changelings if they want to fake their death
return
- src << "We will attempt to regenerate our form."
+ src << "We begin our stasis, preparing energy to arise once more."
status_flags |= FAKEDEATH //play dead
update_canmove()
remove_changeling_powers()
- emote("gasp")
+ emote("deathgasp")
tod = worldtime2text()
- spawn(rand(800,2000))
- if(changeling_power(20,1,100,DEAD))
- changeling.chem_charges -= 20
- if(stat == DEAD)
- dead_mob_list -= src
- living_mob_list += src
- stat = CONSCIOUS
- tod = null
- setToxLoss(0)
- setOxyLoss(0)
- setCloneLoss(0)
- SetParalysis(0)
- SetStunned(0)
- SetWeakened(0)
- radiation = 0
- heal_overall_damage(getBruteLoss(), getFireLoss())
- reagents.clear_reagents()
- src << "We have regenerated."
- visible_message("[src] appears to wake from the dead, having healed all wounds.")
+ spawn(800)
+ src << "We have now stored enough power to regenerate."
+ verbs -= /mob/living/carbon/proc/changeling_fakedeath
+ verbs += /mob/living/carbon/proc/changeling_revive
- status_flags &= ~(FAKEDEATH)
- update_canmove()
- make_changeling()
feedback_add_details("changeling_powers","FD")
return 1
-
-//Boosts the range of your next sting attack by 1
-/mob/living/carbon/proc/changeling_boost_range()
+//Separated from regenerative stasis, so that they can choose when to pop up rather than having no control over it.
+/mob/living/carbon/proc/changeling_revive()
set category = "Changeling"
- set name = "Ranged Sting (10)"
- set desc="Your next sting ability can be used against targets 2 squares away."
+ set name = "Regenerate! (10)"
+ set desc = "Regenerate, healing all damage from our form."
- var/datum/changeling/changeling = changeling_power(10,0,100)
- if(!changeling) return 0
+ var/datum/changeling/changeling = changeling_power(10,0,100,DEAD)
+ if(!changeling) return
changeling.chem_charges -= 10
- src << "Your throat adjusts to launch the sting."
- changeling.sting_range = 2
- src.verbs -= /mob/living/carbon/proc/changeling_boost_range
- spawn(5) src.verbs += /mob/living/carbon/proc/changeling_boost_range
- feedback_add_details("changeling_powers","RS")
- return 1
+ if(stat == DEAD)
+ dead_mob_list -= src
+ living_mob_list += src
+ stat = CONSCIOUS
+ tod = null
+ setToxLoss(0)
+ setOxyLoss(0)
+ setCloneLoss(0)
+ SetParalysis(0)
+ SetStunned(0)
+ SetWeakened(0)
+ radiation = 0
+ heal_overall_damage(getBruteLoss(), getFireLoss())
+ reagents.clear_reagents()
+ src << "We have regenerated."
+
+ status_flags &= ~(FAKEDEATH)
+ update_canmove()
+ make_changeling()
+
+ verbs -= /mob/living/carbon/proc/changeling_revive
+ verbs += /mob/living/carbon/proc/changeling_fakedeath
+
+ feedback_add_details("changeling_powers","CR")
+ return 1
//Recover from stuns.
/mob/living/carbon/proc/changeling_unstun()
set category = "Changeling"
- set name = "Epinephrine Sacs (45)"
- set desc = "Removes all stuns"
+ set name = "Epinephrine Overdose (30)"
+ set desc = "Removes all stuns instantly, and adds a short-term reduction in further stuns."
- var/datum/changeling/changeling = changeling_power(45,0,100,UNCONSCIOUS)
+ var/datum/changeling/changeling = changeling_power(30,0,100,UNCONSCIOUS)
if(!changeling) return 0
- changeling.chem_charges -= 45
+ changeling.chem_charges -= 30
+ src << "We arise."
stat = 0
SetParalysis(0)
SetStunned(0)
@@ -330,28 +300,94 @@
lying = 0
update_canmove()
- src.verbs -= /mob/living/carbon/proc/changeling_unstun
- spawn(5) src.verbs += /mob/living/carbon/proc/changeling_unstun
+ reagents.add_reagent("synaptizine", 20)
+
feedback_add_details("changeling_powers","UNS")
return 1
-//Speeds up chemical regeneration
-/mob/proc/changeling_fastchemical()
+//Increases maximum chemical storage and regeneraton.
+/mob/proc/changeling_advglands()
+ src.mind.changeling.chem_storage += 25
src.mind.changeling.chem_recharge_rate *= 2
return 1
-//Increases macimum chemical storage
-/mob/proc/changeling_engorgedglands()
- src.mind.changeling.chem_storage += 25
+
+//A flashy ability, good for crowd control and sewing chaos.
+/mob/living/carbon/proc/changeling_shriek()
+ set category = "Changeling"
+ set name = "Resonant Shriek (25)"
+ set desc = "Deafen and confuse those around us."
+
+ var/datum/changeling/changeling = changeling_power(25)
+ if(!changeling) return 0
+ src.mind.changeling.chem_charges -= 25
+
+ for(var/mob/living/carbon/M in ohearers(4, usr))
+ if(!M.mind || !M.mind.changeling)
+ M.ear_deaf += 30
+ M.confused += 20
+ M.make_jittery(50)
+
+ for(var/obj/machinery/light/L in range(4, usr))
+ L.on = 1
+ L.broken()
+
+ //for(var/obj/structure/window/W in range(2, usr)) //I like the window-breaking, but it makes the ability too 'loud' to fit changelings.
+ // W.hit(rand(40,100))
+
+ feedback_add_details("changeling_powers","RS")
+ return 1
+
+
+//Makes some spiderlings. Good for setting traps and causing general trouble.
+/mob/living/carbon/proc/changeling_spiders()
+ set category = "Changeling"
+ set name = "Spread Infestation (40)"
+ set desc = "Creates spiderlings."
+
+ var/datum/changeling/changeling = changeling_power(40, 10)
+ if(!changeling) return 0
+ src.mind.changeling.chem_charges -= 40
+
+ for(var/i=0, i<3, i++)
+ var/obj/effect/spider/spiderling/S = new(src.loc)
+ if(prob(50))//nurses are obnoxious and lay more eggs, let's not have that for now.
+ S.grow_as = /mob/living/simple_animal/hostile/giant_spider/hunter
+ else
+ S.grow_as = /mob/living/simple_animal/hostile/giant_spider
+
+ feedback_add_details("changeling_powers","SI")
+ return 1
+
+
+//Heals the things that the other regenerative abilities don't.
+/mob/living/carbon/proc/changeling_panacea()
+ set category = "Changeling"
+ set name = "Anatomic Panacea (25)"
+ set desc = "Cures diseases, disabilities, toxins and radiation."
+
+ var/datum/changeling/changeling = changeling_power(25,0,100,UNCONSCIOUS)
+ if(!changeling) return 0
+ src.mind.changeling.chem_charges -= 25
+
+ src << "We cleanse impurities from our form."
+ reagents.add_reagent("ryetalyn", 10)
+ reagents.add_reagent("hyronalin", 10)
+ reagents.add_reagent("anti_toxin", 20)
+
+ for(var/datum/disease/D in src.viruses)
+ D.cure()
+
+ feedback_add_details("changeling_powers","AP")
return 1
//Prevents AIs tracking you but makes you easily detectable to the human-eye.
/mob/living/carbon/proc/changeling_digitalcamo()
set category = "Changeling"
- set name = "Toggle Digital Camoflague"
- set desc = "The AI can no longer track us, but we will look different if examined. Has a constant cost while active."
+ set name = "Toggle Digital Camouflage"
+ set desc = "The AI can no longer track us, but we will look different if examined."
var/datum/changeling/changeling = changeling_power()
if(!changeling) return 0
@@ -360,42 +396,32 @@
else src << "We distort our form to prevent AI-tracking."
digitalcamo = !digitalcamo
- spawn(0)
- while(src && digitalcamo && mind && mind.changeling)
- mind.changeling.chem_charges = max(mind.changeling.chem_charges - 1, 0)
- sleep(40)
-
- src.verbs -= /mob/living/carbon/proc/changeling_digitalcamo
- spawn(5) src.verbs += /mob/living/carbon/proc/changeling_digitalcamo
feedback_add_details("changeling_powers","CAM")
return 1
//Starts healing you every second for 10 seconds. Can be used whilst unconscious.
-/mob/living/carbon/proc/changeling_rapidregen()
+/mob/living/carbon/proc/changeling_fleshmend()
set category = "Changeling"
- set name = "Rapid Regeneration (30)"
+ set name = "Fleshmend (30)"
set desc = "Begins rapidly regenerating. Does not effect stuns or chemicals."
var/datum/changeling/changeling = changeling_power(30,0,100,UNCONSCIOUS)
if(!changeling) return 0
src.mind.changeling.chem_charges -= 30
+ src << "We begin to heal rapidly."
spawn(0)
for(var/i = 0, i<10,i++)
adjustBruteLoss(-10)
- adjustToxLoss(-10)
adjustOxyLoss(-10)
adjustFireLoss(-10)
sleep(10)
- src.verbs -= /mob/living/carbon/proc/changeling_rapidregen
- spawn(5) src.verbs += /mob/living/carbon/proc/changeling_rapidregen
feedback_add_details("changeling_powers","RR")
return 1
// HIVE MIND UPLOAD/DOWNLOAD DNA
-
var/list/datum/dna/hivemind_bank = list()
/mob/living/carbon/proc/changeling_hiveupload()
@@ -403,7 +429,7 @@ var/list/datum/dna/hivemind_bank = list()
set name = "Hive Channel (10)"
set desc = "Allows you to channel DNA in the airwaves to allow other changelings to absorb it."
- var/datum/changeling/changeling = changeling_power(10,1)
+ var/datum/changeling/changeling = changeling_power(10)
if(!changeling) return
var/list/names = list()
@@ -433,7 +459,7 @@ var/list/datum/dna/hivemind_bank = list()
set name = "Hive Absorb (20)"
set desc = "Allows you to absorb DNA that is being channeled in the airwaves."
- var/datum/changeling/changeling = changeling_power(20,1)
+ var/datum/changeling/changeling = changeling_power(20)
if(!changeling) return
var/list/names = list()
@@ -451,14 +477,15 @@ var/list/datum/dna/hivemind_bank = list()
if(!chosen_dna)
return
- changeling.chem_charges -= 20
- changeling.absorbed_dna += chosen_dna
- src << "We absorb the DNA of [S] from the air."
- feedback_add_details("changeling_powers","HD")
+ if(changeling.can_absorb_dna(null, usr))
+ changeling.chem_charges -= 20
+ changeling.shuffle_dna()
+ changeling.absorbed_dna |= chosen_dna
+ src << "We absorb the DNA of [S] from the air."
+ feedback_add_details("changeling_powers","HD")
return 1
// Fake Voice
-
/mob/living/carbon/proc/changeling_mimicvoice()
set category = "Changeling"
set name = "Mimic Voice"
@@ -490,6 +517,9 @@ var/list/datum/dna/hivemind_bank = list()
sleep(40)
if(src && src.mind && src.mind.changeling)
src.mind.changeling.mimicing = ""
+
+
+
//////////
//STINGS// //They get a pretty header because there's just so fucking many of them ;_;
//////////
@@ -517,9 +547,8 @@ var/list/datum/dna/hivemind_bank = list()
if(!changeling_power(required_chems)) return
changeling.chem_charges -= required_chems
- changeling.sting_range = 1
verbs -= verb_path
- spawn(10) verbs += verb_path
+ spawn(5) verbs += verb_path
src << "We stealthily sting [T]."
if(!T.mind || !T.mind.changeling) return T //T will be affected by the sting
@@ -527,73 +556,10 @@ var/list/datum/dna/hivemind_bank = list()
return
-/mob/living/carbon/proc/changeling_lsdsting()
- set category = "Changeling"
- set name = "Hallucination Sting (15)"
- set desc = "Causes terror in the target."
-
- var/mob/living/carbon/T = changeling_sting(15,/mob/living/carbon/proc/changeling_lsdsting)
- if(!T) return 0
- spawn(rand(300,600))
- if(T) T.hallucination += 400
- feedback_add_details("changeling_powers","HS")
- return 1
-
-/mob/living/carbon/proc/changeling_silence_sting()
- set category = "Changeling"
- set name = "Silence sting (10)"
- set desc="Sting target"
-
- var/mob/living/carbon/T = changeling_sting(10,/mob/living/carbon/proc/changeling_silence_sting)
- if(!T) return 0
- T.silent += 30
- feedback_add_details("changeling_powers","SS")
- return 1
-
-/mob/living/carbon/proc/changeling_blind_sting()
- set category = "Changeling"
- set name = "Blind sting (20)"
- set desc="Sting target"
-
- var/mob/living/carbon/T = changeling_sting(20,/mob/living/carbon/proc/changeling_blind_sting)
- if(!T) return 0
- T << "Your eyes burn horrificly!"
- T.disabilities |= NEARSIGHTED
- spawn(300) T.disabilities &= ~NEARSIGHTED
- T.eye_blind = 10
- T.eye_blurry = 20
- feedback_add_details("changeling_powers","BS")
- return 1
-
-/mob/living/carbon/proc/changeling_deaf_sting()
- set category = "Changeling"
- set name = "Deaf sting (5)"
- set desc="Sting target:"
-
- var/mob/living/carbon/T = changeling_sting(5,/mob/living/carbon/proc/changeling_deaf_sting)
- if(!T) return 0
- T << "Your ears pop and begin ringing loudly!"
- T.sdisabilities |= DEAF
- spawn(300) T.sdisabilities &= ~DEAF
- feedback_add_details("changeling_powers","DS")
- return 1
-
-/mob/living/carbon/proc/changeling_paralysis_sting()
- set category = "Changeling"
- set name = "Paralysis sting (30)"
- set desc="Sting target"
-
- var/mob/living/carbon/T = changeling_sting(30,/mob/living/carbon/proc/changeling_paralysis_sting)
- if(!T) return 0
- T << "Your muscles begin to painfully tighten."
- T.Weaken(20)
- feedback_add_details("changeling_powers","PS")
- return 1
-
/mob/living/carbon/proc/changeling_transformation_sting()
set category = "Changeling"
- set name = "Transformation sting (40)"
- set desc="Sting target"
+ set name = "Transformation Sting (40)"
+ set desc= "Transform the target to one of our stored DNAs"
var/datum/changeling/changeling = changeling_power(40)
if(!changeling) return 0
@@ -614,7 +580,6 @@ var/list/datum/dna/hivemind_bank = list()
if((HUSK in T.mutations) || !check_dna_integrity(T))
src << "Our sting appears ineffective against its DNA."
return 0
- T.visible_message("[T] transforms!")
T.dna = chosen_dna
T.real_name = chosen_dna.real_name
updateappearance(T)
@@ -622,24 +587,10 @@ var/list/datum/dna/hivemind_bank = list()
feedback_add_details("changeling_powers","TS")
return 1
-/mob/living/carbon/proc/changeling_DEATHsting()
- set category = "Changeling"
- set name = "Death Sting (40)"
- set desc = "Causes spasms onto death."
-
- var/mob/living/carbon/T = changeling_sting(40,/mob/living/carbon/proc/changeling_DEATHsting)
- if(!T) return 0
- T << "You feel a small prick and your chest becomes tight."
- T.silent = 10
- T.Paralyse(10)
- T.make_jittery(1000)
- if(T.reagents) T.reagents.add_reagent("lexorin", 40)
- feedback_add_details("changeling_powers","DTHS")
- return 1
/mob/living/carbon/proc/changeling_extract_dna_sting()
set category = "Changeling"
- set name = "Extract DNA Sting (40)"
+ set name = "Extract DNA Sting (25)"
set desc="Stealthily sting a target to extract their DNA."
var/datum/changeling/changeling = null
@@ -648,11 +599,69 @@ var/list/datum/dna/hivemind_bank = list()
if(!changeling)
return 0
- var/mob/living/carbon/T = changeling_sting(40, /mob/living/carbon/proc/changeling_extract_dna_sting)
+ var/mob/living/carbon/T = changeling_sting(25, /mob/living/carbon/proc/changeling_extract_dna_sting)
if(!T) return 0
- T.dna.real_name = T.real_name
- changeling.absorbed_dna |= T.dna
+ if(changeling.can_absorb_dna(T, usr))
+ changeling.absorb_dna(T, usr)
+ else//If the sting fails, give the guy most of his chems back.
+ changeling.chem_charges += 20
feedback_add_details("changeling_powers","ED")
return 1
+
+
+/mob/living/carbon/proc/changeling_mute_sting()
+ set category = "Changeling"
+ set name = "Mute sting (20)"
+ set desc= "Temporarily mutes the target."
+
+ var/mob/living/carbon/T = changeling_sting(20,/mob/living/carbon/proc/changeling_mute_sting)
+ if(!T) return 0
+ T.silent += 30
+ feedback_add_details("changeling_powers","MS")
+ return 1
+
+
+/mob/living/carbon/proc/changeling_blind_sting()
+ set category = "Changeling"
+ set name = "Blind Sting (25)"
+ set desc= "Temporarily blinds the target."
+
+ var/mob/living/carbon/T = changeling_sting(25,/mob/living/carbon/proc/changeling_blind_sting)
+ if(!T) return 0
+ T << "Your eyes burn horrifically!"
+ T.disabilities |= NEARSIGHTED
+ T.eye_blind = 20
+ T.eye_blurry = 40
+ feedback_add_details("changeling_powers","BS")
+ return 1
+
+
+/mob/living/carbon/proc/changeling_lsd_sting()
+ set category = "Changeling"
+ set name = "Hallucination Sting (5)"
+ set desc = "Causes terror in the target."
+
+ var/mob/living/carbon/T = changeling_sting(5,/mob/living/carbon/proc/changeling_lsd_sting)
+ if(!T) return 0
+ spawn(rand(300,600))
+ if(T) T.hallucination += 400
+ feedback_add_details("changeling_powers","HS")
+ return 1
+
+
+/mob/living/carbon/proc/changeling_cryo_sting()
+ set category = "Changeling"
+ set name = "Cryogenic Sting (15)"
+ set desc = "Cools the target, slowing them."
+
+ var/mob/living/carbon/T = changeling_sting(15,/mob/living/carbon/proc/changeling_cryo_sting)
+ if(!T) return 0
+
+ if(T.reagents)
+ T.reagents.add_reagent("frostoil", 30)
+ T.reagents.add_reagent("ice", 30)
+
+ feedback_add_details("changeling_powers","CS")
+ return 1
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/modularchangling.dm b/code/game/gamemodes/changeling/modularchangling.dm
index ec15b284143..6525099209e 100644
--- a/code/game/gamemodes/changeling/modularchangling.dm
+++ b/code/game/gamemodes/changeling/modularchangling.dm
@@ -15,10 +15,18 @@ var/list/powerinstances
/datum/power/changeling/absorb_dna
name = "Absorb DNA"
- desc = "Permits us to syphon the DNA from a human. They become one with us, and we become stronger."
+ desc = "Permits us to siphon the DNA from a human. They become one with us, and the new energy lets us change our abilities."
genomecost = 0
verbpath = /mob/living/carbon/proc/changeling_absorb_dna
+/datum/power/changeling/extractdna
+ name = "Extract DNA Strand"
+ desc = "We stealthily sting a target and extract the DNA from them."
+ helptext = "Will give you the DNA of your target, allowing you to transform into them."
+ genomecost = 0
+ allowduringlesserform = 1
+ verbpath = /mob/living/carbon/proc/changeling_extract_dna_sting
+
/datum/power/changeling/transform
name = "Transform"
desc = "We take on the appearance and voice of one we have absorbed."
@@ -28,18 +36,18 @@ var/list/powerinstances
/datum/power/changeling/fakedeath
name = "Regenerative Stasis"
desc = "We become weakened to a death-like state, where we will rise again from death."
- helptext = "Can be used before or after death. Duration varies greatly."
+ helptext = "Can be used before or after death. Duration varies greatly. Can be used in lesser form."
genomecost = 0
allowduringlesserform = 1
verbpath = /mob/living/carbon/proc/changeling_fakedeath
// Hivemind
-
/datum/power/changeling/hive_upload
name = "Hive Channel"
desc = "We can channel a DNA into the airwaves, allowing our fellow changelings to absorb it and transform into it as if they acquired the DNA themselves."
helptext = "Allows other changelings to absorb the DNA you channel from the airwaves. Will not help them towards their absorb objectives."
genomecost = 0
+ allowduringlesserform = 1
verbpath = /mob/living/carbon/proc/changeling_hiveupload
/datum/power/changeling/hive_download
@@ -47,136 +55,118 @@ var/list/powerinstances
desc = "We can absorb a single DNA from the airwaves, allowing us to use more disguises with help from our fellow changelings."
helptext = "Allows you to absorb a single DNA and use it. Does not count towards your absorb objective."
genomecost = 0
+ allowduringlesserform = 1
verbpath = /mob/living/carbon/proc/changeling_hivedownload
/datum/power/changeling/lesser_form
name = "Lesser Form"
- desc = "We debase ourselves and become lesser. We become a monkey."
+ desc = "We debase ourselves and become lesser. We become a monkey."
genomecost = 1
verbpath = /mob/living/carbon/proc/changeling_lesser_form
-/datum/power/changeling/deaf_sting
- name = "Deaf Sting"
- desc = "We silently sting a human, completely deafening them for a short time."
- genomecost = 1
- allowduringlesserform = 1
- verbpath = /mob/living/carbon/proc/changeling_deaf_sting
-
-/datum/power/changeling/blind_sting
- name = "Blind Sting"
- desc = "We silently sting a human, completely blinding them for a short time."
- genomecost = 2
- allowduringlesserform = 1
- verbpath = /mob/living/carbon/proc/changeling_blind_sting
-
-/datum/power/changeling/silence_sting
- name = "Silence Sting"
- desc = "We silently sting a human, completely silencing them for a short time."
- helptext = "Does not provide a warning to a victim that they have been stung, until they try to speak and cannot."
- genomecost = 2
- allowduringlesserform = 1
- verbpath = /mob/living/carbon/proc/changeling_silence_sting
-
/datum/power/changeling/mimicvoice
name = "Mimic Voice"
desc = "We shape our vocal glands to sound like a desired voice."
helptext = "Will turn your voice into the name that you enter. We must constantly expend chemicals to maintain our form like this"
- genomecost = 3
+ genomecost = 1
verbpath = /mob/living/carbon/proc/changeling_mimicvoice
-/datum/power/changeling/extractdna
- name = "Extract DNA"
- desc = "We stealthily sting a target and extract the DNA from them."
- helptext = "Will give you the DNA of your target, allowing you to transform into them. Does not count towards absorb objectives."
- genomecost = 4
- allowduringlesserform = 1
- verbpath = /mob/living/carbon/proc/changeling_extract_dna_sting
-
/datum/power/changeling/transformation_sting
name = "Transformation Sting"
desc = "We silently sting a human, injecting a retrovirus that forces them to transform into another."
helptext = "Does not provide a warning to others. The victim will transform much like a changeling would."
- genomecost = 3
+ genomecost = 1
verbpath = /mob/living/carbon/proc/changeling_transformation_sting
-/datum/power/changeling/paralysis_sting
- name = "Paralysis Sting"
- desc = "We silently sting a human, paralyzing them for a short time."
- genomecost = 3
- verbpath = /mob/living/carbon/proc/changeling_paralysis_sting
-
-/datum/power/changeling/LSDSting
- name = "Hallucination Sting"
- desc = "We evolve the ability to sting a target with a powerful hallucinogenic chemical."
- helptext = "The target does not notice they have been stung. The effect occurs after 30 to 60 seconds."
- genomecost = 3
- verbpath = /mob/living/carbon/proc/changeling_lsdsting
-
-/datum/power/changeling/DeathSting
- name = "Death Sting"
- desc = "We silently sting a human, filling him with potent chemicals. His rapid death is all but assured."
- genomecost = 10
- verbpath = /mob/living/carbon/proc/changeling_DEATHsting
-
-/datum/power/changeling/boost_range
- name = "Boost Range"
- desc = "We evolve the ability to shoot our stingers at humans, with some preperation."
- genomecost = 2
- allowduringlesserform = 1
- verbpath = /mob/living/carbon/proc/changeling_boost_range
-
/datum/power/changeling/Epinephrine
- name = "Epinephrine sacs"
+ name = "Epinephrine Sacs"
desc = "We evolve additional sacs of adrenaline throughout our body."
- helptext = "Gives the ability to instantly recover from stuns. High chemical cost."
- genomecost = 4
+ helptext = "Removes all stuns instantly, and adds a short-term reduction in further stuns. Can be used while unconscious."
+ genomecost = 1
verbpath = /mob/living/carbon/proc/changeling_unstun
-/datum/power/changeling/ChemicalSynth
- name = "Rapid Chemical-Synthesis"
- desc = "We evolve new pathways for producing our necessary chemicals, permitting us to naturally create them faster."
- helptext = "Doubles the rate at which we naturally recharge chemicals."
- genomecost = 4
- isVerb = 0
- verbpath = /mob/proc/changeling_fastchemical
-/*
-/datum/power/changeling/AdvChemicalSynth
- name = "Advanced Chemical-Synthesis"
- desc = "We evolve new pathways for producing our necessary chemicals, permitting us to naturally create them faster."
- helptext = "Doubles the rate at which we naturally recharge chemicals."
- genomecost = 8
- isVerb = 0
- verbpath = /mob/living/carbon/proc/changeling_fastchemical
-*/
/datum/power/changeling/EngorgedGlands
name = "Engorged Chemical Glands"
desc = "Our chemical glands swell, permitting us to store more chemicals inside of them."
- helptext = "Allows us to store an extra 25 units of chemicals."
- genomecost = 4
+ helptext = "Allows us to store an extra 25 units of chemicals, and doubles production rate."
+ genomecost = 1
isVerb = 0
- verbpath = /mob/proc/changeling_engorgedglands
+ verbpath = /mob/proc/changeling_advglands
-/datum/power/changeling/DigitalCamoflague
- name = "Digital Camoflauge"
- desc = "We evolve the ability to distort our form and proprtions, defeating common altgorthms used to detect lifeforms on cameras."
- helptext = "We cannot be tracked by camera while using this skill. However, humans looking at us will find us.. uncanny. We must constantly expend chemicals to maintain our form like this."
- genomecost = 3
+/datum/power/changeling/DigitalCamouflage
+ name = "Digital Camouflage"
+ desc = "We evolve the ability to distort our form and proprotions, defeating common altgorthms used to detect lifeforms on cameras."
+ helptext = "We cannot be tracked by camera while using this skill. However, humans looking at us will find us... uncanny."
+ genomecost = 1
allowduringlesserform = 1
verbpath = /mob/living/carbon/proc/changeling_digitalcamo
-/datum/power/changeling/rapidregeneration
- name = "Rapid Regeneration"
- desc = "We evolve the ability to rapidly regenerate, negating the need for stasis."
- helptext = "Heals a moderate amount of damage every tick."
- genomecost = 8
- verbpath = /mob/living/carbon/proc/changeling_rapidregen
+/datum/power/changeling/fleshmend
+ name = "Fleshmend"
+ desc = "We evolve the ability to rapidly regenerate, restoring the health of the body we use."
+ helptext = "Heals a moderate amount of damage every tick. Can be used while unconscious."
+ genomecost = 1
+ verbpath = /mob/living/carbon/proc/changeling_fleshmend
+/datum/power/changeling/panacea
+ name = "Anatomic Panacea"
+ desc = "Expels impurifications from our form; curing diseases, genetic disabilities, and removing toxins and radiation."
+ helptext = "Can be used while unconscious."
+ genomecost = 1
+ verbpath = /mob/living/carbon/proc/changeling_panacea
+
+/datum/power/changeling/shriek
+ name = "Resonant Shriek"
+ desc = "Our lungs and vocal chords shift, allowing us to briefly emit a noise that deafens and confuses humans."
+ helptext = "The high-frequency sounds cannot be heard by humans, but will blow out lights nearby."
+ genomecost = 1
+ verbpath = /mob/living/carbon/proc/changeling_shriek
+
+/datum/power/changeling/spiders
+ name = "Spread Infestation"
+ desc = "Our form divides, creating arachnids which will grow into deadly beasts."
+ helptext = "The spiders are thoughtless creatures, and may attack their creators when fully grown. Requires 10 DNA absorptions."
+ genomecost = 1
+ allowduringlesserform = 1
+ verbpath = /mob/living/carbon/proc/changeling_spiders
+
+/datum/power/changeling/lsd_sting
+ name = "Hallucination Sting"
+ desc = "We evolve the ability to sting a target with a powerful hallucinogenic chemical."
+ helptext = "The target does not notice they have been stung. The effect occurs after 30 to 60 seconds."
+ genomecost = 1
+ allowduringlesserform = 1
+ verbpath = /mob/living/carbon/proc/changeling_lsd_sting
+
+/datum/power/changeling/blind_sting
+ name = "Blind Sting"
+ desc = "We silently sting a human, completely blinding them for a short time."
+ genomecost = 1
+ allowduringlesserform = 1
+ verbpath = /mob/living/carbon/proc/changeling_blind_sting
+
+/datum/power/changeling/cryo_sting
+ name = "Cryogenic Sting"
+ desc = "We silently sting a human with a cocktail of chemicals, slowing their metabolism."
+ helptext = "Does not provide a warning to a victim, though they will likely realize they are suddenly freezing."
+ genomecost = 1
+ allowduringlesserform = 1
+ verbpath = /mob/living/carbon/proc/changeling_cryo_sting
+
+/datum/power/changeling/mute_sting
+ name = "Mute Sting"
+ desc = "We silently sting a human, completely silencing them for a short time."
+ helptext = "Does not provide a warning to a victim that they have been stung, until they try to speak and cannot."
+ genomecost = 1
+ allowduringlesserform = 1
+ verbpath = /mob/living/carbon/proc/changeling_mute_sting
// Modularchangling, totally stolen from the new player panel. YAYY
/datum/changeling/proc/EvolutionMenu()//The new one
+ set name = "-Evolution Menu-"//Dashes are so it's listed before all the other abilities.
set category = "Changeling"
- set desc = "Level up!"
+ set desc = "Choose our method of subjugation."
if(!usr || !usr.mind || !usr.mind.changeling) return
src = usr.mind.changeling
@@ -372,10 +362,11 @@ var/list/powerinstances
- Changling Evolution Menu
+ Changeling Evolution Menu
Hover over a power to see more information
- Current evolution points left to evolve with: [geneticpoints]
- Absorb genomes to acquire more evolution points
+ Current ability choices remaining: [geneticpoints]
+ By rendering a lifeform to a husk, we gain enough power to alter and adapt our evolutions.
+ (Readapt)
|
@@ -397,13 +388,24 @@ var/list/powerinstances
for(var/datum/power/changeling/P in powerinstances)
var/ownsthis = 0
+ if(P.genomecost == 0) //Let's skip the crap we start with. Keeps the evolution menu uncluttered.
+ continue
+
if(P in purchasedpowers)
ownsthis = 1
- var/color = "#e6e6e6"
- if(i%2 == 0)
- color = "#f2f2f2"
+ var/color
+ if(ownsthis)
+ if(i%2 == 0)
+ color = "#d8ebd8"
+ else
+ color = "#c3dec3"
+ else
+ if(i%2 == 0)
+ color = "#f2f2f2"
+ else
+ color = "#e6e6e6"
dat += {"
@@ -414,7 +416,7 @@ var/list/powerinstances
- Evolve [P] - Cost: [ownsthis ? "Purchased" : P.genomecost]
+ Evolve [P][ownsthis ? " - Purchased" : ((P.genomecost > 1) ? " - Cost: [P.genomecost]" : "")]
@@ -437,7 +439,7 @@ var/list/powerinstances