Night troll

Ночные тролли Ñ — разновидность созданий ночи. Это сверхъестественные монстры, которые похищают негоблинских цивилизованных существ и превращают их в своих супругов, после чего спариваются с ними ради получения потомства. Все дети имеют тот же пол, что и ночной тролль-похититель, и никогда — пол супруга, если только они не были зачаты каким-то иным способом в режиме крепости. В режиме приключений ночные тролли и их супруги могут становиться целями квестов. Они никак не связаны с обычными троллями.
Графически, спрайты, используемые ночными троллями по умолчанию, представляют собой деформированных человекоподобных существ, что приближенно отображает их сгенерированный внешний вид из их описания. То же справедливо и для других процедурно создаваемых существ, таких как бугимены и малые эксперименты. Спрайты ночных троллей меньше, чем у других процедурных существ, например демонов, ангелов и мегачудовищ.
Характеристики

Подобно бугименам, забытым тварям и титанам, все ночные тролли случайно генерируются при создании мира и отличаются друг от друга. Их количество обычно зависит от размера мира, но может напрямую регулироваться при продвинутой генерации мира — если в настройке "Number of Night Troll Types" указать 0, ночные тролли вовсе не появятся. Не все ночные тролли называются "ночными троллями": возможные названия, помимо слов night, evil и darkness, включают bridegroom, crone, freak, groom, hag, horror, man, monster, ogre, ogress, troll и woman. Ночные тролли связаны со сферами смерти и ночи, что отражается в их именах.
Хотя ночные тролли процедурно генерируются, им свойственны общие черты. Они — гуманоидные сказочные существа, с принадлежностью ко злу, и могут обладать самыми разными особенностями: например, выглядеть как крупные пернатые женщины или массивные одноглазые мужчины без кожи, с рогами и хоботом. У некоторых есть крылья, позволяющие летать, хотя используют они их обычно только в бою против других летающих существ. В описании каждого ночного тролля обязательно упоминается характер его движений (например, неровные движения, дерганные движения) и состояние кожи (гладкая, грубая, бородавчатая, кожистая и т. д.). Их логово выглядит как насыпь или нора в земле, снабжённая дверью или люком. В логове могут находиться различные предметы: инструменты (ножи, вилки, тесаки), немного монет и одежды жертв, трупы, пища из органов или костей разумных существ, котлы с кровью или водой с едой (мясо, кости, целые скелеты, останки вредителей; изредка даже элементы брони), костная мука, вредители, черепа жертв как трофеи и даже жернова. Обычно в логове живёт один тролль, но иногда встречаются семьи из пяти и даже десяти существ. Согласно Toady One1, логова ночных троллей имеют уникальный тег, позволяющий предметам внутри не разрушаться и не гнить.
Все ночные тролли обладают навыками борьбы, кусания, сражения, битья, пинания, уклонения и наблюдения на уровне Talented, а также бонусами ко всем физическим атрибутам. Они могут дышать под водой, не устают, не оглушаются и не чувствуют боли, а также невосприимчивы к тошноте, головокружению и лихорадке. Ночные тролли не нуждаются в еде, воде, сне и дыхании — их невозможно утопить или задушить. В их raw-файлах также прописаны невосприимчивость к ловушкам, способность разрушать здания и ценность питомца 2000. В режиме крепости они встречаются только в своих логовах и почти не способны разрушать постройки или взаимодействовать с ловушками; также у них нет токенов, необходимых для дрессировки (хотя некоторые виды, будучи [SLOW_LEARNER], крайне редко могут стать приспешниками гоблинов, вероятно из-за бага). Ночные тролли могут замечать невидимых существ так же, как вампиры, хотя на практике это почти никогда не проявляется, поскольку ночные тролли не являются играбельной расой.
Размеры тела ночных троллей сильно варьируются — приблизительно от роста крупного дварфа до размеров взрослого оленя. Их супруги могут быть крупнее или меньше похитителей, в зависимости от вида тролля. Приключенцы могут почувствовать запах ночного тролля через o — он описывается как запах "смерти", "печёной плоти" или "внутренностей жуков".
Дварфам могут нравиться ночные тролли за их macabre ways.
Размножение ночных троллей

