Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Шадоулинги #1576

Draft
wants to merge 29 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
ecdba9b
Shadowling species
ThaumicNik Sep 11, 2024
a9626fb
Merge branch 'ss220club:master' into shadowlings
ThaumicNik Sep 15, 2024
bbd7ff6
Abilities WIP
ThaumicNik Sep 15, 2024
76679a1
Merge branch 'shadowlings' of https://github.com/ThaumicNik/Paradise-…
ThaumicNik Sep 15, 2024
e30ddc9
Shadowling Glare
ThaumicNik Sep 16, 2024
aaba939
Shadow walk
ThaumicNik Sep 16, 2024
0a095c3
Icy veins
ThaumicNik Sep 17, 2024
9e8b8ad
Screech
ThaumicNik Sep 17, 2024
1794c87
Blindness smoke
ThaumicNik Sep 17, 2024
ac3e1cd
Veil
ThaumicNik Sep 17, 2024
d2b483c
Glare rename
ThaumicNik Sep 17, 2024
515f005
Father of shadows WIP
ThaumicNik Sep 21, 2024
1e87b00
Shadowling Traps
ThaumicNik Sep 29, 2024
88a1d42
Merge branch 'ss220club:master' into shadowlings
ThaumicNik Sep 29, 2024
72abf85
Shadowling Traps v2
ThaumicNik Sep 29, 2024
36df635
Action icons
ThaumicNik Oct 2, 2024
d163da4
Merge branch 'shadowlings' of https://github.com/ThaumicNik/Paradise-…
ThaumicNik Oct 2, 2024
73fc0e7
Additional icons
ThaumicNik Oct 2, 2024
31f2e8a
Balance tweaks
ThaumicNik Oct 2, 2024
ede9e5e
Merge branch 'shadowlings' of https://github.com/ThaumicNik/Paradise-…
ThaumicNik Oct 2, 2024
b1bd36d
Shadowling Clothes
ThaumicNik Oct 4, 2024
28c040e
Corpse consuming
ThaumicNik Oct 4, 2024
7213b26
Shadowling Datums
ThaumicNik Oct 8, 2024
f5d7b37
Merge branch 'shadowlings' of https://github.com/ThaumicNik/Paradise-…
ThaumicNik Oct 8, 2024
2e3ac2b
Shadow father datum fix
ThaumicNik Oct 8, 2024
86fd1dd
Shadowling Invasion
ThaumicNik Oct 8, 2024
bc8f72d
Few small features
ThaumicNik Oct 14, 2024
90329ee
Merge remote-tracking branch 'upstream' into shadowlings
ThaumicNik Nov 4, 2024
522fe2b
Shadowling hatching
ThaumicNik Nov 4, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions modular_ss220/_defines220/code/antagonists.dm
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#define ROLE_BLOOD_BROTHER "blood brother"
#define ROLE_VOX_RAIDER "vox raider"
#define ROLE_SHADOWLING "shadowling"

#define VOX_RAID_FREQ 1220

Expand Down
3 changes: 3 additions & 0 deletions modular_ss220/_defines220/code/gamemode.dm
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
#define SPECIAL_ROLE_BLOOD_BROTHER "Blood Brother"
#define SPECIAL_ROLE_VOX_RAIDER "Vox Raider"
#define SPECIAL_ROLE_SHADOWLING "Shadowling"
#define SPECIAL_ROLE_SHADOWLING_THRALL "Shadowling Thrall"
#define SPECIAL_ROLE_SHADOW_FATHER "Shadow Father"

#define isvoxcash(W) (istype(W, /obj/item/stack/vox_cash))

Expand Down
3 changes: 3 additions & 0 deletions modular_ss220/_defines220/code/species.dm
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
#define isnucleation(A) (is_species(A, /datum/species/nucleation))

#define isshadowling(A) (is_species(A, /datum/species/shadow/ling))
#define isshadowlinglesser(A) (is_species(A, /datum/species/shadow/ling/lesser))

