define d = Character('diogaoo', color="#fffb00", what_color="#fffda0") define tut = Character(" ", color="#fffb00", what_color="#fffda0", window_left_padding=-90, window_top_padding=-200,window_background="gui/tutorial_textbox.png") define cen = Character(None, color="#ffffff", what_color="#ffffff", what_xalign=0.5, what_textalign=0.5, text_xpos=0.5) define st_transition = ImageDissolve("gui/st_transition.jpg", 3) default show_quick_menu = False default persistent.tutorial = 0 default persistent.LShemale = True default persistent.Difficulty = 1 default persistent.gversion = 0 default name = "Hero" default time = 9 default day = 1 default disableatt = 0 default exp = 0 default rexp = 10 default exp_perk_bonus = 1 default level = 1 default tfame = 0 default persistent.run = 0 default persistent.fame = 0 default att = [1, 1, 1, 1, 1] default bonusatt = [145, 100, 0, 0, 0] default backatt = att[:] default catt = [att[0]*5,att[1]*5,att[2]*5,att[3]*5,att[4]*5] default bcatt = catt[:] default points = 50 default hp = 100 default mhp = 100 default bmhp = 0 default ap = 15 default max_ap = 15 default bonus_max_ap = 0 default lust = 0 default mlust = 100 default bmlust = 0 default sta = 100 default msta = 100 default staregen = 20.00 default addrest = 10.00 default correst = 20.00 default attack = 10.20 default at = 1 default tsta = 0 default damage = 0 default edamage = 0 default escape = 0 default enemyhp = 100 default enemylust = 0 default enemymaxlust = 0 default enemy_armor_type = None default enemy_initial_resistance = 0.0 default enemy_resistance_amount = 0.0 default enemy_resistance_regen = 0.0 default enemy_armor = 0 default stage = 1 default encounter = "None" default encounter_type = "None" default encounter_area = "None" default bweapon = 0 default bonus_damage = 1 default weapon = None default acess = None default gold = 0 default favor = 0 default favor_shop_prize_pool_name = [] default favor_shop_prize_pool_amount = [] default quests_available = [] default current_quest = "None" default quest_current_counter = 0 default quest_max_counter = 0 default debuff = [] default buff = [] default debuff_charmed = 0 default debuff_horny = 0 default gtraits = [] default btraits = [] default personality_points = 99999 default bpersonality_points = 0 default addictions = {"Vaginal": 0, "Anal": 0, "Blowjob": 0, "Titjob": 0, "Foreplay": 0, "Shemale": 0} default corruption = 0 default corruption_meter = 0 default materials = {"Fabric": [(0), (25), (10)], "Plastic": [(0), (25),(10)], "Wood": [(0), (25),(10)], "Iron": [(0), (25),(10)], "Rubber": [(0), (50),(20)], "Jewel": [(0), (50),(20)],} default orecipes = ["Clothes"] default wrecipes = [] default arecipes = [] default wcrafted = [] default acrafted = [] default scrolls = {} default techniques = {} default city_discovered = False default backpack = False default areas = ["Forest", "Plains", "Outskirts"] default persistent.perks = [] default persistent.gold_perks = [0, 0, 0] default persistent.trait_perk_cost = [100, 100] default persistent.portrait = ["none", 0, "date", "enemy"] default persistent.tower_record = ["none", 0, 0, "date", "enemy"] default potion_counter = 0 default jobs_today = [] default jobs_total = 0 default event_chance = 5 default rodd = 33 default podd = 64 default potion_price = 0 default orange_potion_price = 20 default pink_potion_price = 20 default green_potion_price = 20 default consumables = {"Red Potion": 0, "Purple Potion": 0, "Blue Potion": 0, "Orange Potion": 1, "Pink Potion": 1, "Green Potion": 1, "Clothes": 0, "Syringe": 0} default potted = False default cum_screen_alpha = 0 default timer_range = 0 default timer_jump = 0 default last_encounter_pic = [] default pic = 1 default npics = 10 default persistent.extra_pics = [] default pic_type_BE_mode = False default result = None default mash_key = "mouseup_1" default hit_circle_size = 3 default training_arrow_move_right = True default alarm = 0 default temp = "none" default temp2 = "none" default enemy_text = "" default temp3 = 0 default temp4 = 2 default ttfixed = True default scrolls_for_sale = [] default shop_items = [] default recipes_for_sale = [] default curse_options = [] default recipe_day = 0 default quest_day = 0 default spawn_time = [(10, 11), (12, 13), (14, 15), (16, 17), (18, 19), (20, 21)] default tower_challenge = False default tower_boss_rush = False default tower_list = [] default tower_floor = 0 default tower_base_hp = 120 default tower_hp_bonus = 0 default tower_boss_frequency = 5 default tower_replenish_stamina = False default tower_tries = 1 default tower_fame_multiplier = 1.00 default arena_mode = False default museum_mode = False default initial_time = 0 default final_time = 0 default final_gold_gained = 0 default final_damage_dealt = 0 default final_consum_used = 0 default final_potions_found = 0 default final_sidejobs_completed = 0 default final_enemies_defeated = 0 default final_techniques_used = 0 default final_favor_gained = 0 default final_most_increased_addiction = {"Vaginal": 0, "Anal": 0, "Blowjob": 0, "Titjob": 0, "Foreplay": 0, "Shemale": 0} default final_first_orgasm = ["None", 0] default final_worst_enemy = ["None", 0] default tess_slut = 0 default emily_slut = 0 default stacy_fame = 0 default stacy_comments = {} default ines_appeal = 0 default melissa_encountered = False default massage_client_encountered = False default exam_event_encountered = False default marie_encountered = 0 default growing_fury_bonus = 1 default facility_map_discovered = [(130, 205)] default facility_checks = [0, 0, 0, 0, 0, 0, 0] default facility_doors = [0, 0, 1, 0] default map_player_vision = [(130, 205)] default map_player = [130, 205] default map_enemy_1 = [190, 45] default map_enemy_2 = [70, 25] default map_enemy_3 = [0, 0] default persistent.robinhood = 20 default persistent.usedcheat = 0 default angie = ["Angie", 150, 20, ("???", "???"), "Angie Faith", 50, 40, None, "Masamune", ("Common"), "Forest"] default anastasia = ["Anastasia", 130, 12, ("???", "???"), "Jessie Lee", 6, 5, None, "Gloves", ("Common"), "Forest"] default laura = ["Laura", 120, 0, ("???", "???"), "August Ames", 5, 5, "Fabric", None, ("Common"), "Forest"] default allie = ["Allie", 120, 0, ("???", "???"), "Bryci", 7, 5, "Plastic", None, ("Common"), "Forest"] default kali = ["Kali", 150, 0, ("???", "???"), "Kali Roses", 6, 5, "Wood", None, ("Common"), "Forest"] default samantha = ["Samantha", 130, 16, ("???", "???"), "Gia Paige", 6, 5, None, "EXP Ring", ("Common"), "Forest"] default olivia = ["Olivia", min(500, (110+(day*10))), min(50, (8+(day*2))), ("???", "???"), "Amanda Riley", 10, 8, None, None, ("Common", "Shemale"), "Forest"] default mila = ["Mila", 250, 0, (6, 12), "Luna Star", 40, 30, None, "Nameless Blade", ("Boss"), "Forest"] default sigrid = ["Sigrid", 500, 0, (6, 12), "Alura Jenson", 40, 30, None, "Nameless Blade", ("Boss", "Milf"), "Forest"] default nicole = ["Nicole", 130, (18), ("???", "???"), "Alex Coal", 6, 5, "Plastic", None, ("Common"), "Plains"] default liz = ["Liz", 120, 0, ("???", "???"), "Angel Wicky", 7, 5, None, "Gloves", ("Milf"), "Plains"] default natasha = ["Natasha", 130, 0, ("???", "???"), "Luxury Girl", 6, 5, "Wood", None, ("Common"), "Plains"] default bonnie = ["Bonnie", 140, (10), ("???", "???"), "Haley Spades", 5, 5, "Fabric", None, ("Petite"), "Plains"] default michelle = ["Michelle", 120, 0, ("???", "???"), "Diamond Kitty", 8, 5, None, "EXP Ring", ("Common"), "Plains"] default rebecca = ["Rebecca", 120, 0, ("???", "???"), "Domino Presley", 10, 5, None, None, ("Shemale"), "Plains"] default bonniennina = ["Bonnie n Nina", 220, 0, (18, 22), "Haley Spades & Coco Lovelock", 40, 30, None, "Twin Blades", ("Boss", "Petite", "Multiple"), "Plains"] default cassandra = ["Cassandra", 250, 50, (18, 22), "Cali Carter", 200, 150, None, "Twin Blades", ("Boss"), "Plains"] default tinky = ["Tinky", 120, 0, ("???", "???"), "Reyna DelaCruz", 4, 3, None, "EXP Ring", ("Petite"), "Outskirts"] default astridnari = ["Astrid n Ari", 260, 0, (18, 22), "Charlotte Mae & Emily Norman", 40, 30, None, "Growing Fury", ("Boss", "Petite", "Milf", "Multiple"), "Outskirts"] default amy = ["Amy", 160, 10, ("???", "???"), "Athena Faris", 18, 12, None, "Icepick", ("Common"), "Deep Forest"] default hannah = ["Hannah", 160, 0, ("???", "???"), "Karma RX", 17, 11, "Iron", None, ("Bimbo"), "Deep Forest"] default maya = ["Maya", 160, 12, ("???", "???"), "Lauren Phillips", 18, 12, None, "Dagger", ("Milf"), "Deep Forest"] default megan = ["Megan", 160, 30, ("???", "???"), "Jennifer White", 17, 11, "Wood", None, ("Common"), "Deep Forest"] default rei = ["Rei", 160, 0, ("???", "???"), "Connie Perignon", 18, 12, None, "Quick Bracelet", ("Milf"), "Deep Forest"] default serena = ["Serena", 180, 16, ("???", "???"), "Kimber Lee", 24, 14, None, None, ("Shemale"), "Deep Forest"] default claire = ["Claire", 350, 20, (6, 12), "Candice Dare", 80, 40, None, "Windy Knuckles", ("Boss"), "Deep Forest"] default lexi = ["Lexi", 350, 0, (18, 22), "Piper Perri", 80, 40, None, "Windy Knuckles", ("Boss", "Petite"), "Deep Forest"] default tess = ["Tess", 180, 0, ("???", "???"), "Layla Jenner", 20, 12, None, "Icepick", ("Petite"), "Meadow"] default molly = ["Molly", 170, 0, ("???", "???"), "Brooklyn Chase", 18, 12, None, "Quick Bracelet", ("Common"), "Meadow"] default chelsea = ["Chelsea", 150, 15, ("???", "???"), "Ashley Adams", 17, 11, "Iron", None, ("Common"), "Meadow"] default balletsisters = ["Ballet Sisters", 160, 15, ("???", "???"), "Ashly Anderson, Athena Rayne, Shae Celestine", 18, 11, None, "Dagger", ("Petite", "Multiple"), "Meadow"] default gwen = ["Gwen", 100, 0, ("???", "???"), "Ellie Shou", 17, 10, "Wood", None, ("Petite"), "Meadow"] default felicia = ["Felicia", 190, 0, ("???", "???"), "Carrie Emberlyn", 28, 14, None, None, ("Shemale"), "Meadow"] default celeste = ["Celeste", 280, 0, (18, 22), "Emma Rose", 80, 40, None, None, ("Boss", "Shemale"), "Meadow"] default esperanza = ["Esperanza", 350, 20, (18, 22), "Julianna Vega", 80, 40, None, None, ("Boss", "Milf"), "Meadow"] default april = ["April", 270, 0, ("???", "???"), "Madi Collins", 38, 18, "Rubber", None, ("Petite"), "Swamp"] default charlotte = ["Charlotte", 260, 0, ("???", "???"), "Rose Monroe", 42, 18, None, "INT Ring", ("Milf"), "Swamp"] default kendra = ["Kendra", 220, 0, ("???", "???"), "Olivia Austin", 38, 18, "Jewel", None, ("Bimbo"), "Swamp"] default dixie = ["Dixie", 260, "???", ("???", "???"), "Elsa Jean", 34, 18, None, "VIT Ring", ("Petite"), "Swamp"] default paige = ["Paige", 280, 30, ("???", "???"), "April Olsen", 34, 18, None, "CON Ring", ("Common"), "Swamp"] default cindy = ["Cindy", 240, 25, ("???", "???"), "Foxxy", 38, 20, None, None, ("Shemale"), "Swamp"] default victoria = ["Victoria", 260, 0, (6, 12), "Armani Black", 140, 100, None, "Serenity's Shawl", ("Boss"), "Swamp"] default lucynangel = ["Lucy n Angel", 400, 0, (18, 22), "Coco Bae & Rachel Nova", 140, 100, None, "Serenity's Shawl", ("Boss", "Shemale", "Multiple"), "Swamp"] default stacy = ["Stacy", 260, 0, ("???", "???"), "Natasha 10", 34, 18, None, "VIT Ring", ("Petite"), "Coast"] default teresa = ["Teresa", 280, 35, ("???", "???"), "Kit Mercer", 34, 18, None, "CON Ring", ("Milf"), "Coast"] default taylor = ["Taylor", 270, 0, ("???", "???"), "Laney Grey", 38, 18, "Rubber", None, ("Common"), "Coast"] default frederika = ["Frederika", 160, 0, ("???", "???"), "Jordan Pryce", 24, 12, "Jewel", None, ("Bimbo"), "Coast"] default danniendebbie = ["Dannie n Debbie", 280, 0, ("???", "???"), "Cecelia Taylor & Gia DiBella", 38, 18, None, "INT Ring", ("Multiple"), "Coast"] default elena = ["Elena", 300, 30, ("???", "???"), "Aspen Brooks", 38, 20, None, None, ("Shemale"), "Coast"] default kate = ["Kate", 400, 0, (6, 12), "Ryan Conner", 140, 100, None, "Serenity's Shawl", ("Boss", "Bimbo"), "Coast"] default polly = ["Polly", 350, 0, ("???", "???"), "Brandi Bae", 52, 32, None, "Hammer", ("Bimbo"), "Jungle"] default bianca = ["Bianca", 380, 35, ("???", "???"), "Megan Fiore", 50, 32, None, "Heavy Sword", ("Common"), "Jungle"] default gabby = ["Gabby", 400, 0, ("???", "???"), "Mandy Muse", 52, 32, None, "Morning Star", ("Common"), "Jungle"] default caroline = ["Caroline", 330, 0, ("???", "???"), "Bella Rolland", 40, 20, None, "Whispering Stone", ("Common"), "Jungle"] default emily = ["Emily", 370, 0, ("???", "???"), "Kenzie Reeves", 48, 28, None, "Heart Pendant", ("Petite"), "Jungle"] default dakota = ["Dakota", 390, 0, ("???", "???"), "Eva Maxim", 55, 34, None, None, ("Shemale"), "Jungle"] default isabel = ["Isabel", 900, 30, (18, 22), "Vivian Taylor", 200, 150, None, "Thirsty Wyvern", ("Boss"), "Jungle"] default cutielavender = ["CutieLavender", 750, 0, (18, 22), "Bobbie Lavender", 200, 150, None, "Thirsty Wyvern", ("Boss"), "Jungle"] default jackie = ["Jackie", 350, 25, ("???", "???"), "Dakota Skye", 48, 28, None, "Heart Pendant", ("Petite"), "Beach"] default josie = ["Josie", 380, 30, ("???", "???"), "Codi Vore", 52, 32, None, "Hammer", ("Common"), "Beach"] default penelope = ["Penelope", 420, 35, ("???", "???"), "Chantal Danielle", 50, 32, None, "Heavy Sword", ("Bimbo"), "Beach"] default verona = ["Verona", 400, 0, ("???", "???"), "Anissa Kate", 52, 32, None, "Morning Star", ("Common"), "Beach"] default maddie = ["Maddie", 380, 0, ("???", "???"), "Alexis Fawx", 40, 20, None, "Whispering Stone", ("Milf"), "Beach"] default autumn = ["Autumn", 390, 50, ("???", "???"), "Ariel Demure", 55, 34, None, None, ("Shemale"), "Beach"] default ericanmargot = ["Erica n Margot", 800, 30, (6, 12), "Aria Valencia & Eva Nyx", 200, 150, None, "Thirsty Wyvern", ("Multiple, Boss"), "Beach"] default elisa = ["Elisa", 600, 0, (6, 12), "Vitoria Beatriz", 200, 150, None, "Thirsty Wyvern", ("Boss"), "Beach"] default nancy = ["Nancy", 520, 0, ("???", "???"), "Abella Danger", 80, 38, "Iron", None, ("Common"), "Mountains"] default desiree = ["Desiree", 450, 0, ("???", "???"), "August Skye", 77, 32, "Wood", None, ("Common"), "Mountains"] default annie = ["Annie", 460, 0, ("???", "???"), "Molly Little", 78, 33, "Plastic", None, ("Petite"), "Mountains"] default suzanne = ["Suzanne", 500, 0, ("???", "???"), "Callie Brooks", 80, 34, "Fabric", None, ("Milf"), "Mountains"] default ines = ["Ines", 500, 0, ("???", "???"), "Brandylicious", 80, 34, None, None, ("Common"), "Mountains"] default tiffany = ["Tiffany", 1000, 0, (18, 22), "Cubbi Thompson", 300, 200, None, "Stonebreaker", ("Boss", "Bimbo"), "Mountains"] default brittney = ["Brittney", 420, 50, ("???", "???"), "Brittney Kade", 90, 40, None, None, ("Shemale", "Bimbo"), "Mountains"] default gabrielle = ["Gabrielle", 100, 0, ("???", "???"), "Nikki Benz", 40, 30, None, "Syringe", ("Boss", "Bonus"), "None"] default melissa = ["Melissa", 150, 0, ("???", "???"), "Misty Meaner", (day*12), (day*15), None, "Fine Shirt", ("Bonus", "Milf"), "None"] default marie = ["Marie", 100, 0, ("???", "???"), "Brandi Love", 80, 20, None, None, ("Milf"), "None"] default jasmine = ["Jasmine", 3000, 0, ("???", "???"), "Angela White", 0, 0, None, None, ("Milf"), "None"] default hailey = ["Hailey", 2500, 0, ("???", "???"), "Melody Marks", 0, 0, None, None, ("Petite"), "None"] default violet = ["Violet", 4000, 50, ("???", "???"), "Nika Venom", 0, 0, None, None, ("Common"), "None"] default ella = ["Ella", 5000, 50, ("???", "???"), "Bridgette B", 0, 0, None, None, ("Common"), "None"] default enemies = (anastasia, laura, allie, kali, samantha, olivia, nicole, liz, natasha, bonnie, michelle, rebecca, tinky, angie, amy, hannah, maya, megan, rei, serena, tess, molly, chelsea, balletsisters, gwen, felicia, april, charlotte, kendra, dixie, paige, cindy, stacy, teresa, taylor, frederika, danniendebbie, elena, polly, bianca, gabby, caroline, emily, dakota, jackie, josie, verona, maddie, penelope, autumn, nancy, desiree, annie, ines, suzanne, brittney) default bosses = (mila, sigrid, bonniennina, astridnari, cassandra, claire, lexi, esperanza, celeste, victoria, lucynangel, kate, isabel, cutielavender, ericanmargot, tiffany, elisa) default persistent.arena_defeated = False default persistent.arena_hp = 999999 default persistent.arena_heroes = {} default persistent.arena_modifier = None default persistent.arena_last_modifier_change = None default persistent.arena_enemy = None default arena_month_enemy = "hailey" default persistent.Angie = 0 default persistent.Laura = 0 default persistent.Anastasia = 0 default persistent.Allie = 0 default persistent.Kali = 0 default persistent.Samantha = 0 default persistent.Olivia = 0 default persistent.Mila = 0 default persistent.Sigrid = 0 default persistent.Nicole = 0 default persistent.Bonnie = 0 default persistent.Natasha = 0 default persistent.Liz = 0 default persistent.Michelle = 0 default persistent.Rebecca = 0 default persistent.BonnienNina = 0 default persistent.Cassandra = 0 default persistent.Tinky = 0 default persistent.AstridnAri = 0 default persistent.Amy = 0 default persistent.Hannah = 0 default persistent.Maya = 0 default persistent.Megan = 0 default persistent.Rei = 0 default persistent.Serena = 0 default persistent.Claire = 0 default persistent.Lexi = 0 default persistent.Esperanza = 0 default persistent.Celeste = 0 default persistent.Tess = 0 default persistent.Molly = 0 default persistent.Chelsea = 0 default persistent.BalletSisters = 0 default persistent.Gwen = 0 default persistent.Felicia = 0 default persistent.April = 0 default persistent.Kendra = 0 default persistent.Charlotte = 0 default persistent.Dixie = 0 default persistent.Paige = 0 default persistent.Cindy = 0 default persistent.Victoria = 0 default persistent.LucynAngel = 0 default persistent.Stacy = 0 default persistent.Teresa = 0 default persistent.Taylor = 0 default persistent.Frederika = 0 default persistent.DannienDebbie = 0 default persistent.Elena = 0 default persistent.Kate = 0 default persistent.Polly = 0 default persistent.Bianca = 0 default persistent.Gabby = 0 default persistent.Caroline = 0 default persistent.Emily = 0 default persistent.Dakota = 0 default persistent.Isabel = 0 default persistent.CutieLavender = 0 default persistent.Jackie = 0 default persistent.Josie = 0 default persistent.Verona = 0 default persistent.Maddie = 0 default persistent.Penelope = 0 default persistent.Autumn = 0 default persistent.EricanMargot = 0 default persistent.Elisa = 0 default persistent.Nancy = 0 default persistent.Desiree = 0 default persistent.Annie = 0 default persistent.Suzanne = 0 default persistent.Tiffany = 0 default persistent.Ines = 0 default persistent.Gabrielle = 0 default persistent.Brittney = 0 default persistent.Melissa = 0 default persistent.Marie = 0 default persistent.Jasmine = 0 default persistent.Hailey = 0 default persistent.Violet = 0 default persistent.Ella = 0 default persistent.arena_wins = {"Jasmine": 0, "Hailey": 0, "Violet": 0, "Ella": 0} default temp_defeated_enemy = { "Laura": 0, "Anastasia": 0, "Allie": 0, "Kali": 0, "Samantha": 0, "Olivia": 0, "Mila": 0, "Sigrid": 0, "Nicole": 0, "Natasha": 0, "Liz": 0, "Bonnie": 0, "Michelle": 0, "Rebecca": 0, "Bonnie n Nina": 0, "Cassandra": 0, "Gabrielle": 0, "Tinky": 0, "Astrid n Ari": 0, "Angie": 0, "Amy": 0, "Hannah": 0, "Maya": 0, "Megan": 0, "Serena": 0, "Rei": 0, "Claire": 0, "Lexi": 0, "Tess": 0, "Molly": 0, "Chelsea": 0, "Ballet Sisters": 0, "Felicia": 0, "Gwen": 0, "Celeste": 0, "Esperanza": 0, "April": 0, "Kendra": 0, "Charlotte": 0, "Dixie": 0, "Paige": 0, "Cindy": 0, "Victoria": 0, "Lucy n Angel": 0, "Stacy":0, "Teresa": 0, "Taylor": 0, "Frederika": 0, "Dannie n Debbie": 0, "Elena": 0, "Kate": 0, "Polly": 0, "Bianca": 0, "Gabby": 0, "Caroline": 0, "Emily": 0, "Dakota": 0, "Isabel": 0, "CutieLavender": 0, "Jackie": 0, "Josie": 0, "Verona": 0, "Maddie": 0, "Penelope": 0, "Autumn": 0, "Erica n Margot": 0, "Elisa": 0, "Nancy": 0, "Desiree": 0, "Annie": 0, "Suzanne": 0, "Ines": 0, "Brittney": 0, "Tiffany": 0, "Melissa": 0, "Marie": 0, "Jasmine": 0, "Hailey": 0, "Violet": 0, "Ella": 0 } default final_enemy_lust_damage_amount = {"Tavern": [0, 0], "Event": [0, 0]} default persistent.final_broken_heroes_amount = {} default persistent.final_climax_amount = {} default persistent.btraits_pool = [ "Foreplay Lover", "Blowjob Lover", "Breasts Lover", "Pussy Lover", "Anal Lover", "Corrupted", "Clumsy", "Insomnia", "Sluggish" ] default persistent.gtraits_pool = [ "Early Bird", "Stalker", "Alchemist", "Lucky", "Mighty" ] python early: class Achievement(NoRollback): def __init__(self, name='', image='', message='', **kwargs): self.name = name if image == '': self.image = Transform('gui/achievements/trophy_icon.png', fit='contain') else: self.image = Transform(image, fit='contain') self.message = message def __eq__(self, value): """ Since we are using a persistent list we need to do an equality check. Below we are simply checking 'self.name == value.name, self.message == value.message' """ return all((self.name == value.name, self.message == value.message)) def add(trophy): """ Add/Grant Trophies/Achievements to the list. As a standard python expression :: Achievement.add( ) As a screen action :: Function( Achievement.add, ) """ if not achievement.has(trophy.name) and persistent.Difficulty != 0: achievement.grant(trophy.name) renpy.music.play("audio/achievement.ogg",loop=False) store.achievement_notification_list.append(trophy) if trophy not in persistent.my_achievements: persistent.my_achievements.insert(0, trophy) def purge(self): """ This will clear the achievements AND persistent list. """ achievement.clear_all() persistent.my_achievements.clear() init python: from datetime import date, datetime, timedelta import pygame import random renpy.music.register_channel("sex", "sfx", True) renpy.music.register_channel("cumming", "sfx", loop=False, tight=True) def cum_loop(num): return ["audio/cum.ogg",]*num slots = renpy.list_slots() def delete_slot(number = 0, all = False): slots = renpy.list_slots() saveGames = renpy.list_saved_games() slots_file_name = {} for count, i in enumerate(slots): slots_file_name[count] = [i, str(saveGames[count][0])] if number != 0: renpy.unlink_save(slots_file_name[number-1][1]) elif all: for i in slots_file_name: renpy.unlink_save(slots_file_name[i][1]) def delete_save(): delete_slot(0, True) persistent._clear(progress=True) achievements.purge() renpy.notify("Save Deleted !") def start_encounter(enemy): global encounter global enemyhp global edamage global enemylust global enemymaxlust global enemy_armor_type global encounter_type global encounter_area global stage global extra global escape global temp global temp2 global temp3 global bonus_damage encounter = enemy[0] enemyhp = enemy[1] edamage = enemy[2] encounter_type = enemy[9] encounter_area = enemy[10] stage = 1 escape = 0 temp = 0 temp2 = 0 temp3 = 0 extra = 0 enemylust = 0 enemymaxlust = 0 bonus_damage = 1 enemy_armor_type = None if tower_challenge == True: if enemyhp < tower_base_hp: enemyhp = tower_base_hp enemyhp += tower_hp_bonus enemyhp = int(enemyhp*(1+curses["Enemy HP Curse"]*0.1)) if acess == "Whispering Stone": n = renpy.random.randint(1, 100) if n <= (5+round(0.1*(equipments[acess][5])**2 + 0.6965*(equipments[acess][5]) + 0.0458)): apply_buff("Insighted") bonus_damage += ((att[3]+bonusatt[3])/100) if type(encounter_type) is tuple: enemy_type_text = "" for i in encounter_type: enemy_type_text += i+", " else: enemy_type_text = encounter_type hp_adjust() renpy.show("blackscreen", at_list=[top]) renpy.show((encounter.lower().replace(" ", ""))+"1", at_list=[top]) cen("You've found {b}{color=FF0000}[encounter]{/b}{/color}{size=20}{vspace=15}{color=FF0000}HP: "+str(enemyhp)+"{/color}{space=10}|{space=10}{b}Attack: "+str(edamage)+"{/b}{vspace=5}{color=F5B6FF}Enemy Type: {b}"+enemy_type_text.rstrip(", ")) renpy.jump(encounter.replace(" ","") + "2") def start_arena(enemy): global encounter global edamage global enemyhp global enemylust global stage global extra global temp global temp2 global encounter_type global bonus_damage global enemy_armor_type global arena_mode encounter = enemy[0] edamage = enemy[2] encounter_type = enemy[9] if persistent.arena_hp < enemy[1]: enemyhp = persistent.arena_hp else: enemyhp = enemy[1] persistent.arena_hp = enemy[1] enemylust = 0 stage = 1 extra = 0 temp = 0 temp2 = 0 bonus_damage = 1 enemy_armor_type = None arena_mode = True if persistent.arena_modifier == "Brawl": weapon = None if persistent.arena_modifier == "Nudism" and "Naked" not in debuff: apply_debuff("Naked") if "Fairy Powder" in buff: buff.remove("Fairy Powder") if type(encounter_type) is tuple: enemy_type_text = "" for i in encounter_type: enemy_type_text += i+", " else: enemy_type_text = encounter_type apply_debuff("Restrained") renpy.show("blackscreen", at_list=[top]) renpy.show((encounter.lower().replace(" ", ""))+"1", at_list=[top]) cen("You've found {b}{color=FF0000}[encounter]{/b}{/color}{size=20}{vspace=15}{color=FF0000}HP: "+str(enemyhp)+"{/color}{space=10}|{space=10}{b}Attack: "+str(edamage)+"{/b}{vspace=5}{color=F5B6FF}Enemy Type: {b}"+enemy_type_text.rstrip(", ")) renpy.jump(encounter.replace(" ","") + "2") def end_arena(this_enemy): global arena_mode update_arena_records() if this_enemy in persistent.arena_wins: persistent.arena_wins[this_enemy] += 1 else: persistent.arena_wins[this_enemy] = 1 if arena_month_enemy == this_enemy.lower(): persistent.arena_defeated = True persistent.arena_enemy = None persistent.arena_modifier = None arena_mode = False renpy.call_screen("end_arena_screen", this_enemy, (globals()[this_enemy.lower()][1])) def update_arena_records(): name_to_add = name temp2 = 1 while name_to_add in persistent.arena_heroes: name_to_add = name_to_add+str(temp2) temp2 += 1 persistent.arena_heroes[name_to_add] = ((persistent.arena_hp - enemyhp), date.today()) persistent.arena_hp = enemyhp def clear_arena_records(): persistent.arena_heroes.clear() def training(difficulty=1): global alarm global timer_range global result training_arrow_move_right = True alarm = renpy.random.randint(100, 700) timer_range = 0 result = None renpy.play("audio/bignumber.ogg") renpy.show_screen("ready_screen") renpy.pause(1, hard=True) renpy.show_screen("training", difficulty=difficulty) cen("{b}[name] is training", interact=False) while result == None: renpy.pause() renpy.pause(0.3, hard=True) return (((400-result)/4)-timer_range) def training2(difficulty=1, timer_speed=0.01): global alarm global timer_range global result timer_range = 0 number_of_circles = int(difficulty*2) renpy.play("audio/bignumber.ogg") renpy.show_screen("ready_screen") renpy.pause(1, hard=True) renpy.show_screen("training2_timer", timer_speed) while number_of_circles > 0: result = False renpy.show_screen("training2", renpy.random.randint(260, 1510), renpy.random.randint(0, 720)) number_of_circles -= 1 while result == False: renpy.pause(0.2, hard=True) renpy.pause(0.3, hard=True) renpy.hide_screen("training2_timer") return (100-timer_range) def circle_minigame_mobile(difficulty=1): global alarm global timer_range global result timer_range = 500-(difficulty*30) alarm = 500-(difficulty*30) number_of_circles = int(difficulty) renpy.play("audio/bignumber.ogg") renpy.show_screen("ready_screen") renpy.pause(1, hard=True) result = renpy.show_screen("countdown") while number_of_circles > 0 and alarm > 0: result = False renpy.show_screen("training2", renpy.random.randint(260, 1510), renpy.random.randint(0, 720)) number_of_circles -= 1 while result == False: if alarm <= 0: renpy.hide_screen("training2") break renpy.pause(0.1, hard=True) renpy.pause(0.1, hard=True) renpy.hide_screen("countdown") return result def confused(): global alarm global timer_range global encounter global result apply_debuff("Confused") result = None if "Anxious" in btraits: alarm = max(60, int((100-((lust)/(mlust/100)))*5)*((att[4]+bonusatt[4])*0.5/(day))) timer_range = max(60, int((100-((lust)/(mlust/100)))*5)*((att[4]+bonusatt[4])*0.5/(day))) else: alarm = max(90, int((100-((lust)/(mlust/100)))*6)*((att[4]+bonusatt[4])*0.5/(day))) timer_range = max(90, int((100-((lust)/(mlust/100)))*6)*((att[4]+bonusatt[4])*0.5/(day))) renpy.show_screen("ready_screen") cen("{b}[name] is {color=F00000}Confused{/b}{/color}{vspace=10}{color=C500FF} Lust: [lust] / [mlust]{/color}{vspace=10}{color=404040}CON efficacy: "+str(int(((att[4]+bonusatt[4])/(day*2))*100))+"%", interact=False) renpy.pause(1, hard=True) renpy.show_screen("countdown") items = [("{b}{color=00FF00}Recover", True),("{b}{color=00FF00}Recower", False),("{b}{color=00FF00}Rcover", False),("{b}{color=00FF00}Recuver", False),("{b}{color=00FF00}Recver", False),("{b}{color=00FF00}Recouer", False)] renpy.random.shuffle(items) cen("{b}[name] is {color=F00000}Confused{/b}{/color}{vspace=10}{color=C500FF} Lust: [lust] / [mlust]{/color}{vspace=10}{color=404040}CON efficacy: "+str(int(((att[4]+bonusatt[4])/(day*2))*100))+"%", interact=False) result = renpy.display_menu(items) renpy.hide_screen("countdown") if result == False: renpy.play("audio/wrong.ogg") debuff.remove("Confused") elif result == True: renpy.play("audio/right.ogg") debuff.remove("Confused") return result def dodging(): global hit_circle_size global result hit_circle_size = 3 hit_circle_speed = max(0.012, ((lust/mlust))*((day)/(att[1]+bonusatt[1])*0.03)) obj_circle_size = 1 result = None apply_debuff("Dodging") result = None renpy.show_screen("ready_screen") cen("{b}[name] is trying to {color=C500FF}Dodge{/b}{/color}{vspace=10}{color=C500FF}Lust: [lust] / [mlust]{/color}{vspace=10}{color=404040}AGI efficacy: "+str(int(((att[1]+bonusatt[1])/(day*2))*100))+"%", interact=False) renpy.pause(1, hard=True) for i in range(0, 3): cen("{b}[name] is trying to {color=C500FF}Dodge{/b}{/color}{vspace=10}{color=C500FF}Lust: [lust] / [mlust]{/color}{vspace=10}{color=404040}AGI efficacy: "+str(int(((att[1]+bonusatt[1])/(day*2))*100))+"%", interact=False) renpy.show_screen("dodging_screen", obj_circle_size, hit_circle_speed) while result == None: renpy.pause() if result == False: renpy.play("audio/wrong.ogg") debuff.remove("Dodging") return False if i <= 1: renpy.play("audio/right_half.ogg") obj_circle_size -= 0.2 hit_circle_speed *= 1.05 result = None hit_circle_size = obj_circle_size * 3 debuff.remove("Dodging") renpy.play("audio/right.ogg") return True def overwhelmed(difficulty = 0): global alarm global timer_range global timer_jump global result apply_debuff("Overwhelm") alarm = 250 timer_range = 500 result = None renpy.show_screen("ready_screen") cen("{b}[name] is being {color=FF0000}Overwhelmed{/b}{/color}{vspace=10}{color=FF0000}HP: [hp] / [mhp]{/color}{vspace=10}{color=404040}VIT efficacy: "+str(int(((att[2]+bonusatt[2])/(day*2))*100))+"%", interact=False) renpy.pause(1, hard=True) renpy.show_screen("overwhelmed", difficulty) cen("{b}[name] is being {color=FF0000}Overwhelmed{/b}{/color}{vspace=10}{color=FF0000}HP: [hp] / [mhp]{/color}{vspace=10}{color=404040}VIT efficacy: "+str(int(((att[2]+bonusatt[2])/(day*2))*100))+"%", interact=False) while result == None: renpy.pause() debuff.remove("Overwhelm") if result == False: renpy.play("audio/wrong.ogg") elif result == True: renpy.play("audio/right.ogg") renpy.pause(0.3, hard=True) return result def grabbed(difficulty = 0): global alarm global timer_range global timer_jump global result apply_debuff("Grabbed") alarm = 250 timer_range = 500 result = None renpy.show_screen("grabbed") debuff.remove("Grabbed") if result == False: renpy.play("audio/wrong.ogg") elif result == True: renpy.play("audio/right.ogg") return result def distracted(difficulty = 0): global alarm global timer_range global timer_jump global encounter apply_debuff("Distracted") items = [] items_pool = [("1", 1), ("2", 2), ("3", 3), ("4", 4), ("5", 5), ("6", 6)] input_pool = [] n = 0 formula = max(3, min(int((24*(lust/mlust))*((day)/(att[3]+bonusatt[3])*0.5)), 12)) if "Oblivious" in btraits: formula += 2 formula += difficulty renpy.show_screen("ready_screen") cen("{b}[name] is {color=FF0000}Distracted{/b}{/color}{vspace=10}{color=C500FF} Lust: [lust] / [mlust]{/color}{vspace=10}{color=404040}INT efficacy: "+str(int(((att[3]+bonusatt[3])/(day*2))*100))+"%", interact=False) renpy.pause(1, hard=True) for i in range(formula): cen("{b}[name] is {color=FF0000}Distracted{/b}{/color}{vspace=10}{color=C500FF} Lust: [lust] / [mlust]{/color}{vspace=10}{color=404040}INT efficacy: "+str(int(((att[3]+bonusatt[3])/(day*2))*100))+"%", interact=False) choose = renpy.random.randint(1, 6) items.append(choose) renpy.play("audio/bignumber.ogg") renpy.show_screen("distracted_screen", choose) renpy.pause(0.7) for i in items: cen("{b}[name] is {color=FF0000}Distracted{/b}{/color}{vspace=10}{color=C500FF} Lust: [lust] / [mlust]{/color}{vspace=10}{color=404040}INT efficacy: "+str(int(((att[3]+bonusatt[3])/(day*2))*100))+"%", interact=False) result = renpy.display_menu(items_pool) input_pool.append(result) renpy.play("audio/bignumber.ogg") renpy.show_screen("distracted_screen", result) if result != items[n]: renpy.play("audio/wrong.ogg") renpy.pause(1) cen("Correct number: {b}{color=00FF00}"+str(items[n])+"{/b}{/color}\nPlayer input: {b}{color=FF0000}"+str(result)) debuff.remove("Distracted") return False n += 1 renpy.play("audio/right.ogg") debuff.remove("Distracted") return True def input_sequence_minigame(difficulty=1): global timer_range global alarm timer_range = 500-(difficulty*30) alarm = 500-(difficulty*30) number_of_letters = (5+difficulty) letters_to_press = [] letters_pressed = [] for i in range(0, number_of_letters): letters_to_press.append(renpy.random.choice(["input_left", "input_down", "input_right", "input_up"])) renpy.show_screen("ready_screen") renpy.pause(1, hard=True) result = renpy.show_screen("countdown") result = renpy.call_screen("input_sequence_screen", letters_to_press, letters_pressed) renpy.hide_screen("countdown") renpy.pause(0,3, hard=True) return result def add_check(speak, addname, addkind, addreq, hpreq=9999): global hp check_modifier = 1 text = "{color=404040}Modifiers:{space=5}" if ("Ass Worshiper" in btraits) and (addname == "Anal"): check_modifier *= 0.5 text += "{color=A00000}Ass Worshiper (-50%){/color}{space=5}" if ("Felicia's Pet" in btraits) and ("Shemale" in encounter_type): check_modifier = 1 text += "{color=A00000}Felicia's Pet (=1){/color}{space=5}" if ("Princesses Toy" in btraits) and ("Petite" in encounter_type): check_modifier *= 0.5 text += "{color=A00000}Princesses Toy (-50%){/color}{space=5}" if ("Charmed" in debuff): check_modifier *= (1-debuff_charmed*0.1) text += "{color=A00000}Charmed "+str(debuff_charmed)+" (-"+str(debuff_charmed*10)+"%){/color}{space=5}" if ("Loyal Boy" in btraits) and (addname == "Foreplay"): check_modifier *= 0.5 text += "{color=00A000}Loyal Boy (+50%){/color}{space=5}" if ("Plan Ahead" in technique_buff): addreq += round((techniques["Plan Ahead"][1]*2)*0.1) text += "{color=00A000}Plan Ahead (+"+str(round(techniques["Plan Ahead"][1]*2))+"%){/color}{space=5}" del technique_buff["Plan Ahead"] if (curses["Check Curse"] > 0): check_modifier *= (1-curses["Check Curse"]*0.05) text += "{color=A00000}Check Curse "+str(curses["Check Curse"])+" (-"+str(round(curses["Check Curse"]*5, 2))+"%){/color}{space=5}" if text == "{color=404040}Modifiers:{space=5}": text += "None" addreq = max(1, int(addreq*check_modifier)) if hp > hpreq: items = [("{b}{color=FF00FF}Submit{b}{/color}", "Submit"), ("{b}{color=00FF00}Resist ("+addname+":"+str(addreq)+"){/b}{/color}", "Resist"), ("{color=FF0000}Struggle (-"+str(hpreq)+" HP){/color}", "Struggle")] else: items = [("{b}{color=FF00FF}Submit{b}{/color}", "Submit"), ("{b}{color=00FF00}Resist ("+addname+":"+str(addreq)+"){/b}{/color}", "Resist")] cen("{color=F313FF}"+speak+"{vspace=7}{color=FF0000}HP: [hp]/[mhp]{/color} {color=C500FF} Lust: [lust]/[mlust]{/color} {color=45FF00} Stamina: [sta]%{/color}{color=AAAAAA}{vspace=3}Current "+str(addname)+": {b}"+str(addkind)+"{/b}{vspace=1}{size=18}"+text, interact=False) result = renpy.display_menu(items) if result == "Submit": return False elif result == "Resist": if addkind == 0: n = renpy.random.randint(1, (addkind+1)) else: n = renpy.random.randint(1, addkind) cen("Current Value: {color=C500FF}"+str(addkind)+"{/color}{vspace=5}Maximum Allowed: {color=C500FF}"+str(addreq)+"{/color}{vspace=10}{color=808080}Click to roll a number between 1 and "+str(addkind)+"{/color}") renpy.play("audio/diceroll.ogg") if n > addreq: cen("You rolled a {color=C500FF}"+str(n)+"{/color} !{vspace=10}{color=FF0000}You Failed...{/color}") return False else: cen("You rolled a {color=C500FF}"+str(n)+"{/color} !{vspace=10}{color=00FF00}You Passed !{/color}") return True elif result == "Struggle": hp -= hpreq cen(name+" Struggled out !") return True def quick_add_check(addname, addkind, addreq): if addkind == 0: n = renpy.random.randint(1, (addkind+1)) else: n = renpy.random.randint(1, addkind) n = renpy.random.randint(0, addkind) if n > addreq: renpy.show_screen("quick_add_check_notification", addname, addreq, False) return False else: renpy.show_screen("quick_add_check_notification", addname, addreq, True) return True def att_check(speak, attname, attkind, attreq, hpreq=9999): global hp if ("Charmed" in debuff): attreq *= (1+(debuff_charmed*0.1)) attreq = int(attreq) if hp > hpreq: items = [("{b}{color=FF00FF}Submit{b}{/color}", "Submit"), ("{b}{color=00FF00}Resist ("+attname+":"+str(attreq)+"){/b}{/color}", "Resist"), ("{color=FF0000}Struggle (-"+str(hpreq)+" HP){/color}", "Struggle")] else: items = [("{b}{color=FF00FF}Submit{b}{/color}", "Submit"), ("{b}{color=00FF00}Resist ("+attname+":"+str(attreq)+"){/b}{/color}", "Resist")] cen("{color=F313FF}"+speak+"{vspace=15}{color=FF0000}HP: [hp]/[mhp]{/color} {color=C500FF} Lust: [lust]/[mlust]{/color} {color=45FF00} Stamina: [sta]/[msta]{/color}{color=404040}{vspace=5}Current "+str(attname)+": "+str(attkind), interact=False) result = renpy.display_menu(items) if result == "Submit": return False elif result == "Resist": n = renpy.random.randint(0, attkind) cen("Current Value: {color=C500FF}"+str(attkind)+"{/color}{vspace=5}Required: {color=C500FF}"+str(attreq)+"{/color}{vspace=10}{color=808080}Click to roll a number between 0 and "+str(attkind)+"{/color}") renpy.play("audio/diceroll.ogg") if n >= attreq: cen("[name] rolled a {color=C500FF}"+str(n)+"{/color} !{vspace=10}{color=00FF00}You Passed !{/color}") return True else: cen("[name] rolled a {color=C500FF}"+str(n)+"{/color} !{vspace=10}{color=FF0000}You Failed...{/color}") return False elif result == "Struggle": hp -= hpreq cen(name+" Struggled out !") return True def quick_att_check(attname, attkind, attreq): n = renpy.random.randint(1, attkind) if n >= attreq: renpy.show_screen("quick_att_check_notification", attname, attreq, True) return True else: renpy.show_screen("quick_att_check_notification", attname, attreq, False) return False def BE_check(addiction, check_int=True): value_multiplier = 1 if ("Broken Boy" in btraits) and ("Milf" in encounter_type): value_multiplier *= 0.5 if ((addictions[addiction])-int((att[4]+bonusatt[4])*0.4)) >= (50*value_multiplier) or ((corruption)-int((att[4]+bonusatt[4])*0.4)) >= (8*value_multiplier) or att[3] <= 0 and check_int == True: add_enemy_to_final_broken_heroes_amount(encounter) renpy.jump(encounter.replace(" ","") + "BE") elif ((addictions[addiction])-int((att[4]+bonusatt[4])*0.4)) >= (40*value_multiplier) or ((corruption)-int((att[4]+bonusatt[4])*0.4)) >= (3*value_multiplier) or att[3] < 3 and check_int == True: renpy.play("audio/badend.ogg") def deal_damage(amount, ignore_armor=False, resistance_damage=1): global enemyhp global enemy_resistance_amount global final_damage_dealt damage_modifier = 1 if "Direct Hit" not in buff: if ("Melt" in technique_buff): enemy_resistance_amount -= ((techniques["Melt"][1]*0.01) + 1) else: enemy_resistance_amount -= 1 if "Direct Hit" in buff: if "Opportunist" in gtraits: damage_modifier += 1 else: damage_modifier += 0.5 enemy_resistance_amount += 1 if enemy_resistance_amount >= 3: enemy_resistance_amount = enemy_initial_resistance buff.remove("Direct Hit") elif enemy_armor_type != None and enemy_resistance_amount < 1: renpy.play("audio/resistancebreak.ogg") enemy_resistance_amount = 0 apply_buff("Direct Hit") elif "Direct Hit" not in buff and enemy_armor_type != None: if ignore_armor == True: pass elif enemy_armor_type == "Percent": amount *= 1-((enemy_armor+max(0, enemy_resistance_amount-(enemy_initial_resistance*2)))*0.01) elif enemy_armor_type == "Flat": amount = max(0, (amount - (enemy_armor+max(0, enemy_resistance_amount-(enemy_initial_resistance*2))))) else: renpy.notify("Error !! Armor type not found. Please report the current enemy to diogaoo") if "Dominated" in debuff: damage_modifier -= 0.5 damage_modifier -= curses["Attack Curse"]*0.03 amount = int(max(0, amount*damage_modifier)) enemyhp -= amount final_damage_dealt += amount if quests_dic[current_quest][3] == "Deal Damage": quest_progress(amount) return amount def damage_player(amount): global hp global lust global ap amount_modifier = 1 ap_curse_chance = renpy.random.randint(0, 100) if ap_curse_chance >= (curses["AP Curse"]*10): ap = min(max_ap, (ap + 1)) if ("Iron Skin" in technique_buff): amount_modifier -= (techniques["Iron Skin"][1]*0.01) if (curses["HP Damage Curse"] > 0): amount_modifier += (curses["HP Damage Curse"]*0.1) amount = round(amount*amount_modifier) hp -= amount if "Masochist" in btraits: lust += int(amount*0.33) renpy.play("audio/epunch.ogg") return amount def enemy_resistance(initial_amount, regen_amount, res_type, armor_amount): global enemy_initial_resistance global enemy_resistance_amount global enemy_armor_type global enemy_resistance_regen global enemy_armor enemy_armor_type = res_type enemy_initial_resistance = initial_amount enemy_resistance_amount = enemy_initial_resistance enemy_resistance_regen = regen_amount enemy_armor = armor_amount if tower_challenge == True: enemy_armor += curses["Armor Curse"] def decrease_gold(amount): global gold gold -= amount if current_quest == "City Investment": quest_progress(amount) def increase_gold(amount): global gold global final_gold_gained gold += amount final_gold_gained += amount def decrease_persistent_fame(amount): persistent.fame -= amount def decrease_stamina(amount): global sta sta = max(sta-amount, 0) if sta <= 19 and "Tired" not in debuff: apply_debuff("Tired") def skip_time(amount=1): global time global day global stacy_fame time += amount if time > 24: stacy_fame += 2 time -= 24 day += 1 if "Fairy Powder" in buff: for i in range(0, amount): chance = renpy.random.randint(1, 10) if chance == 1: if "Fairy Powder" in buff: buff.remove("Fairy Powder") if "Facialized" in debuff: trigger = 0 for i in range(0, amount): chance = renpy.random.randint(1, 100) if n <= 5: trigger += 1 if trigger > 0: lattack("Shemale", trigger, dealdamage = False) def lattack(add, amount=1, dealdamage=True): global addictions global final_most_increased_addiction global lust global correst global addrest global ap if "Fairy Powder" in buff: amount = 0 elif "Endure" in technique_buff: amount = 0 elif acess == "Rubber Sleeve" and add == "Blowjob": amount = 0 if amount != 0: renpy.show_screen("add_notify_screen", add+" Addiction +"+str(amount)) renpy.play("audio/gainadd.ogg") if museum_mode == False: prev_lust = lust addictions[add] += amount final_most_increased_addiction[add] += amount corruption_damage = int((corruption)*((100-correst)*0.01)) damage_multiplier = 1 if dealdamage == True: ap_curse_chance = renpy.random.randint(0, 100) if ap_curse_chance >= (curses["AP Curse"]*10): ap = min(max_ap, (ap + 1)) if "Uncontrollable Lust" in btraits and "Intoxicated" not in debuff and amount != 0: x = renpy.random.randint(1, 20) if x == 1: apply_debuff("Intoxicated") if "Resilient" in gtraits: corruption_damage = 0 if add == "Vaginal" and "Pussy Lover" in btraits: damage_multiplier += 0.5 elif add == "Titjob" and "Breasts Lover" in btraits: damage_multiplier += 0.5 elif add == "Blowjob" and "Blowjob Lover" in btraits: damage_multiplier += 0.5 elif add == "Foreplay" and "Foreplay Lover" in btraits: damage_multiplier += 0.5 elif add == "Anal" and "Anal Lover" in btraits: damage_multiplier += 0.5 elif add == "Shemale" and "Shemale Lover" in btraits: damage_multiplier += 0.5 if ("Susceptible Boy" in btraits) and ("Milf" in encounter_type): damage_multiplier += 0.5 if "Naked" in debuff: damage_multiplier += 0.1 if "Horny" in debuff: damage_multiplier += (debuff_horny*0.1) if "Desensitize" in technique_buff: damage_multiplier -= (techniques["Desensitize"][1])/100 if "Freshened" in buff: damage_multiplier -= 0.5 x = renpy.random.randint(1, 100) if x <= 25: buff.remove("Freshened") if curses["Lust Damage Curse"] > 0: damage_multiplier += (curses["Lust Damage Curse"]*0.1) final_damage = int(max(0, (corruption_damage + ((addictions[add])*((100-addrest)*0.01)))*damage_multiplier)) lust += final_damage final_enemy_lust_damage_amount[encounter][0] += final_damage final_enemy_lust_damage_amount[encounter][1] += amount update_cum_screen() lust = round(lust) lust = int(lust) return (lust - prev_lust) def hp_adjust(): global enemyhp if persistent.Difficulty == 0: enemyhp = int(enemyhp*0.8) elif persistent.Difficulty == 2: enemyhp = int(enemyhp*1.2) enemyhp = int(enemyhp) def calculate_exp(exp_from_enemy, accessory, bonus_exp_from_perk, difficulty): bonus_exp_from_accessory = 0 bonus_exp_from_difficulty = 0 if difficulty == 0: bonus_exp_from_difficulty = 1.6 if accessory == "EXP Ring": bonus_exp_from_accessory = ((round(0.1*(equipments[acess][5])**2 + 0.6965*(equipments[acess][5]) + 0.0458)+(equipments[acess][4]))/100) exp_gained = exp_from_enemy*(bonus_exp_from_accessory + bonus_exp_from_difficulty + bonus_exp_from_perk) return int(exp_gained) def get_random_spawn_time(): global spawn_time global enemies renpy.random.shuffle(spawn_time) x = 0 for enemy_name in enemies: enemy_name[3] = spawn_time[x] x += 1 if x > 5: renpy.random.shuffle(spawn_time) x = 0 def get_area_enemies(): global enemies global bosses global areas_dic global enemies_by_area enemies_by_area = {n: [] for n in areas_dic.keys()} if persistent.LShemale == True: for enemy in enemies: for area in enemies_by_area: if enemy[10] == area: enemies_by_area[area].append(enemy) else: for enemy in enemies: for area in enemies_by_area: if enemy[10] == area and "Shemale" not in enemy[9]: enemies_by_area[area].append(enemy) enemies_by_area["Outskirts"] = enemies_by_area["Forest"][:] tinky[3] = anastasia[3] enemies_by_area["Outskirts"].remove(anastasia) enemies_by_area["Outskirts"].append(tinky) if mila in enemies_by_area["Outskirts"]: enemies_by_area["Outskirts"].remove(mila) enemies_by_area["Outskirts"].append(astridnari) if sigrid in enemies_by_area["Outskirts"]: enemies_by_area["Outskirts"].remove(sigrid) enemies_by_area["Outskirts"].append(astridnari) def get_number_of_pics_in_gallery(enemy_name): global npics npics = 1 if pic_type_BE_mode == False: while renpy.loadable("images/Enemies/"+enemy_name+"/"+enemy_name.lower()+str(npics)+".webp"): npics += 1 else: while renpy.loadable("images/Enemies/"+enemy_name+"/p"+enemy_name.lower()+str(npics)+".webp"): npics += 1 npics -= 1 def add_bosses(): global bosses global areas_dic global enemies_by_area boss_pool = list(bosses) renpy.random.shuffle(boss_pool) if persistent.LShemale == True: for boss in boss_pool: for area in areas_dic: if boss[10] == area and "Boss" not in enemies_by_area[area][-1][9]: enemies_by_area[area].append(boss) else: for boss in boss_pool: if "Shemale" in boss[9]: boss_pool.remove(boss) for boss in boss_pool: for area in areas_dic: if boss[10] == area and "Boss" not in enemies_by_area[area][-1][9]: enemies_by_area[area].append(boss) def choose_first_techniques(): profs = [] first_techs_list = [tech for tech in techniques_dic if techniques_dic[tech][4] == "Basic"] while len(first_techs_list) > 4: first_techs_list.pop(random.randrange(len(first_techs_list))) renpy.random.shuffle(first_techs_list) for tech in first_techs_list: profs.append(renpy.random.randint(10, 25)) renpy.call_screen("first_technique", profs, first_techs_list) def get_arena_modifier(current_modifier): possible_modifiers = [] persistent.arena_last_modifier_change = int(datetime.now().timestamp()) for mod in arena_modifiers: if arena_modifiers[mod][1] == "any" or arena_modifiers[mod][1] == persistent.arena_enemy: possible_modifiers.append(mod) if current_modifier != None and current_modifier in possible_modifiers: possible_modifiers.remove(current_modifier) choose = renpy.random.choice(possible_modifiers) return choose def play_oral(x=1): choose = renpy.random.choice(["bj1.ogg","bj2.ogg","bj3.ogg","bj4.ogg","bj5.ogg","bj6.ogg","bj7.ogg"]) renpy.play("audio/bjaudio"+str(x)+"/"+choose) def play_squeeze(): choose = renpy.random.choice(["squeeze1.ogg","squeeze2.ogg","squeeze3.ogg","squeeze4.ogg"]) renpy.play("audio/squeezeaudio/"+choose) def play_sex(x, sex_vol=1.0): choose = renpy.random.choice(["sex1.ogg","sex2.ogg","sex3.ogg"]) renpy.music.play("audio/sexaudio/"+x+choose, channel="sex", loop=True, relative_volume=sex_vol) def get_random_pic(number_of_total_pics, start=1): global last_encounter_pic n = renpy.random.randint(start, number_of_total_pics) while (n in last_encounter_pic): n = renpy.random.randint(start, number_of_total_pics) last_encounter_pic.insert(0, n) if len(last_encounter_pic) > 2: last_encounter_pic.pop() return n def get_highest_addictions(): highest_addiction = max(addictions, key=addictions.get) second_highest = sorted(addictions, key=addictions.get)[-2] diff = addictions[highest_addiction] - addictions[second_highest] return highest_addiction, second_highest, diff def get_addictions_diff(addictions_to_get): addictions_sorted = {} addictions_differences = [] final_addictions_differences = [] for add in addictions_to_get: addictions_sorted[add] = addictions[add] addictions_sorted_list = {k: v for k, v in sorted(addictions_sorted.items(), key=lambda x: x[1], reverse=True)} addictions_sorted_list = list(addictions_sorted_list) for add in addictions_sorted_list: addictions_differences.append(addictions[add]) for n in range (0, len(addictions_differences)-1): final_addictions_differences.append(addictions_differences[n] - addictions_differences[n+1]) x = 1 y = 0 for n in range(0, len(addictions_sorted_list)-1): addictions_sorted_list.insert(x, final_addictions_differences[y]) x += 2 y += 1 return addictions_sorted_list def format_time(td): minutes, seconds = divmod(td.seconds, 60) hours, minutes = divmod(minutes, 60) return hours, minutes def get_final_most_increased_addiction(): temp = max(final_most_increased_addiction.values()) for i in final_most_increased_addiction: if final_most_increased_addiction[i] == temp: return i, temp def get_final_most_lust_damage_from_enemy(): temp = max(final_enemy_lust_damage_amount.values())[0] for i in final_enemy_lust_damage_amount: if final_enemy_lust_damage_amount[i][0] == temp: return i, temp def get_final_most_addiction_gain_from_enemy(): temp = max(final_enemy_lust_damage_amount.values())[1] for i in final_enemy_lust_damage_amount: if final_enemy_lust_damage_amount[i][1] == temp: return i, temp def get_final_most_climaxes(): if len(persistent.final_climax_amount) == 0: return "None", 0 temp = max(persistent.final_climax_amount.values()) for i in persistent.final_climax_amount: if persistent.final_climax_amount[i] == temp: return i, temp def get_final_most_broken_heroes(): if len(persistent.final_broken_heroes_amount) == 0: return "None", 0 temp = max(persistent.final_broken_heroes_amount.values()) for i in persistent.final_broken_heroes_amount: if persistent.final_broken_heroes_amount[i] == temp: return i, temp def add_enemy_to_final_broken_heroes_amount(encounter): if encounter in persistent.final_broken_heroes_amount: persistent.final_broken_heroes_amount[encounter] += 1 else: persistent.final_broken_heroes_amount[encounter] = 1 def update_cum_screen(alpha_amount=0): global cum_screen_alpha if alpha_amount == 0: alpha_amount = lust/mlust if not renpy.get_screen("cum_screen"): renpy.show_screen("cum_screen") cum_screen_alpha = min(1, cum_screen_alpha+alpha_amount) def increase_corr(amount): global addictions global corruption global corruption_meter if museum_mode == False: corruption += amount renpy.show_screen("corr_notify_screen", "Corruption+"+str(amount)+" ") renpy.play("audio/gaincorr.ogg") corruption_meter = ((corruption)-int((att[4]+bonusatt[4])*0.4)) def lostatt(stat=None, amount=1): if stat == None: n = renpy.random.randint(1, 5) if n == 1: stat = "STR" elif n == 2: stat = "AGI" elif n == 3: stat = "VIT" elif n == 4: stat = "INT" else: stat = "CON" if "Prodigy" in gtraits and stat == "INT": return if museum_mode == False: if stat == "STR": att[0] -= amount if att[0] < 1: att[0] = 1 if catt[0] > 5: catt[0] -= 5 elif stat == "AGI": att[1] -= amount if att[1] < 1: att[1] = 1 if catt[1] > 5: catt[1] -= 5 elif stat == "VIT": att[2] -= amount if att[2] < 1: att[2] = 1 if catt[2] > 5: catt[2] -= 5 elif stat == "INT": att[3] -= amount if att[3] < 1: att[3] = 1 if catt[3] > 5: catt[3] -= 5 elif stat == "CON": att[4] -= amount if att[4] < 1: att[4] = 1 if catt[4] > 5: catt[4] -= 5 corruption_meter = ((corruption)-int((att[4]+bonusatt[4])*0.4)) renpy.show_screen("lostatt_notify_screen", stat) renpy.play("audio/lostatt.ogg") calc_sub_att() def apply_debuff(dbff): if dbff == "Charmed": global debuff_charmed if debuff_charmed >= 10: return debuff_charmed += 1 renpy.show_screen("debuff_notify_screen", dbff) if "Charmed" in debuff: return elif dbff == "Horny": global debuff_horny debuff_horny += 1 renpy.show_screen("debuff_notify_screen", dbff) if "Horny" in debuff: return if tower_challenge == True and dbff == "Restrained" or dbff in debuff: return else: renpy.show_screen("debuff_notify_screen", dbff) renpy.play("audio/gaindebuff.ogg") debuff.append(str(dbff)) def remove_debuff(dbff): if dbff in debuff: if dbff == "Charmed": global debuff_charmed debuff_charmed = 0 elif dbff == "Horny": global debuff_horny debuff_horny = 0 debuff.remove(dbff) def apply_buff(bff): renpy.show_screen("buff_notify_screen", bff) renpy.play("audio/gainbuff.ogg") buff.append(bff) def apply_tech_buff(bff, description, turns, power): renpy.show_screen("buff_notify_screen", bff) renpy.play("audio/gainbuff.ogg") if bff not in technique_buff: technique_buff[bff] = [turns, power, description] else: technique_buff[bff][0] += turns def add_btrait(ntrait): renpy.play("audio/newbtrait.ogg") btraits.append(ntrait) renpy.show_screen("addtrait_notify_screen", ntrait) def add_gtrait(ntrait): renpy.play("audio/newgtrait.ogg") gtraits.append(ntrait) renpy.show_screen("addtrait_notify_screen", ntrait) def increase_curse(curse): if curse in curses: curses[curse] += 1 else: curses[curse] = 1 def increase_att_one(x): global points global att global catt global corruption_meter if points >= catt[x]: points -= catt[x] att[x] += 1 catt[x] += 5 else: renpy.notify("Not enough points !") if x == 4: corruption_meter = ((corruption)-int((att[4]+bonusatt[4])*0.4)) calc_sub_att() def decrease_att_one(x): global points global att global catt global backatt if att[x] > backatt[x]: att[x] -= 1 catt[x] -= 5 points += catt[x] calc_sub_att() def increase_att_five(x): global points global att global catt i = 5 cost = catt[x] total = 0 n = att[x] while i > 0: n += 1 total += cost cost += 5 i -= 1 if points >= total: att[x] = n catt[x] = cost points -= total else: renpy.notify("Not enough points !") if x == 4: corruption_meter = ((corruption)-int((att[4]+bonusatt[4])*0.4)) calc_sub_att() def calc_sub_att(): global att global attack global staregen global mhp global mlust global max_ap global addrest global correst attack = round((10 + (att[0]+bonusatt[0])*0.2), 2) staregen = min(100.00, round((100*(1-(2**(-0.01*(att[1]+bonusatt[1]+31.2))))), 2)) mhp = int(95 + (att[2]+bonusatt[2])*5) mlust = int(95 + (att[3]+bonusatt[3])*5) max_ap = int(15 + bonus_max_ap + (att[3]+bonusatt[3])*0.25) addrest = min(99.00, round((100*(1-(2.74**(-0.01*(att[4]+bonusatt[4])))))+9, 2)) correst = min(99.00, round((100*(1-(2.5**(-0.011*(att[4]+bonusatt[4])))))+19, 2)) def resetatt(): global points global bpoints global att global catt global backatt global bcatt points = bpoints att = backatt[:] catt = bcatt[:] calc_sub_att() def resettraits(): global personality_points global brtraits global btraits global gtraits personality_points = bpersonality_points btraits.clear() gtraits.clear() def update_bonus_from_ring(acess): global bonusatt if acess != None: x = (equipments[acess][5]) if acess == "STR Ring": bonusatt[0] += 5+round(0.1*x**2 + 0.6965*x + 0.0458) elif acess == "AGI Ring": bonusatt[1] += 5+round(0.1*x**2 + 0.6965*x + 0.0458) elif acess == "VIT Ring": bonusatt[2] += 5+round(0.1*x**2 + 0.6965*x + 0.0458) elif acess == "INT Ring": bonusatt[3] += 5+round(0.1*x**2 + 0.6965*x + 0.0458) elif acess == "CON Ring": bonusatt[4] += 5+round(0.1*x**2 + 0.6965*x + 0.0458) calc_sub_att() def remove_bonus_from_ring(acess): x = (equipments[acess][5]) if acess == "STR Ring": bonusatt[0] -= 5+round(0.1*x**2 + 0.6965*x + 0.0458) elif acess == "AGI Ring": bonusatt[1] -= 5+round(0.1*x**2 + 0.6965*x + 0.0458) elif acess == "VIT Ring": bonusatt[2] -= 5+round(0.1*x**2 + 0.6965*x + 0.0458) elif acess == "INT Ring": bonusatt[3] -= 5+round(0.1*x**2 + 0.6965*x + 0.0458) elif acess == "CON Ring": bonusatt[4] -= 5+round(0.1*x**2 + 0.6965*x + 0.0458) calc_sub_att() def RandomTraits(): global personality_points available_traits = [] available_traits_1_cost = [] available_traits_2_cost = [] gtraits_amount = random.choices((0, 1, 2), weights=(15, 70, 15), k=1) while len(gtraits) < gtraits_amount[0]: n = renpy.random.choice(persistent.gtraits_pool) if n not in gtraits: gtraits.append(n) personality_points -= gtraits_dic[n][1] number = 0 for i in persistent.btraits_pool: number += btraits_dic[i][1] if number < abs(personality_points): renpy.notify("Not enough Negative Traits\nPlease pick less Positive Traits") resettraits() else: while personality_points < 0: available_traits = [j for j in persistent.btraits_pool if j not in btraits] if len(available_traits) <= 0: renpy.notify("Not enough Negative Traits\nPlease pick less Positive Traits") resettraits() elif personality_points <= -3: choose = renpy.random.choice(available_traits) btraits.append(choose) available_traits.remove(choose) personality_points += btraits_dic[choose][1] else: available_traits_1_cost = [j for j in available_traits if btraits_dic[j][1] == 1] available_traits_2_cost = [j for j in available_traits if btraits_dic[j][1] == 2] if personality_points == -1 and len(available_traits_1_cost) > 0: btraits.append(renpy.random.choice(available_traits_1_cost)) personality_points += 1 elif personality_points == -2 and len(available_traits_2_cost) > 0: btraits.append(renpy.random.choice(available_traits_2_cost)) personality_points += 2 else: choose = renpy.random.choice(available_traits) btraits.append(choose) personality_points += btraits_dic[choose][1] renpy.jump("att") def get_random_recipes(): global recipes_for_sale recipes_for_sale = [] w_pool = [w for w in equipments if equipments[w][2] == "Weapon" and equipments[w][3] > 0] a_pool = [a for a in equipments if equipments[a][2] == "Acess" and equipments[a][3] > 0] e_pool = w_pool + a_pool w_chance = [equipments[i][3] for i in w_pool] a_chance = [equipments[j][3] for j in a_pool] recipe1 = (random.choices(w_pool, weights=w_chance, k=1)) recipes_for_sale.append(recipe1[0]) recipe2 = (random.choices(a_pool, weights=a_chance, k=1)) recipes_for_sale.append(recipe2[0]) while len(recipes_for_sale) < 3: recipe = random.choice(e_pool) if recipe not in recipes_for_sale: recipes_for_sale.append(recipe) return recipes_for_sale def get_random_scrolls(): global scrolls_for_sale temp_scrolls_for_sale = [] scrolls_for_sale = [] tiers_available = [3, 2, 2, 1, 1, 1] x = 0 while len(temp_scrolls_for_sale) < 6: choose = renpy.random.choice(list(techniques_dic.keys())) if choose not in temp_scrolls_for_sale and techniques_dic[choose][4] != "Special": temp_scrolls_for_sale.append(choose) for scroll in temp_scrolls_for_sale: scrolls_for_sale.append([scroll, tiers_available[x]]) x += 1 return scrolls_for_sale def get_random_curses(): global curse_options curse_options = [] while len(curse_options) < 3: choose = renpy.random.choice(list(curses.keys())) if choose == "AP Curse" and curses["AP Curse"] >= 10: pass elif choose == "Attack Curse" and curses["Attack Curse"] >= 50: pass elif choose in curse_options: pass else: curse_options.append(choose) def get_single_random_scroll(): scroll_name = "None" scroll_tier = random.choices((1, 2, 3, 4), weights=(50, 30, 15, 5), k=1) while scroll_name == "None": scroll_name = renpy.random.choice(list(techniques_dic.keys())) if techniques_dic[scroll_name][4] == "Special": scroll_name = "None" return (scroll_name, scroll_tier[0]) def get_random_quests(): global quests_dic global quests_available quests_available = [] easy_pool = [easy_quest for easy_quest in quests_dic.keys() if quests_dic[easy_quest][1] == 1] med_pool = [med_quest for med_quest in quests_dic.keys() if quests_dic[med_quest][1] == 2] hard_pool = [hard_quest for hard_quest in quests_dic.keys() if quests_dic[hard_quest][1] == 3] if "p1f" not in persistent.perks: med_pool.remove("Refining Study") hard_pool.remove("Refining Degree") quests_available.append(random.choice(easy_pool)) quests_available.append(random.choice(med_pool)) quests_available.append(random.choice(hard_pool)) def get_purchasable_pictures(): all_enemies = [] for enemy in enemies: if enemy[0] in list(persistent.final_broken_heroes_amount.keys()) and enemy[0] not in persistent.extra_pics and getattr(persistent, enemy[0].replace(" ", ""), None) >= 5: all_enemies.append(enemy[0]) for boss in bosses: if boss[0] in list(persistent.final_broken_heroes_amount.keys()) and boss[0] not in persistent.extra_pics and getattr(persistent, boss[0].replace(" ", ""), None) >= 5: all_enemies.append(boss[0]) return all_enemies def get_purchasable_maps(): global areas global areas_dic maps_for_sale = [] for i in areas_dic.keys(): if i not in areas: maps_for_sale.append(i) return maps_for_sale def get_purchasable_pictures_prices(albums_available): picture_index = 1 this_album_price = 10 pictures_prices = [] for albums_available in albums_available: while renpy.loadable("images/Enemies/"+albums_available.replace(" ", "")+"/p"+albums_available.replace(" ", "").lower()+str(picture_index)+".webp"): this_album_price += 10 picture_index += 1 pictures_prices.append(this_album_price) this_album_price = 10 picture_index = 1 return pictures_prices def buy_pictures_from_museum(album): persistent.extra_pics.append(album) renpy.play("audio/lsuccess.ogg") if len(persistent.extra_pics) >= 10: Achievement.add(achievement_dilettante) if len(persistent.extra_pics) >= 25: Achievement.add(achievement_aficionado) renpy.jump("museum_buy_art") def get_unlocked_albums(album_type): unlocked_albums = [] number_of_times_defeated = 0 if album_type == "Enemies": for enemy in enemies: number_of_times_defeated = getattr(persistent, enemy[0].replace(" ", ""), None) if number_of_times_defeated >= 5: unlocked_albums.append(enemy[0]) elif "Bonus" in enemy[9] and number_of_times_defeated >= 1: unlocked_albums.append(enemy[0]) for boss in bosses: if getattr(persistent, boss[0].replace(" ", ""), None) >= 5: unlocked_albums.append(boss[0]) elif album_type == "Dungeons": for album in persistent.extra_pics: if "Facility" in album: unlocked_albums.append(album) elif album_type == "Events": for album in persistent.extra_pics: if "Event" in album: unlocked_albums.append(album) else: renpy.notify("Error, album type not found !") return unlocked_albums def quest_progress(amount=1): global quest_current_counter global quest_max_counter global final_favor_gained global current_quest global favor quest_current_counter += amount if quest_current_counter >= quest_max_counter: renpy.play("audio/lsuccess.ogg") final_favor_gained += (quests_dic[current_quest][1]) favor += (quests_dic[current_quest][1]) renpy.notify("Quest Completed !") get_random_quests() current_quest = "Cooldown" quest_current_counter = 0 quest_max_counter = 0 def get_random_favor_prize_pool(): global favor_shop_prize_pool_name global favor_shop_prize_pool_amount global favor_prizes_dic favor_shop_prize_pool_name = [] favor_shop_prize_pool_amount = [] queen_blessing_pool = [blessing for blessing in favor_prizes_dic.keys() if favor_prizes_dic[blessing][0] == "Blessing"] x = (random.choice(queen_blessing_pool)) favor_shop_prize_pool_name.append(x) favor_shop_prize_pool_amount.append(1) scroll_pool = [scroll for scroll in techniques_dic.keys() if techniques_dic[scroll][4] != "Special"] x = (random.choice(scroll_pool)) favor_shop_prize_pool_name.append(x) favor_shop_prize_pool_amount.append(1) pot_favor_pool = [pot for pot in favor_prizes_dic.keys() if favor_prizes_dic[pot][0] == "Potion"] x = (random.choice(pot_favor_pool)) favor_shop_prize_pool_name.append(x) favor_shop_prize_pool_amount.append(renpy.random.randint(1, 2)) pot_favor_pool.remove(x) y = (random.choice(pot_favor_pool)) favor_shop_prize_pool_name.append(y) favor_shop_prize_pool_amount.append(renpy.random.randint(1, 2)) pot_favor_pool.remove(y) material_favor_pool = [material for material in favor_prizes_dic.keys() if favor_prizes_dic[material][0] == "Material"] x = (random.choice(material_favor_pool)) favor_shop_prize_pool_name.append(x) favor_shop_prize_pool_amount.append(renpy.random.randint(1, 2)) favor_shop_prize_pool_name.append("10 Gold") favor_shop_prize_pool_amount.append(renpy.random.randint(1, 9)) def generate_tower_enemy_list(): global enemies global tower_list if persistent.LShemale == True: temp_tower_list = [enemy for enemy in enemies] temp_tower_boss_list = [boss for boss in bosses] else: temp_tower_list = [enemy for enemy in enemies if "Shemale" not in enemy[9]] temp_tower_boss_list = [boss for boss in bosses if "Shemale" not in boss[9]] renpy.random.shuffle(temp_tower_list) renpy.random.shuffle(temp_tower_boss_list) if tower_boss_rush == False: for i in range(0, len(temp_tower_list), tower_boss_frequency): tower_list.extend(temp_tower_list[i:i+tower_boss_frequency]) tower_list.append(random.choice(temp_tower_boss_list)) tower_list.pop() else: tower_list.extend(temp_tower_boss_list) def generate_final_enemy_lust_damage_amount_list(): global final_enemy_lust_damage_amount for key in temp_defeated_enemy: final_enemy_lust_damage_amount[key] = [0, 0] def player_orgasm(corr_increase=5): global lust global ap global final_first_orgasm if encounter in persistent.final_climax_amount: persistent.final_climax_amount[encounter] += 1 else: persistent.final_climax_amount[encounter] = 1 if final_first_orgasm[0] == "None": final_first_orgasm[0] = encounter final_first_orgasm[1] = day if renpy.music.is_playing(channel=u'sex') == True: renpy.music.stop(channel=u'sex') renpy.show("blackscreen", at_list=[top]) renpy.show("white", at_list=[top]) renpy.music.play(["audio/cum.ogg"]*3, channel=u'cumming') if "Purity" in buff: buff.remove("Purity") for i in range(0, len(bonusatt)): bonusatt[i] -= 2 calc_sub_att() if "Masturbate" in debuff and "Mother's Blessing" in btraits: corr_increase += 2 renpy.pause(2) if "Ruined" in technique_buff: del technique_buff["Ruined"] else: increase_corr(corr_increase) lust = 0 ap = max_ap renpy.pause(1) renpy.show("blackscreen", at_list=[top]) def dreaming(): global lust renpy.pause(1) number = renpy.random.randint(1, 4) dream_type = str(max(addictions, key=addictions.get)) renpy.show("dream_"+dream_type.lower()+"_"+str(number), at_list=[top]) if dream_type == "Vaginal": cen(name+" dreams about Vaginal sex", interact=False) elif dream_type == "Anal": cen(name+" dreams about Asses", interact=False) elif dream_type == "Shemale": cen(name+" dreams about Shemales", interact=False) else: cen(name+" dreams about "+dream_type, interact=False) renpy.play("audio/heartbeat.ogg") renpy.pause(3) renpy.show("blackscreen", at_list=[top]) renpy.pause(1) lust = min((mlust-1), (lust+(max(addictions.values())))) def apply_favor_shop(item_names, item_amount, temp_favor): global favor global favor_shop_prize_pool_amount global bonusatt global gold if "Queen's Strength" in item_names: x = renpy.random.randint(2, 3) bonusatt = [y+x for y in bonusatt] calc_sub_att() if "Queen's Fortune" in item_names: apply_buff("Fortune") for i in item_names: if " T4" in item_names[item_names.index(i)]: gain_scroll(item_names[item_names.index(i)].replace(" T4", ""), 4) if "Blue Potion" in item_names: consumables["Blue Potion"] += item_amount[item_names.index("Blue Potion")] if "Orange Potion" in item_names: consumables["Orange Potion"] += item_amount[item_names.index("Orange Potion")] if "Pink Potion" in item_names: consumables["Pink Potion"] += item_amount[item_names.index("Pink Potion")] if "Green Potion" in item_names: consumables["Green Potion"] += item_amount[item_names.index("Green Potion")] if "2 Iron" in item_names: materials["Iron"][0] += (item_amount[item_names.index("2 Iron")] * 2) if "Jewel" in item_names: materials["Jewel"][0] += (item_amount[item_names.index("Jewel")]) if "10 Gold" in item_names: increase_gold(item_amount[item_names.index("10 Gold")] * 10) for i in item_names: if " T4" in item_names[item_names.index(i)]: item_pool_index = favor_shop_prize_pool_name.index(i.replace(" T4", "")) else: item_pool_index = favor_shop_prize_pool_name.index(i) item_cart_index = item_names.index(i) favor_shop_prize_pool_amount[item_pool_index] -= item_amount[item_cart_index] if temp_favor < favor: renpy.play("audio/success.ogg") favor = temp_favor def apply_potion_shop(purple, red, green, orange, pink, temp_gold): global temp global temp2 global gold global green_potion_price global orange_potion_price global pink_potion_price temp = purple-(consumables["Purple Potion"]) temp2 = red-(consumables["Red Potion"]) green_potion_price += (green-consumables["Green Potion"])*10 consumables["Green Potion"] = green orange_potion_price += (orange-consumables["Orange Potion"])*10 consumables["Orange Potion"] = orange pink_potion_price += (pink-consumables["Pink Potion"])*10 consumables["Pink Potion"] = pink if temp_gold < gold: renpy.play("audio/success.ogg") decrease_gold(gold - temp_gold) def apply_shop(iron, wood, fabric, plastic, rubber, jewel, temp_gold): global gold materials["Iron"][0] = iron materials["Wood"][0] = wood materials["Fabric"][0] = fabric materials["Plastic"][0] = plastic materials["Rubber"][0] = rubber materials["Jewel"][0] = jewel if temp_gold < gold: renpy.play("audio/success.ogg") decrease_gold(gold - temp_gold) elif temp_gold > gold: renpy.play("audio/success.ogg") increase_gold(temp_gold - gold) def add_to_cart(cart_name_list, cart_amount_list, item_name): if item_name in cart_name_list: index = cart_name_list.index(item_name) cart_amount_list[index] += 1 else: cart_name_list.append(item_name) cart_amount_list.append(1) def remove_from_cart(cart_name_list, cart_amount_list, item_name): if item_name in cart_name_list: index = cart_name_list.index(item_name) cart_amount_list[index] -= 1 if cart_amount_list[index] <= 0: del cart_amount_list[index] del cart_name_list[index] def add_stacy_comment(this_text=""): if this_text != "": stacy_comments[this_text] = [renpy.random.randint(300, 1600), (renpy.random.randint(600, 880)), (renpy.random.randint(2, 3)), (renpy.random.randint(300, 500))] else: if stacy_fame < 20: choose = renpy.random.randint(0, 10) elif stacy_fame < 40: choose = renpy.random.randint(5, 15) elif stacy_fame < 60: choose = renpy.random.randint(10, 20) elif stacy_fame < 80: choose = renpy.random.randint(11, 25) else: choose = renpy.random.randint(15, 30) if choose == 0: comment = "What's going on here?" elif choose == 1: comment = "Who is this girl?" elif choose == 2: comment = "Weird girl" elif choose == 3: comment = "Hey guys, how are you?" elif choose == 4: comment = "What is this?" elif choose == 5: comment = "Ugh, she is so flat" elif choose == 6: comment = "Someone wanna chat?" elif choose == 7: comment = "Stacy's mom tipped $5" elif choose == 8: comment = "Buy cripto and get rich quickly: http://someshadywebsite.xyz" elif choose == 9: comment = "Rock and stone! Am I right guys?" elif choose == 10: comment = "Looking for someone to bang my wife" elif choose == 11: comment = "SomeWeakHero tipped $50" elif choose == 12: comment = "I bet she loves BBC" elif choose == 13: comment = "She's cute" elif choose == 14: comment = "Have you guys seen this girl's mom??" elif choose == 15: comment = "Dirty whore" elif choose == 16: comment = "Let me break your ass, bitch" elif choose == 17: comment = "God, her pussy must taste so good" elif choose == 18: comment = "I would break her in half" elif choose == 19: comment = "I'm back, my love" elif choose == 20: comment = "I love her" elif choose == 21: comment = "Fuck, I'm cumming" elif choose == 22: comment = "I would fuck this girl so good" elif choose == 23: comment = "This is my third time fapping to Stacy today" elif choose == 24: comment = "I wanna fuck Stacy so bad" elif choose == 25: comment = "I missed you Stacy, today was I good day. I had breakfast with my mom and then we went to the park and I couldn't stop thinking about what you..." elif choose == 24: comment = "#AllHailStacy" elif choose == 25: comment = "Please Stacy merry me" elif choose == 26: comment = "Stacy is my queen" elif choose == 27: comment = "Please step on me Stacy" elif choose == 28: comment = "I want Stacy to dominate me" elif choose == 29: comment = "I wanna eat my cum for Stacy" elif choose == 30: comment = "RandomDude69 tipped $300" stacy_comments[comment] = [renpy.random.randint(300, 1600), (renpy.random.randint(600, 880)), (renpy.random.randint(1, 3)), (renpy.random.randint(200, 500))] def move_facility_map(x_position, y_position): global map_player global facility_map_discovered map_player = [x_position, y_position] update_map_vision(x_position, y_position) for room in facility_map_discovered: if room[0] == x_position and room[1] == y_position: return facility_map_discovered.append((x_position, y_position)) def update_map_vision(player_x_position, player_y_position): global map_player_vision map_player_vision.clear() north_free_space = (player_y_position-20) south_free_space = (player_y_position+20) west_free_space = (player_x_position-20) east_free_space = (player_x_position+20) vision_range = 2 while (player_x_position, north_free_space) in facility_map and vision_range > 0: map_player_vision.append((player_x_position, north_free_space)) north_free_space -= 20 vision_range -= 1 vision_range = 2 while (player_x_position, south_free_space) in facility_map and vision_range > 0: map_player_vision.append((player_x_position, south_free_space)) south_free_space += 20 vision_range -= 1 vision_range = 2 while (west_free_space, player_y_position) in facility_map and vision_range > 0: map_player_vision.append((west_free_space, player_y_position)) west_free_space -= 20 vision_range -= 1 vision_range = 2 while (east_free_space, player_y_position) in facility_map and vision_range > 0: map_player_vision.append((east_free_space, player_y_position)) east_free_space += 20 vision_range -= 1 def get_explorable_rooms(nr_of_explorable_rooms=5): explorable_rooms = [] possible_rooms = [(90, 185), (70, 25), (70, 85), (70, 165), (110, 85), (130, 145), (170, 145), (190, 165), (190, 85), (170, 65), (170, 185), (230, 185), (210, 145)] for i in range(0, nr_of_explorable_rooms): choice = renpy.random.choice(possible_rooms) explorable_rooms.append(choice) possible_rooms.remove(choice) return explorable_rooms def move_enemy_map(x_position, y_position): global facility_map enemy_current_position = [x_position, y_position] chances_to_move = 3 pick_coord = renpy.random.randint(0, 1) pick_value = renpy.random.choice([20, -20]) enemy_current_position[pick_coord] += pick_value while chances_to_move > 0: for position in facility_map: if position[0] == enemy_current_position[0] and position[1] == enemy_current_position[1]: return enemy_current_position chances_to_move -= 1 return x_position, y_position def facility_loot(): n = renpy.random.randint(1, 100) if n <= 5: temp = get_single_random_scroll() gain_scroll(temp[0], temp[1]) renpy.play("audio/lsuccess.ogg") cen("Found a {color=E08000}Tier "+str(temp[1])+"{/color} {b}{color=64C6FE}"+temp[0]+"{/color}{/b} Scroll !") elif n <= 10: n = renpy.random.randint(1, 2) if n == 1: recipe_pool = [w for w in equipments if equipments[w][2] == "Weapon" and equipments[w][3] > 0 and w not in wrecipes] recipe_chance = [equipments[i][3] for i in recipe_pool] if len(recipe_chance) > 0: recipe_found = (random.choices(recipe_pool, weights=recipe_chance, k=1)) wrecipes.append(recipe_found[0]) renpy.play("audio/lsuccess.ogg") cen("Found {b}{color=E08000}"+recipe_found[0]+"{/color}{/b} Recipe !") else: cen("It doesn't seems to have anything of value...") else: recipe_pool = [a for a in equipments if equipments[a][2] == "Acess" and equipments[a][3] > 0 and a not in arecipes] recipe_chance = [equipments[j][3] for j in recipe_pool] if len(recipe_chance) > 0: recipe_found = (random.choices(recipe_pool, weights=recipe_chance, k=1)) arecipes.append(recipe_found[0]) renpy.play("audio/lsuccess.ogg") cen("Found {b}{color=E08000}"+recipe_found[0]+"{/color}{/b} Recipe !") else: cen("It doesn't seems to have anything of value...") elif n <= 30: temp = renpy.random.choice(list(materials.keys())) materials[temp][0] += 1 renpy.play("audio/success.ogg") cen("Found a piece of {b}{color=00FFFF}"+temp+"{/b}{/color} !") elif n <= 55: temp = renpy.random.choice(["Red Potion", "Purple Potion", "Blue Potion", "Orange Potion", "Pink Potion", "Green Potion"]) consumables[temp] += 1 renpy.play("audio/success.ogg") cen("Found a {b}{color=00FFFF}"+temp+"{/b}{/color} !") elif n <= 85: n = int(renpy.random.randint(3, 10) + day*renpy.random.randint(1, 3)) increase_gold(n) renpy.play("audio/coinbag.ogg") cen("Found {color=FFFF00}{b}"+str(n)+" Gold !{/b}{/color}") elif n <= 95: albums_available = ["Facility Enemy A", "Facility Enemy B", "Facility Enemy C", "Facility Enemy D", "Facility Enemy E"] album_pool = [album for album in albums_available if album not in persistent.extra_pics] if "Facility" in persistent.final_broken_heroes_amount and "Facility BE" not in persistent.extra_pics: album_pool.append("Facility BE") if len(album_pool) > 0: album_found = renpy.random.choice(album_pool) persistent.extra_pics.append(album_found) renpy.play("audio/lsuccess.ogg") cen("Found {b}{color=E08000}"+album_found+"{/color}{/b} Album !") else: cen("It doesn't seems to have anything of value...") else: cen("It doesn't seems to have anything of value...") def get_curse_description(curse, lvl): if curse == "Attack Curse": return "Decrease Hero Damage by -"+str(lvl*3)+"%" elif curse == "Check Curse": return "Decrease Addiction Checks by -"+str(round(lvl*5, 2))+"%" elif curse == "Enemy HP Curse": return "Increase Enemy Health by +"+str(round(lvl*10, 2))+"%" elif curse == "Lust Damage Curse": return "Increase Enemy Lust Damage by +"+str(round(lvl*10, 2))+"%" elif curse == "HP Damage Curse": return "Increase Enemy Physical Damage by +"+str(round(lvl*10, 2))+"%" elif curse == "AP Curse": return "Adds a "+str(lvl*10)+"% chance of not recovering AP" elif curse == "Armor Curse": return "Increase Enemy Armor by +"+str(lvl*3)+"% / +"+str(lvl*3) elif curse == "Stamina Curse": return "Decrease Max Stamina by +"+str(lvl*2)+"%" else: return "Error, Curse "+str(curse)+" not found, please report to diogaoo" def SetArrayVariable(variavel, id1, valor): variavel[id1] = valor def SetDictVariable(variavel, key, index, valor): variavel[key][index] = valor def RemoveFromDict(dct, key): dct.pop(key) label applyperks: if "p1" in persistent.perks: $ exp_perk_bonus = 1.05 $ gold = 5 $ points = 60 if "p1e" in persistent.perks: $ city_areas.append("Recipe Store") if "p1j" in persistent.perks: $ city_areas.append("Museum") if "p9" in persistent.perks: $ exp_perk_bonus = 2.10 elif "p8" in persistent.perks: $ exp_perk_bonus = 1.85 elif "p7" in persistent.perks: $ exp_perk_bonus = 1.65 elif "p6" in persistent.perks: $ exp_perk_bonus = 1.50 elif "p5" in persistent.perks: $ exp_perk_bonus = 1.35 elif "p4" in persistent.perks: $ exp_perk_bonus = 1.25 elif "p3" in persistent.perks: $ exp_perk_bonus = 1.15 elif "p2" in persistent.perks: $ exp_perk_bonus = 1.10 $ exp_perk_bonus += (persistent.gold_perks[0]*0.01) if "p8b" in persistent.perks: $ gold = 105 elif "p7b" in persistent.perks: $ gold = 85 elif "p6b" in persistent.perks: $ gold = 65 elif "p5b" in persistent.perks: $ gold = 50 elif "p4b" in persistent.perks: $ gold = 35 elif "p3b" in persistent.perks: $ gold = 25 elif "p2b" in persistent.perks: $ gold = 15 elif "p1b" in persistent.perks: $ gold = 10 $ gold += persistent.gold_perks[1] if "p8c" in persistent.perks: $ points = 760 elif "p7c" in persistent.perks: $ points = 560 elif "p6c" in persistent.perks: $ points = 410 elif "p5c" in persistent.perks: $ points = 310 elif "p4c" in persistent.perks: $ points = 230 elif "p3c" in persistent.perks: $ points = 160 elif "p2c" in persistent.perks: $ points = 110 elif "p1c" in persistent.perks: $ points = 80 $ points += persistent.gold_perks[2] if "p1g" in persistent.perks: $ backpack = True if "p2g" in persistent.perks: $ consumables["Blue Potion"] += 1 if "p1i" in persistent.perks: $ bonus_max_ap += 1 if "p2i" in persistent.perks: $ bonus_max_ap += 1 if "p3i" in persistent.perks: $ bonus_max_ap += 1 if "p4i" in persistent.perks: $ bonus_max_ap += 1 if "p5i" in persistent.perks: $ bonus_max_ap += 1 $ bpoints = points $ bpersonality_points = personality_points $ backatt = att[:] $ bcatt = catt[:] jump traits label startrun: python: _game_menu_screen = "Status_screen" backatt = att[:] bcatt = catt[:] bpoints = points initial_time = datetime.now() generate_final_enemy_lust_damage_amount_list() get_random_spawn_time() get_random_favor_prize_pool() get_random_scrolls() get_area_enemies() if (persistent.arena_modifier == None) or (arena_modifiers[persistent.arena_modifier][1] != persistent.arena_enemy) or (int(datetime.now().timestamp()) - persistent.arena_last_modifier_change) >= 86400: persistent.arena_modifier = get_arena_modifier(persistent.arena_modifier) if "Corrupted" in btraits: corruption = 2 if "p1h" in persistent.perks: apply_buff("Purity") for i in range(0, len(bonusatt)): bonusatt[i] += 2 calc_sub_att() hp = mhp lust = 0 ap = max_ap show screen buffs $ quick_menu = True if persistent.tutorial == 1: $ disableatt = 2 jump tutorialbase else: jump base label endrun: if museum_mode == True: $ museum_mode = False jump museum $ final_time = datetime.now() $ final_time = (final_time-initial_time) show screen end_run_screen $ persistent.run += 1 $ persistent.fame += tfame if tower_challenge == True: $ persistent.tower_record[1] += 1 cen "{b}{color=FF0000}Challenge Ended{/color}{/b}{vspace=4}{color=#00A2FF}{b}[name]{/b}: [tower_floor]° Floor{/color}{vspace=2}{color=BABABA}[persistent.tower_record[1]]° Try{vspace=1}{color=C80000}Defeated by [encounter]" if persistent.tower_record[0] != "none": cen "{color=CCCC00}{b}Current Tower Record{/b}{/color}{vspace=4}{color=#00A2FF}{b}[persistent.tower_record[0]]{/b}: [persistent.tower_record[2]]° Floor{/color}{vspace=2}Set in [persistent.tower_record[3]]{vspace=1}{color=C80000}Defeated by [persistent.tower_record[4]]" if persistent.tower_record[2] < tower_floor and tower_replenish_stamina == False and tower_boss_frequency <= 5: $ persistent.tower_record[0] = name $ persistent.tower_record[2] = tower_floor $ persistent.tower_record[3] = date.today() $ persistent.tower_record[4] = encounter play sound "audio/lsuccess.ogg" cen "{color=FFB800}{b}New Tower Record !{/color}{/b}{vspace=4}{color=#00A2FF}{b}[persistent.tower_record[0]]{/b}: [persistent.tower_record[2]]° Floor{/color}{vspace=2}[persistent.tower_record[3]]{vspace=1}{color=C80000}Defeated by [persistent.tower_record[4]]" cen "{b}{color=FF0000}Game Over{/color}{/b}{vspace=4}{b}[name]{/b}: [tfame] Fame{vspace=2}{color=BABABA}[persistent.run] Runs{vspace=1}{color=C80000}Defeated by [encounter]" if persistent.portrait[0] != "none": cen "{color=CCCC00}{b}Current Fame Record{/b}{/color}{vspace=4}{color=#00A2FF}{b}[persistent.portrait[0]]{/b}: [persistent.portrait[1]] Fame{/color}{vspace=2}Set in [persistent.portrait[2]]{vspace=1}{color=C80000}Defeated by [persistent.portrait[3]]" if tfame > persistent.portrait[1]: $ persistent.portrait[3] = encounter $ persistent.portrait[2] = date.today() $ persistent.portrait[1] = tfame $ persistent.portrait[0] = name play sound "audio/lsuccess.ogg" cen "{b}{color=FFB800}New Fame Record !{/color}{/b}{vspace=4}{color=#00A2FF}{b}[persistent.portrait[0]]{/b}: [persistent.portrait[1]] Fame{/color}{vspace=2}Set in [persistent.portrait[2]]{vspace=1}{color=C80000}Defeated by [persistent.portrait[3]]" $ delete_slot(0, True) $ renpy.full_restart(save=True) label before_player_turn: python: for tech_bff in list(technique_buff): if technique_buff[tech_bff][0] != "??": technique_buff[tech_bff][0] -= 1 if technique_buff[tech_bff][0] <= 0: remove_technique(tech_bff) if tech_bff == "Doomsday": if arena_mode == False: renpy.play("audio/crit.ogg") cen(name+" dealt {color=FF0000}{b}"+str(deal_damage(999999))+"{/b}{/color} damage") else: cen("Nothing happened...") renpy.jump(encounter.replace(" ", "") + "turn") if "Intoxicated" in debuff: if "Pheromone Weakness" not in btraits: $ lust += int(mlust*0.05 + (corruption)) else: $ lust += int((mlust*0.05 + (corruption))*1.5) if lust >= mlust: $ renpy.jump(encounter.replace(" ", "") + "turn") jump player_turn label player_turn: $ enemy_text = str(encounter)+": {color=FF0000}HP: "+str(enemyhp)+"{/color}" if enemymaxlust != 0: $ enemy_text += " | {color=C500FF}Lust: "+str(enemylust)+" / "+str(enemymaxlust)+"{/color}" if enemy_armor_type != None: if "Direct Hit" not in buff: if (enemy_resistance_amount > enemy_initial_resistance*2): $ enemy_text += " | {color=008C8C}Resistance: {/color}{color=FF0000}{b}"+str(int(enemy_resistance_amount))+"{/b}{size=14}."+str(enemy_resistance_amount).split('.')[1][0]+"{/color}{space=8}{size=12}+"+str(enemy_resistance_regen)+"{/size}{/color}" else: $ enemy_text += " | {color=008C8C}Resistance: {/color}{color=00B4B4}{b}"+str(int(enemy_resistance_amount))+"{/b}{size=14}."+str(enemy_resistance_amount).split('.')[1][0]+"{space=8}{size=12}+"+str(enemy_resistance_regen)+"{/color}{/size}{/color}" if enemy_armor_type == "Percent": $ enemy_text += " | {color=008C8C}Armor: {/color}{color=00B4B4}"+str(int(enemy_armor+max(0, enemy_resistance_amount-(enemy_initial_resistance*2))))+"%{/color}" elif enemy_armor_type == "Flat": $ enemy_text += " | {color=008C8C}Armor: {/color}{color=00B4B4}"+str(int(enemy_armor+max(0, enemy_resistance_amount-(enemy_initial_resistance*2))))+"{/color}" elif "Direct Hit" in buff: $ enemy_text += " | {color=00FFAA}{b}Armor Break{/b}{/color}" $ enemy_text += " | {b}Attack: "+str(edamage)+"{/b}{vspace=20}{b}"+str(name)+"{/b}: {color=FF0000}HP: "+str(hp)+" / "+str(mhp)+"{/color} | {color=C500FF}Lust: "+str(lust)+" / "+str(mlust)+"{/color} | {color=45FF00}Stamina: "+str(sta)+"%{/color} | {color=64C6FE} AP: "+str(ap)+" / "+str(max_ap) cen "[enemy_text]{nw}" menu: extend "" "{b}{color=FF0000}Normal Attack{/b}{/color}": $ at = 1 jump attack "{b}{color=C00000}Heavy Blow{/b}{/color}" if current_quest != "Low-Violence Pact": $ at = 2 jump attack "Wait": $ at = 0 if "Calm Mind" in gtraits and (lust > mlust*0.05): $ lust -= (int(mlust*0.02)) if "Experiment #804" in gtraits: $ hp = min(mhp, hp + int(mhp*(corruption*0.01))) if "Experiment #613" in btraits: $ n = mhp/(hp*10) $ number = random.uniform(0.0, 100.0) if number <= n: $ increase_corr(1) if "Whirlwind" in buff: $ buff.remove("Whirlwind") $ bweapon = 0 if acess == "Serenity's Shawl": $ enemyhp -= int((att[4]+bonusatt[4])*0.5) if acess == "Heart Pendant": $ n = renpy.random.randint(1, 100) if n <= ((equipments[acess][4]) + round(0.1*(equipments[acess][5])**2 + 0.6965*(equipments[acess][5]) + 0.0458)): $ hp = min(mhp, (hp + int(((att[3]+bonusatt[3])*0.01)*mhp))) play sound "audio/acc_proc.ogg" if weapon == "Growing Fury": $ growing_fury_bonus = 1 $ sta = min(msta, sta+int(staregen*0.5)) if enemy_armor_type != None: if "Direct Hit" in buff: $ enemy_resistance_amount += 1 if enemy_resistance_amount >= 3: $ enemy_resistance_amount = enemy_initial_resistance $ buff.remove("Direct Hit") else: $ enemy_resistance_amount += enemy_resistance_regen $ renpy.jump(encounter.replace(" ", "") + "turn") "{color=00A2FF}Techniques{/color}" if len(techniques) > 0: $ at = 1 show screen use_technique() cen "[enemy_text]" hide screen use_technique "{color=D07700}Consumables" if backpack == True: $ at = 0 show screen consum_screen() cen "[encounter]: {color=FF0000}HP: [enemyhp]{/color} | {b}Attack: [edamage]{/b}{vspace=20}{b}[name]{/b}: {color=FF0000}HP: [hp] / [mhp]{/color} | {color=C500FF} Lust: [lust] / [mlust]{/color} | {color=45FF00} Stamina: [sta] / [msta]" hide screen consum_screen if potted == True: $ potted = False $ renpy.jump(encounter.replace(" ", "") + "turn") else: $ renpy.jump("player_turn") "{color=B0B0B0}Escape{/color}" if tower_challenge == False: $ at = 0 if "Sluggish" in btraits: cen "[name] is too slow to run..." $ renpy.jump(encounter.replace(" ", "") + "turn") if "Restrained" in debuff: cen "[name] is Restrained !" $ renpy.jump(encounter.replace(" ", "") + "turn") if "Dominated" in debuff: cen "[name] is being Dominated !" $ renpy.jump(encounter.replace(" ", "") + "turn") if "Charmed" in debuff: cen "[name] is charmed by [encounter]" $ renpy.jump(encounter.replace(" ", "") + "turn") if "Horny" in debuff: cen "[name] is too horny to leave" $ renpy.jump(encounter.replace(" ", "") + "turn") $ number = renpy.random.randint(0,100) $ escape += (att[1]+bonusatt[1]) $ number += escape if number >= 100: play sound "audio/escape.ogg" cen "{color=00FF00}{b}Escaped!{/b}{/color}" python: for tech in list(technique_buff): remove_technique(tech) $ skip_time() if "Whirlwind" in buff: $ buff.remove("Whirlwind") $ bweapon = 0 if "Intoxicated" in debuff: $ debuff.remove("Intoxicated") if "Masturbate" in debuff: $ debuff.remove("Masturbate") if "Facialized" in debuff: $ n = renpy.random.randint(1, 100) if n <= 5: $ lattack("Shemale", dealdamage = False) jump base else: cen "{b}{color=FF0000}Failed!{/color}{/b}" $ renpy.jump(encounter.replace(" ", "") + "turn") label attack: $ tsta = sta if "Bimbo Thoughts" or "Bimbo Brain" in btraits: $ n = renpy.random.randint(1, 20) if n == 1 and "Bimbo Thoughts" in btraits: $ lostatt("INT") if n >= 2 and n <= 3 and "Bimbo Brain" in btraits: $ lostatt("INT") if "Clumsy" in btraits: $ n = renpy.random.randint(1,20) if n == 1: play sound "audio/miss.ogg" if "Tired" not in debuff: $ decrease_stamina(at*10) else: $ decrease_stamina(at*15) cen "[name] missed..." $ renpy.jump(encounter.replace(" ", "") + "turn") if (weapon == None) and ("Iron Fist" in gtraits): $ bweapon = 5 if at == 1 and sta >= 10 or at == 2 and sta >= 20: $ damage = ((attack*(sta*0.02))+bweapon)*bonus_damage if at == 1: if "Tired" not in debuff: $ decrease_stamina(10) else: $ decrease_stamina(15) play sound "audio/punch.ogg" else: if "Tired" not in debuff: $ decrease_stamina(20) else: $ decrease_stamina(30) if "Mighty" not in gtraits: $ damage = damage*1.5 else: $ damage = damage*1.8 play sound "audio/spunch.ogg" if weapon == "Icepick": $ n = renpy.random.randint(1, 10) if n <= 2: play sound "audio/crit.ogg" $ damage = (damage*1.5) elif (weapon == "Heavy Sword") and ((att[0] + bonusatt[0]) >= 30): $ damage += 8 elif (weapon == "Stonebreaker"): $ damage += int((att[0] + bonusatt[0])*0.5) elif (weapon == "Morning Star"): if at == 2: if "Tired" not in debuff: $ sta += 20 else: $ sta += 30 $ damage = (damage*(sta*0.03)) $ sta = 0 elif (weapon == "Thirsty Wyvern") and at == 1 and hp >= 4: $ damage += int(hp*0.25) $ hp -= int(hp*0.25) elif (weapon == "Twin Blades"): $ n = renpy.random.randint(1, 100) if (n <= (att[3] + bonusatt[3])): play sound "audio/crit.ogg" $ damage = (damage*1.5) elif (weapon == "Masamune"): $ n = renpy.random.randint(1, 100) if (n <= (att[1] + bonusatt[1])): play sound "audio/crit.ogg" $ damage = (damage*5.0) elif (weapon == "Growing Fury"): $ damage *= growing_fury_bonus $ growing_fury_bonus += 0.25 $ damage = int(damage) $ cen (name+" dealt {color=FF0000}{b}"+str(deal_damage(damage))+"{/b}{/color} damage") else: cen "[name] is too tired to attack" $ renpy.jump(encounter.replace(" ", "") + "2") if (weapon == "Windy Knuckles"): if at == 1: $ n = renpy.random.randint(0, 100) if n <= int((att[1]+bonusatt[1])*0.7): if "Tired" not in debuff: $ sta += 5 else: $ sta += 7 if "Whirlwind" not in buff: $ apply_buff("Whirlwind") else: $ buff.remove("Whirlwind") $ apply_buff("Whirlwind") $ bweapon += 2 if enemyhp > 0: $ renpy.jump(encounter.replace(" ", "") + "2") elif "Whirlwind" in buff: $ buff.remove("Whirlwind") $ bweapon = 0 elif "Whirlwind" in buff: $ buff.remove("Whirlwind") $ bweapon = 0 elif (weapon == "Twin Blades") and at == 2 and sta >= 10: $ n = renpy.random.randint(1, 100) if n <= (att[1] + bonusatt[1]): $ at = 1 play sound "audio/miss.ogg" pause 0.2 jump attack if weapon == "Masamune": $ n = renpy.random.randint(1, 100) if n <= (att[3] + bonusatt[3]): $ sta = tsta play sound "audio/acc_proc.ogg" if acess == "Quick Bracelet": $ n = renpy.random.randint(1, 100) if n <= ((equipments[acess][4]) + round(0.1*(equipments[acess][5])**2 + 0.6965*(equipments[acess][5]) + 0.0458)): $ sta = tsta play sound "audio/acc_proc.ogg" $ renpy.jump(encounter.replace(" ", "") + "turn") label job_player_turn: menu: cen "{b}Client{/b}: {color=C500FF}Lust: [enemylust] / [enemyhp]{/color}{vspace=10}{b}[name]{/b}: {color=C500FF} Lust: [lust] / [mlust]{/color}{vspace=5}{color=FFFF00}Tips: {b}[y]{/color}{/b}" "{color=45FF00}{b}Resist{/b}{/color}": $ at = 1 "{color=C500FF}{b}Seduce{/b}{/color}": $ at = 2 "Get Up": $ n = renpy.random.randint(0, 100) if n + enemylust + (att[2]+bonusatt[2]) > 100: $ at = 1 play sound "audio/epunch.ogg" "Client" "Stay there !" else: scene black play sound "audio/escape.ogg" cen "[name] left !" jump tavern play sound "audio/cointip.ogg" $ n = renpy.random.randint(1, 2) if at == 1: $ x = int((((((att[2]+bonusatt[2])*1.5)+(enemylust*0.1))*0.1)+n)*0.6) if x <= 0: $ x = 1 cen "[name] doesn't move{vspace=10}{color=FFFF00}[x]{/color} added to the tip jar" elif at == 2: $ x = int((((((att[2]+bonusatt[2])*4.5)+(enemylust*0.1))*0.1)+n)*1.4) if x <= 0: $ x = 1 cen "[name] strikes a pose{vspace=10}{color=FFFF00}[x]{/color} added to the tip jar" $ y += x jump tavern_job label use_technique(tech): $ final_techniques_used += 1 if current_quest == "Technique Showdown": $ quest_progress() if tech in technique_buff: $ remove_technique(tech) if techniques_dic[tech][3] == "Offensive": hide screen use_technique play sound ("audio/punch.ogg") if tech == "Endure": $ apply_tech_buff("Endure", get_technique_description(tech,techniques[tech][1]), ((round(techniques[tech][1]*0.05))+1), 0) elif tech == "Plan Ahead": $ apply_tech_buff("Plan Ahead", get_technique_description(tech,techniques[tech][1]), "??", (round(techniques[tech][1]*2))) elif tech == "Iron Skin": $ apply_tech_buff("Iron Skin", get_technique_description(tech,techniques[tech][1]), ((round(techniques[tech][1]*0.03))+2), (round(techniques[tech][1]))) elif tech == "Doomsday": $ apply_tech_buff("Doomsday", get_technique_description(tech,techniques[tech][1]), (round(30-(techniques[tech][1]*0.3))), 0) elif tech == "Tension Relax": $ apply_tech_buff("Tension Relax", get_technique_description(tech,techniques[tech][1]), ((round(techniques[tech][1]*0.1))+1), (round(techniques[tech][1]*0.5))) $ staregen += round(techniques[tech][1]*0.5) elif tech == "Target Boss": $ apply_tech_buff("Target Boss", get_technique_description(tech,techniques[tech][1]), ((round(techniques[tech][1]*0.05))+1), (round(techniques[tech][1]))) if "Boss" in encounter_type: $ bonus_damage += round((techniques[tech][1]))/100 elif tech == "Desensitize": $ apply_tech_buff("Desensitize", get_technique_description(tech,techniques[tech][1]), ((round(techniques[tech][1]*0.05))+1), (round(techniques[tech][1]))) elif tech == "Deep Breath": if "Charmed" in debuff: $ debuff_charmed = max(0, debuff_charmed-((int(techniques[tech][1]*0.1))+1)) if debuff_charmed <= 0: $ remove_debuff("Charmed") if "Horny" in debuff: $ debuff_horny = max(0, debuff_horny-((int(techniques[tech][1]*0.1))+1)) if debuff_horny <= 0: $ remove_debuff("Horny") elif tech == "Melt": $ apply_tech_buff("Melt", get_technique_description(tech,techniques[tech][1]), ((round(techniques[tech][1]*0.05))+1), (round(techniques[tech][1]*0.01))) elif tech == "Ruined": $ apply_tech_buff("Ruined", get_technique_description(tech,techniques[tech][1]), "??", 0) elif tech == "Recovery Punch": $ cen(name+" dealt {color=FF0000}{b}"+str(deal_damage(round(attack*((techniques[tech][1])*0.05))))+"{/b}{/color} damage") $ sta = min(msta, sta+(round(techniques[tech][1]))) elif tech == "Flail": $ n = renpy.random.randint(int(attack), (round(attack*(((techniques[tech][1])*0.15))))) $ cen(name+" dealt {color=FF0000}{b}"+str(deal_damage(n))+"{/b}{/color} damage") elif tech == "Exploit Weakness": $ n = round((attack*((techniques[tech][1])*0.05))*(temp_defeated_enemy[encounter]+1)) $ cen(name+" dealt {color=FF0000}{b}"+str(deal_damage(n))+"{/b}{/color} damage") elif tech == "Retaliate": $ n = round((attack*((techniques[tech][1])*0.03))*(len(debuff)+1)) $ cen(name+" dealt {color=FF0000}{b}"+str(deal_damage(n))+"{/b}{/color} damage") elif tech == "Open Wounds": $ n = round((attack*((techniques[tech][1])*0.1))*((globals()[encounter.lower().replace(" ", "")][1]-enemyhp)/enemyhp)) $ cen(name+" dealt {color=FF0000}{b}"+str(deal_damage(n))+"{/b}{/color} damage") elif tech == "Execute": $ n = renpy.random.randint(0, 100) if (((techniques[tech][1])*0.4) >= n) and arena_mode == False: $ renpy.play("audio/crit.ogg") $ cen(name+" dealt {color=FF0000}{b}"+str(deal_damage(9999))+"{/b}{/color} damage") else: $ n = round(attack*((techniques[tech][1])*0.1)) $ cen(name+" dealt {color=FF0000}{b}"+str(deal_damage(n))+"{/b}{/color} damage") elif tech == "Body Slam": $ n = round(attack+(((att[2]+bonusatt[2])*2.5)*(techniques[tech][1]*0.01))) $ cen(name+" dealt {color=FF0000}{b}"+str(deal_damage(n))+"{/b}{/color} damage") elif tech == "Push Over": if arena_mode == False: $ n = round(((techniques[tech][1]*0.5)*0.01)*enemyhp) $ cen(name+" dealt {color=FF0000}{b}"+str(deal_damage(n))+"{/b}{/color} damage") elif tech == "Penetrate Armor": $ n = round(attack*((techniques[tech][1])*0.1)) $ cen(name+" dealt {color=FF0000}{b}"+str(deal_damage(n, ignore_armor=True))+"{/b}{/color} damage") elif tech == "Foul Punch": $ n = round(attack+(corruption*(techniques[tech][1]*0.1))) $ cen(name+" dealt {color=FF0000}{b}"+str(deal_damage(n))+"{/b}{/color} damage") elif tech == "Throw Coins": $ n = round((gold*0.1)*(techniques[tech][1]*0.15)) $ gold = int(max(0, gold-gold*0.1)) $ cen(name+" dealt {color=FF0000}{b}"+str(deal_damage(n))+"{/b}{/color} damage") elif tech == "Reckless Hit": $ n = round(attack*(techniques[tech][1]*0.5)) $ lostatt() $ cen(name+" dealt {color=FF0000}{b}"+str(deal_damage(n))+"{/b}{/color} damage") elif tech == "Last Resort": $ n = round(attack*(techniques[tech][1]*0.6)) $ cen(name+" dealt {color=FF0000}{b}"+str(deal_damage(n))+"{/b}{/color} damage") $ hp = 1 $ lust = int(mlust*0.99) $ sta = 0 $ ap = 0 elif tech == "Flick": $ n = round(attack*(techniques[tech][1]*0.03)) $ cen(name+" dealt {color=FF0000}{b}"+str(deal_damage(n))+"{/b}{/color} damage") elif tech == "Slap": $ n = round(20 + (techniques[tech][1])) $ cen(name+" dealt {color=FF0000}{b}"+str(deal_damage(n))+"{/b}{/color} damage") elif tech == "Sweet Talk": hide screen use_technique $ extra = 1 jump Violet2 if techniques_dic[tech][3] == "Support": $ renpy.jump("player_turn") if techniques_dic[tech][3] == "Offensive": $ renpy.jump(encounter.replace(" ", "") + "turn") label use_consum(consum_type, origin="Backpack", amount=1): hide screen consum_screen $ final_consum_used += 1 if consum_type == "Red Potion": scene black show redpotion at truecenter play sound "audio/success.ogg" if (origin == "Backpack"): $ consumables["Red Potion"] -= 1 if ("Alchemist" not in gtraits) and (origin != "Shop"): if persistent.LShemale == True: $ number = renpy.random.randint(1,6) else: $ number = renpy.random.randint(1,5) if number == 1: $ lattack("Vaginal", amount=5, dealdamage = False) elif number == 2: $ lattack("Titjob", amount=5, dealdamage = False) elif number == 3: $ lattack("Blowjob", amount=5, dealdamage = False) elif number == 4: $ lattack("Foreplay", amount=5, dealdamage = False) elif number == 5: $ lattack("Anal", amount=5, dealdamage = False) else: $ lattack("Shemale", amount=5, dealdamage = False) $ cen("{color=FF0000}VIT{/color} increased by {color=FF0000}"+str(2*amount)+"{/color} !") $ bonusatt[2] += 2*amount $ calc_sub_att() elif consum_type == "Purple Potion": scene black show purplepotion at truecenter play sound "audio/success.ogg" if (origin == "Backpack"): $ consumables["Purple Potion"] -= 1 if ("Alchemist" not in gtraits) and (origin != "Shop"): if persistent.LShemale == True: $ number = renpy.random.randint(1,6) else: $ number = renpy.random.randint(1,5) if number == 1: $ lattack("Vaginal", amount=5, dealdamage = False) elif number == 2: $ lattack("Titjob", amount=5, dealdamage = False) elif number == 3: $ lattack("Blowjob", amount=5, dealdamage = False) elif number == 4: $ lattack("Foreplay", amount=5, dealdamage = False) elif number == 5: $ lattack("Anal", amount=5, dealdamage = False) else: $ lattack("Shemale", amount=5, dealdamage = False) $ cen("{color=C500FF}INT{/color} increased by {color=C500FF}"+str(2*amount)+"{/color} !") $ bonusatt[3] += 2*amount $ calc_sub_att() elif consum_type == "Blue Potion": scene black show bluepotion at truecenter if (origin == "Backpack"): $ consumables["Blue Potion"] -= 1 play sound "audio/success.ogg" $ (addictions["Vaginal"]) -= 3 if (addictions["Vaginal"]) < 0: $ (addictions["Vaginal"]) = 0 $ (addictions["Titjob"]) -= 3 if (addictions["Titjob"]) < 0: $ (addictions["Titjob"]) = 0 $ (addictions["Blowjob"]) -= 3 if (addictions["Blowjob"]) < 0: $ (addictions["Blowjob"]) = 0 $ (addictions["Foreplay"]) -= 3 if (addictions["Foreplay"]) < 0: $ (addictions["Foreplay"]) = 0 $ (addictions["Anal"]) -= 3 if (addictions["Anal"]) < 0: $ (addictions["Anal"]) = 0 $ (addictions["Shemale"]) -= 3 if (addictions["Shemale"]) < 0: $ (addictions["Shemale"]) = 0 cen "All {color=FF00FF}Addictions{/color} decreased !" elif consum_type == "Orange Potion": scene black show orangepotion at truecenter $ consumables["Orange Potion"] -= 1 play sound "audio/success.ogg" $ hp = mhp cen "{color=FF0000}{b}HP{/color} fully restored !{/b}" elif consum_type == "Pink Potion": scene black show pinkpotion at truecenter if "Lexi's Cum Cow" in btraits and (lust >= mlust*0.8): cen "Lexi is the only one who can decrease your lust now" return $ consumables["Pink Potion"] -= 1 play sound "audio/success.ogg" $ lust = 0 cen "{color=C500FF}{b}Lust{/color} fully decreased !{/b}" elif consum_type == "Green Potion": scene black show greenpotion at truecenter $ consumables["Green Potion"] -= 1 play sound "audio/success.ogg" $ sta = msta cen "{color=00D000}{b}Stamina{/color} fully restored !{/b}" elif consum_type == "Clothes": if "Naked" not in debuff: cen "You're already clothed..." else: scene black show clothes at truecenter $ consumables["Clothes"] -= 1 $ debuff.remove("Naked") play sound "audio/success.ogg" cen "You're now fully {b}Clothed{/b}!" elif consum_type == "Syringe": scene black show syringe at truecenter $ consumables["Syringe"] -= 1 play sound "audio/success.ogg" python: n = renpy.random.randint(3, 5) for i in range(0, len(bonusatt)): bonusatt[i] += n $ calc_sub_att() cen "{color=00A2FF}All attributes increased by {b}[n]{/b} !" play sound "audio/success.ogg" $ hp = mhp cen "{color=FF0000}{b}HP{/color} fully restored !{/b}" if "Lexi's Cum Cow" in btraits and (lust >= mlust*0.8): cen "Lexi is the only one who can decrease your lust now" else: play sound "audio/success.ogg" $ lust = 0 cen "{color=C500FF}{b}Lust{/color} fully decreased !{/b}" $ sta = msta play sound "audio/success.ogg" cen "{color=00D000}{b}Stamina{/color} fully restored !{/b}" $ n = renpy.random.randint(1, 10) $ number = renpy.random.randint(5, 10) if n == 1: play sound "audio/gainadd.ogg" $ (addictions["Vaginal"]) += number cen "{color=C500FF}Vaginal{/color} Addiction increased by {color=C500FF}[number]{/color} !" elif n == 2: play sound "audio/gainadd.ogg" $ (addictions["Titjob"]) += number cen "{color=C500FF}Titjob{/color} Addiction increased by {color=C500FF}[number]{/color} !" elif n == 3: play sound "audio/gainadd.ogg" $ (addictions["Blowjob"]) += number cen "{color=C500FF}Blowjob{/color} Addiction increased by {color=C500FF}[number]{/color} !" elif n == 4: play sound "audio/gainadd.ogg" $ (addictions["Foreplay"]) += number cen "{color=C500FF}Foreplay{/color} Addiction increased by {color=C500FF}[number]{/color} !" elif n == 5: play sound "audio/gainadd.ogg" $ (addictions["Anal"]) += number cen "{color=C500FF}Anal{/color} Addiction increased by {color=C500FF}[number]{/color} !" if current_quest == "Quality Check": $ quest_progress(amount) return label before_main_menu: if persistent.gversion != float(config.version) and persistent.run != 0: if persistent.LShemale == False: $ Achievement.add(achievement_lucynangelbe) $ Achievement.add(achievement_cindybe) $ Achievement.add(achievement_celestebe) $ Achievement.add(achievement_autumnbe) $ Achievement.add(achievement_brittneybe) $ delete_slot(0, True) $ persistent.arena_hp = 999999 $ persistent.arena_defeated = False $ persistent.arena_enemy = arena_month_enemy call screen new_version $ persistent.gversion = float(config.version) return label start: $ _game_menu_screen = None if persistent.run == 0: call screen difficulty_opt call screen shemale_opt if persistent.LShemale == False and persistent.Difficulty != 0: $ Achievement.add(achievement_cindybe) $ Achievement.add(achievement_lucynangelbe) $ Achievement.add(achievement_celestebe) $ Achievement.add(achievement_autumnbe) $ Achievement.add(achievement_brittneybe) $ name = renpy.input("What is your Hero name?", length=18) $ name = name.strip() if name == "lauragurlbestgurl": if persistent.usedcheat == False: $ persistent.usedcheat = True show diogaoo happy2 with dissolve: xalign .5 yalign .68 d "Hey, that's a really cool name" if persistent.Difficulty == 0: show diogaoo confused d "I mean, it's really impractical..." show diogaoo happy d "But I like it" show diogaoo wink d "Here, why don't you have this" play sound "audio/lsuccess.ogg" $ persistent.fame += 250 cen "{color=A9E0FF}Gained 250 Fame !" show diogaoo happy2 d "Now, how about you choose a more reasonable name?" $ name = renpy.input("What is your Hero name?", length=18) $ name = name.strip() if name == "lauragurlbestgurl": show diogaoo confused d "Huh, why do you keep typing this?" show diogaoo happy2 d "You know what?" show diogaoo wink d "Here" play sound "audio/lsuccess.ogg" $ persistent.fame += 500 cen "{color=A9E0FF}Gained 500 Fame !" show diogaoo happy d "Now, time to pick a real name" $ name = renpy.input("What is your Hero name?", length=18) $ name = name.strip() if name == "lauragurlbestgurl": show diogaoo sad d "Hey, cut it out" show diogaoo serious d "It's not funny anymore" show diogaoo confused d "Just pick anything else" $ name = renpy.input("What is your Hero name?", length=18) $ name = name.strip() if name == "lauragurlbestgurl": show diogaoo happy2 d "You, know what? Fine" hide diogaoo with dissolve d "Have fun !" $ name = "A really stubborn person" pause 1 else: show diogaoo confused d "But it's kinda pointless in this difficulty" show diogaoo wink d "Why don't you choose a better one?" $ name = renpy.input("What is your Hero name?", length=18) $ name = name.strip() if name == "lauragurlbestgurl": show diogaoo sad d "That's not funny" show diogaoo serious d "Just pick anything else" $ name = renpy.input("What is your Hero name?", length=18) $ name = name.strip() if name == "lauragurlbestgurl": show diogaoo happy2 d "You, know what? Fine" hide diogaoo with dissolve d "Have fun !" $ name = "A really stubborn person" pause 1 else: show diogaoo serious with dissolve: xalign .5 yalign .68 d "Hey, we've been through that already" show diogaoo wink d "Why don't you pick a better name?" $ name = renpy.input("What is your Hero name?", length=18) $ name = name.strip() if name == "lauragurlbestgurl": show diogaoo serious d "Really?" show diogaoo happy2 d "Well, suit yourself" hide diogaoo with dissolve $ name = "A really stubborn person" pause 1 if not name: $ name = "Hero" if name == "Hero" or name.casefold() == "tutorial": if name == "Hero": show diogaoo confused with dissolve: xalign 0.5 yalign 0.68 d "Really? You don't want to pick a name?" show diogaoo happy2 d "Well, I'll just call you {color=#00A2FF}Hero{/color} then, I hope that's okay" else: $ persistent.tutorial = 1 show diogaoo happy2 with dissolve: xalign .5 yalign .68 d "I will walk you through the tutorial again" show diogaoo wink d "I do think that [name] is a great name, so I'll just call you that" hide diogaoo with dissolve jump skilltree show diogaoo happy with dissolve: xalign 0.5 yalign 0.68 if persistent.run == 0: d "Hey there ! Welcome to {color=#00A2FF}Hero Corruption 2" d "This version is a sequel of the game {color=#00A2FF}Hero Corruption{/color}, available for free on the {color=#FF325B}Milovana{/color} website" show diogaoo serious d "{color=#f00}Before we start, please keep in mind that this is a work of fiction, be kind and treat other people with respect. Do not try to reproduce any content that could harm you or anyone else, whether physically or psychologically.{/color}" show diogaoo happy d "If you like the game, consider supporting it on {color=#FF325B}Patreon{/color}. In addition to securing the future of {color=#00A2FF}Hero Corruption{/color}, you will have access to the latest version" show diogaoo happy2 if persistent.tutorial == 0: menu: d "I've noticed you haven't completed the tutorial yet, would you mind if I helped you out?" "{color=00FF00}Yes, please{/color}": show diogaoo happy d "Great, Let me take you to the next screen" $ persistent.tutorial = 1 "{color=FF0000}No, thank you{/color}": show diogaoo serious d "Are you sure? There is an achievement that can only be unlocked if you complete the tutorial" show diogaoo happy2 menu: d "And who knows, maybe you can learn something new" "{color=00FF00}Start Tutorial{/color}": show diogaoo happy d "Great, Let me take you to the next screen" $ persistent.tutorial = 1 "{color=FF0000}I'm good, actually{/color}": $ persistent.tutorial = 10 show diogaoo confused d "Got that! But if you wanna try the tutorial next time, just type {color=FFFFFF}{b}tutorial{/b}{/color} as your hero name" show diogaoo wink d "Have fun playing {color=#00A2FF}Hero Corruption 2{/color}" if persistent.run == 1: d "Hi again !" d "How was your first run?" show diogaoo happy2 d "By now you should already know that you can upgrade your Hero and check your Status by pressing ESC" show diogaoo happy d "I'm sure you'll do better now." elif persistent.run == 2: d "Hey, it's me again, just a heads up" show diogaoo confused d "HC2 animations have been optimized so you have a good experience while the game remains dynamic" show diogaoo sad d "If the 'Skip Animations' option is enabled, it is highly recommended that you disable it" show diogaoo wink d "Have fun" elif persistent.run == 3: show diogaoo happy d "Hey [name]" show diogaoo wink d "Did you realized that your Stamina is directly tied to the Hero's damage?" show diogaoo happy2 d "Knowing how to manage Stamina between and during encounters is the key to a successful run." elif persistent.run == 4: d "Are you having fun?" show diogaoo happy2 d "Remember to take a break once in a while" elif persistent.run == 5: d "Heey, you've been playing for a while now" show diogaoo wink d "Let me know if you have any questions okay?" elif persistent.run == 8: show diogaoo confused d "Hey, I don't know if you noticed, but" show diogaoo sad d "Potions are really important" show diogaoo happy2 d "Luckly, You can consistently find them after defeating two enemies in the same day" show diogaoo wink d "So don't be afraid to explore again, even if you're not ready for another encounter" elif persistent.run == 12: show diogaoo confused d "Hey, don't forget to refine your accessories too" show diogaoo sad d "Most accessories have very low initial numbers" show diogaoo happy2 d "But they increase exponentially every 5 refinement levels" show diogaoo wink d "Save iron and jewel so you can refine accessories in the future, only sell them if you really need the gold" elif persistent.run == 15: show diogaoo confused d "Having a bad luck with recipes?" show diogaoo sad d "I feel you..." show diogaoo wink d "Stop by the Recipe Store, if you're unlucky like me it will quickly become your favorite place" elif persistent.run == 20: d "You really are getting better" show diogaoo happy2 d "If you have some free time, I'd be happy to read a message with your ideas and suggestions." show diogaoo wink d "Good luck now, [name]" elif persistent.run == 25: d "Still playing, huh?" show diogaoo happy2 d "Well, I'm glad you're liking it that much" elif persistent.run == 30: d "Hey, sorry, It's me again, just a heads up this time" show diogaoo serious d "You should drink some water" show diogaoo happy2 d "That's it ! Good luck !" if name == "Diogaoo" or name == "diogaoo": show diogaoo wink d "By the way, I really liked your name !" hide diogaoo with dissolve jump skilltree label skilltree: scene black if "p0" not in persistent.perks: call screen skilltree_locked if persistent.tutorial == 1: show skilltreetutorial show diogaoo happy at left with dissolve d "This is your {color=A85CFF}Skill Tree{/color}." show arrow: xpos 1220 ypos 655 show diogaoo happy d "These pinkish dots you see everywhere are {color=A85CFF}Perks{/color}, each one of them makes your {color=00A2FF}Hero{/color} stronger." show arrow: xpos 1050 ypos 770 show diogaoo wink d "The blue dots are {color=A85CFF}Perks{/color} that you already acquired." hide arrow show arrow2: xpos 1380 ypos 720 show circle1: xpos 940 ypos 670 zoom 0.5 show skilltreetutorialp: xpos 1580 ypos 680 show diogaoo happy d "You can hover over any {color=A85CFF}Perk{/color} and see their description." show arrow2: xpos 1450 ypos 780 zoom 0.6 show diogaoo confused d "As you can see on the {color=A85CFF}Perk{/color} description, each {color=A85CFF}Perk{/color} is tied to a {color=606060}Fame{/color} cost." hide arrow2 hide skilltreetutorialp hide circle1 show circle2: xpos 1610 ypos 810 show diogaoo happy d "That's your current {color=606060}Fame{/color}, you gain {color=606060}Fame{/color} during runs, mostly defeating enemies.\n{color=606060}Fame{/color} is cumulative and saved across multiple runs." hide circle2 show diogaoo wink d "In addition to the {color=606060}Fame{/color} cost, {color=A85CFF}Perks{/color} found in the branches also need to be unlocked in a linear fashion. You cannot skip directly to the top of the tree without unlocking the previous {color=A85CFF}Perks{/color}." show arrow: xpos 1300 ypos 850 show diogaoo confused d "This is an exception for {color=A85CFF}Perks{/color} that are at the roots of the {color=A85CFF}Skill Tree{/color}, these can be unlocked at any time, as long as you have the necessary amount of {color=606060}Fame{/color}." hide arrow show diogaoo sad d "However, acquiring these {color=A85CFF}Perks{/color} also increases the cost of other {color=A85CFF}Perks{/color} at the roots." show arrow: xpos 1200 ypos 60 show diogaoo wink d "Finally, you may have noticed these yellow {color=A85CFF}Perks{/color} at the top of the tree" show diogaoo confused d "These are {color=FFFF00}Golden Perks{/color}, they can be acquired multiple times.\nEach time their cost increases, along with the bonus they provide." hide arrow show diogaoo happy2 d "Which means that you can upgrade your {color=00A2FF}Hero{/color} indefinitely." show diogaoo wink d "Okay, that's it for the {color=A85CFF}Skill Tree{/color}.\nI'll let you play around." show arrow3: xpos 1660 ypos 700 show diogaoo happy d "When you've seen enough, click on that button and we'll talk about {color=8F76BA}Personality Traits{/color}." hide arrow3 hide diogaoo scene black show skilltree at center call screen skilltree show skilltree at center with st_transition call screen skilltree label traits: scene black if persistent.tutorial == 1: show traitstutorial show diogaoo happy at left with dissolve d "Let's talk about {color=8F76BA}Personality Traits{/color}" show diogaoo confused show circle1: xpos 1100 ypos 40 zoom .5 d "These are your {color=8F76BA}Personality Points{/color}, you cannot start a run while this number is negative" show diogaoo happy show circle1: xpos 670 ypos 200 zoom .4 d "Each available {color=CC00FF}Negative Trait{/color} increases your {color=8F76BA}Personality Points{/color} by a specific amount, while {color=0066FF}Positive Traits{/color} decreases it" hide circle1 d "You can have as many traits as you like, {b}{color=FFFFFF}as long as the final sum is positive{/b}" scene black show traitstutorial2 show diogaoo confused at left show circle2: xpos 1180 ypos 585 zoom .9 show arrow3: xpos 1550 ypos 420 d "Please note that {b}for each {color=0066FF}Positive Trait{/color} selected, the cost of the remaining ones increases{/b}" hide arrow3 hide circle2 show diogaoo happy d "Once chosen, these {color=8F76BA}Traits{/color} will be part of your {color=#00A2FF}Hero{/color}'s personality until the end of the run" show diogaoo sad d "Although they cannot be removed, your {color=#00A2FF}Hero{/color} can develop new {color=8F76BA}Traits{/color} along his journey, so be careful what you expose him to" show diogaoo happy d "Most {color=8F76BA}Traits{/color} acquired in a run will be added to this starting pool, meaning you will be able to create {color=#00A2FF}Heroes{/color} with these new, unlockable {color=8F76BA}Traits{/color}" show diogaoo wink show arrow3: xpos 1220 ypos 640 zoom 1.4 show diogaoo happy2 d "If this is overwhelming, or you're feeling lucky, just can click on the {b}{color=#FFFFFF}Random{/b}{/color} button and I'll do my best to pick the remaining {color=8F76BA}Traits{/color} for you" hide circle2 hide diogaoo scene black if persistent.LShemale == True and "Shemale Lover" not in persistent.btraits_pool: $ persistent.btraits_pool.append("Shemale Lover") call screen Traits_screen label att: scene black if persistent.tutorial == 1: show atttutorial show diogaoo happy at left with dissolve d "This is your {b}{color=#FFFFFF}Attribute screen{/color}{/b}" d "Here you will improve your {color=#00A2FF}Hero{/color}'s {b}{color=#FFFFFF}Attributes{/color}{/b} between and during {b}Runs{/b}" show circle2: xpos 50 ypos 50 d "Right on the top you can see the amount of {b}{color=AE60AE}Points{/color}{/b} available at the moment" hide circle2 show arrow3: xpos 220 ypos 120 d "{b}{color=#FFFFFF}Points{/color}{/b} are used to directly improve your {b}Primary Attributes{/b}" show arrow3: xpos 1250 ypos 120 d "As these {b}{color=#FFFFFF}Primary Attributes{/color}{/b} increase, the {color=BEBEBE}Sub-Attributes{/color} also increase." hide arrow3 show circle1: xpos 320 ypos 240 d "Currently, your {color=#00A2FF}Hero{/color} has {b}1{/b} point in {b}Strength{/b}" show circle1: xpos 540 ypos 280 zoom 0.6 show atttutorialp1: xpos 800 ypos 145 show diogaoo happy2 d "You can increase any {b}{color=#FFFFFF}Primary Attribute{/color}{/b} by clicking on it's arrow" show arrow: xpos 1150 ypos 126 d "You can also get additional information by hovering the mouse over it." show diogaoo confused d "As you can see, every {b}{color=#FFFFFF}5 points{/color}{/b} in {b}STR{/b} increases the {color=#00A2FF}Hero{/color}'s Attack by {b}1{/b}" hide arrow d "The amount of {b}{color=#FFFFFF}Points{/color}{/b} needed in each {b}{color=#FFFFFF}Primary Attribute{/color}{/b} to increase it's {color=BEBEBE}Sub-Attribute{/color} may vary" hide atttutorialp1 show circle1: xpos 540 ypos 580 show atttutorialp2: xpos 800 ypos 145 d "For example, you only need {b}{color=#FFFFFF}1{/color}{/b} point in {b}{color=#FFFFFF}INT{/color}{/b} to increase your {color=C500FF}Maximum Lust{/color}" hide circle1 hide atttutorialp2 show diogaoo happy d "You can get more {b}{color=#FFFFFF}Points{/color}{/b} by upgrading your {color=#00A2FF}Skill Tree{/color} or leveling up your {color=#00A2FF}Hero{/color} by defeating enemies during a Run" show diogaoo serious d "This can be a lot to process, so if you prefer, you can improve your {color=#FFFFFF}Attributes{/color} in the {b}Base{/b} afterwards" show diogaoo happy d "I'll let you play around with it" show diogaoo happy2 d "Just click on {b}{color=#FFFFFF}Confirm{/color}{/b} when you're done" scene black show att at center call screen Att_screen label first_tech: scene black if persistent.tutorial == 1: show techstutorial at center show diogaoo happy2 at left with dissolve d "We're almost at the fun part, just need to talk about {color=64C6FE}Techniques{/color} first" show diogaoo wink d "You can learn a new {color=64C6FE}Technique{/color} every {b}5 Levels{b}" show diogaoo confused d "Using an {color=D52A2A}Offensive Technique{/colors} ends your turn, while {color=2AD52A}Support Techniques{/color} allows you to keep playing" show diogaoo happy show circle1: zoom 0.5 xpos 590 ypos 280 d "Each {color=64C6FE}Technique{/color} has a {b}Proficiency{/b} percentage that directly affects its efficiency and cost" show diogaoo serious show circle1: zoom 0.5 xpos 1320 ypos 190 d "A {color=64C6FE}Technique's{/color} {b}Proficiency{/b} is limited by its {b}Tier{/b}" hide circle1 show circle2: xpos 1270 ypos 240 d "The resource used to cast a {color=00A2FF}Technique{/color} is called {color=64C6FE}AP{/color}, we'll talk about that in a moment" hide circle2 show diogaoo wink show techstutorialp: xpos 500 ypos 100 show arrow: xpos 1300 ypos 80 show arrow2: xpos 300 ypos 240 d "You can hover over the description to see a more details and how {b}Proficiency{/b} affects it" show diogaoo confused d "I believe this is enough to get you started, if you want to know more about {color=00A2FF}Techniques{/color}, head to the {color=00E000}Training Camp{/color} at the {color=D06200}City{/color}" hide arrow hide arrow2 hide techstutorialp scene black $ choose_first_techniques() # Decompiled by unrpyc: https://github.com/CensoredUsername/unrpyc