Search in sources :

Example 6 with AbstractItemType

use of com.lilithsthrone.game.inventory.item.AbstractItemType in project liliths-throne-public by Innoxia.

the class EnchantingUtils method getSVGString.

public static String getSVGString(AbstractCoreItem ingredient, List<ItemEffect> effects) {
    if (ingredient.getEnchantmentItemType(effects) instanceof AbstractClothingType) {
        return ingredient.getSVGString();
    }
    if (((AbstractItem) ingredient).getItemType().getId().equals(ItemType.ORIENTATION_HYPNO_WATCH.getId())) {
        if (effects.isEmpty() || effects.get(0).getPrimaryModifier() == TFModifier.REMOVAL) {
            return SVGImages.SVG_IMAGE_PROVIDER.getHypnoWatchBase();
        }
        if (effects.get(0).getPrimaryModifier() == TFModifier.ORIENTATION_GYNEPHILIC) {
            return SVGImages.SVG_IMAGE_PROVIDER.getHypnoWatchGynephilic();
        } else if (effects.get(0).getPrimaryModifier() == TFModifier.ORIENTATION_AMBIPHILIC) {
            return SVGImages.SVG_IMAGE_PROVIDER.getHypnoWatchAmbiphilic();
        } else {
            return SVGImages.SVG_IMAGE_PROVIDER.getHypnoWatchAndrophilic();
        }
    }
    StringBuilder SVGImageSB = new StringBuilder();
    SVGImageSB.append("<div style='width:100%;height:100%;position:absolute;left:0;bottom:0;'>" + SVGImages.SVG_IMAGE_PROVIDER.getRefinedBackgroundMap().get(ingredient.getEnchantmentEffect().getColour()) + "</div>");
    String s = ((AbstractItemType) ingredient.getEnchantmentItemType(effects)).getSVGString();
    Colour colour = Colour.CLOTHING_BLUE_LIGHT;
    for (ItemEffect ie : effects) {
        if (ie.getPrimaryModifier() != null && ie.getPrimaryModifier() != TFModifier.NONE) {
            colour = ie.getPrimaryModifier().getColour();
            break;
        }
    }
    s = s.replaceAll("#ff2a2a", colour.getShades()[0]);
    s = s.replaceAll("#ff5555", colour.getShades()[1]);
    s = s.replaceAll("#ff8080", colour.getShades()[2]);
    s = s.replaceAll("#ffaaaa", colour.getShades()[3]);
    s = s.replaceAll("#ffd5d5", colour.getShades()[4]);
    SVGImageSB.append("<div style='width:100%;height:100%;position:absolute;left:0;bottom:0;'>" + s + "</div>");
    for (ItemEffect ie : effects) {
        if (ie.getSecondaryModifier() != null && ie.getSecondaryModifier() != TFModifier.NONE) {
            SVGImageSB.append("<div style='width:100%;height:100%;position:absolute;left:0;bottom:0;'>" + SVGImages.SVG_IMAGE_PROVIDER.getRefinedSwirlsMap().get(ie.getSecondaryModifier().getColour()) + "</div>");
            break;
        }
    }
    return SVGImageSB.toString();
}
Also used : AbstractItemType(com.lilithsthrone.game.inventory.item.AbstractItemType) AbstractClothingType(com.lilithsthrone.game.inventory.clothing.AbstractClothingType) ItemEffect(com.lilithsthrone.game.inventory.item.ItemEffect) AbstractItem(com.lilithsthrone.game.inventory.item.AbstractItem) Colour(com.lilithsthrone.utils.Colour)

Example 7 with AbstractItemType

use of com.lilithsthrone.game.inventory.item.AbstractItemType in project liliths-throne-public by Innoxia.

the class NPC method generateFetishPotion.

/**
 * Example return value: ["Let's see if you don't enjoy sucking my dick after this!", AbstractItem]
 * @return NPC's speech as a reaction to giving you this potion, along with the potion itself.
 */