//MATERIAL CLASS FOR RACE EAT
#define MATERIAL_CLASS_NONE 0
#define MATERIAL_CLASS_CLOTH 1
Expand Down
3 changes: 3 additions & 0 deletions modular_ss220/antagonists/_antagonists.dm
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@
GLOB.huds += new/datum/atom_hud/antag()
GLOB.special_roles |= ROLE_VOX_RAIDER

GLOB.huds += new/datum/atom_hud/antag()
GLOB.special_roles |= ROLE_SHADOWLING

SSradio.ANTAG_FREQS |= list(VOX_RAID_FREQ)

SSradio.radiochannels |= list(
Expand Down
21 changes: 21 additions & 0 deletions modular_ss220/antagonists/_antagonists.dme
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,24 @@
#include "code/configuration/antag_mix_configuration.dm"
#include "code/mind/memory_edit.dm"
#include "code/antag_mix/antag_mix.dm"
#include "code/shadowlings/shadowling_datum.dm"
#include "code/shadowlings/shadowling_species.dm"
#include "code/shadowlings/shadowling_language.dm"
#include "code/shadowlings/shadowling_eyes.dm"
#include "code/shadowlings/spells/shadowling_spell.dm"
#include "code/shadowlings/spells/shadowling_glare.dm"
#include "code/shadowlings/spells/shadowling_shadow_walk.dm"
#include "code/shadowlings/spells/shadowling_icy_veins.dm"
#include "code/shadowlings/spells/shadowling_screech.dm"
#include "code/shadowlings/spells/shadowling_blindness_smoke.dm"
#include "code/shadowlings/spells/shadowling_veil.dm"
#include "code/shadowlings/spells/shadowling_enthrall.dm"
#include "code/shadowlings/spells/shadowling_tear_the_reality.dm"
#include "code/shadowlings/spells/shadowling_rift_in.dm"
#include "code/shadowlings/spells/shadow_father_crawl.dm"
#include "code/shadowlings/shadowling_clothes.dm"
#include "code/shadowlings/spells/shadowling_hatch.dm"
#include "code/shadowlings/father_of_shadows.dm"
#include "code/shadowlings/shadowling_traps.dm"
#include "code/shadowlings/shadowling_gamemode.dm"
#include "code/shadowlings/shadowling_mob.dm"
164 changes: 164 additions & 0 deletions modular_ss220/antagonists/code/shadowlings/father_of_shadows.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
#define HEALTH_DECREASING_AMOUNT 70
#define MAX_CONSUMED_CORPSES 4

/mob/living/simple_animal/demon/shadow_father // Can't inherit from demon/shadow because of 'initialize' proc
name = "отец теней"
desc = "Крупное демоническое существо, сотканное из теней. Из его красных глаз сочится потусторонняя энергия."
icon = 'modular_ss220/antagonists/icons/shadowlings/father_of_shadows.dmi'
icon_state = "father_of_shadows"
icon_living = "father_of_shadows"
a_intent = INTENT_HARM
mob_biotypes = MOB_ORGANIC | MOB_HUMANOID
stop_automated_movement = TRUE
status_flags = CANPUSH
attack_sound = 'sound/misc/demon_attack1.ogg'
death_sound = 'sound/misc/demon_dies.ogg'
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
maxbodytemp = INFINITY
faction = list("demon")
move_resist = MOVE_FORCE_STRONG
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
see_in_dark = 10
death_sound = 'sound/shadowdemon/shadowdeath.ogg'
speed = 1
maxHealth = 350
health = 350
/// Used to check light exposure alert state
var/thrown_alert
/// Contain list of all traps placed by this shadow father
var/list/obj/structure/shadow_trap/placed_traps = list()
/// Used to check state in consumption logic
var/is_consuming = FALSE
/// Amount of bodies, consumed by the shadow father
var/consumed = 0
/// Used to initialize hud
var/mind_initialized = FALSE

/mob/living/simple_animal/demon/shadow_father/Login()
. = ..()
var/list/L = list(
"<span class='deadsay'><font size=3><b>Вы Отец Тьмы!</b></font></span>",
"<b>Вы коварный и подлый антагонист, который должен подготовить эту станцию для прихода своих детей.</b>",
"<b>Свет - ваш худший враг, но вы не получаете от него урона, находясь в астральной форме.</b>",
"<b>Подготавливайте ловушки и засады в технических туннелях, после чего заманивайте в них жертв.</b>",
"<b>Погружайте в тень тела погибших членов экипажа, чтобы, в будущем, превратить их в своих детей.</b>",
"<b>Накопив достаточно погружённых, издайте свой последний вопль и призовите на станцию тенелингов.</b>",
"<b><i></i></b>",
"<br><span class='motd'>Для подробной информации, посетите вики: [wiki_link("Shadowlings")]</span>"
)
to_chat(src, chat_box_red(L.Join("<br>")))
if(!mind || mind_initialized)
return
mind_initialized = TRUE
var/datum/atom_hud/hud = GLOB.huds[ANTAG_HUD_SHADOW]
hud.add_hud_to(src)
mind.add_antag_datum(/datum/antagonist/shadow_father)

/mob/living/simple_animal/demon/shadow_father/Initialize(mapload)
. = ..()
add_overlay(emissive_appearance(icon, "father_of_shadows_eye_glow_overlay"))
grant_spells()

/mob/living/simple_animal/demon/shadow_father/Life(seconds, times_fired)
. = ..()
var/lum_count = check_darkness()
var/damage_mod = istype(loc, /obj/effect/dummy/slaughter) ? 0.5 : 1
if(lum_count > 0.2)
adjustBruteLoss(40 * damage_mod) // 10 seconds in light
SEND_SOUND(src, sound('sound/weapons/sear.ogg'))
to_chat(src, "<span class='biggerdanger'>The light scalds you!</span>")
else
adjustBruteLoss(-20)

/mob/living/simple_animal/demon/shadow_father/death(gibbed)
for(var/trap in placed_traps)
qdel(trap)
INVOKE_ASYNC(SSticker.mode, TYPE_PROC_REF(/datum/game_mode, begin_shadowling_invasion), src, FALSE)
return ..(gibbed)

/mob/living/simple_animal/demon/shadow_father/proc/check_darkness()
var/turf/T = get_turf(src)
var/lum_count = T.get_lumcount()
if(lum_count > 0.2)
if(!thrown_alert)
thrown_alert = TRUE
throw_alert("light", /atom/movable/screen/alert/lightexposure)
alpha = 255
speed = initial(speed)
else
if(thrown_alert)
thrown_alert = FALSE
clear_alert("light")
alpha = 125
speed = 0.5
return lum_count

/mob/living/simple_animal/demon/shadow_father/proc/grant_spells()
whisper_action.button_overlay_icon = 'modular_ss220/antagonists/icons/shadowlings/shadowlings_actions.dmi'
whisper_action.button_overlay_icon_state = "father_whisper"
whisper_action.button_background_icon_state = "shadow_demon_bg"

var/list/datum/spell/spells_to_grant = list(
new /datum/spell/bloodcrawl/shadow_crawl/father,
new /datum/spell/shadowling/veil,
new /datum/spell/shadowling/screech,
new /datum/spell/shadowling/glare,
new /datum/spell/shadowling/self/place_trap/stun,
new /datum/spell/shadowling/self/place_trap/poison,
new /datum/spell/shadowling/self/place_trap/blindness,
new /datum/spell/shadowling/self/tear_the_reality,
)
for(var/datum/spell/spell in spells_to_grant)
AddSpell(spell)

/mob/living/simple_animal/demon/shadow_father/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum)
if(isliving(AM)) // when a living creature is thrown at it, dont knock it back
return
..()

