code:
l_simp_chinese:

ie_consensual_sex_scene.missionary.first_1_giving:0 "I set [second.Custom2('MyCharacterIntroduction', ROOT.Char )] down on [second.GetHerHis] back and spread [second.GetHerHis] legs."
ie_consensual_sex_scene.missionary.first_2_giving:0 "[second.Custom2('MyCharacterIntroduction', ROOT.Char )|U] lays down before me in anticipation, looking up expectantly."
ie_consensual_sex_scene.missionary.first_3_giving:0 "I look down at [second.GetHerHim], at [second.GetHerHis] spread legs and [second.GetHerHis] eager [second.Custom('GetVaginaAnus')] on display."
ie_consensual_sex_scene.missionary.first_lustful_giving:0 "I throw [second.GetHerHim] down onto [second.GetHerHis] back, towering over [second.GetHerHim] with mounting desire."

ie_consensual_sex_scene.missionary.first_1_receiving:0 "[second.Custom2('MyCharacterIntroduction', ROOT.Char )|U] sets me down on my back and spreads my legs."
ie_consensual_sex_scene.missionary.first_2_receiving:0 "I lay down before [second.Custom2('MyCharacterIntroduction', ROOT.Char )], looking up at [second.GetHerHim] with desire."
ie_consensual_sex_scene.missionary.first_3_receiving:0 "[second.GetSheHe|U] looks down at me, [second.GetHerHis] eyes wandering over my body..."
ie_consensual_sex_scene.missionary.first_lustful_receiving:0 "[second.GetSheHe|U] throws me down onto my back, looming over me with mounting desire."

ie_consensual_sex_scene.missionary.second_1_giving:0 "I rub my [ROOT.Char.Custom('GetPenetratingAppendage')] against [second.GetHerHis] [second.Custom('GetVaginaAnus')], testing [second.GetHerHim] at first."
ie_consensual_sex_scene.missionary.second_2_giving:0 "I probe at [second.GetHerHis] [Select_CString( second.IsFemale, '', 'rear ' )]entrance[Select_CString( ROOT.Char.IsFemale, '', ' with my cockhead' )][Select_CString( second.IsFemale, ', wetting my ', '')][Select_CString( second.IsFemale, ROOT.Char.Custom('GetPenetratingAppendage'), '' )]."
ie_consensual_sex_scene.missionary.second_3_giving:0 "With one hand I spread [second.GetHerHis] [Select_CString( ROOT.Char.IsFemale, 'lower lips', 'cheeks' )] and ease my $genitals_penis_name$ in with the other."
ie_consensual_sex_scene.missionary.second_3_giving_fem:0 "With one hand I spread [second.GetHerHis] [Select_CString( ROOT.Char.IsFemale, 'lower lips', 'cheeks' )] and ease in the fingers of the other."
ie_consensual_sex_scene.missionary.second_4_giving:0 "I [Select_CString( ROOT.Char.IsFemale, 'push', 'guide' )] my [ROOT.Char.Custom('GetPenetratingAppendage')] inside, [second.GetFirstNameNoTooltip] [Select_CString( second.IsFemale, 'sighing', 'groaning' )] at the intrusion."

ie_consensual_sex_scene.missionary.second_1_receiving:0 "[second.GetSheHe|U] rubs [second.GetHerHis] [second.Custom('GetPenetratingAppendage')] against my [ROOT.Char.Custom('GetVaginaAnus')], testing it at first."
ie_consensual_sex_scene.missionary.second_2_receiving:0 "[second.GetSheHe|U] probes at my [Select_CString( ROOT.Char.IsFemale, '', 'rear ' )]entrance with [second.GetHerHis] cockhead, sending shivers up my spine."
ie_consensual_sex_scene.missionary.second_3_receiving:0 "With one hand [second.GetSheHe] spreads my lower lips and eases [second.GetHerHis] $genitals_penis_name$ in with the other."
ie_consensual_sex_scene.missionary.second_3_receiving_fem:0 "With one hand [second.GetSheHe] spreads my lower lips and eases in the fingers of the other."
ie_consensual_sex_scene.missionary.second_4_receiving:0 "[second.GetSheHe|U] slides [second.GetHerHis] [second.Custom('GetPenetratingAppendage')] inside, forcing out a soft [Select_CString( ROOT.Char.IsFemale, 'sigh', 'groan' )] from my lips."

ie_consensual_sex_scene.missionary.third_1_giving:0 "I start thrusting my [ROOT.Char.Custom('GetArmHips')], [second.GetHerHis] [second.Custom('GetVaginaAnus')] yielding and receptive."
ie_consensual_sex_scene.missionary.third_2_giving:0 "I begin to slide my [ROOT.Char.Custom('GetPenetratingAppendage')] in and out, revealing and obscuring my [ROOT.Char.Custom('GetPenetratingAppendage')] within [second.GetHerHim]."
ie_consensual_sex_scene.missionary.third_3_giving:0 "Soon I am pumping my [ROOT.Char.Custom('GetArmHips')], making [second.GetHerHis] whole body rock with every push."

ie_consensual_sex_scene.missionary.third_1_receiving:0 "[second.GetSheHe|U] starts thrusting [second.GetHerHis] [second.Custom('GetArmHips')], my [ROOT.Char.Custom('GetVaginaAnus')] yielding to [second.GetHerHim]."
ie_consensual_sex_scene.missionary.third_2_receiving:0 "[second.GetSheHe|U] begins to slide [second.GetHerHis] [second.Custom('GetPenetratingAppendage')] in and out of my [ROOT.Char.Custom('GetVaginaAnus')], bringing with it a lurid sensation of being filled and emptied..."
ie_consensual_sex_scene.missionary.third_3_receiving:0 "Soon [second.GetSheHe] is pumping [second.GetHerHis] [second.Custom('GetArmHips')], my whole body rocking with every push."

ie_consensual_sex_scene.missionary.escalation_1_giving:0 "I start fucking [second.GetHerHim] proper, harder and faster."
ie_consensual_sex_scene.missionary.escalation_2_giving:0 "Faster and deeper I go, the air filled with the sounds of impassioned sex."
ie_consensual_sex_scene.missionary.escalation_3_giving:0 "Eagerly I hasten, [Select_CString( ROOT.Char.IsFemale, 'making her moan', 'grunting' )] with every hard push."
ie_consensual_sex_scene.missionary.escalation_4_giving:0 "I quicken the pace, driving deep into [second.GetHerHis] [second.Custom('GetVaginaAnus')]."

ie_consensual_sex_scene.missionary.escalation_1_receiving:0 "[second.GetSheHe|U] starts fucking me proper, harder and faster."
ie_consensual_sex_scene.missionary.escalation_2_receiving:0 "Faster and deeper [second.GetSheHe] goes, filling the air with the sounds of impassioned sex."
ie_consensual_sex_scene.missionary.escalation_3_receiving:0 "Eagerly [second.GetSheHe] hastens, [Select_CString( second.IsFemale, 'making me moan', 'grunting' )] with every hard push."
ie_consensual_sex_scene.missionary.escalation_4_receiving:0 "[second.GetSheHe|U] quickens the pace, driving deeper into my [ROOT.Char.Custom('GetVaginaAnus')]."


code:
l_simp_chinese:

ie_cultural_giant_nephilim:0 "nephilim"
ie_cultural_giant_jabbar:0 "jabbar"
ie_cultural_giant_cawr:0 "cawr"
ie_cultural_giant_fomorian:0 "fomorian"
ie_cultural_giant_jentil:0 "jentil"
ie_cultural_giant_ispolin:0 "ispolin"
ie_cultural_giant_gigant:0 "gigant"
ie_cultural_giant_daitya:0 "daitya"
ie_cultural_giant_jotunn:0 "jötunn"
ie_cultural_giant_reus:0 "reus"
ie_cultural_giant_giant:0 "giant"

license: unknown


code:
l_simp_chinese:

genitals_interaction_giving:0 "I [ROOT.Char.Custom2('GenitalsInteractionGiving', SCOPE.sC('second'))]"
genitals_interaction_receiving:0 "[second.GetSheHe] [ROOT.Char.Custom2('GenitalsInteractionReceiving', SCOPE.sC('second'))]"
genitals_interaction_receiving_with_name:0 "[second.GetFirstNameNoTooltip] [ROOT.Char.Custom2('GenitalsInteractionReceiving', SCOPE.sC('second'))]"

genitals_interaction_penetrate_giving:0 "penetrate [second.GetHerHis] [second.Custom2('GetPenetratedOrifice', ROOT.Char)] with my [ROOT.Char.Custom('GetPenetratingAppendage')]"
genitals_interaction_penetrate_receiving:0 "penetrates my [ROOT.Char.Custom2('GetPenetratedOrifice', second)] with [second.GetHerHis] [second.Custom('GetPenetratingAppendage')]"

genitals_interaction_enter_giving:0 "enter [second.GetHerHis] [second.Custom2('GetPenetratedOrifice', ROOT.Char)] with my [ROOT.Char.Custom('GetPenetratingAppendage')]"
genitals_interaction_enter_receiving:0 "enters my [ROOT.Char.Custom2('GetPenetratedOrifice', ROOT.Char)] with [second.GetHerHis] [second.Custom('GetPenetratingAppendage')]"

genitals_interaction_push_giving:0 "push my [ROOT.Char.Custom('GetPenetratingAppendage')] into [second.GetHerHis] [second.Custom2('GetPenetratedOrifice', ROOT.Char)]"
genitals_interaction_push_receiving:0 "pushes [second.GetHerHis] [second.Custom('GetPenetratingAppendage')] into my [ROOT.Char.Custom2('GetPenetratedOrifice', SCOPE.sC('second'))]"

genitals_interaction_shove_giving:0 "shove my [ROOT.Char.Custom('GetPenetratingAppendage')] into [second.GetHerHis] [second.Custom2('GetPenetratedOrifice', ROOT.Char)]"
genitals_interaction_shove_receiving:0 "shoves [second.GetHerHis] [second.Custom('GetPenetratingAppendage')] into my [ROOT.Char.Custom2('GetPenetratedOrifice', SCOPE.sC('second'))]"

genitals_interaction_thrust_giving:0 "thrust my [ROOT.Char.Custom('GetPenetratingAppendage')] into [second.GetHerHis] [second.Custom2('GetPenetratedOrifice', ROOT.Char)]"
genitals_interaction_thrust_receiving:0 "thrusts [second.GetHerHis] [second.Custom('GetPenetratingAppendage')] into my [ROOT.Char.Custom2('GetPenetratedOrifice', SCOPE.sC('second'))]"

genitals_interaction_plunge_giving:0 "plunge my [ROOT.Char.Custom('GetPenetratingAppendage')] into [second.GetHerHis] [second.Custom2('GetPenetratedOrifice', ROOT.Char)]"
genitals_interaction_plunge_receiving:0 "plunges [second.GetHerHis] [second.Custom('GetPenetratingAppendage')] into my [ROOT.Char.Custom2('GetPenetratedOrifice', SCOPE.sC('second'))]"

genitals_interaction_take_giving:0 "take [second.GetHerHim] in [second.GetHerHis] [second.Custom2('GetPenetratedOrifice', ROOT.Char)] with my [ROOT.Char.Custom('GetPenetratingAppendage')]"
genitals_interaction_take_receiving:0 "takes me in my [ROOT.Char.Custom2('GetPenetratedOrifice', SCOPE.sC('second'))] with [second.GetHerHis] [second.Custom('GetPenetratingAppendage')]"

genitals_interaction_fuck_giving:0 "fuck [second.GetHerHim] in [second.GetHerHis] [second.Custom2('GetPenetratedOrifice', ROOT.Char)] with my [ROOT.Char.Custom('GetPenetratingAppendage')]"
genitals_interaction_fuck_receiving:0 "fucks me in my [ROOT.Char.Custom2('GetPenetratedOrifice', SCOPE.sC('second'))] with [second.GetHerHis] [second.Custom('GetPenetratingAppendage')]"


code:
l_simp_chinese:

ie_feast.1000.t:0 "The Morning After"
ie_feast.1000.desc:0 "I wake up after a long night of feasting. My memories are a bit hazy — maybe I feasted a bit too much — but from what I can remember I had a great time. There is nothing better in the world than to eat, to drink, and to be merry.\n\nYawning, I rub the sleep from my eyes. Only then do I realize I am not alone in bed. Heat radiates from a body next to mine."
ie_feast.1000.a:0 "Who..."