public Value<String, AbstractItem> generateFetishPotion(Boolean pairedFetishesOnly) {
    // this will be the ultimately selected effect, or null if none available
    ItemEffect selectedEffect = null;
    // this will be a flavor text string paired with the effect
    String selectedEffectString;
    Map<ItemEffect, Integer> possibleEffects = new HashMap<>();
    AbstractItemType itemType = ItemType.FETISH_UNREFINED;
    Fetish currentTopFetish = null, currentBottomFetish = null;
    TFModifier currentTopModifier = null, currentBottomModifier = null;
    TFPotency currentTopPotency = null, currentBottomPotency = null, currentTopRemovePotency = null, currentBottomRemovePotency = null;
    ;
    int baseTopChance = 5, baseBottomChance = 5, baseTopRemoveChance = 0, baseBottomRemoveChance = 0;
    int currentTopChance = 0, currentBottomChance = 0, currentTopRemoveChance = 0, currentBottomRemoveChance = 0;
    int pairedFetishMultiplier = 5;
    // heavy tendency can still allow small chance giving a matched fetish, otherwise no chance at all
    int matchedFetishDecrement = 8;
    // only a modest increase in chances to matched fetish
    int matchedFetishRemoveIncrement = 1;
    // for now, keeping it simple, only modifying add chances based on desires, one increment (or decrement) per level
    int desiredFetishIncrement = 2;
    // for now, keeping it simple, only modifying add chances based on exp, one increment per level
    int expFetishIncrement = 1;
    switch(Main.getProperties().forcedFetishTendency) {
        case NEUTRAL:
            baseTopChance = 5;
            baseBottomChance = 5;
            baseTopRemoveChance = 2;
            baseBottomRemoveChance = 2;
            break;
        case BOTTOM:
            baseTopChance = 1;
            baseBottomChance = 8;
            baseTopRemoveChance = 3;
            baseBottomRemoveChance = 0;
            break;
        case BOTTOM_HEAVY:
            baseTopChance = -2;
            baseBottomChance = 10;
            baseTopRemoveChance = 4;
            baseBottomRemoveChance = -1;
            break;
        case TOP:
            baseTopChance = 8;
            baseBottomChance = 1;
            baseTopRemoveChance = 0;
            baseBottomRemoveChance = 3;
            break;
        case TOP_HEAVY:
            baseTopChance = 10;
            baseBottomChance = -2;
            baseTopRemoveChance = -1;
            baseBottomRemoveChance = 4;
            break;
    }
    // map of top -> bottom paired fetishes; NPCs with a paired fetish will greatly favor
    // giving the player it's pair, and remove that fetish if there is a match
    Map<Fetish, Fetish> pairedFetishMap = new HashMap<>();
    pairedFetishMap.put(Fetish.FETISH_ANAL_GIVING, Fetish.FETISH_ANAL_RECEIVING);
    pairedFetishMap.put(Fetish.FETISH_VAGINAL_GIVING, Fetish.FETISH_VAGINAL_RECEIVING);
    pairedFetishMap.put(Fetish.FETISH_BREASTS_OTHERS, Fetish.FETISH_BREASTS_SELF);
    pairedFetishMap.put(Fetish.FETISH_ORAL_RECEIVING, Fetish.FETISH_ORAL_GIVING);
    pairedFetishMap.put(Fetish.FETISH_LEG_LOVER, Fetish.FETISH_STRUTTER);
    pairedFetishMap.put(Fetish.FETISH_DOMINANT, Fetish.FETISH_SUBMISSIVE);
    pairedFetishMap.put(Fetish.FETISH_CUM_STUD, Fetish.FETISH_CUM_ADDICT);
    pairedFetishMap.put(Fetish.FETISH_DEFLOWERING, Fetish.FETISH_PURE_VIRGIN);
    pairedFetishMap.put(Fetish.FETISH_IMPREGNATION, Fetish.FETISH_PREGNANCY);
    pairedFetishMap.put(Fetish.FETISH_SEEDER, Fetish.FETISH_BROODMOTHER);
    pairedFetishMap.put(Fetish.FETISH_SADIST, Fetish.FETISH_MASOCHIST);
    pairedFetishMap.put(Fetish.FETISH_NON_CON_DOM, Fetish.FETISH_NON_CON_SUB);
    pairedFetishMap.put(Fetish.FETISH_DENIAL, Fetish.FETISH_DENIAL_SELF);
    pairedFetishMap.put(Fetish.FETISH_VOYEURIST, Fetish.FETISH_EXHIBITIONIST);
    // out of the list entirely, but for now let's have them in there
    if (!pairedFetishesOnly) {
        pairedFetishMap.put(Fetish.FETISH_TRANSFORMATION_GIVING, Fetish.FETISH_TRANSFORMATION_RECEIVING);
        pairedFetishMap.put(Fetish.FETISH_KINK_GIVING, Fetish.FETISH_KINK_RECEIVING);
    }
    for (Entry<Fetish, Fetish> entry : pairedFetishMap.entrySet()) {
        currentTopFetish = entry.getKey();
        currentBottomFetish = entry.getValue();
        currentTopModifier = TFModifier.valueOf("TF_MOD_" + currentTopFetish);
        currentBottomModifier = TFModifier.valueOf("TF_MOD_" + currentBottomFetish);
        currentTopPotency = TFPotency.MINOR_BOOST;
        currentBottomPotency = TFPotency.MINOR_BOOST;
        currentTopRemovePotency = TFPotency.MINOR_DRAIN;
        currentBottomRemovePotency = TFPotency.MINOR_DRAIN;
        currentTopChance = baseTopChance;
        currentBottomChance = baseBottomChance;
        currentTopRemoveChance = baseTopRemoveChance;
        currentBottomRemoveChance = baseBottomRemoveChance;
        // Increase base add chances based on NPC's desire levels for these fetishes
        switch(this.getFetishDesire(currentBottomFetish)) {
            case THREE_LIKE:
                currentTopChance += desiredFetishIncrement;
                break;
            case FOUR_LOVE:
                currentTopChance += desiredFetishIncrement * 2;
                break;
            case ONE_DISLIKE:
                currentTopChance -= desiredFetishIncrement;
                break;
            case ZERO_HATE:
                currentTopChance = 0;
                break;
            default:
        }
        switch(this.getFetishDesire(currentTopFetish)) {
            case THREE_LIKE:
                currentBottomChance += desiredFetishIncrement;
                break;
            case FOUR_LOVE:
                currentBottomChance += desiredFetishIncrement * 2;
                break;
            case ONE_DISLIKE:
                currentBottomChance -= desiredFetishIncrement;
                break;
            case ZERO_HATE:
                currentBottomChance = 0;
                break;
            default:
        }
        // Increase base add chances based on NPC's experience levels for these fetishes
        switch(this.getFetishLevel(currentBottomFetish)) {
            case ONE_AMATEUR:
                currentTopChance += expFetishIncrement;
                break;
            case TWO_EXPERIENCED:
                currentTopChance += expFetishIncrement * 2;
                break;
            case THREE_EXPERT:
                currentTopChance += expFetishIncrement * 3;
                break;
            case FOUR_MASTERFUL:
                currentTopChance += expFetishIncrement * 4;
                break;
            default:
        }
        switch(this.getFetishLevel(currentTopFetish)) {
            case ONE_AMATEUR:
                currentBottomChance += expFetishIncrement;
                break;
            case TWO_EXPERIENCED:
                currentBottomChance += expFetishIncrement * 2;
                break;
            case THREE_EXPERT:
                currentBottomChance += expFetishIncrement * 3;
                break;
            case FOUR_MASTERFUL:
                currentBottomChance += expFetishIncrement * 4;
                break;
            default:
        }
        // set chances if NPC has top fetish
        if (this.hasFetish(currentTopFetish)) {
            currentBottomChance *= pairedFetishMultiplier;
            currentTopChance -= matchedFetishDecrement;
            currentBottomRemoveChance = 0;
            if (!pairedFetishesOnly) {
                currentTopRemoveChance += matchedFetishRemoveIncrement;
            }
        } else if (pairedFetishesOnly) {
            currentBottomChance = 0;
            // in paired only mode, we're only adding fetishes
            currentTopRemoveChance = 0;
            currentBottomRemoveChance = 0;
        }
        // set chances if NPC has bottom fetish
        if (this.hasFetish(currentBottomFetish)) {
            currentTopChance *= pairedFetishMultiplier;
            currentBottomChance -= matchedFetishDecrement;
            currentTopRemoveChance = 0;
            if (!pairedFetishesOnly) {
                currentBottomRemoveChance += matchedFetishRemoveIncrement;
            }
        } else if (pairedFetishesOnly) {
            currentTopChance = 0;
            // in paired only mode, we're only adding fetishes
            currentTopRemoveChance = 0;
            currentBottomRemoveChance = 0;
        }
        // if player has positive bottom fetish desire, adjust potency level to fully add fetish, not just desire
        if (Main.game.getPlayer().getFetishDesire(currentBottomFetish) == FetishDesire.THREE_LIKE || Main.game.getPlayer().getFetishDesire(currentBottomFetish) == FetishDesire.FOUR_LOVE) {
            currentBottomPotency = TFPotency.BOOST;
        } else if (Main.game.getPlayer().getFetishDesire(currentBottomFetish) == FetishDesire.TWO_NEUTRAL) {
            int rand = Util.random.nextInt(100);
            // if the player is neutral, but the NPC has fetish,small chance to fully add rather than just boost desire
            if (this.hasFetish(currentTopFetish) && rand < 30) {
                currentBottomPotency = TFPotency.BOOST;
            }
        } else {
            // if they are already less than neutral, don't remove any more
            currentBottomRemoveChance = 0;
        }
        // prevent extraneous effects if player has bottom fetish, plus alter remove potency to drop fetish, not just desire
        if (Main.game.getPlayer().hasFetish(currentBottomFetish)) {
            currentBottomChance = 0;
            currentBottomRemovePotency = TFPotency.DRAIN;
        }
        // if player has positive top fetish desire, adjust potency level to fully add fetish, not just desire
        if (Main.game.getPlayer().getFetishDesire(currentTopFetish) == FetishDesire.THREE_LIKE || Main.game.getPlayer().getFetishDesire(currentTopFetish) == FetishDesire.FOUR_LOVE) {
            currentTopPotency = TFPotency.BOOST;
        } else if (Main.game.getPlayer().getFetishDesire(currentTopFetish) == FetishDesire.TWO_NEUTRAL) {
            int rand = Util.random.nextInt(100);
            // if the player is neutral, but the NPC has paired fetish,small chance to fully add rather than just boost desire
            if (this.hasFetish(currentBottomFetish) && rand < 30) {
                currentTopPotency = TFPotency.BOOST;
            }
        } else {
            // if they are already less than neutral, don't remove any more
            currentTopRemoveChance = 0;
        }
        // prevent extraneous effects if player has top fetish, plus alter remove potency to drop fetish, not just desire
        if (Main.game.getPlayer().hasFetish(currentTopFetish)) {
            currentTopChance = 0;
            currentTopRemovePotency = TFPotency.DRAIN;
        }
        // some settings and status combinations can create negative values, so let's zero those out
        if (currentTopChance < 0) {
            currentTopChance = 0;
        }
        if (currentBottomChance < 0) {
            currentBottomChance = 0;
        }
        if (currentTopRemoveChance < 0) {
            currentTopRemoveChance = 0;
        }
        if (currentBottomRemoveChance < 0) {
            currentBottomRemoveChance = 0;
        }
        if (currentTopChance > 0) {
            possibleEffects.put(new ItemEffect(itemType.getEnchantmentEffect(), TFModifier.NONE, currentTopModifier, currentTopPotency, 1), currentTopChance);
        }
        if (currentTopRemoveChance > 0) {
            possibleEffects.put(new ItemEffect(itemType.getEnchantmentEffect(), TFModifier.NONE, currentTopModifier, currentTopRemovePotency, 1), currentTopRemoveChance);
        }
        if (currentBottomChance > 0) {
            possibleEffects.put(new ItemEffect(itemType.getEnchantmentEffect(), TFModifier.NONE, currentBottomModifier, currentBottomPotency, 1), currentBottomChance);
        }
        if (currentBottomRemoveChance > 0) {
            possibleEffects.put(new ItemEffect(itemType.getEnchantmentEffect(), TFModifier.NONE, currentBottomModifier, currentBottomRemovePotency, 1), currentBottomRemoveChance);
        }
    }
    // map of unpaired fetish -> boolean stating whether it wants to be shared, or hoarded
    // currently, all unpaired fetishes seem like they are something the owner would want to share,
    // but setting the second argument to false will cause the NPC to instead have an aversion to
    // giving the player the same fetish
    Map<Fetish, Boolean> unpairedFetishMap = new HashMap<>();
    unpairedFetishMap.put(Fetish.FETISH_BIMBO, true);
    unpairedFetishMap.put(Fetish.FETISH_CROSS_DRESSER, true);
    unpairedFetishMap.put(Fetish.FETISH_INCEST, true);
    unpairedFetishMap.put(Fetish.FETISH_MASTURBATION, true);
    for (Entry<Fetish, Boolean> entry : unpairedFetishMap.entrySet()) {
        currentTopFetish = entry.getKey();
        Boolean wantsToShare = entry.getValue();
        currentTopModifier = TFModifier.valueOf("TF_MOD_" + currentTopFetish);
        currentTopPotency = TFPotency.MINOR_BOOST;
        currentTopRemovePotency = TFPotency.MINOR_DRAIN;
        currentTopChance = baseTopChance;
        currentTopRemoveChance = baseTopRemoveChance;
        if (wantsToShare) {
            // Increase base add chances based on NPC's experience levels for this fetishes
            switch(this.getFetishDesire(currentTopFetish)) {
                case THREE_LIKE:
                    currentTopChance += desiredFetishIncrement;
                    break;
                case FOUR_LOVE:
                    currentTopChance += desiredFetishIncrement * 2;
                    break;
                case ONE_DISLIKE:
                    currentTopChance -= desiredFetishIncrement;
                    break;
                case ZERO_HATE:
                    currentTopChance = 0;
                    break;
                default:
            }
            // Increase base add chances based on NPC's experience levels for this fetishes
            switch(this.getFetishLevel(currentTopFetish)) {
                case ONE_AMATEUR:
                    currentTopChance += expFetishIncrement;
                    break;
                case TWO_EXPERIENCED:
                    currentTopChance += expFetishIncrement * 2;
                    break;
                case THREE_EXPERT:
                    currentTopChance += expFetishIncrement * 3;
                    break;
                case FOUR_MASTERFUL:
                    currentTopChance += expFetishIncrement * 4;
                    break;
                default:
            }
        }
        // set chances if NPC has top fetish
        if (this.hasFetish(currentTopFetish)) {
            if (wantsToShare) {
                currentTopChance *= pairedFetishMultiplier;
                currentTopRemoveChance = 0;
            } else if (pairedFetishesOnly) {
                currentTopChance = 0;
            } else {
                currentTopChance -= matchedFetishDecrement;
                currentTopRemoveChance += matchedFetishRemoveIncrement;
            }
        } else if (pairedFetishesOnly && wantsToShare) {
            currentTopChance = 0;
            currentTopRemoveChance = 0;
        }
        // if player has positive top fetish desire, adjust potency level to fully add fetish, not just desire
        if (Main.game.getPlayer().getFetishDesire(currentTopFetish) == FetishDesire.THREE_LIKE || Main.game.getPlayer().getFetishDesire(currentTopFetish) == FetishDesire.FOUR_LOVE) {
            currentTopPotency = TFPotency.BOOST;
        } else if (Main.game.getPlayer().getFetishDesire(currentTopFetish) == FetishDesire.TWO_NEUTRAL) {
            int rand = Util.random.nextInt(100);
            // if the player is neutral, but the NPC has paired fetish,small chance to fully add rather than just boost desire
            if (wantsToShare && this.hasFetish(currentBottomFetish) && rand < 30) {
                currentTopPotency = TFPotency.BOOST;
            }
        } else {
            // if they are already less than neutral, don't remove any more
            currentTopRemoveChance = 0;
        }
        // prevent extraneous effects if player has top fetish, plus alter remove potency to drop fetish, not just desire
        if (Main.game.getPlayer().hasFetish(currentTopFetish)) {
            currentTopChance = 0;
            currentTopRemovePotency = TFPotency.DRAIN;
        }
        // some setting and status combos can result in negative values, so let's zero those out
        if (currentTopChance < 0) {
            currentTopChance = 0;
        }
        if (currentTopRemoveChance < 0) {
            currentTopRemoveChance = 0;
        }
        if (currentTopChance > 0) {
            possibleEffects.put(new ItemEffect(itemType.getEnchantmentEffect(), TFModifier.NONE, currentTopModifier, currentTopPotency, 1), currentTopChance);
        }
        if (currentTopRemoveChance > 0) {
            possibleEffects.put(new ItemEffect(itemType.getEnchantmentEffect(), TFModifier.NONE, currentTopModifier, currentTopRemovePotency, 1), currentTopRemoveChance);
        }
    }
    // randomly select from possible effects
    int total = 0;
    for (Entry<ItemEffect, Integer> entry : possibleEffects.entrySet()) {
        total += entry.getValue();
    }
    // no valid options found
    if (total == 0) {
        return null;
    }
    int count = Util.random.nextInt(total) + 1;
    total = 0;
    for (Entry<ItemEffect, Integer> entry : possibleEffects.entrySet()) {
        if (total < count && total + entry.getValue() >= count) {
            selectedEffect = entry.getKey();
            break;
        }
        total += entry.getValue();
    }
    // no fetish to add, so we have nothing to return
    if (selectedEffect == null) {
        return null;
    }
    // Let's figure out what flavor text string to pair with our selected effect
    // I'm VERY uncertain that you'll like any of this flavor text at all, so please feel free to modify as you see fit
    // Some of it I do like, but mostly I just wanted to be sure there were unique placeholder values for every current fetish
    // Also, simply removing/commenting out an entry will cause the fetish in question to go to the default, if you'd like
    // to get rid of one of my placeholders without having to write your own replacement
    Map<TFModifier, String> fetishAddFlavorText = new HashMap<>(), fetishRemoveFlavorText = new HashMap<>();
    String defaultFetishAddFlavorText = "Why not expand your horizons a bit, eh?";
    String defaultFetishRemoveFlavorText = "Maybe you should cool down a bit about the more extreme stuff, eh?.";
    // body part
    fetishAddFlavorText.put(TFModifier.TF_MOD_FETISH_ANAL_GIVING, "You're going to love doing it in the ass after this.");
    fetishRemoveFlavorText.put(TFModifier.TF_MOD_FETISH_ANAL_GIVING, "Maybe you should cool down a bit about fucking people in the ass.");
    fetishAddFlavorText.put(TFModifier.TF_MOD_FETISH_ANAL_RECEIVING, "You're going to love taking it in the ass after this.");
    fetishRemoveFlavorText.put(TFModifier.TF_MOD_FETISH_ANAL_RECEIVING, "Maybe you should cool down a bit about getting fucked in the ass.");
    fetishAddFlavorText.put(TFModifier.TF_MOD_FETISH_BREASTS_OTHERS, "Don't you just love a nice pair of tits?");
    fetishRemoveFlavorText.put(TFModifier.TF_MOD_FETISH_BREASTS_OTHERS, "You're way too into breasts.");
    fetishAddFlavorText.put(TFModifier.TF_MOD_FETISH_BREASTS_SELF, "Wouldn't you love to put your breasts to good use?");
    fetishRemoveFlavorText.put(TFModifier.TF_MOD_FETISH_BREASTS_SELF, "You're way too into your breasts.");
    fetishAddFlavorText.put(TFModifier.TF_MOD_FETISH_ORAL_GIVING, "That beautiful mouth of yours is about to get a lot more use");
    fetishRemoveFlavorText.put(TFModifier.TF_MOD_FETISH_ORAL_GIVING, "You don't really need to suck every cock you come across, do you?");
    fetishAddFlavorText.put(TFModifier.TF_MOD_FETISH_ORAL_RECEIVING, "Don't you just love getting head?");
    fetishRemoveFlavorText.put(TFModifier.TF_MOD_FETISH_ORAL_RECEIVING, "Not everyone enjoys getting fucked in the face, you know.");
    fetishAddFlavorText.put(TFModifier.TF_MOD_FETISH_VAGINAL_GIVING, "Nothing quite compares to fucking a wet pussy, right?");
    fetishRemoveFlavorText.put(TFModifier.TF_MOD_FETISH_VAGINAL_GIVING, "There's more to sex than just pussy. Expand your horizons a bit.");
    fetishAddFlavorText.put(TFModifier.TF_MOD_FETISH_VAGINAL_RECEIVING, "When it comes down to it, you just want to get fucked in the pussy, right?");
    fetishRemoveFlavorText.put(TFModifier.TF_MOD_FETISH_VAGINAL_RECEIVING, "There's more to sex than just pussy. Expand your horizons a bit.");
    fetishAddFlavorText.put(TFModifier.TF_MOD_FETISH_LEG_LOVER, "A nice pair of stems makes all the difference, right?");
    fetishRemoveFlavorText.put(TFModifier.TF_MOD_FETISH_LEG_LOVER, "Maybe focus a bit more on what's above the waist -- or at least around the hips?");
    fetishAddFlavorText.put(TFModifier.TF_MOD_FETISH_STRUTTER, "You've got legs that don't quit -- you really ought to use them");
    fetishRemoveFlavorText.put(TFModifier.TF_MOD_FETISH_STRUTTER, "Maybe focus a bit more on what's above your waist -- or at least around the hips?");
    // Behavioral
    fetishAddFlavorText.put(TFModifier.TF_MOD_FETISH_DOMINANT, "Don't you think you deserve to be the one in charge?");
    fetishRemoveFlavorText.put(TFModifier.TF_MOD_FETISH_DOMINANT, "You're really not as intimidating as you think.");
    fetishAddFlavorText.put(TFModifier.TF_MOD_FETISH_SUBMISSIVE, "Give in to it, and admit that you want nothing more than to be my plaything.");
    fetishRemoveFlavorText.put(TFModifier.TF_MOD_FETISH_SUBMISSIVE, "Sometimes it's nice to get what you want too, right?");
    fetishAddFlavorText.put(TFModifier.TF_MOD_FETISH_CUM_STUD, "Nothing really compares to filling a juicy hole hole with your seed, right?");
    fetishRemoveFlavorText.put(TFModifier.TF_MOD_FETISH_CUM_STUD, "Sex should be about the journey, not the destination.");
    fetishAddFlavorText.put(TFModifier.TF_MOD_FETISH_CUM_ADDICT, "I know a dirty little cum dumpster when I see one.");
    fetishRemoveFlavorText.put(TFModifier.TF_MOD_FETISH_CUM_ADDICT, "You can be more than a receptacle for other people's jizz if you want, you know.");
    fetishAddFlavorText.put(TFModifier.TF_MOD_FETISH_DEFLOWERING, "There's something special about being the first to the party, right?");
    fetishRemoveFlavorText.put(TFModifier.TF_MOD_FETISH_DEFLOWERING, "Trust me, it's a lot more fun when they have a bit of experience.");
    fetishAddFlavorText.put(TFModifier.TF_MOD_FETISH_PURE_VIRGIN, "You should treasure whatever innocence you have left while it lasts.");
    fetishRemoveFlavorText.put(TFModifier.TF_MOD_FETISH_PURE_VIRGIN, "Fuck virginity. You'll have a lot more fun doing it than having it.");
    fetishAddFlavorText.put(TFModifier.TF_MOD_FETISH_IMPREGNATION, "A stud like you really ought to be breeding as many bitches as you can");
    fetishRemoveFlavorText.put(TFModifier.TF_MOD_FETISH_IMPREGNATION, "Get over yourself. No one wants to have your baby.");
    fetishAddFlavorText.put(TFModifier.TF_MOD_FETISH_PREGNANCY, "Being fucked is nice, but being bred is better, isn't it?");
    fetishRemoveFlavorText.put(TFModifier.TF_MOD_FETISH_PREGNANCY, "Being knocked up is a bit of a drag, don't you think?");
    fetishAddFlavorText.put(TFModifier.TF_MOD_FETISH_SEEDER, "You ought to be making babies, and lots of them.");
    fetishRemoveFlavorText.put(TFModifier.TF_MOD_FETISH_SEEDER, "You don't really need more mouths to feed, do you?");
    fetishAddFlavorText.put(TFModifier.TF_MOD_FETISH_BROODMOTHER, "You ought to be making babies, and lots of them.");
    fetishRemoveFlavorText.put(TFModifier.TF_MOD_FETISH_BROODMOTHER, "You don't really need more mouths to feed, do you?");
    fetishAddFlavorText.put(TFModifier.TF_MOD_FETISH_SADIST, "Isn't it nice when you hurt them and they beg for more?");
    fetishRemoveFlavorText.put(TFModifier.TF_MOD_FETISH_SADIST, "Not everyone likes being your punching bag.");
    fetishAddFlavorText.put(TFModifier.TF_MOD_FETISH_MASOCHIST, "It's time for you to embrace the pain. You'll thank me later.");
    fetishRemoveFlavorText.put(TFModifier.TF_MOD_FETISH_MASOCHIST, "You should really take better care of yourself.");
    fetishAddFlavorText.put(TFModifier.TF_MOD_FETISH_NON_CON_DOM, "When they beg for you to stop it just drives you crazy, doesn't it?");
    fetishRemoveFlavorText.put(TFModifier.TF_MOD_FETISH_NON_CON_DOM, "Most of the time, no really means no.");
    fetishAddFlavorText.put(TFModifier.TF_MOD_FETISH_NON_CON_SUB, "Every time you say 'no' I can see 'fuck me harder' in your eyes.");
    fetishRemoveFlavorText.put(TFModifier.TF_MOD_FETISH_NON_CON_SUB, "You really can get off without being forced to, believe it or not.");
    fetishAddFlavorText.put(TFModifier.TF_MOD_FETISH_DENIAL, "The only thing better than coming is telling your partner they can't, right?");
    fetishRemoveFlavorText.put(TFModifier.TF_MOD_FETISH_DENIAL, "If they're willing to fuck you, at least let them come once in a while.");
    fetishAddFlavorText.put(TFModifier.TF_MOD_FETISH_DENIAL_SELF, "Where's the fun in coming right away? Wouldn't you rather savor the experience?");
    fetishRemoveFlavorText.put(TFModifier.TF_MOD_FETISH_DENIAL_SELF, "What's the point if you aren't getting off?");
    fetishAddFlavorText.put(TFModifier.TF_MOD_FETISH_VOYEURIST, "Sometimes it's just fun to watch, isn't it?");
    fetishRemoveFlavorText.put(TFModifier.TF_MOD_FETISH_VOYEURIST, "Privacy is a thing worth respecting.");
    fetishAddFlavorText.put(TFModifier.TF_MOD_FETISH_EXHIBITIONIST, "You've got it -- you should flaunt it");
    fetishRemoveFlavorText.put(TFModifier.TF_MOD_FETISH_EXHIBITIONIST, "Not everyone wants to see what you've got to offer.");
    // Behavioral unpaired
    fetishAddFlavorText.put(TFModifier.TF_MOD_FETISH_BIMBO, "I think it's time you embraced your inner braindead slut.");
    fetishRemoveFlavorText.put(TFModifier.TF_MOD_FETISH_BIMBO, "Maybe have just a little self respect?");
    fetishAddFlavorText.put(TFModifier.TF_MOD_FETISH_CROSS_DRESSER, "You should wear what you want, and enjoy it.");
    fetishRemoveFlavorText.put(TFModifier.TF_MOD_FETISH_CROSS_DRESSER, "It wouldn't kill you to be a bit more reserved.");
    fetishAddFlavorText.put(TFModifier.TF_MOD_FETISH_MASTURBATION, "Nobody knows your body quite like you do, right?");
    fetishRemoveFlavorText.put(TFModifier.TF_MOD_FETISH_MASTURBATION, "Maybe you should think getting your hands on someone else's junk once in a while?");
    fetishAddFlavorText.put(TFModifier.TF_MOD_FETISH_INCEST, "You know it wouldn't be a taboo if it wasn't at least a little bit fun.");
    fetishRemoveFlavorText.put(TFModifier.TF_MOD_FETISH_INCEST, "You what? Gross.");
    // Behavioral transformative
    fetishAddFlavorText.put(TFModifier.TF_MOD_FETISH_TRANSFORMATION_GIVING, "You strike me as someone who should be an agent of change.");
    fetishRemoveFlavorText.put(TFModifier.TF_MOD_FETISH_TRANSFORMATION_GIVING, "You should really just let people be who they are.");
    fetishAddFlavorText.put(TFModifier.TF_MOD_FETISH_TRANSFORMATION_RECEIVING, "Don't you just love becoming something new?");
    fetishRemoveFlavorText.put(TFModifier.TF_MOD_FETISH_TRANSFORMATION_RECEIVING, "I think you're good just as you are.");
    fetishAddFlavorText.put(TFModifier.TF_MOD_FETISH_KINK_GIVING, "You're into so many interesting things -- you really should share them with others.");
    fetishRemoveFlavorText.put(TFModifier.TF_MOD_FETISH_KINK_GIVING, "Just let people enjoy what they enjoy, okay?");
    fetishAddFlavorText.put(TFModifier.TF_MOD_FETISH_KINK_RECEIVING, "You strike me as someone who would really enjoy trying new things.");
    fetishRemoveFlavorText.put(TFModifier.TF_MOD_FETISH_KINK_RECEIVING, "I think you're already excitable enough as it is.");
    if (selectedEffect.getPotency() == TFPotency.MINOR_BOOST || selectedEffect.getPotency() == TFPotency.BOOST) {
        // default for adding a fetish, just in case a fetish is somehow selected without a string defined in the lookup
        selectedEffectString = defaultFetishAddFlavorText;
        if (fetishAddFlavorText.get(selectedEffect.getSecondaryModifier()) != null) {
            selectedEffectString = fetishAddFlavorText.get(selectedEffect.getSecondaryModifier());
        }
    } else {
        // default for removing a fetish, just in case a fetish is somehow selected without a string defined in the lookup
        selectedEffectString = defaultFetishRemoveFlavorText;
        if (fetishRemoveFlavorText.get(selectedEffect.getSecondaryModifier()) != null) {
            selectedEffectString = fetishRemoveFlavorText.get(selectedEffect.getSecondaryModifier());
        }
    }
    // finally, build and return our fetish potion
    List<ItemEffect> effects = new ArrayList<>();
    effects.add(selectedEffect);
    return new Value<>(selectedEffectString, EnchantingUtils.craftItem(AbstractItemType.generateItem(itemType), effects));
}
Also used : HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) AbstractItemType(com.lilithsthrone.game.inventory.item.AbstractItemType) TFModifier(com.lilithsthrone.game.inventory.enchanting.TFModifier) Fetish(com.lilithsthrone.game.character.fetishes.Fetish) TFPotency(com.lilithsthrone.game.inventory.enchanting.TFPotency) ListValue(com.lilithsthrone.utils.Util.ListValue) Value(com.lilithsthrone.utils.Util.Value) ItemEffect(com.lilithsthrone.game.inventory.item.ItemEffect)