/mob/living/simple_animal/demon/shadow_father/UnarmedAttack(atom/A)
// Prevent self-attack
if(A == src)
return
// Pick a random attack sound for each attack
attack_sound = pick('sound/shadowdemon/shadowattack2.ogg', 'sound/shadowdemon/shadowattack3.ogg', 'sound/shadowdemon/shadowattack4.ogg')
if(!ishuman(A))
if(isitem(A))
A.extinguish_light()
return ..()
var/mob/living/carbon/human/target = A
if(target.stat != DEAD)
return ..()

if(isLivingSSD(target) && client.send_ssd_warning(target) || isnull(target.mind))
return

if(is_consuming)
to_chat(src, span_notice("Мы уже поглощаем кого-то."))
return

if(consumed == MAX_CONSUMED_CORPSES)
return

visible_message(span_danger("[src] начинает окутывать [target] теневой пеленой!"))
is_consuming = TRUE
playsound(src, 'modular_ss220/antagonists/sound/shadowlings/shadow_consumption_start.ogg', 50, TRUE)
if(!do_after(src, 15 SECONDS, FALSE, target = target))
is_consuming = FALSE
return

target.visible_message(span_danger("[src] полностью окутывает [target] тенями и тело исчезает в потусторонней пелене! [src], похоже, стал слабее!"))
qdel(target)
playsound(src, 'modular_ss220/antagonists/sound/shadowlings/shadow_consumption_end.ogg', 50, TRUE)
maxHealth -= HEALTH_DECREASING_AMOUNT
health = clamp(health, 0, maxHealth)
consumed++
if(consumed < MAX_CONSUMED_CORPSES)
to_chat(src, span_purple("Мы успешно погрузили тело жервты во тьму. Мы слабеем, но теперь после нашей смерти в мир явится больше тенелингов. Мы можем поглотить ещё [MAX_CONSUMED_CORPSES - consumed] тел."))
else
to_chat(src, span_purple("Это была последняя жертва. Всё что мы теперь можем сделать, это начать прорыв завесы."))
is_consuming = FALSE

