use of com.lilithsthrone.game.inventory.item.ItemEffect 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));
}
use of com.lilithsthrone.game.inventory.item.ItemEffect 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));
}
use of com.lilithsthrone.game.inventory.item.ItemEffect in project liliths-throne-public by Innoxia.
the class EnchantmentDialogue method inventoryView.
private static String inventoryView() {
inventorySB.setLength(0);
ItemEffect effect = new ItemEffect(ingredient.getEnchantmentEffect(), primaryMod, secondaryMod, potency, limit);
// Primary mods:
inventorySB.append("<div class='container-half-width' style='padding-bottom:0;'>");
for (TFModifier tfMod : ingredient.getEnchantmentEffect().getPrimaryModifiers()) {
inventorySB.append("<div class='modifier-icon " + tfMod.getRarity().getName() + "' style='width:11.5%;'>" + "<div class='modifier-icon-content'>" + tfMod.getSVGString() + "</div>" + "<div class='overlay' id='MOD_PRIMARY_" + tfMod.hashCode() + "'></div>" + "</div>");
}
for (int i = 32; i > ingredient.getEnchantmentEffect().getPrimaryModifiers().size(); i--) {
inventorySB.append("<div class='modifier-icon empty' style='width:11.5%;'></div>");
}
inventorySB.append("<div class='container-full-width'>" + "<div class='container-half-width' style='width:78%; margin:0 1%; text-align:center; line-height:100vh;'>" + "<h5 style='margin:0; padding:0;'>Primary Modifier</h5>" + "</div>" + "<div class='container-half-width' style='width:18%; margin:0 1%;'>");
if (primaryMod != null) {
inventorySB.append("<div class='modifier-icon " + primaryMod.getRarity().getName() + "' style='width:100%; margin:0;'>" + "<div class='modifier-icon-content'>" + primaryMod.getSVGString() + "</div>" + "<div class='overlay' id='MOD_PRIMARY_ENCHANTING'></div>" + "</div>");
} else {
inventorySB.append("<div class='modifier-icon empty' style='width:30%; margin:0 1%;'>" + "<div class='overlay' style='cursor:default;' id='MOD_PRIMARY_ENCHANTING'></div>" + "</div>");
}
inventorySB.append("</div></div>");
inventorySB.append("</div>");
// Secondary mods:
inventorySB.append("<div class='container-half-width' style='padding-bottom:0;'>");
for (TFModifier tfMod : ingredient.getEnchantmentEffect().getSecondaryModifiers(primaryMod)) {
inventorySB.append("<div class='modifier-icon " + tfMod.getRarity().getName() + "' style='width:11.5%;'>" + "<div class='modifier-icon-content'>" + tfMod.getSVGString() + "</div>" + "<div class='overlay' id='MOD_SECONDARY_" + tfMod.hashCode() + "'></div>" + "</div>");
}
for (int i = 32; i > ingredient.getEnchantmentEffect().getSecondaryModifiers(primaryMod).size(); i--) {
inventorySB.append("<div class='modifier-icon empty' style='width:11.5%;'></div>");
}
inventorySB.append("<div class='container-full-width'>" + "<div class='container-half-width' style='width:18%; margin:0 1%;'>");
if (secondaryMod != null) {
inventorySB.append("<div class='modifier-icon " + secondaryMod.getRarity().getName() + "' style='width:100%; margin:0;'>" + "<div class='modifier-icon-content'>" + secondaryMod.getSVGString() + "</div>" + "<div class='overlay' id='MOD_SECONDARY_ENCHANTING'></div>" + "</div>");
} else {
inventorySB.append("<div class='modifier-icon empty' style='width:30%; margin:0 1%;'>" + "<div class='overlay' style='cursor:default;' id='MOD_SECONDARY_ENCHANTING'></div>" + "</div>");
}
inventorySB.append("</div>" + "<div class='container-half-width' style='width:78%; margin:0 1%; text-align:center; line-height:100vh;'>" + "<h5 style='margin:0; padding:0;'>Secondary Modifier</h5>" + "</div>" + "</div>");
inventorySB.append("</div>");
// Potency:
inventorySB.append("<div class='container-full-width' style='text-align:center; padding:8px 0; margin-top:0;'>");
for (TFPotency potency : TFPotency.values()) {
inventorySB.append("<div class='normal-button" + (ingredient.getEnchantmentEffect().getPotencyModifiers(primaryMod, secondaryMod).contains(potency) ? "" : " disabled") + (EnchantmentDialogue.potency == potency ? " selected" : "") + "' id='POTENCY_" + potency + "'" + " style='" + (EnchantmentDialogue.potency == potency ? "color:" + potency.getColour().toWebHexString() + ";" : "") + " margin:0 1%; width:14%;'>" + potency.getName() + "</div>");
}
inventorySB.append("</div>");
// Limits:
int ingredientLimit = ingredient.getEnchantmentEffect().getLimits(primaryMod, secondaryMod);
if (ingredientLimit != 0) {
inventorySB.append("<div class='container-full-width' style='text-align:center; padding:8px 0; margin-top:0;'>" + "<div style='float:left; width:14.6%; margin:0 1%; padding:0;'>" + "<div class='normal-button" + (limit == 0 ? " disabled" : "") + "' id='LIMIT_MINIMUM' style='width:100%;'>Limit Min.</div>" + "</div>" + "<div style='float:left; width:14.6%; margin:0 1%; padding:0;'>" + "<div class='normal-button" + (limit == 0 ? " disabled" : "") + "' id='LIMIT_DECREASE_LARGE' style='width:100%;'>Limit--</div>" + "</div>" + "<div style='float:left; width:14.6%; margin:0 1%; padding:0;'>" + "<div class='normal-button" + (limit == 0 ? " disabled" : "") + "' id='LIMIT_DECREASE' style='width:100%;'>Limit-</div>" + "</div>" + "<div style='float:left; width:14.6%; margin:0 1%; padding:0;'>" + "<div class='normal-button" + (limit == ingredientLimit ? " disabled" : "") + "' id='LIMIT_INCREASE' style='width:100%;'>Limit+</div>" + "</div>" + "<div style='float:left; width:14.6%; margin:0 1%; padding:0;'>" + "<div class='normal-button" + (limit == ingredientLimit ? " disabled" : "") + "' id='LIMIT_INCREASE_LARGE' style='width:100%;'>Limit++</div>" + "</div>" + "<div style='float:left; width:14.6%; margin:0 1%; padding:0;'>" + "<div class='normal-button" + (limit == ingredientLimit ? " disabled" : "") + "' id='LIMIT_MAXIMUM' style='width:100%;'>Limit Max.</div>" + "</div>" + "</div>");
}
// Effect:
inventorySB.append("<div class='container-full-width' style='text-align:center; padding:8px 0; margin-top:0;'>");
inventorySB.append("<div class='container-half-width' style='width:28%; margin:0 1%;'>" + "<b style='color:" + ingredient.getRelatedEssence().getColour().toWebHexString() + ";'>Effect to be added:</b>" + "</div>");
inventorySB.append("<div class='container-half-width' style='width:48%; margin:0 1%;'>");
int i = 0;
if (effect.getEffectsDescription(Main.game.getPlayer(), Main.game.getPlayer()) != null) {
if (i > 0) {
inventorySB.append("</br>");
}
for (String s : effect.getEffectsDescription(Main.game.getPlayer(), Main.game.getPlayer())) {
inventorySB.append("<b>" + Util.capitaliseSentence(s) + "</b>");
}
i++;
} else {
inventorySB.append("<b>-</b>");
}
inventorySB.append("</div>");
inventorySB.append("<div class='container-half-width' style='width:18%; margin:0 1%;'>");
if (effects.size() >= ingredient.getEnchantmentLimit() || ingredient.getEnchantmentEffect().getEffectsDescription(primaryMod, secondaryMod, potency, limit, Main.game.getPlayer(), Main.game.getPlayer()) == null || ingredient.getEnchantmentEffect().getEffectsDescription(primaryMod, secondaryMod, potency, limit, Main.game.getPlayer(), Main.game.getPlayer()).isEmpty()) {
inventorySB.append("<div class='normal-button disabled' style='width:100%; margin:auto 0;'>" + "<b>Add</b> | " + UtilText.formatAsEssencesUncoloured(effect.getCost(), "b", false) + "<div class='overlay no-pointer' id='ENCHANT_ADD_BUTTON_DISABLED'></div>" + "</div>");
} else {
inventorySB.append("<div class='normal-button' style='width:100%; margin:auto 0;'>" + "<b style='color:" + Colour.GENERIC_GOOD.toWebHexString() + ";'>Add</b> | " + UtilText.formatAsEssences(effect.getCost(), "b", false) + "<div class='overlay' id='ENCHANT_ADD_BUTTON'></div>" + "</div>");
}
inventorySB.append("</div>");
inventorySB.append("</div>");
// Item crafting:
inventorySB.append("<div class='container-full-width' style='text-align:center; padding:8px 0; margin-top:0;'>");
int count = 1;
if (ingredient instanceof AbstractItem) {
count = Main.game.getPlayer().getItemCount((AbstractItem) ingredient);
} else if (ingredient instanceof AbstractClothing) {
count = Main.game.getPlayer().getClothingCount((AbstractClothing) ingredient);
} else if (ingredient instanceof AbstractWeapon) {
count = Main.game.getPlayer().getWeaponCount((AbstractWeapon) ingredient);
}
inventorySB.append("<div class='container-half-width' style='width:18%; margin:0 1%; text-align:center;'>");
inventorySB.append("<b>Input</b>" + "<div class='enchanting-ingredient " + ingredient.getRarity().getName() + "'>" + "<div class='enchanting-ingredient-content'>" + ingredient.getSVGString() + "</div>" + "<div class='overlay' id='INGREDIENT_ENCHANTING'></div>" + "<div class='enchanting-ingredient-count'><b>x" + count + "</b></div>" + "</div>");
inventorySB.append("</div>");
// Effects:
inventorySB.append("<div class='container-half-width' style='width:58%; margin:0 1%;'>");
inventorySB.append("<b>Effects (</b>" + (effects.size() >= ingredient.getEnchantmentLimit() ? "<b style='color:" + Colour.GENERIC_BAD.toWebHexString() + ";'>" : "<b>") + "" + effects.size() + "/" + ingredient.getEnchantmentLimit() + "</b><b>)</b></br>" + "<b>" + Util.capitaliseSentence(EnchantingUtils.getPotionName(ingredient, effects)) + "</b> | Cost: " + UtilText.formatAsEssences(EnchantingUtils.getCost(ingredient, effects), "b", false));
if (effects.isEmpty()) {
inventorySB.append("</br><span style='color:" + Colour.TEXT_GREY.toWebHexString() + ";'>No effects added</span>");
} else {
i = 0;
for (ItemEffect ie : effects) {
for (String s : ie.getEffectsDescription(Main.game.getPlayer(), Main.game.getPlayer())) {
inventorySB.append("<div class='container-full-width' style='background:" + RenderingEngine.getEntryBackgroundColour(i % 2 == 0) + "; width:98%; margin:0 1%; padding:2px;'>" + Util.capitaliseSentence(s) + (ingredient.getEffects().size() > i && ingredient.getEffects().get(i).equals(ie) ? "<div class='normal-button' style='width:64px; height:22px; line-height:22px; font-size:16px; margin:0; padding:0 0 0 4px; float:right; text-align:left;'>" + "<b style='color:" + Colour.GENERIC_BAD.toWebHexString() + ";'>X</b> " + UtilText.formatAsEssences(ie.getCost(), "b", false) + "<div class='overlay' id='DELETE_EFFECT_" + i + "'></div></div>" : "<div class='normal-button' id='DELETE_EFFECT_" + i + "'" + " style='width:22px; height:22px; line-height:22px; font-size:16px; margin:0; padding:0; float:right; color:" + Colour.GENERIC_BAD.toWebHexString() + ";'><b>X</b></div>") + "</div>");
i++;
}
}
}
inventorySB.append("</div>");
inventorySB.append("<div class='container-half-width' style='width:18%; margin:0 1%; text-align:center;'>");
inventorySB.append("<b>Output</b>" + "<div class='enchanting-ingredient " + ingredient.getEnchantmentItemType(effects).getRarity().getName() + "'>" + "<div class='enchanting-ingredient-content'>" + EnchantingUtils.getSVGString(ingredient, effects) + "</div>" + "<div class='overlay' id='OUTPUT_ENCHANTING'></div>" + "</div>");
inventorySB.append("</div>");
inventorySB.append("</div>");
return inventorySB.toString();
}
use of com.lilithsthrone.game.inventory.item.ItemEffect in project liliths-throne-public by Innoxia.
the class AbstractClothing method getDescription.
@Override
public String getDescription() {
descriptionSB.setLength(0);
descriptionSB.append("<p>" + getTypeDescription() + "</p>");
// Physical resistance
descriptionSB.append("<p>" + (getClothingType().isPlural() ? "They" : "It") + " provide" + (getClothingType().isPlural() ? "" : "s") + " <b>" + getClothingType().getPhysicalResistance() + "</b> <b style='color: " + Attribute.RESISTANCE_PHYSICAL.getColour().toWebHexString() + ";'> " + Attribute.RESISTANCE_PHYSICAL.getName() + "</b>.</p>");
if (enchantmentKnown) {
descriptionSB.append("<p>Effects:");
if (!this.getEffects().isEmpty()) {
for (ItemEffect e : this.getEffects()) {
if (e.getPrimaryModifier() != TFModifier.CLOTHING_ATTRIBUTE) {
for (String s : e.getEffectsDescription(Main.game.getPlayer(), Main.game.getPlayer())) {
descriptionSB.append("</br>" + s);
}
}
}
for (Entry<Attribute, Integer> entry : this.getAttributeModifiers().entrySet()) {
descriptionSB.append("</br>" + (entry.getValue() < 0 ? "[style.boldBad(" + entry.getValue() + ")] " : "[style.boldGood(+" + entry.getValue() + ")] ") + "<b style='color:" + entry.getKey().getColour().toWebHexString() + ";'>" + Util.capitaliseSentence(entry.getKey().getName()) + "</b>");
}
} else {
descriptionSB.append("[style.boldDisabled(None)]");
}
descriptionSB.append("</p>");
descriptionSB.append("<p>" + (getClothingType().isPlural() ? "They" : "It") + " " + (getClothingType().isPlural() ? "have" : "has") + " a value of " + UtilText.formatAsMoney(getValue()) + ".");
} else {
descriptionSB.append("</br>" + (getClothingType().isPlural() ? "They" : "It") + " " + (getClothingType().isPlural() ? "have" : "has") + " an <b>unknown value</b>!");
}
descriptionSB.append("</p>");
if (getClothingType().getClothingSet() != null)
descriptionSB.append("<p>" + (getClothingType().isPlural() ? "They" : "It") + " " + (getClothingType().isPlural() ? "are" : "is") + " part of the <b style='color:" + Colour.RARITY_EPIC.toWebHexString() + ";'>" + getClothingType().getClothingSet().getName() + "</b> set." + "</p>");
return descriptionSB.toString();
}
use of com.lilithsthrone.game.inventory.item.ItemEffect 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);
}
}
}
}
Aggregations