Example 8 with AbstractItemType

use of com.lilithsthrone.game.inventory.item.AbstractItemType in project liliths-throne-public by Innoxia.

the class NPC method generateTransformativePotion.

/**
 * Example return value: ["Let's give you bigger breasts!", AbstractItem]
 * @return NPC's speech as a reaction to giving you this potion, along with the potion itself.
 */
public Value<String, AbstractItem> generateTransformativePotion() {
    /* TODO
		 * Body Size
		 * Muscle mass
		 * Penis modifiers
		 * Vagina modifiers
		 * Throat modifiers
		 */
    int numberOfTransformations = Main.game.getPlayer().hasFetish(Fetish.FETISH_TRANSFORMATION_RECEIVING) ? 2 + Util.random.nextInt(7) : 1 + Util.random.nextInt(4);
    List<ItemEffect> effects = new ArrayList<>();
    AbstractItemType itemType = ItemType.RACE_INGREDIENT_HUMAN;
    String reaction = "Time to transform you!";
    String raceName = "human";
    if (Main.getProperties().forcedTFPreference != FurryPreference.HUMAN) {
        if (getPreferredBody().getGender().isFeminine()) {
            raceName = getPreferredBody().getGender().getName() + " " + getPreferredBody().getSubspecies().getSingularFemaleName();
        } else {
            raceName = getPreferredBody().getGender().getName() + " " + getPreferredBody().getSubspecies().getSingularMaleName();
        }
        switch(getPreferredBody().getRace()) {
            case CAT_MORPH:
                itemType = ItemType.RACE_INGREDIENT_CAT_MORPH;
                reaction = "Time to turn you into a cute little " + raceName + "!";
                break;
            case DOG_MORPH:
                itemType = ItemType.RACE_INGREDIENT_DOG_MORPH;
                reaction = "Time to turn you into an excitable little " + raceName + "!";
                break;
            case HARPY:
                itemType = ItemType.RACE_INGREDIENT_HARPY;
                reaction = "Time to turn you into a hot little " + raceName + "!";
                break;
            case HORSE_MORPH:
                itemType = ItemType.RACE_INGREDIENT_HORSE_MORPH;
                if (getPreferredBody().getGender().isFeminine()) {
                    reaction = "Time to turn you into my little mare!";
                } else {
                    reaction = "Time to turn you into my very own stallion!";
                }
                break;
            case REINDEER_MORPH:
                itemType = ItemType.RACE_INGREDIENT_REINDEER_MORPH;
                if (getPreferredBody().getGender().isFeminine()) {
                    reaction = "Time to turn you into my little doe!";
                } else {
                    reaction = "Time to turn you into my very own buck!";
                }
                break;
            case SQUIRREL_MORPH:
                itemType = ItemType.RACE_INGREDIENT_SQUIRREL_MORPH;
                reaction = "Time to turn you into a cute little " + raceName + "!";
                break;
            case WOLF_MORPH:
                itemType = ItemType.RACE_INGREDIENT_WOLF_MORPH;
                reaction = "Time to turn you into a " + raceName + "!";
                break;
            case ALLIGATOR_MORPH:
                itemType = ItemType.RACE_INGREDIENT_ALLIGATOR_MORPH;
                reaction = "Time to turn you into a " + raceName + "!";
                break;
            case COW_MORPH:
                itemType = ItemType.RACE_INGREDIENT_COW_MORPH;
                break;
            case ANGEL:
            case DEMON:
            case IMP:
            case HUMAN:
            case SLIME:
                itemType = ItemType.RACE_INGREDIENT_HUMAN;
                break;
        }
    }
    AbstractItemType genitalsItemType = itemType;
    boolean skipGenitalsTF = false;
    if (Main.getProperties().forcedTFPreference == FurryPreference.HUMAN || Main.getProperties().forcedTFPreference == FurryPreference.MINIMUM) {
        genitalsItemType = ItemType.RACE_INGREDIENT_HUMAN;
        boolean vaginaSet = false;
        boolean penisSet = false;
        if ((Main.game.getPlayer().getVaginaType() == getPreferredBody().getVagina().getType()) || (getPreferredBody().getVagina().getType() != VaginaType.NONE && Main.game.getPlayer().hasVagina())) {
            vaginaSet = true;
        }
        if ((Main.game.getPlayer().getPenisType() == getPreferredBody().getPenis().getType()) || (getPreferredBody().getPenis().getType() != PenisType.NONE && Main.game.getPlayer().hasPenis())) {
            penisSet = true;
        }
        skipGenitalsTF = vaginaSet && penisSet;
    }
    Map<ItemEffect, String> possibleEffects = new HashMap<>();
    if (!skipGenitalsTF) {
        // Sexual transformations:
        boolean removingVagina = false;
        boolean addingVagina = false;
        boolean removingPenis = false;
        boolean addingPenis = false;
        if (!Main.game.getPlayer().isHasAnyPregnancyEffects()) {
            // Vagina cannot be transformed if pregnant, so skip this
            if (Main.game.getPlayer().getVaginaType() != getPreferredBody().getVagina().getType()) {
                if (getPreferredBody().getVagina().getType() == VaginaType.NONE) {
                    if (Main.game.getPlayer().getVaginaRawCapacityValue() > 1) {
                        possibleEffects.put(new ItemEffect(genitalsItemType.getEnchantmentEffect(), TFModifier.TF_VAGINA, TFModifier.TF_MOD_CAPACITY, TFPotency.DRAIN, 1), "Let's get to work on getting rid of that little cunt of yours!");
                        removingVagina = true;
                    } else {
                        possibleEffects.put(new ItemEffect(genitalsItemType.getEnchantmentEffect(), TFModifier.TF_VAGINA, TFModifier.REMOVAL, TFPotency.MINOR_BOOST, 1), "Let's get rid of that tight little cunt of yours!");
                        removingVagina = true;
                    }
                } else if ((Main.getProperties().forcedTFPreference != FurryPreference.HUMAN && Main.getProperties().forcedTFPreference != FurryPreference.MINIMUM) || getPreferredBody().getVagina().getType() == VaginaType.HUMAN) {
                    possibleEffects.put(new ItemEffect(genitalsItemType.getEnchantmentEffect(), TFModifier.TF_VAGINA, TFModifier.NONE, TFPotency.MINOR_BOOST, 1), "Let's give you a nice " + getPreferredBody().getVagina().getName(Main.game.getPlayer(), false) + "!");
                    addingVagina = true;
                }
            }
        }
        if (Main.game.getPlayer().getPenisType() != getPreferredBody().getPenis().getType()) {
            if (getPreferredBody().getPenis().getType() == PenisType.NONE) {
                if (Main.game.getPlayer().getPenisRawSizeValue() > 1) {
                    possibleEffects.put(new ItemEffect(genitalsItemType.getEnchantmentEffect(), TFModifier.TF_PENIS, TFModifier.TF_MOD_SIZE, TFPotency.DRAIN, 1), "Let's get to work on getting rid of that cock of yours!");
                    removingPenis = true;
                } else {
                    possibleEffects.put(new ItemEffect(genitalsItemType.getEnchantmentEffect(), TFModifier.TF_PENIS, TFModifier.REMOVAL, TFPotency.MINOR_BOOST, 1), "Let's get rid of that pathetic little cock of yours!");
                    removingPenis = true;
                }
            } else if ((Main.getProperties().forcedTFPreference != FurryPreference.HUMAN && Main.getProperties().forcedTFPreference != FurryPreference.MINIMUM) || getPreferredBody().getPenis().getType() == PenisType.HUMAN) {
                possibleEffects.put(new ItemEffect(genitalsItemType.getEnchantmentEffect(), TFModifier.TF_PENIS, TFModifier.NONE, TFPotency.MINOR_BOOST, 1), "Let's give you a nice " + getPreferredBody().getPenis().getName(Main.game.getPlayer(), false) + "!");
                addingPenis = true;
            }
        }
        if (!possibleEffects.isEmpty()) {
            String s = "";
            if (possibleEffects.size() > 1) {
                if (removingVagina) {
                    s += "Let's get to work on getting rid of that cunt of yours,";
                    if (removingPenis) {
                        s += " and I thinking it's also time to say goodbye to your pathetic cock as well!";
                    } else if (addingPenis) {
                        s += " and give you a nice cock instead!";
                    }
                } else if (addingVagina) {
                    s += "Let's give you a " + getPreferredBody().getVagina().getName(Main.game.getPlayer(), false) + ",";
                    if (removingPenis) {
                        s += " and I think I'll get rid of your pathetic cock at the same time!";
                    } else if (addingPenis) {
                        s += " and a nice cock as well!";
                    }
                }
            }
            for (Entry<ItemEffect, String> entry : possibleEffects.entrySet()) {
                if (possibleEffects.size() == 1) {
                    s = entry.getValue();
                }
                effects.add(entry.getKey());
            }
            return new Value<>(s, EnchantingUtils.craftItem(AbstractItemType.generateItem(itemType), effects));
        }
    }
    // All minor part transformations:
    if (Main.getProperties().forcedTFPreference != FurryPreference.HUMAN) {
        if (possibleEffects.isEmpty() || Math.random() > 0.33f) {
            if (Main.game.getPlayer().getAntennaType() != getPreferredBody().getAntenna().getType()) {
                possibleEffects.put(new ItemEffect(itemType.getEnchantmentEffect(), TFModifier.TF_ANTENNA, TFModifier.NONE, TFPotency.MINOR_BOOST, 1), reaction);
            }
            if (Main.getProperties().forcedTFPreference != FurryPreference.MINIMUM) {
                if (Main.game.getPlayer().getAssType() != getPreferredBody().getAss().getType()) {
                    possibleEffects.put(new ItemEffect(itemType.getEnchantmentEffect(), TFModifier.TF_ASS, TFModifier.NONE, TFPotency.MINOR_BOOST, 1), reaction);
                }
                if (Main.game.getPlayer().getBreastType() != getPreferredBody().getBreast().getType()) {
                    possibleEffects.put(new ItemEffect(itemType.getEnchantmentEffect(), TFModifier.TF_BREASTS, TFModifier.NONE, TFPotency.MINOR_BOOST, 1), reaction);
                }
            }
            if (Main.game.getPlayer().getEarType() != getPreferredBody().getEar().getType()) {
                possibleEffects.put(new ItemEffect(itemType.getEnchantmentEffect(), TFModifier.TF_EARS, TFModifier.NONE, TFPotency.MINOR_BOOST, 1), reaction);
            }
            if (Main.game.getPlayer().getEyeType() != getPreferredBody().getEye().getType()) {
                possibleEffects.put(new ItemEffect(itemType.getEnchantmentEffect(), TFModifier.TF_EYES, TFModifier.NONE, TFPotency.MINOR_BOOST, 1), reaction);
            }
            if (Main.game.getPlayer().getHairType() != getPreferredBody().getHair().getType()) {
                possibleEffects.put(new ItemEffect(itemType.getEnchantmentEffect(), TFModifier.TF_HAIR, TFModifier.NONE, TFPotency.MINOR_BOOST, 1), reaction);
            }
            if (Main.game.getPlayer().getHornType() != getPreferredBody().getHorn().getType()) {
                possibleEffects.put(new ItemEffect(itemType.getEnchantmentEffect(), TFModifier.TF_HORNS, TFModifier.NONE, TFPotency.MINOR_BOOST, 1), reaction);
            }
            if (Main.game.getPlayer().getTailType() != getPreferredBody().getTail().getType()) {
                possibleEffects.put(new ItemEffect(itemType.getEnchantmentEffect(), TFModifier.TF_TAIL, TFModifier.NONE, TFPotency.MINOR_BOOST, 1), reaction);
            }
            if (Main.game.getPlayer().getWingType() != getPreferredBody().getWing().getType()) {
                possibleEffects.put(new ItemEffect(itemType.getEnchantmentEffect(), TFModifier.TF_WINGS, TFModifier.NONE, TFPotency.MINOR_BOOST, 1), reaction);
            }
        }
        // Leg & Arm transformations:
        if (Main.getProperties().forcedTFPreference != FurryPreference.MINIMUM) {
            if (possibleEffects.isEmpty()) {
                if (Main.game.getPlayer().getArmType() != getPreferredBody().getArm().getType()) {
                    possibleEffects.put(new ItemEffect(itemType.getEnchantmentEffect(), TFModifier.TF_ARMS, TFModifier.NONE, TFPotency.MINOR_BOOST, 1), reaction);
                }
                if (Main.game.getPlayer().getLegType() != getPreferredBody().getLeg().getType()) {
                    possibleEffects.put(new ItemEffect(itemType.getEnchantmentEffect(), TFModifier.TF_LEGS, TFModifier.NONE, TFPotency.MINOR_BOOST, 1), reaction);
                }
            }
        }
        // Face & Skin transformations:
        if (Main.getProperties().forcedTFPreference == FurryPreference.NORMAL || Main.getProperties().forcedTFPreference == FurryPreference.MAXIMUM) {
            if (possibleEffects.isEmpty()) {
                if (Main.game.getPlayer().getSkinType() != getPreferredBody().getSkin().getType()) {
                    possibleEffects.put(new ItemEffect(itemType.getEnchantmentEffect(), TFModifier.TF_SKIN, TFModifier.NONE, TFPotency.MINOR_BOOST, 1), reaction);
                }
                if (Main.game.getPlayer().getFaceType() != getPreferredBody().getFace().getType()) {
                    possibleEffects.put(new ItemEffect(itemType.getEnchantmentEffect(), TFModifier.TF_FACE, TFModifier.NONE, TFPotency.MINOR_BOOST, 1), reaction);
                }
            }
        }
    }
    // 50% chance of type TF:
    if (Math.random() < 0.5f && !possibleEffects.isEmpty()) {
        List<ItemEffect> keysAsArray = new ArrayList<>(possibleEffects.keySet());
        for (int i = 0; i < numberOfTransformations; i++) {
            if (!keysAsArray.isEmpty()) {
                ItemEffect e = keysAsArray.get(Util.random.nextInt(keysAsArray.size()));
                effects.add(e);
                keysAsArray.remove(e);
            }
        }
        return new Value<>(reaction, EnchantingUtils.craftItem(AbstractItemType.generateItem(itemType), effects));
    }
    // Cum production:
    if (getPreferredBody().getPenis().getType() != PenisType.NONE && Main.game.getPlayer().getPenisRawCumProductionValue() < getPreferredBody().getPenis().getTesticle().getRawCumProductionValue()) {
        possibleEffects.put(new ItemEffect(itemType.getEnchantmentEffect(), TFModifier.TF_CUM, TFModifier.TF_MOD_WETNESS, TFPotency.MAJOR_BOOST, 1), "Mmm! You're gonna make lots of cum for me!");
    }
    // Femininity:
    if (Main.game.getPlayer().getFemininityValue() < getPreferredBody().getFemininity() && Femininity.valueOf(Main.game.getPlayer().getFemininityValue()) != Femininity.valueOf(getPreferredBody().getFemininity())) {
        possibleEffects.put(new ItemEffect(itemType.getEnchantmentEffect(), TFModifier.TF_CORE, TFModifier.TF_MOD_FEMININITY, TFPotency.MAJOR_BOOST, 1), "I'm gonna need you to be more feminine!");
    } else if (Main.game.getPlayer().getFemininityValue() > getPreferredBody().getFemininity() && Femininity.valueOf(Main.game.getPlayer().getFemininityValue()) != Femininity.valueOf(getPreferredBody().getFemininity())) {
        possibleEffects.put(new ItemEffect(itemType.getEnchantmentEffect(), TFModifier.TF_CORE, TFModifier.TF_MOD_FEMININITY, TFPotency.MAJOR_DRAIN, 1), "I'm gonna need you to be more of a man!");
    }
    // Height:
    if (Main.game.getPlayer().getHeightValue() < getPreferredBody().getHeightValue() && (getPreferredBody().getHeightValue() - Main.game.getPlayer().getHeightValue() > 5)) {
        possibleEffects.put(new ItemEffect(itemType.getEnchantmentEffect(), TFModifier.TF_CORE, TFModifier.TF_MOD_SIZE, TFPotency.BOOST, 1), "Let's make you a little taller!");
    } else if (Main.game.getPlayer().getHeightValue() > getPreferredBody().getHeightValue() && (Main.game.getPlayer().getHeightValue() - getPreferredBody().getHeightValue() > 5)) {
        possibleEffects.put(new ItemEffect(itemType.getEnchantmentEffect(), TFModifier.TF_CORE, TFModifier.TF_MOD_SIZE, TFPotency.DRAIN, 1), "Let's make you a little shorter!");
    }
    // Breast size:
    if (Main.game.getPlayer().getBreastSize().getMeasurement() < getPreferredBody().getBreast().getSize().getMeasurement()) {
        possibleEffects.put(new ItemEffect(itemType.getEnchantmentEffect(), TFModifier.TF_BREASTS, TFModifier.TF_MOD_SIZE, TFPotency.MINOR_BOOST, 1), "Your breasts need to be bigger!");
    } else if (Main.game.getPlayer().getBreastSize().getMeasurement() > getPreferredBody().getBreast().getSize().getMeasurement()) {
        possibleEffects.put(new ItemEffect(itemType.getEnchantmentEffect(), TFModifier.TF_BREASTS, TFModifier.TF_MOD_SIZE, TFPotency.MINOR_DRAIN, 1), "Your breasts are too big!");
    }
    // Ass size:
    if (Main.game.getPlayer().getAssSize().getValue() < getPreferredBody().getAss().getAssSize().getValue()) {
        possibleEffects.put(new ItemEffect(itemType.getEnchantmentEffect(), TFModifier.TF_ASS, TFModifier.TF_MOD_SIZE, TFPotency.MINOR_BOOST, 1), "Your ass needs to be bigger");
    } else if (Main.game.getPlayer().getAssSize().getValue() > getPreferredBody().getAss().getAssSize().getValue()) {
        possibleEffects.put(new ItemEffect(itemType.getEnchantmentEffect(), TFModifier.TF_ASS, TFModifier.TF_MOD_SIZE, TFPotency.MINOR_DRAIN, 1), "Your ass is too big!");
    }
    // Hip size:
    if (Main.game.getPlayer().getHipSize().getValue() < getPreferredBody().getAss().getHipSize().getValue()) {
        possibleEffects.put(new ItemEffect(itemType.getEnchantmentEffect(), TFModifier.TF_ASS, TFModifier.TF_MOD_SIZE_SECONDARY, TFPotency.MINOR_BOOST, 1), "Your hips need to be wider!");
    } else if (Main.game.getPlayer().getHipSize().getValue() > getPreferredBody().getAss().getHipSize().getValue()) {
        possibleEffects.put(new ItemEffect(itemType.getEnchantmentEffect(), TFModifier.TF_ASS, TFModifier.TF_MOD_SIZE_SECONDARY, TFPotency.MINOR_DRAIN, 1), "Your hips are too wide!");
    }
    if (Main.game.getPlayer().getPenisType() != PenisType.NONE && getPreferredBody().getPenis().getType() != PenisType.NONE) {
        // Penis size:
        if (Main.game.getPlayer().getPenisRawSizeValue() < getPreferredBody().getPenis().getRawSizeValue()) {
            if (getPreferredBody().getPenis().getRawSizeValue() - Main.game.getPlayer().getPenisRawSizeValue() > 5) {
                possibleEffects.put(new ItemEffect(itemType.getEnchantmentEffect(), TFModifier.TF_PENIS, TFModifier.TF_MOD_SIZE, TFPotency.BOOST, 1), "Your cock needs to be a lot bigger!");
            } else {
                possibleEffects.put(new ItemEffect(itemType.getEnchantmentEffect(), TFModifier.TF_PENIS, TFModifier.TF_MOD_SIZE, TFPotency.MINOR_BOOST, 1), "Your cock needs to be a little bigger!");
            }
        } else if (Main.game.getPlayer().getPenisRawSizeValue() > getPreferredBody().getPenis().getRawSizeValue()) {
            if (Main.game.getPlayer().getPenisRawSizeValue() - getPreferredBody().getPenis().getRawSizeValue() > 5) {
                possibleEffects.put(new ItemEffect(itemType.getEnchantmentEffect(), TFModifier.TF_PENIS, TFModifier.TF_MOD_SIZE, TFPotency.DRAIN, 1), "Your cock needs to be a lot smaller!");
            } else {
                possibleEffects.put(new ItemEffect(itemType.getEnchantmentEffect(), TFModifier.TF_PENIS, TFModifier.TF_MOD_SIZE, TFPotency.MINOR_DRAIN, 1), "Your cock needs to be a little smaller!");
            }
        }
    }
    if (Main.game.getPlayer().getVaginaType() != VaginaType.NONE && getPreferredBody().getVagina().getType() != VaginaType.NONE) {
        // Vagina wetness:
        if (Main.game.getPlayer().getVaginaWetness().getValue() < getPreferredBody().getVagina().getOrificeVagina().getWetness(Main.game.getGenericAndrogynousNPC()).getValue()) {
            possibleEffects.put(new ItemEffect(itemType.getEnchantmentEffect(), TFModifier.TF_VAGINA, TFModifier.TF_MOD_WETNESS, TFPotency.MINOR_BOOST, 1), "Your pussy isn't wet enough!");
        }
    }
    // Hair length:
    if (Main.game.getPlayer().getHairRawLengthValue() < getPreferredBody().getHair().getRawLengthValue() && (getPreferredBody().getHair().getRawLengthValue() - Main.game.getPlayer().getHairRawLengthValue() > 5)) {
        possibleEffects.put(new ItemEffect(itemType.getEnchantmentEffect(), TFModifier.TF_HAIR, TFModifier.TF_MOD_SIZE, TFPotency.BOOST, 1), "Your [pc.hair] " + (Main.game.getPlayer().getHairType().isDefaultPlural() ? "are" : "is") + " too short!");
    } else if (Main.game.getPlayer().getHairRawLengthValue() > getPreferredBody().getHair().getRawLengthValue() && (Main.game.getPlayer().getHairRawLengthValue() - getPreferredBody().getHair().getRawLengthValue() > 5)) {
        possibleEffects.put(new ItemEffect(itemType.getEnchantmentEffect(), TFModifier.TF_HAIR, TFModifier.TF_MOD_SIZE, TFPotency.DRAIN, 1), "Your [pc.hair] " + (Main.game.getPlayer().getHairType().isDefaultPlural() ? "are" : "is") + " too long!");
    }
    // Lip size:
    if (Main.game.getPlayer().getLipSize().getValue() < getPreferredBody().getFace().getMouth().getLipSize().getValue()) {
        possibleEffects.put(new ItemEffect(itemType.getEnchantmentEffect(), TFModifier.TF_FACE, TFModifier.TF_MOD_SIZE, TFPotency.MINOR_BOOST, 1), "Your [pc.lips] are too small!");
    } else if (Main.game.getPlayer().getLipSize().getValue() > getPreferredBody().getFace().getMouth().getLipSize().getValue()) {
        possibleEffects.put(new ItemEffect(itemType.getEnchantmentEffect(), TFModifier.TF_FACE, TFModifier.TF_MOD_SIZE, TFPotency.MINOR_DRAIN, 1), "Your [pc.lips] are too big!");
    }
    if (possibleEffects.isEmpty()) {
        return null;
    }
    // List<ItemEffect> keysAsArray = new ArrayList<>(possibleEffects.keySet());
    // ItemEffect effect = keysAsArray.get(Util.random.nextInt(keysAsArray.size()));
    // 
    // for (int i = 0; i < numberOfTransformations; i++) {
    // if (!keysAsArray.isEmpty()) {
    // ItemEffect e = keysAsArray.get(Util.random.nextInt(keysAsArray.size()));
    // effects.add(e);
    // keysAsArray.remove(e);
    // }
    // }
    // 
    // return new Value<>(
    // possibleEffects.get(effect),
    // EnchantingUtils.craftItem(AbstractItemType.generateItem(itemType), effects));
    List<ItemEffect> keysAsArray = new ArrayList<>(possibleEffects.keySet());
    for (int i = 0; i < numberOfTransformations; i++) {
        if (!keysAsArray.isEmpty()) {
            ItemEffect e = keysAsArray.get(Util.random.nextInt(keysAsArray.size()));
            effects.add(e);
            keysAsArray.remove(e);
        }
    }
    return new Value<>(possibleEffects.get(effects.get(0)), EnchantingUtils.craftItem(AbstractItemType.generateItem(itemType), effects));
}
Also used : AbstractItemType(com.lilithsthrone.game.inventory.item.AbstractItemType) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) ListValue(com.lilithsthrone.utils.Util.ListValue) Value(com.lilithsthrone.utils.Util.Value) ItemEffect(com.lilithsthrone.game.inventory.item.ItemEffect)