#undef HEALTH_DECREASING_AMOUNT
#undef MAX_CONSUMED_CORPSES
81 changes: 81 additions & 0 deletions modular_ss220/antagonists/code/shadowlings/shadowling_clothes.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
/obj/item/clothing/under/shadowling
name = "почерневшая плоть"
desc = "Чёрная хитинистая кожа с выступающими красными венами."
icon = 'modular_ss220/antagonists/icons/shadowlings/shadowlings_clothes.dmi'
icon_state = "shadowling_uniform"
origin_tech = null
flags = NODROP | DROPDEL
has_sensor = FALSE
displays_id = FALSE
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF


/obj/item/clothing/suit/space/shadowling
name = "теневой панцирь"
desc = "Тёмный полупросрачный панцирь, защищающий тенелинга от урона и немного от космоса." //Still takes damage from spacewalking but is immune to space itself
icon = 'modular_ss220/antagonists/icons/shadowlings/shadowlings_clothes.dmi'
icon_state = "shadowling_suit"
icon_override = 'icons/mob/clothing/underwear.dmi' // It's required to avoid 'suit' test icon
body_parts_covered = FULL_BODY //Shadowlings are immune to space
cold_protection = FULL_BODY
min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT
flags_inv = HIDEGLOVES | HIDESHOES | HIDEJUMPSUIT
flags = NODROP | DROPDEL
slowdown = 0
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
heat_protection = null //You didn't expect a light-sensitive creature to have heat resistance, did you?
max_heat_protection_temperature = null
armor = list(melee = 25, bullet = 25, laser = 0, energy = 10, bomb = 25, bio = 100, rad = 100, fire = 100, acid = 100)