ie_feast.1001.desc:0 "I turn around and stare right into the eyes of a beautiful — yet unknown [stranger.GetWomanMan]. A broad smile appears on [stranger.GetHerHis] face. My eyes trail down, but I quickly avert them when I notice [stranger.GetHerHis] naked form.\n\n"What's wrong, my Liege?" [stranger.GetSheHe] asks. "Last night you couldn't get enough of my body."\n\nThe [stranger.GetWomanMan] folds the covers away, revealing [stranger.GetHerHis] gorgeous naked body fully to me."
ie_feast.1001.a.spouse:0 "I'm spoken for."
ie_feast.1001.a:0 "This was a mistake."
ie_feast.1001.a.tt:0 "You say goodbye to [stranger.GetShortUIName]."
ie_feast.1001.b:0 "Just this once."
ie_feast.1001.c:0 "In for a penny, in for a pound."


code:
l_simp_chinese:

ie_hunt.0001.t:0 "Quite the Catch"
ie_hunt.0001.desc:0 "I hear rustling in the bushes. Stealthily, I move in closer, bow at the ready. I round a tree, expecting to see the [ROOT.Char.Custom('LocalAnimal')] I was tracking.\n\nWhat I find instead are [lesbian_1.Custom2('MyCharacterIntroduction', ROOT.Char)] and [lesbian_2.Custom2('MyCharacterIntroductionNoComma', ROOT.Char)]. Both women are in a state of undress, standing up against a tree, hungrily kissing one another. [lesbian_1.GetFirstNamePossessiveNoTooltip|U] hand is underneath [lesbian_2.GetFirstNamePossessiveNoTooltip] skirt, between her legs. [ROOT.Char.Custom('sinful_agitating')]"
ie_hunt.0001.desc.optional:0 "The sight is as scandalous as it is arousing."
ie_hunt.0001.a:0 "Maybe the ladies would like some company."
ie_hunt.0001.a.tt:0 "You offer to join them"
ie_hunt.0001.b:0 "I should not disturb them."
ie_hunt.0001.b.tt:0 "You respect their privacy and leave."
ie_hunt.0001.c:0 "Such sinful behavior cannot be condoned!"
ie_hunt.0002.desc:0 "The women look at me for a moment. Then they start to laugh out loud.\n\n“Not in a million years,” one says.\n\n“I’d rather fuck myself with a blade,” the other says.\n\nAs if I am not even there, the two women resume their agitating acts."
ie_hunt.0002.a:0 "No one talks to me like that!"
ie_hunt.0002.b:0 "Fine! I was leaving anyway."
ie_hunt.0003.desc:0 "The women are startled at first, but then begin to smile.\n\n“You are welcome to join us, my lord,” one of them says.\n\n“You are our liege after all,” the other adds.\n\nI join the two women and immediately share a deep, lustful kiss with each of them. Their lips are so incredibly soft — their tongues eager. Both women remove their remaining garments, and I too undress myself.\n\nThe three of us lay our naked bodies down in the grass and proceed to make love in ways I could never have fathomed. Making love to two women at once makes me more aroused, and gives me more pleasure than any other form of intercourse I had enjoyed up till now.\n\nThe women and I enjoy each other’s company — and bodies — until well past sunset. By the end, all three of us are left fully satisfied."
ie_hunt.0003.a:0 "We should make this a regular thing."
ie_hunt.0003.b:0 "This was a fun distraction, nothing more."
ie_hunt.0004.desc:0 "The women shriek in surprise when I speak up. As quickly as they can they get dressed again.\n\n“Wait…” I say.\n\nBut before I can say anything else the two women run off into the woods."
ie_hunt.0004.a:0 "That was... unexpected."


code:
l_simp_chinese:

ie_consensual_kissing_scene.0001.t:0 "Intimate Encounter"
ie_consensual_kissing_scene.0001.a:0 "Invite [carn_sex_target.GetTitledFirstNameNoTooltip] up to my room."
ie_consensual_kissing_scene.0001.b:0 "Leave it at just a kiss."
ie_consensual_kissing_scene.0001.debug:0 "DEBUG – Again!"

ie_consensual_kissing_scene.0001.text_giving:0 "[ROOT.Char.Custom2('ie_consensual_kissing_scene_part_1_giving', SCOPE.sC('receiver'))] [ROOT.Char.Custom2('ie_consensual_kissing_scene_part_2_giving', SCOPE.sC('receiver'))]\n\n[ROOT.Char.Custom2('ie_consensual_kissing_scene_part_3_giving', SCOPE.sC('receiver'))] [ROOT.Char.Custom2('ie_consensual_kissing_scene_part_4_giving', SCOPE.sC('receiver'))]"

ie_consensual_kissing_scene.0001.text_receiving:0 "[ROOT.Char.Custom2('ie_consensual_kissing_scene_part_1_receiving', SCOPE.sC('giver'))] [ROOT.Char.Custom2('ie_consensual_kissing_scene_part_2_receiving', SCOPE.sC('giver'))]\n\n[ROOT.Char.Custom2('ie_consensual_kissing_scene_part_3_receiving', SCOPE.sC('giver'))] [ROOT.Char.Custom2('ie_consensual_kissing_scene_part_4_receiving', SCOPE.sC('giver'))]"


code:
l_simp_chinese:

ie_pet_animal.0001.t:0 "A Girl's Best Friend"
ie_pet_animal.0001.desc:0 "My faithful companion [ROOT.Char.Custom('DogStoryName')] follows me everywhere, and never misses an opportunity to join me in the comfy pillows and blankets of my bed. Many nights his warm coat has offered me solace to my loneliness and when morning comes, I am roused from my slumber by the most enthusiastic lickings!\n\nHe has accompanied me to my bedchambers with such regularity that my retinue thinks little of it these days. A most enviable privilege for a gentleman - to be able to spend the whole night in privacy with a fair lady..."
ie_pet_animal.0001.a:0 "Who's a good boy!? You’re a good boy! You want a tummy rub?"
ie_pet_animal.0001.a.tt:0 "Rub rub rub!"
ie_pet_animal.0001.b:0 "He makes for a nice cuddling companion, nothing more."
ie_pet_animal.0001.b.tt:0 "Best to let sleeping dogs lie."
ie_pet_animal.0002.desc:0 "[ROOT.Char.Custom('DogStoryName')] rolls over, exposing his belly and happily wagging his tail as I rub his belly. He wriggles and squirms, panting as I go faster. Out of some compulsion to overwhelm my furry companion with affection, I put both my hands on his stomach and furiously rub him - until his leg starts kicking and he begins to bark.\n\nWhen I draw back, I notice something strange about him. He has frozen in place, panting and looking up at me. His legs are bent and he remains on his back, while in his furry loins, I spy something... red."
ie_pet_animal.0002.a:0 "It wasn't there before..."
ie_pet_animal.0002.a.tt:0 "I wonder what it feels like."
ie_pet_animal.0002.a.toast.desc:0 "You lay with your dog."
ie_pet_animal.0002.b:0 "Down! Off the bed! Bad dog!"
ie_pet_animal.0002.b.tt:0 "I'm not comfortable with where this is going."


code:
l_simp_chinese:

I_LUSTFUL_PIETY_IMPACT_GAIN:0 "You gain [piety_i]$VALUE|+0$ [piety|E] because [GetTrait('lustful').GetName( CHARACTER.Self )] is a [virtue|E]"
I_LUSTFUL_PIETY_IMPACT_LOSS:0 "You lose [piety_i]$VALUE|-0$ [piety|E] because [GetTrait('lustful').GetName( CHARACTER.Self )] is a [sin|E]"
THEY_LUSTFUL_PIETY_IMPACT_GAIN:0 "[CHARACTER.GetShortUIName|U] gains [piety_i]$VALUE|V0$ [piety|E] because [GetTrait('lustful').GetName( CHARACTER.Self )] is a [virtue|E]"
THEY_LUSTFUL_PIETY_IMPACT_LOSS:0 "[CHARACTER.GetShortUIName|U] loses [piety_i]$VALUE|V0$ [piety|E] because [GetTrait('lustful').GetName( CHARACTER.Self )] is a [sin|E]"
I_PAST_LUSTFUL_PIETY_IMPACT_GAIN:0 "You gained [piety_i]$VALUE|+0$ [piety|E] because [GetTrait('lustful').GetName( CHARACTER.Self )] is a [virtue|E]"
I_PAST_LUSTFUL_PIETY_IMPACT_LOSS:0 "You lost  [piety_i]$VALUE|-0$ [piety|E] because [GetTrait('lustful').GetName( CHARACTER.Self )] is a [sin|E]"
THEY_PAST_LUSTFUL_PIETY_IMPACT_GAIN:0 "[CHARACTER.GetShortUIName|U] gained [piety_i]$VALUE|V0$ [piety|E] because [GetTrait('lustful').GetName( CHARACTER.Self )] is a [virtue|E]"
THEY_PAST_LUSTFUL_PIETY_IMPACT_LOSS:0 "[CHARACTER.GetShortUIName|U] lost [piety_i]$VALUE|V0$ [piety|E] because [GetTrait('lustful').GetName( CHARACTER.Self )] is a [sin|E]"

PIETY_GAIN:0 "Gains [piety_i]$VALUE|V0$ [piety|E] because [GetTrait('lustful').GetName( CHARACTER.Self )] is a [virtue|E]"
PIETY_LOSS:0 "Loses [piety_i]$VALUE|V0$ [piety|E] because [GetTrait('lustful').GetName( CHARACTER.Self )] is a [sin|E]"
PAST_LUSTFUL_PIETY_IMPACT_GAIN:0 "Gained [piety_i]$VALUE|V0$ [piety|E] because [GetTrait('lustful').GetName( CHARACTER.Self )] is a [virtue|E]"
PAST_LUSTFUL_PIETY_IMPACT_LOSS:0 "Lost [piety_i]$VALUE|V0$ [piety|E] because [GetTrait('lustful').GetName( CHARACTER.Self )] is a [sin|E]"


code:
l_simp_chinese:

rule_ie_masked_orgy:0 "#D Intimate Encounters:#! Masked Orgy"
setting_ie_masked_orgy_player_and_ai:0 "Enabled"
setting_ie_masked_orgy_player_and_ai_desc:0 "Both you and AI characters can host masked orgies."
setting_ie_masked_orgy_player_only:0 "#high Player only#!"
setting_ie_masked_orgy_player_only_desc:0 "Only players are allowed to host masked orgies."
setting_ie_masked_orgy_disabled:0 "#high Disabled#!"
setting_ie_masked_orgy_disabled_desc:0 "Noone can host masked orgies."


code:
l_simp_chinese:
trait_ie_masked:0 "Masked"
trait_ie_masked_desc:0 "This character is using a mask to hide their identity."
trait_ie_masked_character_desc:0 "[ROOT.GetCharacter.GetFirstNameNoTooltip] is using a mask to hide [ROOT.GetCharacter.GetHerHis] identity."


code:
l_spanish:

genitals_vagina_name:0 "[ROOT.Char.Custom('GetVaginaName')]"
genitals_penis_name:0 "[ROOT.Char.Custom('GetPenisName')]"

genitals_vagina_name_vagina:0 "vagina"
genitals_vagina_name_pussy:0 "pussy"
genitals_vagina_name_cunt:0 "cunt"
genitals_vagina_name_slit:0 "slit"
genitals_vagina_name_sex:0 "sex"
genitals_vagina_name_depths:0 "depths"
genitals_vagina_name_sheathe:0 "sheathe"
genitals_vagina_name_womanhood:0 "womanhood"
genitals_vagina_name_nethers:0 "nethers"

penetrated_orifice_anus_name:0 "[ROOT.Char.Custom('GetAnusName')]"

penetrated_orifice_anus_name_anus:0 "anus"
penetrated_orifice_anus_name_ass:0 "ass"
penetrated_orifice_anus_name_asshole:0 "asshole"
penetrated_orifice_anus_name_rectum:0 "rectum"
penetrated_orifice_anus_name_rear:0 "rear"
penetrated_orifice_anus_name_rear_entrance:0 "rear entrance"

penetrated_orifice_mouth:0 "mouth"

vagina_adjective_wet:0 "wet"
vagina_adjective_dripping:0 "dripping"
vagina_adjective_dripping_wet:0 "dripping wet"
vagina_adjective_drenched:0 "drenched"
vagina_adjective_soaking:0 "soaking"
vagina_adjective_soaking_wet:0 "soaking wet"
vagina_adjective_sopping_wet:0 "sopping wet"
vagina_adjective_moist:0 "moist"
vagina_adjective_soaked:0 "soaked"

penis_adjective_erect:0 "erect"
penis_adjective_hard:0 "hard"
penis_adjective_stiff:0 "stiff"
penis_adjective_rock_hard:0 "rock hard"
penis_adjective_rigid:0 "rigid"
penis_adjective_throbbing:0 "throbbing"
penis_adjective_turgid:0 "turgid"
penis_adjective_firm:0 "firm"

genitals_penis_name_penis:0 "penis"
genitals_penis_name_cock:0 "cock"
genitals_penis_name_dick:0 "dick"
genitals_penis_name_member:0 "member"
genitals_penis_name_length:0 "length"
genitals_penis_name_shaft:0 "shaft"
genitals_penis_name_manhood:0 "manhood"