Example 9 with AbstractItemType

use of com.lilithsthrone.game.inventory.item.AbstractItemType in project liliths-throne-public by Innoxia.

the class Vicky method dailyReset.

@Override
public void dailyReset() {
    clearNonEquippedInventory();
    for (int i = 0; i < 2; i++) {
        this.addWeapon(AbstractWeaponType.generateWeapon(WeaponType.OFFHAND_CHAOS_RARE), false);
        this.addWeapon(AbstractWeaponType.generateWeapon(WeaponType.MELEE_CHAOS_RARE), false);
    }
    this.addWeapon(AbstractWeaponType.generateWeapon(WeaponType.OFFHAND_CHAOS_EPIC), false);
    this.addWeapon(AbstractWeaponType.generateWeapon(WeaponType.MELEE_CHAOS_EPIC), false);
    AbstractItem ingredient = AbstractItemType.generateItem(availableIngredients[Util.random.nextInt(availableIngredients.length)]);
    TFModifier primaryMod = TFModifier.getTFRacialBodyPartsList().get(Util.random.nextInt(TFModifier.getTFRacialBodyPartsList().size()));
    for (int i = 0; i < 6; i++) {
        if (ingredient.getEnchantmentEffect().getEffectsDescription(primaryMod, TFModifier.NONE, TFPotency.MINOR_BOOST, 0, Main.game.getPlayer(), Main.game.getPlayer()) != null) {
            this.addItem(EnchantingUtils.craftItem(ingredient, Util.newArrayListOfValues(new ListValue<>(new ItemEffect(ingredient.getEnchantmentEffect(), primaryMod, TFModifier.NONE, TFPotency.MINOR_BOOST, 0)))), false);
        }
        ingredient = AbstractItemType.generateItem(availableIngredients[Util.random.nextInt(availableIngredients.length)]);
        primaryMod = TFModifier.getTFRacialBodyPartsList().get(Util.random.nextInt(TFModifier.getTFRacialBodyPartsList().size()));
    }
    if (Main.game.getPlayer().hasQuest(QuestLine.SIDE_ENCHANTMENT_DISCOVERY)) {
        for (AbstractItemType itemType : ItemType.essences) {
            for (int i = 0; i < 20 + Util.random.nextInt(11); i++) {
                this.addItem(AbstractItemType.generateItem(itemType), false);
            }
        }
    }
}
Also used : TFModifier(com.lilithsthrone.game.inventory.enchanting.TFModifier) AbstractItemType(com.lilithsthrone.game.inventory.item.AbstractItemType) ItemEffect(com.lilithsthrone.game.inventory.item.ItemEffect) AbstractItem(com.lilithsthrone.game.inventory.item.AbstractItem)