/obj/item/clothing/shoes/shadowling
name = "теневые крюки"
desc = "Угольно-чёрные крюки, расположенные на ногах тенелингов."
icon = 'modular_ss220/antagonists/icons/shadowlings/shadowlings_clothes.dmi'
icon_state = "shadowling_shoes"
resistance_flags = LAVA_PROOF|FIRE_PROOF|ACID_PROOF
flags = NODROP | DROPDEL
no_slip = TRUE

/obj/item/clothing/mask/gas/shadowling
name = "теневая маска"
desc = "Тёмная хитиновая маска, располагающаяся на лицах тенелингов."
icon = 'modular_ss220/antagonists/icons/shadowlings/shadowlings_clothes.dmi'
icon_state = "shadowling_mask"
siemens_coefficient = 0
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
flags_cover = MASKCOVERSEYES
flags = NODROP | DROPDEL

/obj/item/clothing/gloves/shadowling
name = "теневые наручи"
desc = "Плотной слой теневой материи, защищающий руки тенелинга от и электричества."
icon = 'modular_ss220/antagonists/icons/shadowlings/shadowlings_clothes.dmi'
icon_state = "shadowling_gloves"
siemens_coefficient = 0
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
flags = NODROP | DROPDEL

/obj/item/clothing/head/shadowling
name = "теневой шлем"
desc = "Шлемообразный защитный панцирь, расположенный на голове тенелинга."
icon = 'modular_ss220/antagonists/icons/shadowlings/shadowlings_clothes.dmi'
icon_state = "shadowling_helmet"
cold_protection = HEAD
min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT
heat_protection = HEAD
max_heat_protection_temperature = SPACE_HELM_MAX_TEMP_PROTECT
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
flags_cover = HEADCOVERSEYES //We don't need to cover mouth
flags = NODROP | DROPDEL | BLOCKHAIR

/obj/item/clothing/glasses/shadowling
name = "багровые линзы"
desc = "Небольшие красные мембраны, защищающие уязвимые глаза тенелингов."
icon = 'modular_ss220/antagonists/icons/shadowlings/shadowlings_clothes.dmi'
icon_state = "shadowling_glasses"
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
flash_protect = FLASH_PROTECTION_SENSITIVE
vision_flags = SEE_MOBS
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
flags = NODROP | DROPDEL
32 changes: 32 additions & 0 deletions modular_ss220/antagonists/code/shadowlings/shadowling_datum.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
/datum/antagonist/shadowling
name = "Shadowling"
antag_hud_type = ANTAG_HUD_SHADOW
antag_hud_name = "hudshadowling"
job_rank = ROLE_SHADOWLING
special_role = SPECIAL_ROLE_SHADOWLING
wiki_page_name = "Shadowlings"

/datum/antagonist/shadow_father
name = "Shadow Father"
antag_hud_type = ANTAG_HUD_SHADOW
antag_hud_name = "hudshadowfather"
job_rank = ROLE_SHADOWLING // I don't change it, so there is no different database line for shadowling roles
special_role = SPECIAL_ROLE_SHADOW_FATHER
wiki_page_name = "Shadowlings"

/datum/antagonist/shadowling_thrall
name = "Shadowling Thrall"
antag_hud_type = ANTAG_HUD_SHADOW
antag_hud_name = "hudshadowlingthrall"
job_rank = ROLE_SHADOWLING // I don't change it, so there is no different database line for shadowling roles
special_role = SPECIAL_ROLE_SHADOWLING_THRALL
wiki_page_name = "Shadowlings"

/proc/is_thrall(var/mob/living/M)

Check failure on line 25 in modular_ss220/antagonists/code/shadowlings/shadowling_datum.dm

View workflow job for this annotation

GitHub Actions / Run Linters

Check Grep

modular_ss220/antagonists/code/shadowlings/shadowling_datum.dm:25: Changed files contains a proc argument starting with 'var'.
return TRUE

/proc/is_shadow_or_thrall(var/mob/living/M)