penetrating_appendage_fingers:0 "fingers"

genitals_vulgar_vagina:0 "[ROOT.Char.Custom('GetVaginaAdjective')] [ROOT.Char.Custom('GetVaginaName')]"
genitals_vulgar_penis:0 "[ROOT.Char.Custom('GetPenisAdjective')] [ROOT.Char.Custom('GetPenisName')]"
genitals_vulgar_random:0 "[ROOT.Char.Custom('GetGenitalsVulgarRandom')]"

genitals_action_rub:0 "rub"
genitals_action_rubs:0 "rubs"
genitals_action_rubbing:0 "rubbing"
genitals_action_stroke:0 "stroke"
genitals_action_strokes:0 "strokes"
genitals_action_stroking:0 "stroking"

semen_name:0 "[ROOT.Char.Custom('GetSemenName')]"

semen_name_semen:0 "semen"
semen_name_sperm:0 "sperm"
semen_name_cum:0 "cum"
semen_name_seed:0 "seed"
semen_name_manly_essence:0 "manly essence"
semen_name_seed:0 "seed"
semen_name_milk:0 "milk"
semen_name_ejaculate:0 "ejaculate"
semen_name_spunk:0 "spunk"

orgasm_verb:0 "[ROOT.Char.Custom('GetOrgasmVerb')]"

orgasm_verb_orgasm:0 "orgasm"
orgasm_verb_cum:0 "cum"
orgasm_verb_climax:0 "climax"
orgasm_verb_come:0 "come"

orgasm_verb_third_person:0 "[ROOT.Char.Custom('GetOrgasmVerbThirdPerson')]"

orgasm_verb_orgasms:0 "orgasms"
orgasm_verb_cums:0 "cums"
orgasm_verb_climaxes:0 "climaxes"
orgasm_verb_comes:0 "comes"

ie_hips:0 "hips"
ie_arm:0 "arm"


code:
l_spanish:

ie_consensual_kissing_scene.first_1_giving:0 "My and [second.GetFirstNamePossessiveNoTooltip] lips meet in a tender embrace."
ie_consensual_kissing_scene.first_2_giving:0 "I kiss [second.GetFirstNameNoTooltip] sweetly, holding [second.GetHerHis] hand."
ie_consensual_kissing_scene.first_3_giving:0 "I close my eyes, put my hand up to [second.GetFirstNamePossessiveNoTooltip] cheek and kiss [second.GetHerHim]."
ie_consensual_kissing_scene.first_4_giving:0 "I smile at the [second.GetTitleAsNameNoTooltip], and then lean in to kiss [second.GetHerHim]."
ie_consensual_kissing_scene.first_negative_opinion_1_giving:0 "I force my lips against [second.GetHerHis] own."
ie_consensual_kissing_scene.first_negative_opinion_2_giving:0 "I mash my lips against [second.GetHerHis] mouth."

ie_consensual_kissing_scene.first_1_receiving:0 "My and [second.GetFirstNamePossessiveNoTooltip] lips meet in a tender embrace."
ie_consensual_kissing_scene.first_2_receiving:0 "[second.GetFirstNameNoTooltip] kisses me sweetly, holding my hand."
ie_consensual_kissing_scene.first_3_receiving:0 "[second.GetFirstNameNoTooltip] closes [second.GetHerHis] eyes, puts [second.GetHerHis] hand up to my cheek and kisses me."
ie_consensual_kissing_scene.first_4_receiving:0 "The [second.GetTitleAsNameNoTooltip] smiles at me, and then leans in to kiss me."
ie_consensual_kissing_scene.first_negative_opinion_1_receiving:0 "[second.GetFirstNameNoTooltip] forces [second.GetHerHis] lips against my own."
ie_consensual_kissing_scene.first_negative_opinion_2_receiving:0 "[second.GetFirstNameNoTooltip] mashes [second.GetHerHis] lips against my mouth."

ie_consensual_kissing_scene.second_1_giving:0 "I kiss [second.GetHerHim] again and again."
ie_consensual_kissing_scene.second_2_giving:0 "[second.GetSheHe|U] softly sighs between every kiss."
ie_consensual_kissing_scene.second_3_giving:0 "[second.GetFirstNameNoTooltip] kisses me back, meeting my affections with [second.GetHerHis] own."
ie_consensual_kissing_scene.second_4_giving:0 "Our lips part only momentarily before they’re soon drawn back to another."
ie_consensual_kissing_scene.second_negative_opinion_1_giving:0 "I insist upon this, kissing [second.GetFirstNameNoTooltip] despite [second.GetHerHis] tepid reception."
ie_consensual_kissing_scene.second_chaste_1_giving:0 "I peck and peck at [second.GetFirstNameNoTooltip], never letting my kisses linger too long."

ie_consensual_kissing_scene.second_1_receiving:0 "[second.GetSheHe|U] kisses me again and again."
ie_consensual_kissing_scene.second_2_receiving:0 "I sigh between every kiss."
ie_consensual_kissing_scene.second_3_receiving:0 "I kiss [second.GetFirstNameNoTooltip] back, meeting [second.GetHerHis] affections with my own."
ie_consensual_kissing_scene.second_4_receiving:0 "Our lips part only momentarily before they’re soon drawn back to another."
ie_consensual_kissing_scene.second_negative_opinion_1_receiving:0 "[second.GetSheHe|U] insists upon this, kissing me despite my discomfort."
ie_consensual_kissing_scene.second_chaste_1_receiving:0 "[second.GetSheHe|U] pecks and pecks at me, never letting [second.GetHerHis] kisses linger too long."

ie_consensual_kissing_scene.escalation_1_giving:0 "Soon my tongue finds its way into [second.GetHerHis] mouth, rolling against [second.GetHerHis] own."
ie_consensual_kissing_scene.escalation_2_giving:0 "Kissing becomes making out as our tongues dance around one another in passion."
ie_consensual_kissing_scene.escalation_3_giving:0 "My lips part as we kiss and I slide my tongue into [second.GetHerHis] own waiting mouth."
ie_consensual_kissing_scene.escalation_4_giving:0 "My tongue meets with [second.GetFirstNamePossessiveNoTooltip] between my lips, the wet sounds of kissing interspersed with soft sighs."
ie_consensual_kissing_scene.escalation_negative_opinion_1_giving:0 "I shove my tongue down [second.GetHerHis] throat, [second.GetHerHis] own tongue fighting against the intrusion."

ie_consensual_kissing_scene.escalation_1_receiving:0 "Soon [second.GetHerHis] tongue finds its way into my mouth, rolling against my own."
ie_consensual_kissing_scene.escalation_2_receiving:0 "Kissing becomes making out as our tongues dance around one another in passion."
ie_consensual_kissing_scene.escalation_3_receiving:0 "I feel [second.GetFirstNameNoTooltip] open [second.GetHerHis] mouth and slide [second.GetHerHis] tongue into my own."
ie_consensual_kissing_scene.escalation_4_receiving:0 "My tongue meets with [second.GetFirstNamePossessiveNoTooltip] between my lips, the wet sounds of kissing interspersed with soft sighs."
ie_consensual_kissing_scene.escalation_negative_opinion_1_receiving:0 "[second.GetSheHe|U] shoves [second.GetHerHis] tongue down my throat and I can’t help but try to resist with my own."

ie_consensual_kissing_scene.conclusion_1_giving:0 "I pull away, smiling at [second.GetHerHim]."
ie_consensual_kissing_scene.conclusion_2_giving:0 "Our lips part, the both of us sighing happily."
ie_consensual_kissing_scene.conclusion_3_giving:0 "I lean back, ending the sweet embrace."
ie_consensual_kissing_scene.conclusion_negative_opinion_1_giving:0 "I pull away from [second.GetFirstNameNoTooltip] and [second.GetSheHe] clears [second.GetHerHis] throat and rubs [second.GetHerHis] mouth with the back of [second.GetHerHis] hand."
ie_consensual_kissing_scene.conclusion_lustful_1_giving:0 "I cannot bear to tear myself away from [second.GetHerHim], but eventually the kiss ends and I look upon my [ROOT.Char.Custom2('RelationToMeShort', second)] with stifled desire."

ie_consensual_kissing_scene.conclusion_1_receiving:0 "[second.GetSheHe|U] pulls away, smiling at me."
ie_consensual_kissing_scene.conclusion_2_receiving:0 "Our lips part, the both of us sighing happily."
ie_consensual_kissing_scene.conclusion_3_receiving:0 "[second.GetSheHe|U] leans back, ending the sweet embrace."
ie_consensual_kissing_scene.conclusion_negative_opinion_1_receiving:0 "The [second.GetTitleAsNameNoTooltip] pulls away from me and I clear my throat and rub my mouth with the back of my hand."
ie_consensual_kissing_scene.conclusion_lustful_1_receiving:0 "In [second.GetHerHis] lust, my [ROOT.Char.Custom2('RelationToMeShort', second)] cannot bear to tear [second.GetHerselfHimself] away from me, but eventually the kiss ends and [second.GetSheHe] looks upon me with wanton eyes."


code:
l_spanish:

ie_consensual_sex_scene.orgasm_male.warning_1_giving:0 "I feel a sublime pressure mounting at the base of my $genitals_penis_name$, warning of an imminent release."
ie_consensual_sex_scene.orgasm_male.warning_2_giving:0 "The pleasure builds and builds, pushing me towards the edge..."
ie_consensual_sex_scene.orgasm_male.warning_3_giving:0 "My $genitals_penis_name$ throbs inside of [second.GetHerHim], moments away from climax."

ie_consensual_sex_scene.orgasm_male.warning_1_receiving:0 "[second.GetFirstNameNoTooltip] looks to be near [second.GetHerHis] limit, [second.GetHerHis] expression betraying an imminent release..."
ie_consensual_sex_scene.orgasm_male.warning_2_receiving:0 "[second.GetFirstNameNoTooltip] appears to be drawing towards a climax, [second.GetHerHis] eyes desperate and wanton."
ie_consensual_sex_scene.orgasm_male.warning_3_receiving:0 "I can feel [second.GetHerHim] getting more desperate, closer and closer..."

ie_consensual_sex_scene.orgasm_male.inside_1_giving:0 "Suddenly an explosion of pleasure erupts out the tip of my $genitals_penis_name$, and hot wet $semen_name$ bursts out into [second.GetFirstNamePossessiveNoTooltip] [second.Custom('GetVaginaAnus')]."
ie_consensual_sex_scene.orgasm_male.inside_2_giving:0 "I let out a moan of ecstasy, waves of pleasure washing across my body as I $orgasm_verb$."
ie_consensual_sex_scene.orgasm_male.inside_3_giving:0 "I $orgasm_verb$, flooding streams of hot $semen_name$ into [second.GetFirstNamePossessiveNoTooltip] [Select_CString( second.IsFemale, 'womb', second.Custom('GetAnusName') )]. I can feel it wash out, sliding down my $genitals_penis_name$."

ie_consensual_sex_scene.orgasm_male.inside_1_receiving:0 "Suddenly [second.GetFirstNameNoTooltip] groans in exertion, furrowing [second.GetHerHis] brow as I feel a warmth flooding my [ROOT.Char.Custom('GetVaginaAnus')]."
ie_consensual_sex_scene.orgasm_male.inside_2_receiving:0 "[second.GetFirstNameNoTooltip] lets out a moan of ecstasy, [second.GetHerHis] whole body shaking as [second.GetSheHe] $orgasm_verb_third_person$."
ie_consensual_sex_scene.orgasm_male.inside_3_receiving:0 "[second.GetFirstNameNoTooltip] $orgasm_verb_third_person$, filling my [Select_CString( ROOT.Char.IsFemale, 'womb', ROOT.Char.Custom('GetAnusName') )] with [second.GetHerHis] warm $semen_name$. Everything gets hot and slippery in my [ROOT.Char.Custom('GetVaginaAnus')]..."

ie_consensual_sex_scene.orgasm_male.inside_aftermath_1_giving:0 "I pull out, my $genitals_penis_name$ soaking wet. A dribble of $semen_name$ oozes out of [second.GetFirstNamePossessiveNoTooltip] [second.Custom('GetVaginaAnus')]."
ie_consensual_sex_scene.orgasm_male.inside_aftermath_2_giving:0 "[second.GetFirstNamePossessiveNoTooltip] [second.Custom('GetVaginaAnus')] feels so very slippery and I look down to see my $genitals_penis_name$ coated in thick white $semen_name$."
ie_consensual_sex_scene.orgasm_male.inside_aftermath_3_giving:0 "I let out a deep sigh of satisfaction, every muscle in my body relaxing as I slip free from [second.GetFirstNamePossessiveNoTooltip] embrace."

