Merge pull request #796 from TheDZD/shadowling

Port of /tg/station's Shadowlings [WIP]
This commit is contained in:
ZomgPonies
2015-05-04 20:38:20 -04:00
48 changed files with 1415 additions and 78 deletions
+6
View File
@@ -501,6 +501,12 @@
if(ticker.mode.traitors.len)
dat += check_role_table("Traitors", ticker.mode.traitors, src)
if(ticker.mode.shadows.len)
dat += check_role_table("Shadowlings", ticker.mode.shadows, src)
if(ticker.mode.thralls.len)
dat += check_role_table("Shadowling Thralls", ticker.mode.thralls, src)
if(ticker.mode.vampires.len)
dat += check_role_table("Vampires", ticker.mode.vampires, src)
+3 -1
View File
@@ -17,12 +17,14 @@ var/global/list/special_roles = list( //keep synced with the defines BE_* in set
"raider" = IS_MODE_COMPILED("heist"), // 1024 / 11
"vampire" = IS_MODE_COMPILED("vampire"), // 2048 / 12
"mutineer" = IS_MODE_COMPILED("mutiny"), // 4096 / 13
"blob" = IS_MODE_COMPILED("blob") // 8192 / 14
"blob" = IS_MODE_COMPILED("blob"), // 8192 / 14
"shadowling" = IS_MODE_COMPILED("shadowling") //16384 / 15
)
var/global/list/special_role_times = list( //minimum age (in days) for accounts to play these roles
num2text(BE_PAI) = 0,
num2text(BE_TRAITOR) = 7,
num2text(BE_CHANGELING) = 14,
num2text(BE_SHADOWLING) = 14,
num2text(BE_WIZARD) = 14,
num2text(BE_REV) = 14,
num2text(BE_VAMPIRE) = 14,
+3 -3
View File
@@ -3,7 +3,7 @@
/mob/proc/gib()
death(1)
var/atom/movable/overlay/animation = null
monkeyizing = 1
notransform = 1
canmove = 0
icon = null
invisibility = 101
@@ -31,7 +31,7 @@
/mob/proc/dust()
death(1)
var/atom/movable/overlay/animation = null
monkeyizing = 1
notransform = 1
canmove = 0
icon = null
invisibility = 101
@@ -54,7 +54,7 @@
/mob/proc/melt()
death(1)
var/atom/movable/overlay/animation = null
monkeyizing = 1
notransform = 1
canmove = 0
icon = null
invisibility = 101
+8
View File
@@ -356,6 +356,14 @@
key = "g"
flags = RESTRICTED | HIVEMIND
/datum/language/shadowling
name = "Shadowling Hivemind"
desc = "Shadowlings and their thralls are capable of communicating over a psychic hivemind."
speech_verb = "says"
colour = "shadowling"
key = "8"
flags = RESTRICTED | HIVEMIND
/datum/language/ling/broadcast(var/mob/living/speaker,var/message,var/speaker_mask)
if(speaker.mind && speaker.mind.changeling)
@@ -1,7 +1,7 @@
/mob/living/carbon/alien/gib()
death(1)
var/atom/movable/overlay/animation = null
monkeyizing = 1
notransform = 1
canmove = 0
icon = null
invisibility = 101
@@ -22,7 +22,7 @@
/mob/living/carbon/alien/dust()
death(1)
var/atom/movable/overlay/animation = null
monkeyizing = 1
notransform = 1
canmove = 0
icon = null
invisibility = 101
@@ -53,7 +53,7 @@
/mob/living/carbon/alien/humanoid/regenerate_icons()
..()
if (monkeyizing) return
if (notransform) return
update_inv_head(0,0)
update_inv_wear_suit(0,0)
@@ -23,8 +23,8 @@
/obj/item/organ/brain/New()
..()
spawn(5)
if(brainmob && brainmob.client)
brainmob.client.screen.len = null //clear the hud
for(var/mob/living/carbon/brain/bmob in src) //I'm going to hell for this, but there's no other way to stop these runtimes.
bmob.client.screen.len = null //clear the hud
/obj/item/organ/brain/proc/transfer_identity(var/mob/living/carbon/H)
name = "\the [H]'s [initial(src.name)]"
@@ -19,7 +19,7 @@
/mob/living/carbon/brain/gib()
death(1)
var/atom/movable/overlay/animation = null
monkeyizing = 1
notransform = 1
canmove = 0
icon = null
invisibility = 101
@@ -169,17 +169,17 @@
..()
/obj/item/device/mmi/posibrain/New()
src.brainmob = new(src)
src.brainmob.name = "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]"
src.brainmob.real_name = src.brainmob.name
src.brainmob.loc = src
src.brainmob.container = src
src.brainmob.robot_talk_understand = 1
src.brainmob.stat = 0
src.brainmob.silent = 0
src.brainmob.brain_op_stage = 4.0
dead_mob_list -= src.brainmob
for(var/mob/living/carbon/brain/bmob in src) //Also going to hell for this, but this should fix the runtimes.
bmob = new /mob/living/carbon/brain(src)
bmob.name = "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]"
bmob.real_name = src.brainmob.name
bmob.loc = src
bmob.container = src
bmob.robot_talk_understand = 1
bmob.stat = 0
bmob.silent = 0
bmob.brain_op_stage = 4.0
dead_mob_list -= bmob
..()
@@ -1,7 +1,7 @@
/mob/living/carbon/human/gib()
death(1)
var/atom/movable/overlay/animation = null
monkeyizing = 1
notransform = 1
canmove = 0
icon = null
invisibility = 101
@@ -42,7 +42,7 @@
/mob/living/carbon/human/dust()
death(1)
var/atom/movable/overlay/animation = null
monkeyizing = 1
notransform = 1
canmove = 0
icon = null
invisibility = 101
@@ -62,7 +62,7 @@
/mob/living/carbon/human/melt()
death(1)
var/atom/movable/overlay/animation = null
monkeyizing = 1
notransform = 1
canmove = 0
icon = null
invisibility = 101
@@ -1400,6 +1400,8 @@
regenerate_icons()
fixblood()
UpdateAppearance()
if(species)
return 1
else
+18 -3
View File
@@ -46,7 +46,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
set invisibility = 0
//set background = 1
if (monkeyizing) return
if (notransform) return
if(!loc) return // Fixing a null error that occurs when the mob isn't found in the world -- TLE
..()
@@ -760,9 +760,24 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc
if(A.lighting_use_dynamic) light_amount = T.lighting_lumcount
else light_amount = 10
if(light_amount > species.light_dam) //if there's enough light, start dying
take_overall_damage(1,1)
if(species.light_effect_amp)
adjustFireLoss(5) //This gets doubled by Shadowling's innate fire weakness, so it ends up being 10.
else
adjustFireLoss(1)
adjustBruteLoss(1)
src << "<span class='userdanger'>The light burns you!</span>"
src << 'sound/weapons/sear.ogg'
else //heal in the dark
heal_overall_damage(1,1)
if(species.light_effect_amp)
adjustFireLoss(-5)
adjustBruteLoss(-5)
adjustBrainLoss(-25) //gibbering shadowlings are hilarious but also bad to have
adjustCloneLoss(-1)
SetWeakened(0)
SetStunned(0)
else
adjustFireLoss(-1)
adjustBruteLoss(-1)
//The fucking FAT mutation is the greatest shit ever. It makes everyone so hot and bothered.
@@ -471,7 +471,7 @@ proc/get_damage_icon_part(damage_state, body_part)
//For legacy support.
/mob/living/carbon/human/regenerate_icons()
..()
if(monkeyizing) return
if(notransform) return
update_mutations(0)
force_update_limbs()
update_mutantrace(0)
@@ -9,7 +9,7 @@
set invisibility = 0
//set background = 1
if (src.monkeyizing)
if (src.notransform)
return
..()
@@ -1,7 +1,7 @@
/mob/living/carbon/monkey/gib()
death(1)
var/atom/movable/overlay/animation = null
monkeyizing = 1
notransform = 1
canmove = 0
icon = null
invisibility = 101
@@ -21,7 +21,7 @@
/mob/living/carbon/monkey/dust()
death(1)
var/atom/movable/overlay/animation = null
monkeyizing = 1
notransform = 1
canmove = 0
icon = null
invisibility = 101
@@ -12,7 +12,7 @@
/mob/living/carbon/monkey/Life()
set invisibility = 0
//set background = 1
if (monkeyizing) return
if (notransform) return
if (update_muts)
update_muts=0
domutcheck(src,null,MUTCHK_FORCED)
+2 -1
View File
@@ -41,7 +41,8 @@
var/brute_mod = null // Physical damage reduction/malus.
var/burn_mod = null // Burn damage reduction/malus.
var/light_dam
var/light_dam //Light level above which species takes damage, and below which it heals.
var/light_effect_amp //If 0, takes/heals 1 burn and brute per tick. Otherwise, both healing and damage effects are amplified.
var/max_hurt_damage = 9 // Max melee damage dealt + 5 if hulk
var/list/default_genes = list()
+1 -1
View File
@@ -1,7 +1,7 @@
/mob/living/Life()
..()
if (monkeyizing) return
if (notransform) return
if(!loc) return // Fixing a null error that occurs when the mob isn't found in the world -- TLE
if(mind)
if(mind in ticker.mode.implanted)
+3
View File
@@ -32,4 +32,7 @@
if("vampire")
if((ref in ticker.mode.thralls) || (mind in ticker.mode.enthralled))
ticker.mode.update_vampire_icons_added(mind)
if("shadowling")
if((mind in ticker.mode.shadowling_thralls) || (mind in ticker.mode.shadows))
ticker.mode.update_shadow_icons_added(src.mind)
return .
+2 -2
View File
@@ -1,7 +1,7 @@
/mob/living/silicon/gib()
death(1)
var/atom/movable/overlay/animation = null
monkeyizing = 1
notransform = 1
canmove = 0
icon = null
invisibility = 101
@@ -22,7 +22,7 @@
/mob/living/silicon/dust()
death(1)
var/atom/movable/overlay/animation = null
monkeyizing = 1
notransform = 1
canmove = 0
icon = null
invisibility = 101
@@ -2,7 +2,7 @@
set invisibility = 0
set background = 1
if (src.monkeyizing)
if (src.notransform)
return
@@ -1,7 +1,7 @@
/mob/living/silicon/robot/gib()
//robots don't die when gibbed. instead they drop their MMI'd brain
var/atom/movable/overlay/animation = null
monkeyizing = 1
notransform = 1
canmove = 0
icon = null
invisibility = 101
@@ -23,7 +23,7 @@
/mob/living/silicon/robot/dust()
death(1)
var/atom/movable/overlay/animation = null
monkeyizing = 1
notransform = 1
canmove = 0
icon = null
invisibility = 101
@@ -2,7 +2,7 @@
set invisibility = 0
//set background = 1
if (src.monkeyizing)
if (src.notransform)
return
src.blinded = null
@@ -0,0 +1,33 @@
/mob/living/simple_animal/ascendant_shadowling
name = "Ascendant Shadowling"
desc = "A large, floating eldritch horror. It has pulsing markings all about its body and large horns. It seems to be floating without any form of support."
icon = 'icons/mob/mob.dmi'
icon_state = "shadowling_ascended"
icon_living = "shadowling_ascended"
speak_emote = list("telepathically thunders", "telepathically booms")
force_threshold = INFINITY //Can't die by normal means
health = 100000
maxHealth = 100000
speed = 0
var/phasing = 0
see_in_dark = 8
see_invisible = SEE_INVISIBLE_MINIMUM
response_help = "stares at"
response_disarm = "flails at"
response_harm = "flails at"
harm_intent_damage = 0
melee_damage_lower = 35
melee_damage_upper = 35
attacktext = "claws at"
attack_sound = 'sound/weapons/slash.ogg'
minbodytemp = 0
maxbodytemp = INFINITY
environment_smash = 2
faction = list("faithless")
/mob/living/simple_animal/ascendant_shadowling/Process_Spacemove(var/movement_dir = 0)
return 1 //copypasta from carp code
+1 -1
View File
@@ -1023,7 +1023,7 @@ var/list/slot_equipment_priority = list( \
if(world.time < client.move_delay) return 0
if(stat==2) return 0
if(anchored) return 0
if(monkeyizing) return 0
if(notransform) return 0
if(restrained()) return 0
return 1
+1 -1
View File
@@ -57,7 +57,7 @@
var/disabilities = 0 //Carbon
var/atom/movable/pulling = null
var/next_move = null
var/monkeyizing = null //Carbon
var/notransform = null //Carbon
var/other = 0.0
var/hand = null
var/eye_blind = null //Carbon
+1 -1
View File
@@ -190,7 +190,7 @@
if(isAI(mob))
return AIMove(n,direct,mob)
if(mob.monkeyizing) return//This is sota the goto stop mobs from moving var
if(mob.notransform) return//This is sota the goto stop mobs from moving var
if(isliving(mob))
var/mob/living/L = mob
+15 -15
View File
@@ -5,14 +5,14 @@
/*
/mob/living/carbon/human/proc/monkeyize()
if (monkeyizing)
if (notransform)
return
for(var/obj/item/W in src)
if (W==w_uniform) // will be torn
continue
unEquip(W)
regenerate_icons()
monkeyizing = 1
notransform = 1
canmove = 0
stunned = 1
icon = null
@@ -62,7 +62,7 @@
return ..()
/mob/living/carbon/human/AIize(move=1) // 'move' argument needs defining here too because BYOND is dumb
if (monkeyizing)
if (notransform)
return
for(var/t in organs)
del(t)
@@ -70,11 +70,11 @@
return ..(move)
/mob/living/carbon/AIize()
if (monkeyizing)
if (notransform)
return
for(var/obj/item/W in src)
unEquip(W)
monkeyizing = 1
notransform = 1
canmove = 0
icon = null
invisibility = 101
@@ -178,12 +178,12 @@
//human -> robot
/mob/living/carbon/human/proc/Robotize()
if (monkeyizing)
if (notransform)
return
for(var/obj/item/W in src)
unEquip(W)
regenerate_icons()
monkeyizing = 1
notransform = 1
canmove = 0
icon = null
invisibility = 101
@@ -236,12 +236,12 @@
//human -> alien
/mob/living/carbon/human/proc/Alienize()
if (monkeyizing)
if (notransform)
return
for(var/obj/item/W in src)
unEquip(W)
regenerate_icons()
monkeyizing = 1
notransform = 1
canmove = 0
icon = null
invisibility = 101
@@ -267,12 +267,12 @@
return
/mob/living/carbon/human/proc/slimeize(adult as num, reproduce as num)
if (monkeyizing)
if (notransform)
return
for(var/obj/item/W in src)
unEquip(W)
regenerate_icons()
monkeyizing = 1
notransform = 1
canmove = 0
icon = null
invisibility = 101
@@ -302,12 +302,12 @@
return
/mob/living/carbon/human/proc/corgize()
if (monkeyizing)
if (notransform)
return
for(var/obj/item/W in src)
unEquip(W)
regenerate_icons()
monkeyizing = 1
notransform = 1
canmove = 0
icon = null
invisibility = 101
@@ -332,13 +332,13 @@
usr << "\red Sorry but this mob type is currently unavailable."
return
if(monkeyizing)
if(notransform)
return
for(var/obj/item/W in src)
unEquip(W)
regenerate_icons()
monkeyizing = 1
notransform = 1
canmove = 0
icon = null
invisibility = 101
+2
View File
@@ -108,6 +108,8 @@
if(H.species.name == "Golem")
user << "\red Your metal fingers don't fit in the trigger guard!"
return
if(user.dna && user.dna.species == "Shadowling")
user << "<span class='danger'>The muzzle flash would cause damage to your form!</span>"
add_fingerprint(user)
@@ -12,8 +12,8 @@
/obj/item/projectile/change/proc/wabbajack (mob/M as mob in living_mob_list)
if(istype(M, /mob/living) && M.stat != DEAD)
if(M.monkeyizing) return
M.monkeyizing = 1
if(M.notransform) return
M.notransform = 1
M.canmove = 0
M.icon = null
M.overlays.Cut()
+2 -2
View File
@@ -127,8 +127,8 @@
proc/wabbajack(mob/living/M)
if(istype(M))
if(istype(M, /mob/living) && M.stat != DEAD)
if(M.monkeyizing) return
M.monkeyizing = 1
if(M.notransform) return
M.notransform = 1
M.canmove = 0
M.icon = null
M.overlays.Cut()
+2 -2
View File
@@ -393,8 +393,8 @@ datum
if(!M) M = holder.my_atom
if(istype(M, /mob/living/carbon) && M.stat != DEAD)
M << "\red Your flesh rapidly mutates!"
if(M.monkeyizing) return
M.monkeyizing = 1
if(M.notransform) return
M.notransform = 1
M.canmove = 0
M.icon = null
M.overlays.Cut()