Check failure on line 28 in modular_ss220/antagonists/code/shadowlings/shadowling_datum.dm

View workflow job for this annotation

GitHub Actions / Run Linters

Check Grep

modular_ss220/antagonists/code/shadowlings/shadowling_datum.dm:28: Changed files contains a proc argument starting with 'var'.
return TRUE

/proc/is_shadow(var/mob/living/M)

Check failure on line 31 in modular_ss220/antagonists/code/shadowlings/shadowling_datum.dm

View workflow job for this annotation

GitHub Actions / Run Linters

Check Grep

modular_ss220/antagonists/code/shadowlings/shadowling_datum.dm:31: Changed files contains a proc argument starting with 'var'.
return TRUE
6 changes: 6 additions & 0 deletions modular_ss220/antagonists/code/shadowlings/shadowling_eyes.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
// Changing the organ usage action background
/obj/item/organ/internal/eyes/night_vision/nightmare
actions_types = list(/datum/action/item_action/organ_action/use/shadowling)

/datum/action/item_action/organ_action/use/shadowling
button_background_icon_state = "shadow_demon_bg"
31 changes: 31 additions & 0 deletions modular_ss220/antagonists/code/shadowlings/shadowling_gamemode.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/datum/game_mode
var/list/datum/mind/shadowlings = list()
var/list/datum/mind/shadowling_thralls = list()
var/list/datum/mind/shadow_fathers = list()
var/victory_warning_announced = FALSE

/// Called when shadow father is killed or when special spell is used
/datum/game_mode/proc/begin_shadowling_invasion(mob/living/simple_animal/demon/shadow_father/father, spell_used)
// Spawning father as shadowling
if(spell_used)
var/obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter(father.loc)
var/mob/living/carbon/human/shadowling/ling = new /mob/living/carbon/human/shadowling(holder)
ling.AddSpell(new /datum/spell/shadowling/self/rift_in)
ling.key = father.key
else
father.consumed++ //At least one shadowling
var/list/mob/dead/observer/candidates = SSghost_spawns.poll_candidates("Вы хотите поиграть за тенелинга?", ROLE_SHADOWLING, TRUE, 25 SECONDS, source = /mob/living/simple_animal/demon/shadow_father, role_cleanname = "Shadowling")
while(father.consumed > 0)
if(candidates.len < 1)
break
var/player_to_spawn
var/mob/dead/observer/ghost = pick(candidates)
candidates.Remove(ghost)
player_to_spawn = ghost.key
var/obj/effect/dummy/slaughter/holder = new /obj/effect/dummy/slaughter(father.loc)
var/mob/living/carbon/human/shadowling/ling = new /mob/living/carbon/human/shadowling(holder)
ling.AddSpell(new /datum/spell/shadowling/self/rift_in)
dust_if_respawnable(ghost)
ling.key = player_to_spawn
father.consumed--

18 changes: 18 additions & 0 deletions modular_ss220/antagonists/code/shadowlings/shadowling_language.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
/datum/language/shadowling
name = "Шёпот из тени"
desc = "В тени всегда есть те, кто слышит все ваши секреты. Шадоулинги используют рэдспейс для связи между собой."
speech_verb = "says"
colour = "purple"
key = "sl"
flags = RESTRICTED | HIVEMIND | NOBABEL
follow = TRUE

/datum/language/shadowling/get_random_name()
var/new_name
if(prob(0.1))
new_name = "Лучик Доброты" // :)
else
// Edgelord names ahead
new_name += "[pick("Владыка", "Поработитель", "Повелитель", "Мучитель", "Пожиратель", "Угнетатель", "Судья", "Убийца", "Уничтожитель", "Тиран")]"
new_name += " [pick("Тьмы", "Тени", "Темноты", "Ужаса", "Страха", "Ненависти", "Зависти", "Злости", "Греха", "Мрака", "Боли", "Кары")]"
return new_name
Loading
Loading