ie_consensual_sex_scene.orgasm_male.inside_aftermath_1_receiving:0 "[second.GetFirstNameNoTooltip] pulls out, [second.GetHerHis] $genitals_penis_name$ soaked. I look down to see it slathered in white $semen_name$."
ie_consensual_sex_scene.orgasm_male.inside_aftermath_2_receiving:0 "My [ROOT.Char.Custom('GetVaginaAnus')] feels so very warm and wet, hotter and wetter still since [second.GetFirstNamePossessiveNoTooltip] orgasm inside of it."
ie_consensual_sex_scene.orgasm_male.inside_aftermath_3_receiving:0 "[second.GetFirstNameNoTooltip] lets out a deep sigh of satisfaction, slipping free and leaving me with a sense of emptiness in my [ROOT.Char.Custom('GetVaginaAnus')]."

ie_consensual_sex_scene.orgasm_female.warning_1_giving:0 "[second.GetFirstNameNoTooltip] seems to be near [second.GetHerHis] limit, [second.GetHerHis] ecstatic screams betraying [second.GetHerHis] imminent climax..."
ie_consensual_sex_scene.orgasm_female.warning_2_giving:0 "[second.GetFirstNameNoTooltip] appears to be drawing towards a climax, [second.GetHerHis] eyes desperate and wanton."
ie_consensual_sex_scene.orgasm_female.warning_3_giving:0 "I can feel [second.GetHerHim] getting more desperate, closer and closer…"

ie_consensual_sex_scene.orgasm_female.warning_1_receiving:0 "I can't keep myself from screaming out as my climax draws near."
ie_consensual_sex_scene.orgasm_female.warning_2_receiving:0 "The pleasure builds and builds, pushing me towards the edge..."
ie_consensual_sex_scene.orgasm_female.warning_3_receiving:0 "My pussy keeps on gushing, moments away from climax."

ie_consensual_sex_scene.orgasm_female.1_giving:0 "Suddenly [second.GetFirstNameNoTooltip] screams at the top of her lungs as a powerful squirt of fluids erupts from [second.GetHerHis] $genitals_vagina_name$."
ie_consensual_sex_scene.orgasm_female.2_giving:0 "[second.GetFirstNameNoTooltip] lets out a final scream of ecstasy, [second.GetHerHis] whole body shaking violently as [second.GetSheHe] $orgasm_verb_third_person$."
ie_consensual_sex_scene.orgasm_female.3_giving:0 "[second.GetHerHis|U] eyes roll back in their sockets and [second.GetHerHis] entire body convulses as [second.GetSheHe] $orgasm_verb_third_person$."

ie_consensual_sex_scene.orgasm_female.1_receiving:0 "Suddenly an explosion of pleasure erupts from between my legs, and fluids squirt out of my sex."
ie_consensual_sex_scene.orgasm_female.2_receiving:0 "I let out a final scream of ecstasy, waves of pleasure rocking my body as I $orgasm_verb$."
ie_consensual_sex_scene.orgasm_female.3_receiving:0 "I $orgasm_verb$, losing consciousness for a moment as I get overwhelmed by pleasure."

ie_consensual_sex_scene.orgasm_female.aftermath_1_giving:0 "I pull out, my fingers soaking wet. Fluids keep oozing out of [second.GetFirstNamePossessiveNoTooltip] $genitals_vagina_name$."
ie_consensual_sex_scene.orgasm_female.aftermath_2_giving:0 "[second.GetFirstNamePossessiveNoTooltip] $genitals_vagina_name$ feels so very slippery and I look down to see my fingers coated in [second.GetHerHis] juices."
ie_consensual_sex_scene.orgasm_female.aftermath_3_giving:0 "[second.GetFirstNameNoTooltip] lets out a deep sigh of satisfaction, every muscle in [second.GetHerHis] body relaxing as I pull my fingers out of [second.GetHerHim]."

ie_consensual_sex_scene.orgasm_female.aftermath_1_receiving:0 "[second.GetFirstNameNoTooltip] pulls out, [second.GetHerHis] fingers soaked. I look down to see them dripping with my fluids."
ie_consensual_sex_scene.orgasm_female.aftermath_2_receiving:0 "My $genitals_vagina_name$ feels so very warm and wet, hotter and wetter still since the orgasm [second.GetFirstNameNoTooltip] provided me."
ie_consensual_sex_scene.orgasm_female.aftermath_3_receiving:0 "I let out a deep sigh of satisfaction, every muscle in my body relaxing as [second.GetFirstNameNoTooltip] pulls [second.GetHerHis] fingers out of me."


code:
l_spanish:

ie_consensual_sex_scene.missionary.first_1_giving:0 "I set [second.Custom2('MyCharacterIntroduction', ROOT.Char )] down on [second.GetHerHis] back and spread [second.GetHerHis] legs."
ie_consensual_sex_scene.missionary.first_2_giving:0 "[second.Custom2('MyCharacterIntroduction', ROOT.Char )|U] lays down before me in anticipation, looking up expectantly."
ie_consensual_sex_scene.missionary.first_3_giving:0 "I look down at [second.GetHerHim], at [second.GetHerHis] spread legs and [second.GetHerHis] eager [second.Custom('GetVaginaAnus')] on display."
ie_consensual_sex_scene.missionary.first_lustful_giving:0 "I throw [second.GetHerHim] down onto [second.GetHerHis] back, towering over [second.GetHerHim] with mounting desire."

ie_consensual_sex_scene.missionary.first_1_receiving:0 "[second.Custom2('MyCharacterIntroduction', ROOT.Char )|U] sets me down on my back and spreads my legs."
ie_consensual_sex_scene.missionary.first_2_receiving:0 "I lay down before [second.Custom2('MyCharacterIntroduction', ROOT.Char )], looking up at [second.GetHerHim] with desire."
ie_consensual_sex_scene.missionary.first_3_receiving:0 "[second.GetSheHe|U] looks down at me, [second.GetHerHis] eyes wandering over my body..."
ie_consensual_sex_scene.missionary.first_lustful_receiving:0 "[second.GetSheHe|U] throws me down onto my back, looming over me with mounting desire."

ie_consensual_sex_scene.missionary.second_1_giving:0 "I rub my [ROOT.Char.Custom('GetPenetratingAppendage')] against [second.GetHerHis] [second.Custom('GetVaginaAnus')], testing [second.GetHerHim] at first."
ie_consensual_sex_scene.missionary.second_2_giving:0 "I probe at [second.GetHerHis] [Select_CString( second.IsFemale, '', 'rear ' )]entrance[Select_CString( ROOT.Char.IsFemale, '', ' with my cockhead' )][Select_CString( second.IsFemale, ', wetting my ', '')][Select_CString( second.IsFemale, ROOT.Char.Custom('GetPenetratingAppendage'), '' )]."
ie_consensual_sex_scene.missionary.second_3_giving:0 "With one hand I spread [second.GetHerHis] [Select_CString( ROOT.Char.IsFemale, 'lower lips', 'cheeks' )] and ease my $genitals_penis_name$ in with the other."
ie_consensual_sex_scene.missionary.second_3_giving_fem:0 "With one hand I spread [second.GetHerHis] [Select_CString( ROOT.Char.IsFemale, 'lower lips', 'cheeks' )] and ease in the fingers of the other."
ie_consensual_sex_scene.missionary.second_4_giving:0 "I [Select_CString( ROOT.Char.IsFemale, 'push', 'guide' )] my [ROOT.Char.Custom('GetPenetratingAppendage')] inside, [second.GetFirstNameNoTooltip] [Select_CString( second.IsFemale, 'sighing', 'groaning' )] at the intrusion."

ie_consensual_sex_scene.missionary.second_1_receiving:0 "[second.GetSheHe|U] rubs [second.GetHerHis] [second.Custom('GetPenetratingAppendage')] against my [ROOT.Char.Custom('GetVaginaAnus')], testing it at first."
ie_consensual_sex_scene.missionary.second_2_receiving:0 "[second.GetSheHe|U] probes at my [Select_CString( ROOT.Char.IsFemale, '', 'rear ' )]entrance with [second.GetHerHis] cockhead, sending shivers up my spine."
ie_consensual_sex_scene.missionary.second_3_receiving:0 "With one hand [second.GetSheHe] spreads my lower lips and eases [second.GetHerHis] $genitals_penis_name$ in with the other."
ie_consensual_sex_scene.missionary.second_3_receiving_fem:0 "With one hand [second.GetSheHe] spreads my lower lips and eases in the fingers of the other."
ie_consensual_sex_scene.missionary.second_4_receiving:0 "[second.GetSheHe|U] slides [second.GetHerHis] [second.Custom('GetPenetratingAppendage')] inside, forcing out a soft [Select_CString( ROOT.Char.IsFemale, 'sigh', 'groan' )] from my lips."

ie_consensual_sex_scene.missionary.third_1_giving:0 "I start thrusting my [ROOT.Char.Custom('GetArmHips')], [second.GetHerHis] [second.Custom('GetVaginaAnus')] yielding and receptive."
ie_consensual_sex_scene.missionary.third_2_giving:0 "I begin to slide my [ROOT.Char.Custom('GetPenetratingAppendage')] in and out, revealing and obscuring my [ROOT.Char.Custom('GetPenetratingAppendage')] within [second.GetHerHim]."
ie_consensual_sex_scene.missionary.third_3_giving:0 "Soon I am pumping my [ROOT.Char.Custom('GetArmHips')], making [second.GetHerHis] whole body rock with every push."

ie_consensual_sex_scene.missionary.third_1_receiving:0 "[second.GetSheHe|U] starts thrusting [second.GetHerHis] [second.Custom('GetArmHips')], my [ROOT.Char.Custom('GetVaginaAnus')] yielding to [second.GetHerHim]."
ie_consensual_sex_scene.missionary.third_2_receiving:0 "[second.GetSheHe|U] begins to slide [second.GetHerHis] [second.Custom('GetPenetratingAppendage')] in and out of my [ROOT.Char.Custom('GetVaginaAnus')], bringing with it a lurid sensation of being filled and emptied..."
ie_consensual_sex_scene.missionary.third_3_receiving:0 "Soon [second.GetSheHe] is pumping [second.GetHerHis] [second.Custom('GetArmHips')], my whole body rocking with every push."

ie_consensual_sex_scene.missionary.escalation_1_giving:0 "I start fucking [second.GetHerHim] proper, harder and faster."
ie_consensual_sex_scene.missionary.escalation_2_giving:0 "Faster and deeper I go, the air filled with the sounds of impassioned sex."
ie_consensual_sex_scene.missionary.escalation_3_giving:0 "Eagerly I hasten, [Select_CString( ROOT.Char.IsFemale, 'making her moan', 'grunting' )] with every hard push."
ie_consensual_sex_scene.missionary.escalation_4_giving:0 "I quicken the pace, driving deep into [second.GetHerHis] [second.Custom('GetVaginaAnus')]."

ie_consensual_sex_scene.missionary.escalation_1_receiving:0 "[second.GetSheHe|U] starts fucking me proper, harder and faster."
ie_consensual_sex_scene.missionary.escalation_2_receiving:0 "Faster and deeper [second.GetSheHe] goes, filling the air with the sounds of impassioned sex."
ie_consensual_sex_scene.missionary.escalation_3_receiving:0 "Eagerly [second.GetSheHe] hastens, [Select_CString( second.IsFemale, 'making me moan', 'grunting' )] with every hard push."
ie_consensual_sex_scene.missionary.escalation_4_receiving:0 "[second.GetSheHe|U] quickens the pace, driving deeper into my [ROOT.Char.Custom('GetVaginaAnus')]."


code:
l_spanish:

ie_cultural_giant_nephilim:0 "nephilim"
ie_cultural_giant_jabbar:0 "jabbar"
ie_cultural_giant_cawr:0 "cawr"
ie_cultural_giant_fomorian:0 "fomorian"
ie_cultural_giant_jentil:0 "jentil"
ie_cultural_giant_ispolin:0 "ispolin"
ie_cultural_giant_gigant:0 "gigant"
ie_cultural_giant_daitya:0 "daitya"
ie_cultural_giant_jotunn:0 "jötunn"
ie_cultural_giant_reus:0 "reus"
ie_cultural_giant_giant:0 "giant"


code:
l_spanish:

genitals_interaction_giving:0 "I [ROOT.Char.Custom2('GenitalsInteractionGiving', SCOPE.sC('second'))]"
genitals_interaction_receiving:0 "[second.GetSheHe] [ROOT.Char.Custom2('GenitalsInteractionReceiving', SCOPE.sC('second'))]"
genitals_interaction_receiving_with_name:0 "[second.GetFirstNameNoTooltip] [ROOT.Char.Custom2('GenitalsInteractionReceiving', SCOPE.sC('second'))]"