Example 10 with AbstractItemType

use of com.lilithsthrone.game.inventory.item.AbstractItemType in project liliths-throne-public by Innoxia.

the class EnchantingUtils method craftItem.

public static AbstractItem craftItem(AbstractCoreItem ingredient, List<ItemEffect> effects) {
    AbstractItem craftedItem = null;
    craftedItem = AbstractItemType.generateItem((AbstractItemType) ingredient.getEnchantmentItemType(effects));
    List<ItemEffect> effectsToBeAdded = new ArrayList<>();
    effectsToBeAdded.addAll(effects);
    craftedItem.setItemEffects(effectsToBeAdded);
    craftedItem.setName(getPotionName(ingredient, effectsToBeAdded));
    craftedItem.setColour(ingredient.getEnchantmentEffect().getColour());
    craftedItem.setSVGString(getSVGString(ingredient, effectsToBeAdded));
    return craftedItem;
}
Also used : AbstractItemType(com.lilithsthrone.game.inventory.item.AbstractItemType) ArrayList(java.util.ArrayList) ItemEffect(com.lilithsthrone.game.inventory.item.ItemEffect) AbstractItem(com.lilithsthrone.game.inventory.item.AbstractItem)

Aggregations

AbstractItemType (com.lilithsthrone.game.inventory.item.AbstractItemType)10 ItemEffect (com.lilithsthrone.game.inventory.item.ItemEffect)7 AbstractItem (com.lilithsthrone.game.inventory.item.AbstractItem)5 AbstractClothingType (com.lilithsthrone.game.inventory.clothing.AbstractClothingType)4 Colour (com.lilithsthrone.utils.Colour)3 ArrayList (java.util.ArrayList)3 Gender (com.lilithsthrone.game.character.gender.Gender)2 GenderNames (com.lilithsthrone.game.character.gender.GenderNames)2 GenderPronoun (com.lilithsthrone.game.character.gender.GenderPronoun)2 Subspecies (com.lilithsthrone.game.character.race.Subspecies)2 TFModifier (com.lilithsthrone.game.inventory.enchanting.TFModifier)2 AbstractWeaponType (com.lilithsthrone.game.inventory.weapon.AbstractWeaponType)2 KeyboardAction (com.lilithsthrone.game.settings.KeyboardAction)2 ListValue (com.lilithsthrone.utils.Util.ListValue)2 Value (com.lilithsthrone.utils.Util.Value)2 File (java.io.File)2 HashMap (java.util.HashMap)2 Document (org.w3c.dom.Document)2 EnchantmentEventListener (com.lilithsthrone.controller.eventListeners.EnchantmentEventListener)1 InventorySelectedItemEventListener (com.lilithsthrone.controller.eventListeners.InventorySelectedItemEventListener)1