Как уже упоминалось, ночные тролли похищают существо, не принадлежащее гоблинской цивилизации, и превращают его в ночного тролля противоположного пола (этот механизм, а также причины невозможности преобразования гоблинов неизвестны). Любопытно, что похитителем может быть как самец, так и самка, и в одном мире легко могут существовать тролли обоих полов. Причина, по которой ночные тролли предпочитают похищать жертв, вместо размножения между собой, неизвестна; тот факт, что потомство всегда одного пола с похитителем, намекает на возможные проблемы с размножением между "естественно рождёнными" ночными троллями. Поскольку они предположительно разумны, причиной может быть и культурное табу на спаривание с троллем, которого сам не похитил и не преобразовал, хотя это порождает вопрос, зачем им вообще способность к преобразованию.
Неизвестно, могут ли супруги спариваться с другим ночным троллем противоположного пола (или вообще с кем-то, кроме собственного похитителя). Неясно также, способны ли они сами похищать и превращать жертв, например если их собственный тролль-похититель погибает.
Интересен генетический аспект: подобный тип размножения фактически создаёт генетический барьер, означающий, что если бы гены и мутации были добавлены в качестве игровой механики, изначальные ночные тролли мужского пола и изначальные ночные тролли женского пола в конечном итоге разделялись бы на отдельные виды, поскольку мутация, возникшая среди одного пола, не могла бы попасть в генофонд другого пола.
Если ночные тролли рожают в режиме крепости, дети становятся дружественны к крепости. Они не носят своих детёнышей, за исключением ситуаций, когда превращены в жителей крепости с помощью dfhack.
Борьба с ночными троллями
Ночные тролли — сильные, но не особенно опасные противники, если действуют в одиночку. Они крупнее людей, поэтому бороться с ними сложнее, также им тяжелее нанести урон тупыми атаками чем людям. Кроме того, они не чувствуют боли и не нуждаются в дыхании, так что их нельзя оглушить или задушить.
В их логове иногда можно найти один из разделочных инструментов, например нож или тесак. Обычно они нападают без оружия, но их удары, пинки и особенно укусы могут наносить серьёзный урон из-за большого размера. На самом деле зубы — самое опасное оружие ночного тролля, поэтому если он держит в руках режущий инструмент, не стоит разоружать его: тролли всегда предпочитают использовать вооружённые атаки. Особенно избегайте попаданий в позвоночник: для тролля это не смертельно, так как функции дыхания ему не нужны, но он может потерять возможность пользоваться ногами, руками или крыльями (если они есть). Зато это вынудит его постоянно использовать свою самую сильную атаку.
Ночные тролли могут погибнуть от кровопотери, повреждения мозга, обезглавливания или разрубания пополам. Они никогда не носят одежду или доспехи, поэтому их конечности легко отрубить. Наибольший урон им наносят колющие и рубящие атаки. Будьте особенно осторожны с троллями и другими созданиями ночи, обладающими рогами.
Пример raws (извлечено из world.sav) |
|---|
[OBJECT:CREATURE]
[CREATURE:NIGHT_CREATURE_26]
[NAME:hag of twilight:hags of twilight:hag of twilight]
[GENERATED]
[ATTACK_TRIGGER:20:0:0]
[NIGHT_CREATURE_HUNTER]
[BIOME:ANY_FOREST]
[BIOME:ANY_SHRUBLAND]
[BIOME:ANY_SAVANNA]
[BIOME:ANY_GRASSLAND]
[BIOME:ANY_WETLAND]
[BIOME:TUNDRA]
[CASTE:FEMALE]
[FEMALE]
[SPOUSE_CONVERTER]
[ORIENTATION:MALE:0:0:1]
[ORIENTATION:FEMALE:1:0:0]
[CASTE:MALE]
[MALE]
[CONVERTED_SPOUSE]
[SELECT_CASTE:ALL]
[CAN_LEARN]
[CAN_SPEAK]
[SENSE_CREATURE_CLASS:15:4:0:1]
[PHYS_ATT_RANGE:STRENGTH:450:550:700:750:800:850:900]
[PHYS_ATT_RANGE:AGILITY:1000:1250:1500:2000:2250:2500:3000]
[PHYS_ATT_RANGE:TOUGHNESS:850:900:950:1000:1050:1100:1150]
[PHYS_ATT_RANGE:ENDURANCE:850:900:950:1000:1050:1100:1150]
[PHYS_ATT_RANGE:RECUPERATION:450:1050:1150:1250:1350:1550:2250]
[PHYS_ATT_RANGE:DISEASE_RESISTANCE:700:1300:1400:1500:1600:1800:2500]
[MENT_ATT_RANGE:ANALYTICAL_ABILITY:1250:1500:1750:2000:2500:3000:5000]
[MENT_ATT_RANGE:FOCUS:1250:1500:1750:2000:2500:3000:5000]
[MENT_ATT_RANGE:WILLPOWER:1250:1500:1750:2000:2500:3000:5000]
[MENT_ATT_RANGE:PATIENCE:0:333:666:1000:2333:3666:5000]
[MENT_ATT_RANGE:MEMORY:1250:1500:1750:2000:2500:3000:5000]
[MENT_ATT_RANGE:LINGUISTIC_ABILITY:450:1050:1150:1250:1350:1550:2250]
[MENT_ATT_RANGE:MUSICALITY:0:333:666:1000:2333:3666:5000]
[MENT_ATT_RANGE:SOCIAL_AWARENESS:700:1300:1400:1500:1600:1800:2500]
[PERSONALITY:BASHFUL:0:0:0]
[PERSONALITY:STRESS_VULNERABILITY:0:0:0]
[PERSONALITY:FRIENDLINESS:0:0:0]
[PERSONALITY:DISDAIN_ADVICE:100:100:100]
[PERSONALITY:CHEER_PROPENSITY:0:0:0]
[PERSONALITY:GRATITUDE:0:0:0]
[PERSONALITY:TRUST:0:0:0]
[PERSONALITY:ALTRUISM:0:0:0]
[PERSONALITY:CRUELTY:100:100:100]
[NATURAL_SKILL:WRESTLING:6]
[NATURAL_SKILL:BITE:6]
[NATURAL_SKILL:GRASP_STRIKE:6]
[NATURAL_SKILL:STANCE_STRIKE:6]
[NATURAL_SKILL:MELEE_COMBAT:6]
[NATURAL_SKILL:DODGING:6]
[NATURAL_SKILL:SITUATIONAL_AWARENESS:6]
[DIFFICULTY:1]
[LAIR:SIMPLE_BURROW:50]
[LAIR:SIMPLE_MOUND:50]
[LAIR_CHARACTERISTIC:HAS_DOORS:100]
[HABIT_NUM:TEST_ALL]
[HABIT:GRIND_BONE_MEAL:50]
[HABIT:COOK_BLOOD:50]
[HABIT:GRIND_VERMIN:50]
[HABIT:COOK_VERMIN:50]
[HABIT:COOK_PEOPLE:50]
[HABIT:COLLECT_TROPHIES:50]
[ODOR_STRING:death]
[ODOR_LEVEL:90]
[NO_DRINK]
[NO_EAT]
[NO_SLEEP]
[BODY_APPEARANCE_MODIFIER:HEIGHT:90:95:98:100:102:105:110]
[BODY_APPEARANCE_MODIFIER:BROADNESS:90:95:98:100:102:105:110]
[LARGE_PREDATOR]
[EVIL]
[SUPERNATURAL]
[FANCIFUL]
[AMPHIBIOUS]
[PETVALUE:2000]
[GRASSTRAMPLE:20]
[BUILDINGDESTROYER:2]
[ALL_ACTIVE]
[SWIMS_INNATE]
[TRAPAVOID]
[NOPAIN]
[NOSTUN]
[NONAUSEA]
[NOFEAR]
[NOEXERT]
[NO_DIZZINESS]
[NO_FEVERS]
[LARGE_PREDATOR]
[SPHERE:DEATH]
[SPHERE:NIGHT]
[SELECT_CASTE:FEMALE]
[BODY_SIZE:0:0:5900]
[BODY_SIZE:2:0:29500]
[BODY_SIZE:12:0:118000]
[SELECT_CASTE:MALE]
[BODY_SIZE:0:0:106000]
[SELECT_CASTE:ALL]
[BABY:1]
[CHILD:12]
[CREATURE_TILE:165]
[BODY:RCP_UPPER_BODY:RCP_LOWER_BODY:RCP_NECK:RCP_HEAD:RCP_TWO_PART_ARMS:RCP_TWO_PART_LEGS:RCP_TAIL:RCP_2_EYES:RCP_LUNGS:RCP_HEART:RCP_GUTS:RCP_THROAT:RCP_SPINE:RCP_UPPER_SPINE:RCP_BRAIN:RCP:SKULL:RCP_MOUTH:RCP_TONGUE:RCP_RIBS]
[CANOPENDOORS]
[EQUIPS]
[BODY_DETAIL_PLAN:STANDARD_MATERIALS]
[REMOVE_MATERIAL:HAIR]
[BODY_DETAIL_PLAN:STANDARD_TISSUES]
[REMOVE_TISSUE:HAIR]
[BODY_DETAIL_PLAN:VERTEBRATE_TISSUE_LAYERS:SKIN:FAT:MUSCLE:BONE:CARTILAGE]
[BODY_DETAIL_PLAN:STANDARD_HEAD_POSITIONS]
[BODY_DETAIL_PLAN:HUMANOID_HEAD_POSITIONS]
[BODY_DETAIL_PLAN:HUMANOID_RIBCAGE_POSITIONS]
[BODY_DETAIL_PLAN:HUMANOID_RELSIZES]
[USE_MATERIAL_TEMPLATE:SINEW:SINEW_TEMPLATE]
[TENDRONS:LOCAL_CREATURE_MAT:SINEW:200]
[LIGAMENTS:LOCAL_CREATURE_MAT:SINEW:200]
[HAS_NERVES]
[NOBREATHE]
[HOMEOTERM:10040]
[SELECT_MATERIAL:SKIN]
[STATE_COLOR:ALL_SOLID:GRAY]
[NO_UNIT_TYPE_COLOR]
[COLOR:2:0:0]
[SELECT_TISSUE_LAYER:HEART:BY_CATEGORY:HEART]
[PLUS_TISSUE_LAYER:SKIN:BY_CATEGORY:THROAT]
[TL_MAJOR_ARTERIES]
[USE_MATERIAL_TEMPLATE:BLOOD:BLOOD_TEMPLATE]
[BLOOD:LOCAL_CREATURE_MAT:BLOOD:LIQUID]
[CREATURE_CLASS:GENERAL_POISON]
[ATTACK:PUNCH:BODYPART:BY_TYPE:GRASP]
[ATTACK_SKILL:GRASP_STRIKE]
[ATTACK_VERB:punch:punches]
[ATTACK_CONTACT_PERC:100]
[ATTACK_PREPARE_AND_RECOVER:2:2]
[ATTACK_FLAG_WITH]
[ATTACK_PRIORITY:MAIN]
[ATTACK:KICK:BODYPART:BY_TYPE:STANCE]
[ATTACK_SKILL:STANCE_STRIKE]
[ATTACK_VERB:kick:kicks]
[ATTACK_CONTACT_PERC:100]
[ATTACK_PREPARE_AND_RECOVER:2:2]
[ATTACK_FLAG_WITH]
[ATTACK_PRIORITY:MAIN]
[ATTACK_FLAG_BAD_MULTIATTACK]
[ATTACK:BITE:BODYPART:BY_CATEGORY:MOUTH]
[ATTACK_SKILL:BITE]
[ATTACK_VERB:bite:bites]
[ATTACK_CONTACT_PERC:100]
[ATTACK_PREPARE_AND_RECOVER:2:2]
[ATTACK_PRIORITY:MAIN]
[ATTACK_FLAG_CANLATCH]
[GAIT:SWIM:Maximum Swim Speed:725:10:3:2175:50:LAYERS_SLOW:STRENGTH:AGILITY:STEALTH_SLOWS:50]
[GAIT:SWIM:Faster Swim:1450:5:3:2175:10:LAYERS_SLOW:STRENGTH:AGILITY:STEALTH_SLOWS:20]
[GAIT:SWIM:Fast Swim:2175:NO_BUILD_UP:5:LAYERS_SLOW:STRENGTH:AGILITY:STEALTH_SLOWS:10]
[GAIT:SWIM:Swim:2900:NO_BUILD_UP:0]
[GAIT:SWIM:Slow Swim:3900:NO_BUILD_UP:0]
[GAIT:SWIM:Creeping Swim:5900:NO_BUILD_UP:0]
[GAIT:WALK:Sprint:200:10:3:600:50:LAYERS_SLOW:STRENGTH:AGILITY:STEALTH_SLOWS:50]
[GAIT:WALK:Run:400:5:3:600:10:LAYERS_SLOW:STRENGTH:AGILITY:STEALTH_SLOWS:20]
[GAIT:WALK:Jog:600:NO_BUILD_UP:5:LAYERS_SLOW:STRENGTH:AGILITY:STEALTH_SLOWS:10]
[GAIT:WALK:Walk:800:NO_BUILD_UP:0]
[GAIT:WALK:Stroll:1700:NO_BUILD_UP:0]
[GAIT:WALK:Creep:2600:NO_BUILD_UP:0]
[GAIT:CRAWL:Scramble:225:10:3:675:50:LAYERS_SLOW:STRENGTH:AGILITY:STEALTH_SLOWS:50]
[GAIT:CRAWL:Faster Crawl:450:5:3:675:10:LAYERS_SLOW:STRENGTH:AGILITY:STEALTH_SLOWS:20]
[GAIT:CRAWL:Fast Crawl:675:NO_BUILD_UP:5:LAYERS_SLOW:STRENGTH:AGILITY:STEALTH_SLOWS:10]
[GAIT:CRAWL:Crawl:900:NO_BUILD_UP:0]
[GAIT:CRAWL:Slow Crawl:1900:NO_BUILD_UP:0]
[GAIT:CRAWL:Creep:2900:NO_BUILD_UP:0]
[GAIT:CLIMB:Scramble:225:10:3:675:50:LAYERS_SLOW:STRENGTH:AGILITY:STEALTH_SLOWS:50]
[GAIT:CLIMB:Faster Climb:450:5:3:675:10:LAYERS_SLOW:STRENGTH:AGILITY:STEALTH_SLOWS:20]
[GAIT:CLIMB:Fast Climb:675:NO_BUILD_UP:5:LAYERS_SLOW:STRENGTH:AGILITY:STEALTH_SLOWS:10]
[GAIT:CLIMB:Climb:900:NO_BUILD_UP:0]
[GAIT:CLIMB:Slow Climb:1900:NO_BUILD_UP:0]
[GAIT:CLIMB:Creep:2900:NO_BUILD_UP:0]
[DESCRIPTION:A large humanoid with lidless eyes. It has a short tail and its joints are backward. Its gray skin is waxy. Now you will know why you fear the night.]
[PREFSTRING:macabre ways]
[SELECT_CASTE:FEMALE]
[CASTE_NAME:hag of twilight:hags of twilight:hag of twilight]
[SELECT_CASTE:MALE]
[CASTE_NAME:hag groom of twilight:hag grooms of twilight:hag groom of twilight]
[SELECT_CASTE:ALL] |
night_troll_names={
{name="troll",names="trolls",name_adj="troll",cond=function(options) return true end},
{name="man",names="men",name_adj="man",cond=function(options) return adj_exploitable_check(options.fadj) and options.is_male_version end},
{name="woman",names="women",name_adj="woman",cond=function(options) return adj_exploitable_check(options.fadj) and not options.is_male_version end},
{name="brute",names="brutes",name_adj="brutish",cond=function(options) return options.is_male_version and options.night_creature_strength_pref and adj_exploitable_check(options.fadj) end},
{name="hag",names="hags",name_adj="hag",cond=function(options) return not options.is_male_version end},
{name="crone",names="crones",name_adj="crone",cond=function(options) return not options.is_male_version end},
{name="monster",names="monsters",name_adj="monster",cond=function(options) return true end},
{name="creature",names="creatures",name_adj="creature",cond=function(options) return true end},
{name="ogre",names="ogres",name_adj="ogre",cond=function(options) return options.night_creature_strength_pref and options.is_male_version end},
{name="ogress",names="ogresses",name_adj="ogress",cond=function(options) return options.night_creature_strength_pref and not options.is_male_version end},
{name="freak",names="freak",name_adj="freak",cond=function(options) return adj_exploitable_check(options.fadj) end},
{name="horror",names="horrors",name_adj="horror",cond=function(options) return true end},
}
night_troll_flavor_adjs={
"night",
"dark",
"shadow",
"midnight",
"dusk",
"vile",
"wicked",
"twilight",
"moon",
"gloom",
"bleak",
}
night_troll_flavor={
{
add="it mutters to itself as it moves aimlessly",
flavor_adj={"muttering","grumbling","whispering","brooding"}
},
{
add="it groans from time to time",
flavor_adj={"groaning","moaning","whispering","brooding"}
},
{
add="it howls into high winds",
flavor_adj={"screaming","howling","baying","bellowing","shrieking","wailing"}
},
}
night_troll_strength_flavor={
{
add="it shambles sluggishly",
flavor_adj={}
},
{
add="it stamps the ground and snorts",
flavor_adj={}
},
{
add="it has a bloated body",
flavor_adj={"bloated"}
},
{
add="it lumbers along steadily from place to place",
flavor_adj={}
},
}
night_troll_agile_flavor={
{
add="its joints are backward",
flavor_adj={"backward"}
},
{
add="it moves with uneven jerking motions",
flavor_adj={}
},
{
add="its limbs jut out at asymmetric angles",
flavor_adj={"crooked","twisted"}
},
{
add="it lopes quickly along the ground",
flavor_adj={}
},
{
add="it strides in silence with purpose",
flavor_adj={}
},
}
night_troll_smells={
"bug innards",
"cooked flesh",
"death"
}
creatures.night_creature.troll.default=function(tok)
local lines={}
local options={
spheres={
NIGHT=true,
DEATH=true
},
fallback_pref_str="macabre ways",
token=tok
}
options.is_male_version=one_in(2)
if one_in(2) then
options.night_creature_strength_pref=true
else
options.night_creature_agile_pref=true
end
night_creature_universals(lines,options)
-- partially I started feeling split_to_lines is ugly,
-- partially I want to show there's no one right way to do it
-- hopefully my caprice isn't too aggravating
lines[#lines+1]="[NIGHT_CREATURE_HUNTER]"
lines[#lines+1]="[BIOME:ANY_FOREST]"
lines[#lines+1]="[BIOME:ANY_SHRUBLAND]"
lines[#lines+1]="[BIOME:ANY_SAVANNA]"
lines[#lines+1]="[BIOME:ANY_GRASSLAND]"
lines[#lines+1]="[BIOME:ANY_WETLAND]"
lines[#lines+1]="[BIOME:TUNDRA]"
if options.is_male_version then
lines[#lines+1]="[CASTE:MALE]"
lines[#lines+1]="[MALE]"
lines[#lines+1]="[SPOUSE_CONVERTER]"
lines[#lines+1]="[ORIENTATION:MALE:1:0:0]"
lines[#lines+1]="[ORIENTATION:FEMALE:0:0:1]"
lines[#lines+1]="[CASTE:FEMALE]"
lines[#lines+1]="[FEMALE]"
lines[#lines+1]="[CONVERTED_SPOUSE]"
else
lines[#lines+1]="[CASTE:FEMALE]"
lines[#lines+1]="[FEMALE]"
lines[#lines+1]="[SPOUSE_CONVERTER]"
lines[#lines+1]="[ORIENTATION:MALE:0:0:1]"
lines[#lines+1]="[ORIENTATION:FEMALE:1:0:0]"
lines[#lines+1]="[CASTE:MALE]"
lines[#lines+1]="[MALE]"
lines[#lines+1]="[CONVERTED_SPOUSE]"
end
lines[#lines+1]="[SELECT_CASTE:ALL]"
lines[#lines+1]="[CAN_LEARN]"
if one_in(2) then lines[#lines+1]="[SLOW_LEARNER]" end
lines[#lines+1]="[CAN_SPEAK]"
lines[#lines+1]="[SENSE_CREATURE_CLASS:GENERAL_POISON:15:4:0:1]"
if options.night_creature_strength_pref then
lines[#lines+1]="[PHYS_ATT_RANGE:STRENGTH:1000:1250:1500:2000:2250:2500:3000]"
lines[#lines+1]="[PHYS_ATT_RANGE:AGILITY:450:550:700:750:800:850:900]"
lines[#lines+1]="[PHYS_ATT_RANGE:TOUGHNESS:850:900:950:1000:1050:1100:1150]"
lines[#lines+1]="[PHYS_ATT_RANGE:ENDURANCE:850:900:950:1000:1050:1100:1150]"
options.special_walk_speed=1000
elseif options.night_creature_agile_pref then
lines[#lines+1]="[PHYS_ATT_RANGE:STRENGTH:450:550:700:750:800:850:900]"
lines[#lines+1]="[PHYS_ATT_RANGE:AGILITY:1000:1250:1500:2000:2250:2500:3000]"
lines[#lines+1]="[PHYS_ATT_RANGE:TOUGHNESS:850:900:950:1000:1050:1100:1150]"
lines[#lines+1]="[PHYS_ATT_RANGE:ENDURANCE:850:900:950:1000:1050:1100:1150]"
options.special_walk_speed=800;
elseif options.night_creature_strength_agile_pref then
lines[#lines+1]="[PHYS_ATT_RANGE:STRENGTH:1000:1150:1250:1500:2000:2250:2500]"
lines[#lines+1]="[PHYS_ATT_RANGE:AGILITY:1000:1150:1250:1500:2000:2250:2500]"
lines[#lines+1]="[PHYS_ATT_RANGE:TOUGHNESS:850:900:950:1000:1050:1100:1150]"
lines[#lines+1]="[PHYS_ATT_RANGE:ENDURANCE:850:900:950:1000:1050:1100:1150]"
options.special_walk_speed=850;
end
lines[#lines+1]="[PHYS_ATT_RANGE:RECUPERATION:450:1050:1150:1250:1350:1550:2250]"
lines[#lines+1]="[PHYS_ATT_RANGE:DISEASE_RESISTANCE:700:1300:1400:1500:1600:1800:2500]"
lines[#lines+1]="[MENT_ATT_RANGE:ANALYTICAL_ABILITY:1250:1500:1750:2000:2500:3000:5000]"
lines[#lines+1]="[MENT_ATT_RANGE:FOCUS:1250:1500:1750:2000:2500:3000:5000]"
lines[#lines+1]="[MENT_ATT_RANGE:WILLPOWER:1250:1500:1750:2000:2500:3000:5000]"
lines[#lines+1]="[MENT_ATT_RANGE:PATIENCE:0:333:666:1000:2333:3666:5000]"
lines[#lines+1]="[MENT_ATT_RANGE:MEMORY:1250:1500:1750:2000:2500:3000:5000]"
lines[#lines+1]="[MENT_ATT_RANGE:LINGUISTIC_ABILITY:450:1050:1150:1250:1350:1550:2250]"
lines[#lines+1]="[MENT_ATT_RANGE:MUSICALITY:0:333:666:1000:2333:3666:5000]"
lines[#lines+1]="[MENT_ATT_RANGE:SOCIAL_AWARENESS:700:1300:1400:1500:1600:1800:2500]"
--[[
MENTAL_ATTRIBUTE_CREATIVITY,
MENTAL_ATTRIBUTE_INTUITION,
MENTAL_ATTRIBUTE_SPATIAL_SENSE,
MENTAL_ATTRIBUTE_KINESTHETIC_SENSE,
MENTAL_ATTRIBUTE_EMPATHY,
]]
--lines[#lines+1]="[PERSONALITY:ANXIETY_PROPENSITY:0:0:0]"
--lines[#lines+1]="[PERSONALITY:DEPRESSION_PROPENSITY:0:0:0]"
lines[#lines+1]="[PERSONALITY:BASHFUL:0:0:0]"
lines[#lines+1]="[PERSONALITY:STRESS_VULNERABILITY:0:0:0]"
lines[#lines+1]="[PERSONALITY:FRIENDLINESS:0:0:0]"
--lines[#lines+1]="[PERSONALITY:ASSERTIVENESS:100:100:100]"
lines[#lines+1]="[PERSONALITY:DISDAIN_ADVICE:100:100:100]"
lines[#lines+1]="[PERSONALITY:CHEER_PROPENSITY:0:0:0]"
lines[#lines+1]="[PERSONALITY:GRATITUDE:0:0:0]"
lines[#lines+1]="[PERSONALITY:TRUST:0:0:0]"
lines[#lines+1]="[PERSONALITY:ALTRUISM:0:0:0]"
--lines[#lines+1]="[PERSONALITY:SWAYED_BY_EMOTIONS:0:0:0]"
lines[#lines+1]="[PERSONALITY:CRUELTY:100:100:100]"
--lines[#lines+1]="[PERSONALITY:PRIDE:100:100:100]"
add_regular_tokens(lines,options)
populate_sphere_info(lines,options)
local rcp={
name_string="humanoid",
tile='H',
body_base="HUMANOID",
c_class="AMPHIBIAN", -- FOR SKIN/ORGANS AND NO HAIR/FEATHERS AT FIRST
min_size=1,
cannot_have_shell=true
}
lines[#lines+1]="[NATURAL_SKILL:WRESTLING:6]"
lines[#lines+1]="[NATURAL_SKILL:BITE:6]"
lines[#lines+1]="[NATURAL_SKILL:GRASP_STRIKE:6]"
lines[#lines+1]="[NATURAL_SKILL:STANCE_STRIKE:6]"
lines[#lines+1]="[NATURAL_SKILL:MELEE_COMBAT:6]"
lines[#lines+1]="[NATURAL_SKILL:DODGING:6]"
lines[#lines+1]="[NATURAL_SKILL:SITUATIONAL_AWARENESS:6]"
lines[#lines+1]="[DIFFICULTY:3]"
lines[#lines+1]="[LAIR:SIMPLE_MOUND:50]"
lines[#lines+1]="[LAIR:SIMPLE_BURROW:50]"
lines[#lines+1]="[LAIR_CHARACTERISTIC:HAS_DOORS:100]"
lines[#lines+1]="[HABIT_NUM:TEST_ALL]"
lines[#lines+1]="[HABIT:GRIND_BONE_MEAL:50]"
lines[#lines+1]="[HABIT:COOK_BLOOD:50]"
lines[#lines+1]="[HABIT:GRIND_VERMIN:50]"
lines[#lines+1]="[HABIT:COOK_VERMIN:50]"
lines[#lines+1]="[HABIT:COOK_PEOPLE:50]"
lines[#lines+1]="[HABIT:COLLECT_TROPHIES:50]"
lines[#lines+1]="[ODOR_STRING:"..pick_random(night_troll_smells).."]"
lines[#lines+1]="[ODOR_LEVEL:90]"
local body_size=70000+trandom(8)*10000+trandom(11)*1000
options.body_size=body_size
lines[#lines+1]="[SELECT_CASTE:"..(options.is_male_version and "MALE" or "FEMALE").."]"
lines[#lines+1]="[BODY_SIZE:0:0:"..tostring(math.floor(body_size/20)).."]"
lines[#lines+1]="[BODY_SIZE:2:0:"..tostring(math.floor(body_size/4)).."]"
lines[#lines+1]="[BODY_SIZE:12:0:"..tostring(math.floor(body_size)).."]"
body_size_properties(lines,body_size)
local spouse_size=math.floor(body_size*(trandom(51)+50)/100)
lines[#lines+1]="[SELECT_CASTE:"..(options.is_male_version and "FEMALE" or "MALE").."]"
add_body_size(lines,spouse_size)
lines[#lines+1]="[SELECT_CASTE:ALL]"
lines[#lines+1]="[BABY:1]"
lines[#lines+1]="[CHILD:18]"
lines[#lines+1]="[CREATURE_TILE:165]" --Ñ
options.custom_desc_func=function(options)
local add_tbl={}
options.flavor_adj = options.flavor_adj or {}
if one_in(4) then
add_tbl=pick_random(night_troll_flavor)
elseif options.night_creature_strength_pref then
add_tbl=pick_random(night_troll_strength_flavor)
options.flavor_adj[#options.flavor_adj+1]="lumbering"
options.flavor_adj[#options.flavor_adj+1]="hulking"
elseif options.night_creature_agile_pref then
add_tbl=pick_random(night_troll_agile_flavor)
options.flavor_adj[#options.flavor_adj+1]="narrow"
options.flavor_adj[#options.flavor_adj+1]="starved"
options.flavor_adj[#options.flavor_adj+1]="emaciated"
end
table_merge(options.flavor_adj,add_tbl.flavor_adj)
return add_tbl.add
end
options.flavor_adj=options.flavor_adj or {}
build_procgen_creature(rcp,lines,options)
table_merge(options.flavor_adj,night_troll_flavor_adjs)
night_troll_end_phrases=night_troll_end_phrases or {
" of the night",
" of evil",
" of twilight",
" of shadow",
}
options.potential_end_phrase = options.potential_end_phrase or {}
table_merge(options.potential_end_phrase,night_troll_end_phrases)
local name_str=""
local used_ending=false
local name={}
if trandom(#options.flavor_adj + #options.potential_end_phrase) >= #options.flavor_adj then
options.eadj=pick_random(options.potential_end_phrase)
name=pick_random_conditional(night_troll_names,"cond",options)
name_str=name.name..options.eadj..":"..name.names..options.eadj..":"..name.name_adj..options.eadj
used_ending=true
else
options.fadj=pick_random(options.flavor_adj)
name=pick_random_conditional(night_troll_names,"cond",options)
name_str=options.fadj.." "..name.name..":"..options.fadj.." "..name.names..":"..options.fadj.." "..name.name_adj
end
night_troll_wife_names=night_troll_wife_names or {
{"spouse","spouses"},
{"mate","mates"},
{"consort","consorts"},
{"wife","wives"},
{"bride","brides"},
}
night_troll_husband_names=night_troll_husband_names or {
{"spouse","spouses"},
{"mate","mates"},
{"consort","consorts"},
{"husband","husbands"},
{"bridegroom","bridegrooms"},
{"groom","grooms"}
}
local sn,sns="",""
if options.is_male_version then
sn,sns=table.unpack(pick_random(night_troll_wife_names))
lines[#lines+1]="[SELECT_CASTE:MALE]"
else
sn,sns=table.unpack(pick_random(night_troll_husband_names))
lines[#lines+1]="[SELECT_CASTE:FEMALE]"
end
local cstr=""
if used_ending then
cstr=name.name.." "..sn..options.eadj..":"..name.name.." "..sns..options.eadj..":"..name.name_adj.." "..sn..options.eadj
elseif one_in(2) then
cstr=options.fadj.." "..name.name.." "..sn..":"..options.fadj.." "..name.name.." "..sns..":"..options.fadj.." "..name.name.." "..sn
else
cstr=sn.." of the "..options.fadj.." "..name.name..":"..sns.." of the "..options.fadj.." "..name.name..":"..sn.." of the "..options.fadj.." "..name.name_adj
end
lines[#lines+1]="[CASTE_NAME:"..name_str.."]"
if options.is_male_version then lines[#lines+1]="[SELECT_CASTE:FEMALE]"
else lines[#lines+1] = "[SELECT_CASTE:MALE]" end
lines[#lines+1]="[CASTE_NAME:"..cstr.."]"
lines[#lines+1]="[GO_TO_START]"
lines[#lines+1]="[NAME:"..name_str.."]"
return {raws=lines,weight=1}
end
|