genitals_interaction_penetrate_giving:0 "penetrate [second.GetHerHis] [second.Custom2('GetPenetratedOrifice', ROOT.Char)] with my [ROOT.Char.Custom('GetPenetratingAppendage')]"
genitals_interaction_penetrate_receiving:0 "penetrates my [ROOT.Char.Custom2('GetPenetratedOrifice', second)] with [second.GetHerHis] [second.Custom('GetPenetratingAppendage')]"

genitals_interaction_enter_giving:0 "enter [second.GetHerHis] [second.Custom2('GetPenetratedOrifice', ROOT.Char)] with my [ROOT.Char.Custom('GetPenetratingAppendage')]"
genitals_interaction_enter_receiving:0 "enters my [ROOT.Char.Custom2('GetPenetratedOrifice', ROOT.Char)] with [second.GetHerHis] [second.Custom('GetPenetratingAppendage')]"

genitals_interaction_push_giving:0 "push my [ROOT.Char.Custom('GetPenetratingAppendage')] into [second.GetHerHis] [second.Custom2('GetPenetratedOrifice', ROOT.Char)]"
genitals_interaction_push_receiving:0 "pushes [second.GetHerHis] [second.Custom('GetPenetratingAppendage')] into my [ROOT.Char.Custom2('GetPenetratedOrifice', SCOPE.sC('second'))]"

genitals_interaction_shove_giving:0 "shove my [ROOT.Char.Custom('GetPenetratingAppendage')] into [second.GetHerHis] [second.Custom2('GetPenetratedOrifice', ROOT.Char)]"
genitals_interaction_shove_receiving:0 "shoves [second.GetHerHis] [second.Custom('GetPenetratingAppendage')] into my [ROOT.Char.Custom2('GetPenetratedOrifice', SCOPE.sC('second'))]"

genitals_interaction_thrust_giving:0 "thrust my [ROOT.Char.Custom('GetPenetratingAppendage')] into [second.GetHerHis] [second.Custom2('GetPenetratedOrifice', ROOT.Char)]"
genitals_interaction_thrust_receiving:0 "thrusts [second.GetHerHis] [second.Custom('GetPenetratingAppendage')] into my [ROOT.Char.Custom2('GetPenetratedOrifice', SCOPE.sC('second'))]"

genitals_interaction_plunge_giving:0 "plunge my [ROOT.Char.Custom('GetPenetratingAppendage')] into [second.GetHerHis] [second.Custom2('GetPenetratedOrifice', ROOT.Char)]"
genitals_interaction_plunge_receiving:0 "plunges [second.GetHerHis] [second.Custom('GetPenetratingAppendage')] into my [ROOT.Char.Custom2('GetPenetratedOrifice', SCOPE.sC('second'))]"

genitals_interaction_take_giving:0 "take [second.GetHerHim] in [second.GetHerHis] [second.Custom2('GetPenetratedOrifice', ROOT.Char)] with my [ROOT.Char.Custom('GetPenetratingAppendage')]"
genitals_interaction_take_receiving:0 "takes me in my [ROOT.Char.Custom2('GetPenetratedOrifice', SCOPE.sC('second'))] with [second.GetHerHis] [second.Custom('GetPenetratingAppendage')]"

genitals_interaction_fuck_giving:0 "fuck [second.GetHerHim] in [second.GetHerHis] [second.Custom2('GetPenetratedOrifice', ROOT.Char)] with my [ROOT.Char.Custom('GetPenetratingAppendage')]"
genitals_interaction_fuck_receiving:0 "fucks me in my [ROOT.Char.Custom2('GetPenetratedOrifice', SCOPE.sC('second'))] with [second.GetHerHis] [second.Custom('GetPenetratingAppendage')]"


code:
l_spanish:

ie_feast.1000.t:0 "The Morning After"
ie_feast.1000.desc:0 "I wake up after a long night of feasting. My memories are a bit hazy — maybe I feasted a bit too much — but from what I can remember I had a great time. There is nothing better in the world than to eat, to drink, and to be merry.\n\nYawning, I rub the sleep from my eyes. Only then do I realize I am not alone in bed. Heat radiates from a body next to mine."
ie_feast.1000.a:0 "Who..."

ie_feast.1001.desc:0 "I turn around and stare right into the eyes of a beautiful — yet unknown [stranger.GetWomanMan]. A broad smile appears on [stranger.GetHerHis] face. My eyes trail down, but I quickly avert them when I notice [stranger.GetHerHis] naked form.\n\n"What's wrong, my Liege?" [stranger.GetSheHe] asks. "Last night you couldn't get enough of my body."\n\nThe [stranger.GetWomanMan] folds the covers away, revealing [stranger.GetHerHis] gorgeous naked body fully to me."
ie_feast.1001.a.spouse:0 "I'm spoken for."
ie_feast.1001.a:0 "This was a mistake."
ie_feast.1001.a.tt:0 "You say goodbye to [stranger.GetShortUIName]."
ie_feast.1001.b:0 "Just this once."
ie_feast.1001.c:0 "In for a penny, in for a pound."


code:
l_spanish:

ie_hunt.0001.t:0 "Quite the Catch"
ie_hunt.0001.desc:0 "I hear rustling in the bushes. Stealthily, I move in closer, bow at the ready. I round a tree, expecting to see the [ROOT.Char.Custom('LocalAnimal')] I was tracking.\n\nWhat I find instead are [lesbian_1.Custom2('MyCharacterIntroduction', ROOT.Char)] and [lesbian_2.Custom2('MyCharacterIntroductionNoComma', ROOT.Char)]. Both women are in a state of undress, standing up against a tree, hungrily kissing one another. [lesbian_1.GetFirstNamePossessiveNoTooltip|U] hand is underneath [lesbian_2.GetFirstNamePossessiveNoTooltip] skirt, between her legs. [ROOT.Char.Custom('sinful_agitating')]"
ie_hunt.0001.desc.optional:0 "The sight is as scandalous as it is arousing."
ie_hunt.0001.a:0 "Maybe the ladies would like some company."
ie_hunt.0001.a.tt:0 "You offer to join them"
ie_hunt.0001.b:0 "I should not disturb them."
ie_hunt.0001.b.tt:0 "You respect their privacy and leave."
ie_hunt.0001.c:0 "Such sinful behavior cannot be condoned!"
ie_hunt.0002.desc:0 "The women look at me for a moment. Then they start to laugh out loud.\n\n“Not in a million years,” one says.\n\n“I’d rather fuck myself with a blade,” the other says.\n\nAs if I am not even there, the two women resume their agitating acts."
ie_hunt.0002.a:0 "No one talks to me like that!"
ie_hunt.0002.b:0 "Fine! I was leaving anyway."
ie_hunt.0003.desc:0 "The women are startled at first, but then begin to smile.\n\n“You are welcome to join us, my lord,” one of them says.\n\n“You are our liege after all,” the other adds.\n\nI join the two women and immediately share a deep, lustful kiss with each of them. Their lips are so incredibly soft — their tongues eager. Both women remove their remaining garments, and I too undress myself.\n\nThe three of us lay our naked bodies down in the grass and proceed to make love in ways I could never have fathomed. Making love to two women at once makes me more aroused, and gives me more pleasure than any other form of intercourse I had enjoyed up till now.\n\nThe women and I enjoy each other’s company — and bodies — until well past sunset. By the end, all three of us are left fully satisfied."
ie_hunt.0003.a:0 "We should make this a regular thing."
ie_hunt.0003.b:0 "This was a fun distraction, nothing more."
ie_hunt.0004.desc:0 "The women shriek in surprise when I speak up. As quickly as they can they get dressed again.\n\n“Wait…” I say.\n\nBut before I can say anything else the two women run off into the woods."
ie_hunt.0004.a:0 "That was... unexpected."


code:
l_spanish:

ie_consensual_kissing_scene.0001.t:0 "Intimate Encounter"
ie_consensual_kissing_scene.0001.a:0 "Invite [carn_sex_target.GetTitledFirstNameNoTooltip] up to my room."
ie_consensual_kissing_scene.0001.b:0 "Leave it at just a kiss."
ie_consensual_kissing_scene.0001.debug:0 "DEBUG – Again!"

ie_consensual_kissing_scene.0001.text_giving:0 "[ROOT.Char.Custom2('ie_consensual_kissing_scene_part_1_giving', SCOPE.sC('receiver'))] [ROOT.Char.Custom2('ie_consensual_kissing_scene_part_2_giving', SCOPE.sC('receiver'))]\n\n[ROOT.Char.Custom2('ie_consensual_kissing_scene_part_3_giving', SCOPE.sC('receiver'))] [ROOT.Char.Custom2('ie_consensual_kissing_scene_part_4_giving', SCOPE.sC('receiver'))]"

ie_consensual_kissing_scene.0001.text_receiving:0 "[ROOT.Char.Custom2('ie_consensual_kissing_scene_part_1_receiving', SCOPE.sC('giver'))] [ROOT.Char.Custom2('ie_consensual_kissing_scene_part_2_receiving', SCOPE.sC('giver'))]\n\n[ROOT.Char.Custom2('ie_consensual_kissing_scene_part_3_receiving', SCOPE.sC('giver'))] [ROOT.Char.Custom2('ie_consensual_kissing_scene_part_4_receiving', SCOPE.sC('giver'))]"


code:
l_spanish:

ie_pet_animal.0001.t:0 "A Girl's Best Friend"
ie_pet_animal.0001.desc:0 "My faithful companion [ROOT.Char.Custom('DogStoryName')] follows me everywhere, and never misses an opportunity to join me in the comfy pillows and blankets of my bed. Many nights his warm coat has offered me solace to my loneliness and when morning comes, I am roused from my slumber by the most enthusiastic lickings!\n\nHe has accompanied me to my bedchambers with such regularity that my retinue thinks little of it these days. A most enviable privilege for a gentleman - to be able to spend the whole night in privacy with a fair lady..."
ie_pet_animal.0001.a:0 "Who's a good boy!? You’re a good boy! You want a tummy rub?"
ie_pet_animal.0001.a.tt:0 "Rub rub rub!"
ie_pet_animal.0001.b:0 "He makes for a nice cuddling companion, nothing more."
ie_pet_animal.0001.b.tt:0 "Best to let sleeping dogs lie."
ie_pet_animal.0002.desc:0 "[ROOT.Char.Custom('DogStoryName')] rolls over, exposing his belly and happily wagging his tail as I rub his belly. He wriggles and squirms, panting as I go faster. Out of some compulsion to overwhelm my furry companion with affection, I put both my hands on his stomach and furiously rub him - until his leg starts kicking and he begins to bark.\n\nWhen I draw back, I notice something strange about him. He has frozen in place, panting and looking up at me. His legs are bent and he remains on his back, while in his furry loins, I spy something... red."
ie_pet_animal.0002.a:0 "It wasn't there before..."
ie_pet_animal.0002.a.tt:0 "I wonder what it feels like."
ie_pet_animal.0002.a.toast.desc:0 "You lay with your dog."
ie_pet_animal.0002.b:0 "Down! Off the bed! Bad dog!"
ie_pet_animal.0002.b.tt:0 "I'm not comfortable with where this is going."


code:
l_spanish:

I_LUSTFUL_PIETY_IMPACT_GAIN:0 "You gain [piety_i]$VALUE|+0$ [piety|E] because [GetTrait('lustful').GetName( CHARACTER.Self )] is a [virtue|E]"
I_LUSTFUL_PIETY_IMPACT_LOSS:0 "You lose [piety_i]$VALUE|-0$ [piety|E] because [GetTrait('lustful').GetName( CHARACTER.Self )] is a [sin|E]"
THEY_LUSTFUL_PIETY_IMPACT_GAIN:0 "[CHARACTER.GetShortUIName|U] gains [piety_i]$VALUE|V0$ [piety|E] because [GetTrait('lustful').GetName( CHARACTER.Self )] is a [virtue|E]"
THEY_LUSTFUL_PIETY_IMPACT_LOSS:0 "[CHARACTER.GetShortUIName|U] loses [piety_i]$VALUE|V0$ [piety|E] because [GetTrait('lustful').GetName( CHARACTER.Self )] is a [sin|E]"
I_PAST_LUSTFUL_PIETY_IMPACT_GAIN:0 "You gained [piety_i]$VALUE|+0$ [piety|E] because [GetTrait('lustful').GetName( CHARACTER.Self )] is a [virtue|E]"
I_PAST_LUSTFUL_PIETY_IMPACT_LOSS:0 "You lost  [piety_i]$VALUE|-0$ [piety|E] because [GetTrait('lustful').GetName( CHARACTER.Self )] is a [sin|E]"
THEY_PAST_LUSTFUL_PIETY_IMPACT_GAIN:0 "[CHARACTER.GetShortUIName|U] gained [piety_i]$VALUE|V0$ [piety|E] because [GetTrait('lustful').GetName( CHARACTER.Self )] is a [virtue|E]"
THEY_PAST_LUSTFUL_PIETY_IMPACT_LOSS:0 "[CHARACTER.GetShortUIName|U] lost [piety_i]$VALUE|V0$ [piety|E] because [GetTrait('lustful').GetName( CHARACTER.Self )] is a [sin|E]"

PIETY_GAIN:0 "Gains [piety_i]$VALUE|V0$ [piety|E] because [GetTrait('lustful').GetName( CHARACTER.Self )] is a [virtue|E]"
PIETY_LOSS:0 "Loses [piety_i]$VALUE|V0$ [piety|E] because [GetTrait('lustful').GetName( CHARACTER.Self )] is a [sin|E]"
PAST_LUSTFUL_PIETY_IMPACT_GAIN:0 "Gained [piety_i]$VALUE|V0$ [piety|E] because [GetTrait('lustful').GetName( CHARACTER.Self )] is a [virtue|E]"
PAST_LUSTFUL_PIETY_IMPACT_LOSS:0 "Lost [piety_i]$VALUE|V0$ [piety|E] because [GetTrait('lustful').GetName( CHARACTER.Self )] is a [sin|E]"


code:
l_spanish:

rule_ie_masked_orgy:0 "#D Intimate Encounters:#! Masked Orgy"
setting_ie_masked_orgy_player_and_ai:0 "Enabled"
setting_ie_masked_orgy_player_and_ai_desc:0 "Both you and AI characters can host masked orgies."
setting_ie_masked_orgy_player_only:0 "#high Player only#!"
setting_ie_masked_orgy_player_only_desc:0 "Only players are allowed to host masked orgies."
setting_ie_masked_orgy_disabled:0 "#high Disabled#!"
setting_ie_masked_orgy_disabled_desc:0 "Noone can host masked orgies."


code:
l_spanish:
trait_ie_masked:0 "Masked"
trait_ie_masked_desc:0 "This character is using a mask to hide their identity."
trait_ie_masked_character_desc:0 "[ROOT.GetCharacter.GetFirstNameNoTooltip] is using a mask to hide [ROOT.GetCharacter.GetHerHis] identity."


code:
"""
CK3 Localization Helper script by erri120 under GPLv3.

Usage:

Updating translations:

python localization_helper.py update --lang german

Viewing statistics:

python localization_helper.py stats

Viewing statistics for a specific language:

python localization_helper.py stats --lang german

"""

import os;
import argparse;
import sys;
import glob;
import shutil;
import re;
from typing import Tuple, List;
from enum import Enum;

class TranslationStatus(Enum):
    """Status enum for translations"""
    UNTRANSLATED = 0
    TRANSLATED = 1
    NEEDSUPDATE = 2

#key, value, translated, comment
Yaml = Tuple[str, str, TranslationStatus, bool];

BASE_LANGUAGE = 'english';
ENCODING = 'utf-8-sig';
BACKUP_SUFFIX = '_backup';

localization_dir = os.path.abspath('localization');
base_dir = os.path.join(localization_dir, BASE_LANGUAGE);

def create_empty_list(count: int) -> List[str]:
    """Creates a new empty list"""
    return [''] * count;

def is_empty(string: str) -> bool:
    """Checks if the string is empty or only has whitespaces"""

    if not string:
        return True;
    return string.isspace();

def get_lang_name(lang: str) -> str:
    """Returns the name ending for a language."""

    return 'l_'+lang;

def get_yaml(string: str) -> Yaml:
    """Gets a YAML Tuple for the current line"""

    empty = ('', '', TranslationStatus.UNTRANSLATED, False);

    if is_empty(string):
        return empty;

    line = string.strip();
    comment_index = -1;

    try:
        comment_index = line.index('#');
        if comment_index == 0:
            return ('', '', TranslationStatus.UNTRANSLATED, True);
    except ValueError:
        pass;

    line_len = len(line);
    index = -1;
    key = '';
    value = '';
    status = TranslationStatus.UNTRANSLATED;

    try:
        index = line.index(':');
    except ValueError:
        print('Unable to get index of : in line \"'+line+'\"');
        return empty;

    key = line[0:index];

    if line_len <= index+1:
        return (key, value, status, False);

    if not is_empty(line[index+1]):
        translation_value = line[index+1];
        if not translation_value in ('0', '1', '2'):
            print('Unknown translation value \"'+translation_value+'\" in line \"'+line+'\"');
        else:
            if translation_value == '1':
                status = TranslationStatus.TRANSLATED;
            if translation_value == '2':
                status = TranslationStatus.NEEDSUPDATE;
        value = line[index+2:].strip();
    else:
        value = line[index+1:].strip();

    result = (key, value, status, False);
    return result;

def get_yaml_from_file(path: str) -> List[Yaml]:
    """Reads a file and returns a list of all YAML values"""

    yaml = list();
    with open(path, 'r', encoding=ENCODING) as file_stream:
        line = file_stream.readline();
        while line:
            yaml.append(get_yaml(line));
            line = file_stream.readline();

    return yaml;

def yaml_to_string(yaml: Yaml, include_translate: bool = True, override_translate_status: str = '') -> str:
    """Converts a YAML Tuple to string"""
    translate_str = '' if not include_translate else str(yaml[2].value);
    if not override_translate_status == '':
        translate_str = override_translate_status;
    return yaml[0]+':'+translate_str+' '+yaml[1]+'\n';

def update_translation_file(input_path: str, output_path: str, output_lang: str):
    """Updates the provided file with new translations"""

    output_lang_name = get_lang_name(output_lang);
    output_path_short = re.sub(r'^.*?localization', '', output_path)
    input_path_short = re.sub(r'^.*?localization', '', input_path)

    print("========================================");
    print('Updating file '+output_path_short);

    if not os.path.exists(output_path):
        print('=> File does not exist, copying from '+input_path_short+' to '+output_path_short);
        shutil.copyfile(input_path, output_path);

    input_yaml = get_yaml_from_file(input_path);
    output_yaml = get_yaml_from_file(output_path);

    input_len = len(input_yaml);
    output_len = len(output_yaml);
    new_lines = create_empty_list(input_len);

    if output_len != input_len:
        print('=> Input length does not equal output length: '+str(input_len)+' != '+str(output_len));

    output_len_updated = input_len;
    for i in range(input_len):
        cur_input = input_yaml[i];
        # is comment
        if cur_input[3]:
            continue;

        if i == 0:
            new_lines[0] = output_lang_name+':\n';
            continue;

        if is_empty(cur_input[0]):
            new_lines[i] = '\n';
            continue;

        # searching for a YAML tuple with the same key as the current
        found_in_output = next((x for x in output_yaml if x[0] == cur_input[0]),
            ('', '', TranslationStatus.UNTRANSLATED, False));

        # not found means we just add the input
        if not found_in_output[0]:
            print('==> New key: '+ cur_input[0]);
            new_lines[i] = yaml_to_string(cur_input, True, "0");
            continue;

        # if we found it in the output file we check if it's already flagged as needing update, and keep the translation
        if found_in_output[2] == TranslationStatus.NEEDSUPDATE:
            new_lines[i] = yaml_to_string(found_in_output);
            continue;

        # if we found it in the output file we check if it needs update and we add the NEEDSUPDATE status
        if cur_input[2] == TranslationStatus.NEEDSUPDATE and found_in_output[2] == TranslationStatus.TRANSLATED:
            print('==> New Update Needed: '+ cur_input[0]);
            new_lines[i] = "#" + yaml_to_string(found_in_output) + yaml_to_string(cur_input, True, "2");
            # i = i+1;
            # output_len_updated = output_len_updated+1;
            continue;

        # if we found it in the output file we check if it's translated and keep the translation
        if found_in_output[2] == TranslationStatus.TRANSLATED:
            new_lines[i] = yaml_to_string(found_in_output);
            continue;

        # if it's not translated then we copy the input
        new_lines[i] = yaml_to_string(cur_input, True, "0");

    with open(output_path, 'w', encoding=ENCODING) as file_stream:
        file_stream.writelines(new_lines);

def copy_base_translations(input_dir: str, output_dir: str, input_lang: str, output_lang: str):
    """
    Recursively copies the contents of one folder to another and
    calls the updateFile function on every file.
    """

    input_lang_file_name = get_lang_name(input_lang)+'.yml';
    output_lang_file_name = get_lang_name(output_lang)+'.yml';

    if not os.path.exists(output_dir):
        os.mkdir(output_dir);
    items = glob.glob(input_dir + '\\*');
    for item in items:
        if os.path.isdir(item):
            path = os.path.join(output_dir, item.split(os.path.sep)[-1]);
            copy_base_translations(item, path, input_lang, output_lang);
        else:
            file_name = item.split(os.path.sep)[-1];
            if file_name.endswith(input_lang_file_name):
                file_name = file_name.replace(input_lang_file_name, output_lang_file_name);
            path = os.path.join(output_dir, file_name);
            update_translation_file(item, path, output_lang);

def rename_deleted_or_moved_files(input_dir: str, output_dir: str, input_lang: str, output_lang: str):
    """
    Rename files in the translation that are not present in the english localization anymore
    """

    input_lang_file_name = get_lang_name(input_lang)+'.yml';
    output_lang_file_name = get_lang_name(output_lang)+'.yml';

    # We get a list of all files in the english localization
    input_file_list = list()
    for subdir, dirs, files in os.walk(input_dir):
        for file in files:
            cur_input_file = os.path.join(subdir, file).split(input_lang_file_name);
            cur_input_file = cur_input_file[0].split(input_dir);
            input_file_list += cur_input_file;

    # We compare the translation files with the english ones, and rename those that don't exist in the english loc anymore
    # With the exception of the language specific custom localizations in "custom_localization_[output_lang]"
    for subdir, dirs, files in os.walk(output_dir):
        for file in files:
            cur_output_file = os.path.join(subdir, file).split(output_lang_file_name);
            cur_output_file = cur_output_file[0].split(output_lang);
            if not cur_output_file[1] in input_file_list and not os.path.isdir(cur_output_file[1]) and not file.endswith(BACKUP_SUFFIX) and not subdir.endswith("custom_localization_" + output_lang):
                print("========================================");
                print("=> '" + input_lang + cur_output_file[1] + input_lang_file_name + "' doesn't exist anymore");
                print(" ==> renaming the " + output_lang + " version for backup");
                os.rename(os.path.join(subdir, file), os.path.join(subdir, file) + BACKUP_SUFFIX)

def updating(output_language: str):
    """Updates all Translations"""

    print("===================================================");
    print('Updating Translation for Language: '+output_language);
    print("===================================================");
    output_dir = os.path.join(localization_dir, output_language);

    print('=> Using '+BASE_LANGUAGE+' Translations from '+base_dir+' in '+output_dir);
    copy_base_translations(base_dir, output_dir, BASE_LANGUAGE, output_language);
    rename_deleted_or_moved_files(base_dir, output_dir, BASE_LANGUAGE, output_language);

def get_translation_stats_file(base: str, path: str, cur_lang: str, detail: bool) -> Tuple[str, int, int, int]:
    """Gets the number of translated and not translated string of a file"""

    yaml = get_yaml_from_file(path);

    total = 0;
    translated = 0;
    not_translated = 0;
    needs_update = 0;

    lang_name = get_lang_name(cur_lang);

    for x in yaml:
        if x[3]:
            continue;
        if is_empty(x[0]):
            continue;
        if x[0] == lang_name:
            continue;

        total += 1;
        if x[2] == TranslationStatus.TRANSLATED:
            translated += 1;
        elif x[2] == TranslationStatus.UNTRANSLATED:
            if detail:
                print(path+' '+x[0]);
            not_translated += 1;
        else:
            needs_update += 1;

    return (path.replace(base, ''), translated, not_translated, needs_update);

def get_translation_stats_folder(base: str, folder: str, cur_lang: str, detail: bool) -> List[Tuple[str, int, int, int]]:
    """Gets Translation stats for a folder"""

    result = list();

    items = glob.glob(folder + '\\*');
    for item in items:
        if os.path.isdir(item):
            dir_stats = get_translation_stats_folder(base, item, cur_lang, detail);
            for stat in dir_stats:
                result.append(stat);
        else:
            file_stats = get_translation_stats_file(base, item, cur_lang, detail);
            result.append(file_stats);

    return result;

def add(enumerable: List[int]) -> int:
    """Adds all numbers of a list"""

    i = 0;
    for x in enumerable:
        i += x;
    return i;

def stats(lang: str):
    """Displays Translation Statistics"""

    print('Translation Statistics:\n');
    print('%-15s %10s %7s %8s %7s' % ('Language ', 'Translated', 'Missing', 'Outdated', 'Ratio'))

    languages = glob.glob(localization_dir+'\\*');
    detail = lang != '';
    for language in languages:
        name = language.replace(localization_dir+'\\', '');
        if name == BASE_LANGUAGE:
            continue;
        if detail and lang != name:
            continue;
        lang_stats = get_translation_stats_folder(language+'\\', language, name, detail);
        translated = list(map(lambda x: x[1], lang_stats));
        missing = list(map(lambda x: x[2], lang_stats));
        needs_update = list(map(lambda x: x[3], lang_stats));
        total_translated = add(translated);
        total_missing = add(missing);
        total_needs_update = add(needs_update);
        total = total_translated+total_missing+total_needs_update;
        ratio = (total_translated/total)*100;

        ratio_str = f'{ratio:.2f}%';

        print('%-15s %10s %7s %8s %7s' % (name, total_translated, total_missing, total_needs_update, ratio_str))

def main():
    """Main"""
    parser = argparse.ArgumentParser('Localization Helper',
        description='Localization Helper by erri120',
        allow_abbrev=False);
    parser.add_argument('verb',
        help='Translation Update or Statistics',
        choices=('update', 'stats'));
    parser.add_argument('--lang',
        action='store',
        type=str,
        metavar='Language',
        help='Language for Translation Updates');
    args = parser.parse_args();

    lang = args.lang;
    if args.verb == 'update':
        if lang is None:
            print('Updating all languages')
            languages = glob.glob(localization_dir+'\\*')
            for language in languages:
                name = language.replace(localization_dir+'\\', '')
                if name == BASE_LANGUAGE:
                    continue
                updating(name)
        else:
            updating(lang)
    else:
        if lang is None:
            stats('');
        else:
            stats(lang);

if __name__ == '__main__':
    main();


code:
.dockerignore
.editorconfig
GPLv3.txt
LICENSE
README.md
TGS3.json
.github
.gitignore
.gitattributes
.git/hooks
.git/info
.git/modules
.git/objects
.git/refs
.vs*
cfg
data
SQL
node_modules
tgstation.dmb
tgstation.int
tgstation.rsc
tgstation.lk
tgstation.dyn.rsc
*.dll
Dockerfile
tools/bootstrap/.cache

repo_name: AnalWerewolf/sundown

path: .dockerignore

license: mit


code:
[*]
indent_style = tab
indent_size = 4
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
end_of_line = lf

[*.yml]
indent_style = space
indent_size = 2

[*.py]
indent_style = space

[*.md]
trim_trailing_whitespace = false

[Dockerfile]
indent_style = space

path: .editorconfig


code:
#Ignores big formatting commits when checking blame.
#To make use of this file by default, run 'git config blame.ignoreRevsFile .git-blame-ignore-revs'
#in the project folder

## Line ending conversions

# Force LF line endings with gitattributes and convert repo
62676e72a85cd23e7a87d94adff96d17859dbdc5
# Line ending apocalypse
134a76cc8f5517bdc1bba5a8cbe01dc820df1c2a
# Initial pass to convert LF to CRLF
8af8a43d6f27e342e79d4aacb22b7668cbdc8559
# Many changes
931da9e7ef8c0f52a768eed7998e7e62ccdefcdc
# Remove hideous inline tab indentation, and bans it in contributing guidelines
0f435d5dff0a7957e8cba60a41a7fc10439064c3

path: .git-blame-ignore-revs


code:
* text=auto

## Enforce text mode and LF line breaks
*.bat text eol=lf
*.cjs text eol=lf
*.css text eol=lf
*.dm text eol=lf
*.dme text eol=lf
*.dmf text eol=lf
*.htm text eol=lf
*.html text eol=lf
*.js text eol=lf
*.json text eol=lf
*.jsx text eol=lf
*.md text eol=lf
*.ps1 text eol=lf
*.py text eol=lf
*.scss text eol=lf
*.sh text eol=lf
*.sql text eol=lf
*.svg text eol=lf
*.ts text eol=lf
*.tsx text eol=lf
*.txt text eol=lf
*.yaml text eol=lf
*.yml text eol=lf

## Enforce binary mode
*.bmp binary
*.dll binary
*.dmb binary
*.exe binary
*.gif binary
*.jpg binary
*.png binary
*.so binary

## Merger hooks, run tools/hooks/install.bat or install.sh to set up
*.dmm text eol=lf merge=dmm
*.dmi binary merge=dmi

## Force tab indents on dm files
*.dm whitespace=indent-with-non-tab

path: .gitattributes


code:
# This list auto requests reviews from the specified org members
# when a PR that modifies the file in question is opened
# This list is alphabetized by User -> Filename and separated into sections for Maintainers/Contributors KEEP IT THAT WAY
# In the event that people are to be informed of changes
# to the same file or dir, add them to the end of under Multiple Owners

# MAINTAINERS

# Cobby
/code/modules/reagents/ @ExcessiveUseOfCobblestone
/code/modules/research/designs/medical_designs.dm @ExcessiveUseOfCobblestone
/code/modules/surgery/ @ExcessiveUseOfCobblestone
/code/game/objects/items/storage/firstaid.dm @ExcessiveUseOfCobblestone
/code/modules/jobs/job_types/chief_medical_officer.dm @ExcessiveUseOfCobblestone
/code/modules/jobs/job_types/medical_doctor.dm @ExcessiveUseOfCobblestone

# Cyberboss

/code/__HELPERS/jatum.dm @Cyberboss
/code/controllers/subsystem/atoms.dm @Cyberboss
/code/controllers/subsystem/mapping.dm @Cyberboss
/code/controllers/globals.dm @Cyberboss
/code/datums/helper_datums/getrev.dm @Cyberboss
/code/datums/map_config.dm @Cyberboss
/code/datums/forced_movement.dm @Cyberboss
/code/datums/holocall.dm @Cyberboss
/code/modules/admin/verbs/adminhelp.dm @Cyberboss
/code/modules/admin/verbs/adminpm.dm @Cyberboss
/code/modules/mapping/ @Cyberboss

# Jordie0608

/SQL/ @Jordie0608
/code/controllers/subsystem/dbcore.dm @Jordie0608
/tools/SQLAlertEmail/ @Jordie0608

# LemonInTheDark

/code/__DEFINES/atmospherics/ @LemonInTheDark
/code/modules/atmospherics/ @LemonInTheDark

# Mothblocks

/code/modules/unit_tests/ @Mothblocks
/code/modules/client/preferences/ @Mothblocks
/code/modules/preferences.dm @Mothblocks
/code/modules/preferences_menu.dm @Mothblocks
/code/modules/preferences_savefile.dm @Mothblocks
/tgui/packages/tgui/interfaces/PreferencesMenu/ @Mothblocks

# ninjanomnom

/code/__DEFINES/dcs/ @ninjanomnom
/code/controllers/subsystem/dcs.dm @ninjanomnom
/code/controllers/subsystem/shuttle.dm @ninjanomnom
/code/datums/components/ @ninjanomnom
/code/datums/elements/ @ninjanomnom
/code/modules/shuttle/ @ninjanomnom

# ShizCalev

/sound/ @ShizCalev

# stylemistake

/code/__DEFINES/chat.dm @stylemistake
/code/__DEFINES/tgui.dm @stylemistake
/code/controllers/subsystem/chat.dm @stylemistake
/code/controllers/subsystem/tgui.dm @stylemistake
/code/modules/tgchat @stylemistake
/code/modules/tgui @stylemistake
/code/modules/tgui_panel @stylemistake
/tgui @stylemistake

# tralezab

/code/datums/ai/ @tralezab

# Watermelon914

/code/modules/wiremod/ @Watermelon914

# CONTRIBUTORS

# Ghilker

/code/__DEFINES/atmospherics/ @Ghilker
/code/modules/atmospherics/ @Ghilker

# JohnFulpWizard

/goon/ @JohnFulpWillard

# MrStonedOne

/SQL/database_changelog.txt @MrStonedOne
/code/__DEFINES/MC.dm @MrStonedOne
/code/controllers/admin.dm @MrStonedOne
/code/controllers/master.dm @MrStonedOne
/code/controllers/failsafe.dm @MrStonedOne
/code/controllers/subsystem.dm @MrStonedOne
/code/controllers/subsystem/timer.dm @MrStonedOne
/code/controllers/configuration/entries @MrStonedOne
/config/ @MrStonedOne

# MULTIPLE OWNERS

/icons/ @Twaticus @ShizCalev @Krysonism
/code/controllers/subsystem/air.dm @LemonInTheDark @MrStonedOne
/_maps/ @EOBGames @ShizCalev @Maurukas
/tools/build/ @MrStonedOne @stylemistake
/tools/LinuxOneShot/ @Cyberboss @MrStonedOne
/tools/tgs4_scripts/ @Cyberboss @MrStonedOne

#SIC SEMPER TYRANNIS
/code/modules/hydroponics/grown/citrus.dm @optimumtact

path: .github/CODEOWNERS


code:
# CONTRIBUTING

1. [Reporting Issues](#reporting-issues)
2. [Introduction](#introduction)
3. [Getting Started](#getting-started)
4. [Meet the Team](#meet-the-team)
	1. [Headcoder](#headcoder)
	2. [Maintainers](#maintainers)
	3. [Issue Managers](#issue-managers)
5. [Development Guides](#development-guides)
6. [Pull Request Process](#pull-request-process)
7. [Porting features/sprites/sounds/tools from other codebases](#porting-featuresspritessoundstools-from-other-codebases)
8. [Banned content](#banned-content)
9. [A word on Git](#a-word-on-git)

## Reporting Issues

If you ever encounter a bug in-game, the best way to let a coder know about it is with our GitHub Issue Tracker. Please make sure you use the supplied issue template, and include the round ID for the server.

(If you don't have an account, making a new one takes only one minute.)

If you have difficulty, ask for help in the #coding-general channel on our discord.

## Introduction

Hello and welcome to /tg/station's contributing page. You are here because you are curious or interested in contributing - thank you! Everyone is free to contribute to this project as long as they follow the simple guidelines and specifications below; at /tg/station, we strive to maintain code stability and maintainability, and to do that, we need all pull requests to hold up to those specifications. It's in everyone's best interests - including yours! - if the same bug doesn't have to be fixed twice because of duplicated code.

First things first, we want to make it clear how you can contribute (if you've never contributed before), as well as the kinds of powers the team has over your additions, to avoid any unpleasant surprises if your pull request is closed for a reason you didn't foresee.

## Getting Started

/tg/station doesn't have a list of goals and features to add; we instead allow freedom for contributors to suggest and create their ideas for the game. That doesn't mean we aren't determined to squash bugs, which unfortunately pop up a lot due to the deep complexity of the game. Here are some useful starting guides, if you want to contribute or if you want to know what challenges you can tackle with zero knowledge about the game's code structure.

If you want to contribute the first thing you'll need to do is [set up Git](http://tgstation13.org/wiki/Setting_up_git) so you can download the source code.
After setting it up, optionally navigate your git commandline to the project folder and run the command: `git config blame.ignoreRevsFile .git-blame-ignore-revs`.

We have a [list of guides on the wiki](http://www.tgstation13.org/wiki/Guides#Development_and_Contribution_Guides) that will help you get started contributing to /tg/station with Git and Dream Maker. For beginners, it is recommended you work on small projects like bugfixes at first. If you need help learning to program in BYOND, check out this [repository of resources](http://www.byond.com/developer/articles/resources).

There is an open list of approachable issues for [your inspiration here](https://github.com/tgstation/tgstation/issues?q=is%3Aopen+is%3Aissue+label%3A%22Good+First+Issue%22).

You can of course, as always, ask for help on the Discord channels or the forums. We're just here to have fun and help out, so please don't expect professional support.

## Meet the Team

### Headcoder

The Headcoder is responsible for controlling, adding, and removing maintainers from the project. In addition to filling the role of a normal maintainer, they have sole authority on who becomes a maintainer, as well as who remains a maintainer and who does not.

### Maintainers

Maintainers are quality control. If a proposed pull request doesn't meet the following specifications, they can request you to change it, or simply just close the pull request. Maintainers are required to give a reason for closing the pull request.

Maintainers can revert your changes if they feel they are not worth maintaining or if they did not live up to the quality specifications.

Maintainer Guidelines

These are the few directives we have for project maintainers.

- Do not merge PRs you create.
- Do not merge PRs until 24 hours have passed since it was opened. Exceptions include:
  - Emergency fixes.
    - Try to get secondary maintainer approval before merging if you are able to.
  - PRs with empty commits intended to generate a changelog.
- Do not merge PRs that contain content from the [banned content list](./CONTRIBUTING.md#banned-content).

These are not steadfast rules as maintainers are expected to use their best judgement when operating.

Our team is entirely voluntary, as such we extend our thanks to maintainers, issue managers, and contributors alike for helping keep the project alive.

### Issue Managers

Issue Managers help out the project by labelling bug reports and PRs and closing bug reports which are duplicates or are no longer applicable.

What You Can and Can't Do as an Issue Manager

This should help you understand what you can and can't do with your newfound github permissions.

Things you **CAN** do:
* Label issues appropriately
* Close issues when appropriate
* Label PRs when appropriate

Things you **CAN'T** do:
* [Close PRs](https://imgur.com/w2RqpX8.png): Only maintainers are allowed to close PRs. Do not hit that button.

## Development Guides

#### Writing readable code
[Style guide](./guides/STYLE.md)

#### Writing sane code
[Code standards](./guides/STANDARDS.md)

#### Writing understandable code
[Autodocumenting code](./guides/AUTODOC.md)

#### Misc

[Policy configuration system](./guides/POLICYCONFIG.md)

[Hard deletes](./guides/HARDDELETES.md)

[UI Development](../tgui/README.md)

[AI Datums](../code/datums/ai/making_your_ai.md)

## Pull Request Process

There is no strict process when it comes to merging pull requests. Pull requests will sometimes take a while before they are looked at by a maintainer; the bigger the change, the more time it will take before they are accepted into the code. Every team member is a volunteer who is giving up their own time to help maintain and contribute, so please be courteous and respectful. Here are some helpful ways to make it easier for you and for the maintainers when making a pull request.

* Make sure your pull request complies to the requirements outlined here

* You are expected to have tested your pull requests if it is anything that would warrant testing. Text only changes, single number balance changes, and similar generally don't need testing, but anything else does. This means by extension web edits are disallowed for larger changes.

* You are going to be expected to document all your changes in the pull request. Failing to do so will mean delaying it as we will have to question why you made the change. On the other hand, you can speed up the process by making the pull request readable and easy to understand, with diagrams or before/after data. Should you be optimizing a routine you must provide proof by way of profiling that your changes are faster.

* We ask that you use the changelog system to document your player facing changes, which prevents our players from being caught unaware by said changes - you can find more information about this [on this wiki page](http://tgstation13.org/wiki/Guide_to_Changelogs).

* If you are proposing multiple changes, which change many different aspects of the code, you are expected to section them off into different pull requests in order to make it easier to review them and to deny/accept the changes that are deemed acceptable.

* If your pull request is accepted, the code you add no longer belongs exclusively to you but to everyone; everyone is free to work on it, but you are also free to support or object to any changes being made, which will likely hold more weight, as you're the one who added the feature. It is a shame this has to be explicitly said, but there have been cases where this would've saved some trouble.

* Please explain why you are submitting the pull request, and how you think your change will be beneficial to the game. Failure to do so will be grounds for rejecting the PR.

* If your pull request is not finished, you may open it as a draft for potential review. If you open it as a full-fledged PR make sure it is at least testable in a live environment. Pull requests that do not at least meet this requirement will be closed. You may request a maintainer reopen the pull request when you're ready, or make a new one.

* While we have no issue helping contributors (and especially new contributors) bring reasonably sized contributions up to standards via the pull request review process, larger contributions are expected to pass a higher bar of completeness and code quality *before* you open a pull request. Maintainers may close such pull requests that are deemed to be substantially flawed. You should take some time to discuss with maintainers or other contributors on how to improve the changes.

* After leaving reviews on an open pull request, maintainers may convert it to a draft. Once you have addressed all their comments to the best of your ability, feel free to mark the pull as `Ready for Review` again.

## Porting features/sprites/sounds/tools from other codebases

If you are porting features/tools from other codebases, you must give them credit where it's due. Typically, crediting them in your pull request and the changelog is the recommended way of doing it. Take note of what license they use though, porting stuff from AGPLv3 and GPLv3 codebases are allowed.

Regarding sprites & sounds, you must credit the artist and possibly the codebase. All /tg/station assets including icons and sound are under a [Creative Commons 3.0 BY-SA license](https://creativecommons.org/licenses/by-sa/3.0/) unless otherwise indicated. However if you are porting assets from GoonStation or usually any assets under the [Creative Commons 3.0 BY-NC-SA license](https://creativecommons.org/licenses/by-nc-sa/3.0/) are to go into the 'goon' folder of the /tg/station codebase.

## Banned content
Do not add any of the following in a Pull Request or risk getting the PR closed:
* National Socialist Party of Germany content, National Socialist Party of Germany related content, or National Socialist Party of Germany references
* Code adding, removing, or updating the availability of alien races/species/human mutants without prior approval. Pull requests attempting to add or remove features from said races/species/mutants require prior approval as well.
* Code which violates GitHub's [terms of service](https://github.com/site/terms).

Just because something isn't on this list doesn't mean that it's acceptable. Use common sense above all else.

## A word on Git
This repository uses `LF` line endings for all code as specified in the **.gitattributes** and **.editorconfig** files.

Unless overridden or a non standard git binary is used the line ending settings should be applied to your clone automatically.

Note: VSC requires an [extension](https://marketplace.visualstudio.com/items?itemName=EditorConfig.EditorConfig) to take advantage of editorconfig.

Github actions that require additional configuration are disabled on the repository until ACTION_ENABLER secret is created with non-empty value.


code:
---
name: Bug report
about: Create a report to help reproduce and fix the issue
---
<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may not be viewable -->
## Round ID:

<!--- **INCLUDE THE ROUND ID**
If you discovered this issue from playing tgstation hosted servers:
[Round ID]: # (It can be found in the Status panel or retrieved from https://sb.atlantaned.space/rounds ! The round id let's us look up valuable information and logs for the round the bug happened.)-->

## Testmerges:

<!-- If you're certain the issue is to be caused by a test merge [OOC tab -> Show Server Revision], report it in the pull request's comment section rather than on the tracker(If you're unsure you can refer to the issue number by prefixing said number with #. The issue number can be found beside the title after submitting it to the tracker).If no testmerges are active, feel free to remove this section. -->

## Reproduction:

<!-- Explain your issue in detail, including the steps to reproduce it. Issues without proper reproduction steps or explanation are open to being ignored/closed by maintainers.-->

<!-- **For Admins:** Oddities induced by var-edits and other admin tools are not necessarily bugs. Verify that your issues occur under regular circumstances before reporting them. -->


code:
---
name: Feature request
about: Suggest an idea for this project

---

Feature requests are not handled in the repository. The best place to discuss these ideas would be on the /tg/station 13 forums here: https://tgstation13.org/phpBB/viewforum.php?f=9&sid=5153c1c704a4fb1006bf7a265e45e03f


code:
<!-- Write **BELOW** The Headers and **ABOVE** The comments else it may not be viewable. -->
<!-- You can view Contributing.MD for a detailed description of the pull request process. -->

## About The Pull Request

<!-- Describe The Pull Request. Please be sure every change is documented or this can delay review and even discourage maintainers from merging your PR! -->

## Why It's Good For The Game

<!-- Please add a short description of why you think these changes would benefit the game. If you can't justify it in words, it might not be worth adding. -->

## Changelog

<!-- If your PR modifies aspects of the game that can be concretely observed by players or admins you should add a changelog. If your change does NOT meet this description, remove this section. -->

:cl:
add: Added new mechanics or gameplay changes
add: Added more things
expansion: Expands content of an existing feature
del: Removed old things
qol: made something easier to use
balance: rebalanced something
fix: fixed a few things
soundadd: added a new sound thingy
sounddel: removed an old sound thingy
imageadd: added some icons and images
imagedel: deleted some icons and images
spellcheck: fixed a few typos
code: changed some code
refactor: refactored some code
config: changed some config setting
admin: messed with admin stuff
server: something server ops should know
/:cl:

<!-- Both :cl:'s are required for the changelog to work! You can put your name to the right of the first :cl: if you want to overwrite your GitHub username as author ingame. -->
<!-- You can use multiple of the same prefix (they're only used for the icon ingame) and delete the unneeded ones. Despite some of the tags, changelogs should generally represent how a player might be affected by the changes rather than a summary of the PR's contents. -->


code:
no_balance_label = "GBP: No Update"
reset_label = "GBP: Reset"

[points]
"Administration" = 2
"Atomic" = 2
"Balance/Rebalance" = -8
"Code Improvement" = 2
"Content Expansion" = -3
"Feedback" = 2
"Fix" = 3
"Grammar and Formatting" = 1
"Hard Deletes" = 12
"Logging" = 1
"Mechanic" = -10
"Performance" = 12
"Priority: CRITICAL" = 20
"Priority: High" = 15
"Quality of Life" = 1
"Refactor" = 10
"Sound" = 3
"Sprites" = 3
"Unit Tests" = 6


code:
# dmdoc
[DOCUMENTATION]: http://codedocs.tgstation13.org

[BYOND]: https://secure.byond.com/

[DMDOC]: https://github.com/SpaceManiac/SpacemanDMM/tree/master/src/dmdoc

[DMDOC] is a documentation generator for DreamMaker, the scripting language
of the [BYOND] game engine. It produces simple static HTML files based on
documented files, macros, types, procs, and vars.

We use **dmdoc** to generate [DOCUMENTATION] for our code, and that documentation
is automatically generated and built on every new commit to the master branch

This gives new developers a clickable reference [DOCUMENTATION] they can browse to better help
gain understanding of the /tg/station codebase structure and api reference.

## Documenting code on /tg/station
We use block comments to document procs and classes, and we use `///` line comments
when documenting individual variables.

It is required that all new code be covered with DMdoc code, according to the [Requirements](#Required)

We also require that when you touch older code, you must document the functions that you
have touched in the process of updating that code

### Required
A class *must* always be autodocumented, and all public functions *must* be documented

All class level defined variables *must* be documented

Internal functions *should* be documented, but may not be

A public function is any function that a developer might reasonably call while using
or interacting with your object. Internal functions are helper functions that your
public functions rely on to implement logic

### Documenting a proc
When documenting a proc, we give a short one line description (as this is shown
next to the proc definition in the list of all procs for a type or global
namespace), then a longer paragraph which will be shown when the user clicks on
the proc to jump to it's definition
```
/**
 * Short description of the proc
 *
 * Longer detailed paragraph about the proc
 * including any relevant detail
 * Arguments:
 * * arg1 - Relevance of this argument
 * * arg2 - Relevance of this argument
 */
```

### Documenting a class
We first give the name of the class as a header, this can be omitted if the name is
just going to be the typepath of the class, as dmdoc uses that by default

Then we give a short oneline description of the class

Finally we give a longer multi paragraph description of the class and it's details
```
/**
 * # Classname (Can be omitted if it's just going to be the typepath)
 *
 * The short overview
 *
 * A longer
 * paragraph of functionality about the class
 * including any assumptions/special cases
 *
 */
```

### Documenting a variable/define
Give a short explanation of what the variable, in the context of the class, or define is.
```
/// Type path of item to go in suit slot
var/suit = null
```

## Module level description of code
Modules are the best way to describe the structure/intent of a package of code
where you don't want to be tied to the formal layout of the class structure.

On /tg/station we do this by adding markdown files inside the `code` directory
that will also be rendered and added to the modules tree. The structure for
these is deliberately not defined, so you can be as freeform and as wheeling as
you would like.

[Here is a representative example of what you might write](http://codedocs.tgstation13.org/code/modules/keybindings/readme.html)

## Special variables
You can use certain special template variables in DM DOC comments and they will be expanded
```
    [DEFINE_NAME] - Expands to a link to the define definition if documented
    [/mob] - Expands to a link to the docs for the /mob class
    [/mob/proc/Dizzy] - Expands to a link that will take you to the /mob class and anchor you to the dizzy proc docs
    [/mob/var/stat] - Expands to a link that will take you to the /mob class and anchor you to the stat var docs
```

You can customise the link name by using `[link name][link shorthand].`

eg. `[see more about dizzy here] [/mob/proc/Dizzy]`

This is very useful to quickly link to other parts of the autodoc code to expand
upon a comment made, or reasoning about code


code:
## DOWNLOADING
There are a number of ways to download the source code. Some are described here, an alternative all-inclusive guide is also located at https://www.tgstation13.org/wiki/Downloading_the_source_code

Option 1:
Follow this: https://www.tgstation13.org/wiki/Setting_up_git

Option 2: Download the source code as a zip by clicking the ZIP button in the
code tab of https://github.com/tgstation/tgstation
(note: this will use a lot of bandwidth if you wish to update and is a lot of
hassle if you want to make any changes at all, so it's not recommended.)

Option 3: Download a pre-compiled nightly at https://tgstation13.download/nightlies/ (same caveats as option 2)

*Warning: option 4 is out of date, and not maintained, use at your own risk*

Option 4: Use our docker image that tracks the master branch (See commits for build status. Again, same caveats as option 2)

```
docker run -d -p <your port>:1337 -v /path/to/your/config:/tgstation/config -v /path/to/your/data:/tgstation/data tgstation/tgstation <dream daemon options i.e. -public or -params>
```