Search in sources :

Example 6 with OrificeType

use of com.lilithsthrone.game.sex.OrificeType in project liliths-throne-public by Innoxia.

the class RoomPlayer method getResponseRoom.

private static Response getResponseRoom(int index) {
    int minutesPassed = (int) (Main.game.getMinutesPassed() % (24 * 60));
    sleepTimer = (Main.game.isDayTime() ? (int) ((60 * 21) - minutesPassed) : (int) ((60 * (minutesPassed < (60 * 7) ? 7 : 31)) - minutesPassed));
    if (index == 1) {
        return new Response("Rest", "Rest for four hours. As well as replenishing your energy and aura, you will also get the 'Well Rested' status effect.", AUNT_HOME_PLAYERS_ROOM_SLEEP) {

            @Override
            public void effects() {
                Main.game.getPlayer().setHealth(Main.game.getPlayer().getAttributeValue(Attribute.HEALTH_MAXIMUM));
                Main.game.getPlayer().setMana(Main.game.getPlayer().getAttributeValue(Attribute.MANA_MAXIMUM));
                Main.game.getPlayer().setLust(0);
                if (Main.game.getPlayer().hasTrait(Perk.JOB_UNEMPLOYED, true)) {
                    Main.game.getPlayer().addStatusEffect(StatusEffect.WELL_RESTED_BOOSTED, (8 * 60) + 240);
                } else {
                    Main.game.getPlayer().addStatusEffect(StatusEffect.WELL_RESTED, (6 * 60) + 240);
                }
            }
        };
    } else if (index == 2) {
        return new Response("Rest until " + (Main.game.isDayTime() ? "Evening" : "Morning"), "Rest for " + (sleepTimer >= 60 ? sleepTimer / 60 + " hours " : " ") + (sleepTimer % 60 != 0 ? sleepTimer % 60 + " minutes" : "") + " until " + (Main.game.isDayTime() ? "evening (21:00)." : "morning (07:00).") + " As well as replenishing your energy and aura, you will also get the 'Well Rested' status effect.", AUNT_HOME_PLAYERS_ROOM_SLEEP_LONG) {

            @Override
            public void effects() {
                Main.game.getPlayer().setHealth(Main.game.getPlayer().getAttributeValue(Attribute.HEALTH_MAXIMUM));
                Main.game.getPlayer().setMana(Main.game.getPlayer().getAttributeValue(Attribute.MANA_MAXIMUM));
                Main.game.getPlayer().setLust(0);
                if (Main.game.getPlayer().hasTrait(Perk.JOB_UNEMPLOYED, true)) {
                    Main.game.getPlayer().addStatusEffect(StatusEffect.WELL_RESTED_BOOSTED, (8 * 60) + sleepTimer);
                } else {
                    Main.game.getPlayer().addStatusEffect(StatusEffect.WELL_RESTED, (6 * 60) + sleepTimer);
                }
            }
        };
    } else if (index == 3) {
        return new Response("Wash", "Use your room's en-suite to take a bath or shower. Rose will come and clean your clothes while you wash yourself.", AUNT_HOME_PLAYERS_ROOM_WASH) {

            @Override
            public void effects() {
                Main.game.getPlayer().setHealth(Main.game.getPlayer().getAttributeValue(Attribute.HEALTH_MAXIMUM));
                Main.game.getPlayer().setMana(Main.game.getPlayer().getAttributeValue(Attribute.MANA_MAXIMUM));
                Set<OrificeType> dirtyOrifices = new HashSet<>();
                for (Entry<OrificeType, Integer> entry : Main.game.getPlayer().getCummedInAreaMap().entrySet()) {
                    if (entry.getValue() > 0) {
                        dirtyOrifices.add(entry.getKey());
                    }
                }
                Main.game.getPlayer().washAllOrifices();
                Main.game.getPlayer().calculateStatusEffects(0);
                Main.game.getPlayer().cleanAllDirtySlots();
                Main.game.getPlayer().cleanAllClothing();
                for (OrificeType orifice : OrificeType.values()) {
                    if (dirtyOrifices.contains(orifice)) {
                        switch(orifice) {
                            case ANUS:
                                if (Main.game.getPlayer().getCummedInAreaMap().get(orifice) > 0) {
                                    Main.game.getTextEndStringBuilder().append(formatWashingArea(false, "You wash as much of the cum out of your [pc.asshole] as you can, but there's so much in there that you're unable to fully clean it all out!"));
                                } else {
                                    Main.game.getTextEndStringBuilder().append(formatWashingArea(true, "You wash all of the cum out of your [pc.asshole]."));
                                }
                                break;
                            case ASS:
                                if (Main.game.getPlayer().getCummedInAreaMap().get(orifice) > 0) {
                                    Main.game.getTextEndStringBuilder().append(formatWashingArea(false, "You wash as much of the cum off of your [pc.ass] as you can, but there's so much that's covering it, that you're unable to fully clean yourself!"));
                                } else {
                                    Main.game.getTextEndStringBuilder().append(formatWashingArea(true, "You wash all of the cum off of your [pc.ass]."));
                                }
                                break;
                            case BREAST:
                                if (Main.game.getPlayer().getCummedInAreaMap().get(orifice) > 0) {
                                    Main.game.getTextEndStringBuilder().append(formatWashingArea(false, "You wash as much of the cum off of your [pc.breasts] as you can, but there's so much that's covering it, that you're unable to fully clean yourself!"));
                                } else {
                                    Main.game.getTextEndStringBuilder().append(formatWashingArea(true, "You wash all of the cum off of your [pc.breasts]."));
                                }
                                break;
                            case MOUTH:
                                if (Main.game.getPlayer().getCummedInAreaMap().get(orifice) > 0) {
                                    Main.game.getTextEndStringBuilder().append(formatWashingArea(false, "The shower does nothing to clean the cum out of your stomach!"));
                                }
                                break;
                            case NIPPLE:
                                if (Main.game.getPlayer().getCummedInAreaMap().get(orifice) > 0) {
                                    Main.game.getTextEndStringBuilder().append(formatWashingArea(false, "You wash as much of the cum out of your [pc.nipples] as you can, but there's so much in there that you're unable to fully clean it all out!"));
                                } else {
                                    Main.game.getTextEndStringBuilder().append(formatWashingArea(true, "You wash all of the cum out of your [pc.nipples]."));
                                }
                                break;
                            case THIGHS:
                                if (Main.game.getPlayer().getCummedInAreaMap().get(orifice) > 0) {
                                    Main.game.getTextEndStringBuilder().append(formatWashingArea(false, "You wash as much of the cum off of your [pc.thighs] as you can, but there's so much that's covering it, that you're unable to fully clean yourself!"));
                                } else {
                                    Main.game.getTextEndStringBuilder().append(formatWashingArea(true, "You wash all of the cum off of your [pc.thighs]."));
                                }
                                break;
                            case URETHRA:
                                if (Main.game.getPlayer().getCummedInAreaMap().get(orifice) > 0) {
                                    Main.game.getTextEndStringBuilder().append(formatWashingArea(false, "You wash as much of the cum out of your urethra as you can, but there's so much in there that you're unable to fully clean it all out!"));
                                } else {
                                    Main.game.getTextEndStringBuilder().append(formatWashingArea(true, "You wash all of the cum out of your urethra."));
                                }
                                break;
                            case VAGINA:
                                if (Main.game.getPlayer().getCummedInAreaMap().get(orifice) > 0) {
                                    Main.game.getTextEndStringBuilder().append(formatWashingArea(false, "You wash as much of the cum out of your [pc.pussy] as you can, but there's so much in there that you're unable to fully clean it all out!"));
                                } else {
                                    Main.game.getTextEndStringBuilder().append(formatWashingArea(true, "You wash all of the cum out of your [pc.pussy]."));
                                }
                                break;
                        }
                    }
                }
                Main.game.getTextEndStringBuilder().append("<p>" + "<b style='color:" + Colour.GENERIC_GOOD.toWebHexString() + ";'>Your clothes have been cleaned, and you feel refreshed!</b>" + "</p>");
            }
        };
    } else if (index == 4) {
        if (Main.game.getDialogueFlags().values.contains(DialogueFlagValue.knowsDate)) {
            return new Response("Calendar", "Take another look at the enchanted calendar that's pinned up on one wall.", AUNT_HOME_PLAYERS_ROOM_CALENDAR);
        } else {
            return new Response("<span style='color:" + Colour.GENERIC_EXCELLENT.toWebHexString() + ";'>Calendar</span>", "There's a calendar pinned up on one wall. Take a closer look at it.", AUNT_HOME_PLAYERS_ROOM_CALENDAR);
        }
    } else if (index == 6) {
        return new ResponseEffectsOnly("Entrance hall", "Fast travel down to the entrance hall.") {

            @Override
            public void effects() {
                Main.game.setActiveWorld(Main.game.getWorlds().get(WorldType.LILAYAS_HOUSE_GROUND_FLOOR), PlaceType.LILAYA_HOME_ENTRANCE_HALL, true);
            }
        };
    } else if (index == 7) {
        return new ResponseEffectsOnly("Lilaya's Lab", "Fast travel down to Lilaya's laboratory.") {

            @Override
            public void effects() {
                Main.game.setActiveWorld(Main.game.getWorlds().get(WorldType.LILAYAS_HOUSE_GROUND_FLOOR), PlaceType.LILAYA_HOME_LAB, true);
            }
        };
    } else {
        return null;
    }
}
Also used : Response(com.lilithsthrone.game.dialogue.responses.Response) OrificeType(com.lilithsthrone.game.sex.OrificeType) ResponseEffectsOnly(com.lilithsthrone.game.dialogue.responses.ResponseEffectsOnly) HashSet(java.util.HashSet)

Example 7 with OrificeType

use of com.lilithsthrone.game.sex.OrificeType in project liliths-throne-public by Innoxia.

the class SexManagerDefault method getPartnerSexAction.

/**
 * New:</br>
 * - Get accessible areas</br>
 * - Choose foreplay & main sex</br>
 * - Choose positions for each</br>
 * - Clothing for foreplay</br>
 * - position</br>
 * - foreplay (self-actions take minimum priority)</br>
 * - clothing for main</br>
 * - position</br>
 * - main (self-actions take minimum priority)</br>
 * - orgasm
 */
@Override
public SexActionInterface getPartnerSexAction(SexActionInterface sexActionPlayer) {
    possibleActions.clear();
    bannedActions.clear();
    List<SexActionInterface> availableActions = Sex.getAvailableSexActionsPartner();
    if (Sex.getActivePartner().getArousal() >= ArousalLevel.FIVE_ORGASM_IMMINENT.getMaximumValue() && SexFlags.playerPreparedForOrgasm) {
        List<SexActionInterface> priorityOrgasms = new ArrayList<>();
        for (SexActionInterface action : availableActions) {
            for (GameCharacter character : Sex.getAllParticipants()) {
                if (action.getAreasCummedIn(Sex.getActivePartner(), character) != null) {
                    if ((action.getAreasCummedIn(Sex.getActivePartner(), character).contains(OrificeType.VAGINA) && (Sex.getActivePartner().hasFetish(Fetish.FETISH_IMPREGNATION) || Sex.getActivePartner().hasFetish(Fetish.FETISH_SEEDER))) || SexFlags.playerRequestedCreampie) {
                        priorityOrgasms.add(action);
                    } else if (SexFlags.playerRequestedPullOut && (Sex.isConsensual() || Sex.isSubHasEqualControl())) {
                        priorityOrgasms.add(action);
                    }
                }
                if (action.getAreasCummedIn(character, Sex.getActivePartner()) != null) {
                    if ((action.getAreasCummedIn(character, Sex.getActivePartner()).contains(OrificeType.VAGINA) && (Sex.getActivePartner().hasFetish(Fetish.FETISH_PREGNANCY) || Sex.getActivePartner().hasFetish(Fetish.FETISH_BROODMOTHER)))) {
                        priorityOrgasms.add(action);
                    }
                }
            }
        }
        if (!priorityOrgasms.isEmpty()) {
            return priorityOrgasms.get(Util.random.nextInt(priorityOrgasms.size()));
        } else {
            return availableActions.get(Util.random.nextInt(availableActions.size()));
        }
    }
    // If the partner is resisting, they will not want to remove any clothing, and will instead simply use an available option. (Which will be a SUB_RESIST or neutral pace one.)
    if (Sex.getSexPace(Sex.getActivePartner()) == SexPace.SUB_RESISTING) {
        possibleActions.addAll(Sex.getAvailableSexActionsPartner());
        if (!possibleActions.isEmpty()) {
            return possibleActions.get(Util.random.nextInt(possibleActions.size()));
        } else {
            return SexActionUtility.PARTNER_NONE;
        }
    }
    if (!Sex.getActivePartner().getSexPositionPreferences().contains(Sex.getSexPositionSlot(Sex.getActivePartner()))) {
        for (SexActionInterface action : availableActions) {
            if (action.getActionType() == SexActionType.PARTNER_POSITIONING) {
                possibleActions.add(action);
            }
        }
        // Choose a random position:
        if (!possibleActions.isEmpty()) {
            // }
            return possibleActions.get(Util.random.nextInt(possibleActions.size()));
        }
    } else {
        for (SexActionInterface action : availableActions) {
            if (action.getActionType() == SexActionType.PARTNER_POSITIONING) {
                bannedActions.add(action);
            }
        }
    }
    // Skip over remove clothing if action is of HIGH or MAX priority
    if (Sex.getAvailableSexActionsPartner().get(0).getPriority() != SexActionPriority.HIGH && Sex.getAvailableSexActionsPartner().get(0).getPriority() != SexActionPriority.UNIQUE_MAX) {
        List<CoverableArea> playerAreasToBeExposed = new ArrayList<>();
        List<CoverableArea> partnerAreasToBeExposed = new ArrayList<>();
        if (Sex.isInForeplay()) {
            if (Sex.getActivePartner().getForeplayPreference() != null) {
                PenetrationType pen = Sex.getActivePartner().getForeplayPreference().getPenetrationType();
                SexParticipantType participantType = Sex.getActivePartner().getForeplayPreference().getAsParticipant();
                if (participantType == SexParticipantType.CATCHER) {
                    if (pen == PenetrationType.PENIS && !Main.game.getPlayer().isCoverableAreaExposed(CoverableArea.PENIS) && Main.game.getPlayer().isAbleToAccessCoverableArea(CoverableArea.PENIS, true)) {
                        playerAreasToBeExposed.add(CoverableArea.PENIS);
                    } else if (pen == PenetrationType.TONGUE && !Main.game.getPlayer().isCoverableAreaExposed(CoverableArea.MOUTH) && Main.game.getPlayer().isAbleToAccessCoverableArea(CoverableArea.MOUTH, true)) {
                        playerAreasToBeExposed.add(CoverableArea.MOUTH);
                    }
                } else {
                    if (pen == PenetrationType.PENIS && !Sex.getActivePartner().isCoverableAreaExposed(CoverableArea.PENIS) && Sex.getActivePartner().isAbleToAccessCoverableArea(CoverableArea.PENIS, true)) {
                        partnerAreasToBeExposed.add(CoverableArea.PENIS);
                    } else if (pen == PenetrationType.TONGUE && !Sex.getActivePartner().isCoverableAreaExposed(CoverableArea.MOUTH) && Sex.getActivePartner().isAbleToAccessCoverableArea(CoverableArea.MOUTH, true)) {
                        partnerAreasToBeExposed.add(CoverableArea.MOUTH);
                    }
                }
                OrificeType orifice = Sex.getActivePartner().getForeplayPreference().getOrificeType();
                if (participantType == SexParticipantType.PITCHER) {
                    if (orifice == OrificeType.ANUS && !Main.game.getPlayer().isCoverableAreaExposed(CoverableArea.ANUS) && Main.game.getPlayer().isAbleToAccessCoverableArea(CoverableArea.ANUS, true)) {
                        playerAreasToBeExposed.add(CoverableArea.ANUS);
                    } else if ((orifice == OrificeType.BREAST || orifice == OrificeType.NIPPLE) && !Main.game.getPlayer().isCoverableAreaExposed(CoverableArea.NIPPLES) && Main.game.getPlayer().isAbleToAccessCoverableArea(CoverableArea.NIPPLES, true)) {
                        playerAreasToBeExposed.add(CoverableArea.NIPPLES);
                    } else if (orifice == OrificeType.MOUTH && !Main.game.getPlayer().isCoverableAreaExposed(CoverableArea.MOUTH) && Main.game.getPlayer().isAbleToAccessCoverableArea(CoverableArea.MOUTH, true)) {
                        playerAreasToBeExposed.add(CoverableArea.MOUTH);
                    } else if (orifice == OrificeType.URETHRA && !Main.game.getPlayer().isCoverableAreaExposed(CoverableArea.PENIS) && Main.game.getPlayer().isAbleToAccessCoverableArea(CoverableArea.PENIS, true)) {
                        playerAreasToBeExposed.add(CoverableArea.PENIS);
                    } else if (orifice == OrificeType.VAGINA && !Main.game.getPlayer().isCoverableAreaExposed(CoverableArea.VAGINA) && Main.game.getPlayer().isAbleToAccessCoverableArea(CoverableArea.VAGINA, true)) {
                        playerAreasToBeExposed.add(CoverableArea.VAGINA);
                    }
                } else {
                    if (orifice == OrificeType.ANUS && !Sex.getActivePartner().isCoverableAreaExposed(CoverableArea.ANUS) && Sex.getActivePartner().isAbleToAccessCoverableArea(CoverableArea.ANUS, true)) {
                        partnerAreasToBeExposed.add(CoverableArea.ANUS);
                    } else if ((orifice == OrificeType.BREAST || orifice == OrificeType.NIPPLE) && !Sex.getActivePartner().isCoverableAreaExposed(CoverableArea.NIPPLES) && Sex.getActivePartner().isAbleToAccessCoverableArea(CoverableArea.NIPPLES, true)) {
                        partnerAreasToBeExposed.add(CoverableArea.NIPPLES);
                    } else if (orifice == OrificeType.MOUTH && !Sex.getActivePartner().isCoverableAreaExposed(CoverableArea.MOUTH) && Sex.getActivePartner().isAbleToAccessCoverableArea(CoverableArea.MOUTH, true)) {
                        partnerAreasToBeExposed.add(CoverableArea.MOUTH);
                    } else if (orifice == OrificeType.URETHRA && !Sex.getActivePartner().isCoverableAreaExposed(CoverableArea.PENIS) && Sex.getActivePartner().isAbleToAccessCoverableArea(CoverableArea.PENIS, true)) {
                        partnerAreasToBeExposed.add(CoverableArea.PENIS);
                    } else if (orifice == OrificeType.VAGINA && !Sex.getActivePartner().isCoverableAreaExposed(CoverableArea.VAGINA) && Sex.getActivePartner().isAbleToAccessCoverableArea(CoverableArea.VAGINA, true)) {
                        partnerAreasToBeExposed.add(CoverableArea.VAGINA);
                    }
                }
            } else {
                if (playerAreasToBeExposed.isEmpty()) {
                    // }
                    if (!Main.game.getPlayer().isCoverableAreaExposed(CoverableArea.NIPPLES) && Main.game.getPlayer().isAbleToAccessCoverableArea(CoverableArea.NIPPLES, true)) {
                        playerAreasToBeExposed.add(CoverableArea.NIPPLES);
                    } else if (!Main.game.getPlayer().isCoverableAreaExposed(CoverableArea.MOUTH) && Main.game.getPlayer().isAbleToAccessCoverableArea(CoverableArea.MOUTH, true)) {
                        playerAreasToBeExposed.add(CoverableArea.MOUTH);
                    }
                }
                if (partnerAreasToBeExposed.isEmpty()) {
                    // }
                    if (!Sex.getActivePartner().isCoverableAreaExposed(CoverableArea.NIPPLES) && Sex.getActivePartner().isAbleToAccessCoverableArea(CoverableArea.NIPPLES, true)) {
                        partnerAreasToBeExposed.add(CoverableArea.NIPPLES);
                    } else if (!Sex.getActivePartner().isCoverableAreaExposed(CoverableArea.MOUTH) && Sex.getActivePartner().isAbleToAccessCoverableArea(CoverableArea.MOUTH, true)) {
                        partnerAreasToBeExposed.add(CoverableArea.MOUTH);
                    }
                }
            }
        } else {
            if (Sex.getActivePartner().getMainSexPreference() != null) {
                PenetrationType pen = Sex.getActivePartner().getMainSexPreference().getPenetrationType();
                SexParticipantType participantType = Sex.getActivePartner().getMainSexPreference().getAsParticipant();
                if (participantType == SexParticipantType.CATCHER) {
                    if (pen == PenetrationType.PENIS && !Main.game.getPlayer().isCoverableAreaExposed(CoverableArea.PENIS) && Main.game.getPlayer().isAbleToAccessCoverableArea(CoverableArea.PENIS, true)) {
                        playerAreasToBeExposed.add(CoverableArea.PENIS);
                    } else if (pen == PenetrationType.TONGUE && !Main.game.getPlayer().isCoverableAreaExposed(CoverableArea.MOUTH) && Main.game.getPlayer().isAbleToAccessCoverableArea(CoverableArea.MOUTH, true)) {
                        playerAreasToBeExposed.add(CoverableArea.MOUTH);
                    }
                } else {
                    if (pen == PenetrationType.PENIS && !Sex.getActivePartner().isCoverableAreaExposed(CoverableArea.PENIS) && Sex.getActivePartner().isAbleToAccessCoverableArea(CoverableArea.PENIS, true)) {
                        partnerAreasToBeExposed.add(CoverableArea.PENIS);
                    } else if (pen == PenetrationType.TONGUE && !Sex.getActivePartner().isCoverableAreaExposed(CoverableArea.MOUTH) && Sex.getActivePartner().isAbleToAccessCoverableArea(CoverableArea.MOUTH, true)) {
                        partnerAreasToBeExposed.add(CoverableArea.MOUTH);
                    }
                }
                OrificeType orifice = Sex.getActivePartner().getMainSexPreference().getOrificeType();
                if (participantType == SexParticipantType.PITCHER) {
                    if (orifice == OrificeType.ANUS && !Main.game.getPlayer().isCoverableAreaExposed(CoverableArea.ANUS) && Main.game.getPlayer().isAbleToAccessCoverableArea(CoverableArea.ANUS, true)) {
                        playerAreasToBeExposed.add(CoverableArea.ANUS);
                    } else if ((orifice == OrificeType.BREAST || orifice == OrificeType.NIPPLE) && !Main.game.getPlayer().isCoverableAreaExposed(CoverableArea.NIPPLES) && Main.game.getPlayer().isAbleToAccessCoverableArea(CoverableArea.NIPPLES, true)) {
                        playerAreasToBeExposed.add(CoverableArea.NIPPLES);
                    } else if (orifice == OrificeType.MOUTH && !Main.game.getPlayer().isCoverableAreaExposed(CoverableArea.MOUTH) && Main.game.getPlayer().isAbleToAccessCoverableArea(CoverableArea.MOUTH, true)) {
                        playerAreasToBeExposed.add(CoverableArea.MOUTH);
                    } else if (orifice == OrificeType.URETHRA && !Main.game.getPlayer().isCoverableAreaExposed(CoverableArea.PENIS) && Main.game.getPlayer().isAbleToAccessCoverableArea(CoverableArea.PENIS, true)) {
                        playerAreasToBeExposed.add(CoverableArea.PENIS);
                    } else if (orifice == OrificeType.VAGINA && !Main.game.getPlayer().isCoverableAreaExposed(CoverableArea.VAGINA) && Main.game.getPlayer().isAbleToAccessCoverableArea(CoverableArea.VAGINA, true)) {
                        playerAreasToBeExposed.add(CoverableArea.VAGINA);
                    }
                } else {
                    if (orifice == OrificeType.ANUS && !Sex.getActivePartner().isCoverableAreaExposed(CoverableArea.ANUS) && Sex.getActivePartner().isAbleToAccessCoverableArea(CoverableArea.ANUS, true)) {
                        partnerAreasToBeExposed.add(CoverableArea.ANUS);
                    } else if ((orifice == OrificeType.BREAST || orifice == OrificeType.NIPPLE) && !Sex.getActivePartner().isCoverableAreaExposed(CoverableArea.NIPPLES) && Sex.getActivePartner().isAbleToAccessCoverableArea(CoverableArea.NIPPLES, true)) {
                        partnerAreasToBeExposed.add(CoverableArea.NIPPLES);
                    } else if (orifice == OrificeType.MOUTH && !Sex.getActivePartner().isCoverableAreaExposed(CoverableArea.MOUTH) && Sex.getActivePartner().isAbleToAccessCoverableArea(CoverableArea.MOUTH, true)) {
                        partnerAreasToBeExposed.add(CoverableArea.MOUTH);
                    } else if (orifice == OrificeType.URETHRA && !Sex.getActivePartner().isCoverableAreaExposed(CoverableArea.PENIS) && Sex.getActivePartner().isAbleToAccessCoverableArea(CoverableArea.PENIS, true)) {
                        partnerAreasToBeExposed.add(CoverableArea.PENIS);
                    } else if (orifice == OrificeType.VAGINA && !Sex.getActivePartner().isCoverableAreaExposed(CoverableArea.VAGINA) && Sex.getActivePartner().isAbleToAccessCoverableArea(CoverableArea.VAGINA, true)) {
                        partnerAreasToBeExposed.add(CoverableArea.VAGINA);
                    }
                }
            }
            // else {
            if (playerAreasToBeExposed.isEmpty()) {
                // } else
                if (Main.game.getPlayer().hasPenis() && !Main.game.getPlayer().isCoverableAreaExposed(CoverableArea.PENIS) && Main.game.getPlayer().isAbleToAccessCoverableArea(CoverableArea.PENIS, true)) {
                    playerAreasToBeExposed.add(CoverableArea.PENIS);
                } else if (Main.game.getPlayer().hasVagina() && !Main.game.getPlayer().isCoverableAreaExposed(CoverableArea.VAGINA) && Main.game.getPlayer().isAbleToAccessCoverableArea(CoverableArea.VAGINA, true)) {
                    playerAreasToBeExposed.add(CoverableArea.VAGINA);
                }
            // else if(!Main.game.getPlayer().isCoverableAreaExposed(CoverableArea.NIPPLES) && Main.game.getPlayer().isAbleToAccessCoverableArea(CoverableArea.NIPPLES, true)) {
            // playerAreasToBeExposed.add(CoverableArea.NIPPLES);
            // } else if(!Main.game.getPlayer().isCoverableAreaExposed(CoverableArea.MOUTH) && Main.game.getPlayer().isAbleToAccessCoverableArea(CoverableArea.MOUTH, true)) {
            // playerAreasToBeExposed.add(CoverableArea.MOUTH);
            // }
            }
            if (partnerAreasToBeExposed.isEmpty()) {
                // } else
                if (Sex.getActivePartner().hasPenis() && !Sex.getActivePartner().isCoverableAreaExposed(CoverableArea.PENIS) && Sex.getActivePartner().isAbleToAccessCoverableArea(CoverableArea.PENIS, true)) {
                    partnerAreasToBeExposed.add(CoverableArea.PENIS);
                } else if (Sex.getActivePartner().hasVagina() && !Sex.getActivePartner().isCoverableAreaExposed(CoverableArea.VAGINA) && Sex.getActivePartner().isAbleToAccessCoverableArea(CoverableArea.VAGINA, true)) {
                    partnerAreasToBeExposed.add(CoverableArea.VAGINA);
                }
            // else if(!Sex.getPartner().isCoverableAreaExposed(CoverableArea.NIPPLES) && Sex.getPartner().isAbleToAccessCoverableArea(CoverableArea.NIPPLES, true)) {
            // partnerAreasToBeExposed.add(CoverableArea.NIPPLES);
            // } else if(!Sex.getPartner().isCoverableAreaExposed(CoverableArea.MOUTH) && Sex.getPartner().isAbleToAccessCoverableArea(CoverableArea.MOUTH, true)) {
            // partnerAreasToBeExposed.add(CoverableArea.MOUTH);
            // }
            }
        // }
        }
        if (!partnerAreasToBeExposed.isEmpty() && Sex.isCanRemoveSelfClothing(Sex.getActivePartner())) {
            Collections.shuffle(partnerAreasToBeExposed);
            if (partnerAreasToBeExposed.get(0) == CoverableArea.MOUND) {
                return Sex.partnerManageClothingToAccessCoverableArea(false, CoverableArea.VAGINA);
            } else {
                return Sex.partnerManageClothingToAccessCoverableArea(false, partnerAreasToBeExposed.get(0));
            }
        }
        if (!playerAreasToBeExposed.isEmpty() && Sex.isCanRemoveOthersClothing(Sex.getActivePartner())) {
            Collections.shuffle(playerAreasToBeExposed);
            if (playerAreasToBeExposed.get(0) == CoverableArea.MOUND) {
                return Sex.partnerManageClothingToAccessCoverableArea(true, CoverableArea.VAGINA);
            } else {
                return Sex.partnerManageClothingToAccessCoverableArea(true, playerAreasToBeExposed.get(0));
            }
        }
    }
    // Ban all penetrations if the partner is a virgin in the associated orifice:
    for (SexActionInterface action : availableActions) {
        // TODO
        if (action.getAssociatedOrificeType() != null && action.getActionType() == SexActionType.PARTNER_PENETRATION && action.getParticipantType().isUsingSelfOrificeType()) {
            switch(action.getAssociatedOrificeType()) {
                case ANUS:
                    if (Sex.getActivePartner().isAssVirgin() && Sex.getSexPace(Sex.getActivePartner()) != SexPace.SUB_EAGER) {
                        bannedActions.add(action);
                    }
                    break;
                case MOUTH:
                    if (Sex.getActivePartner().isFaceVirgin() && Sex.getSexPace(Sex.getActivePartner()) != SexPace.SUB_EAGER) {
                        bannedActions.add(action);
                    }
                    break;
                case NIPPLE:
                    if (Sex.getActivePartner().isNippleVirgin() && Sex.getSexPace(Sex.getActivePartner()) != SexPace.SUB_EAGER) {
                        bannedActions.add(action);
                    }
                    break;
                case URETHRA:
                    if (Sex.getActivePartner().isUrethraVirgin() && Sex.getSexPace(Sex.getActivePartner()) != SexPace.SUB_EAGER) {
                        bannedActions.add(action);
                    }
                    break;
                case VAGINA:
                    if (Sex.getActivePartner().hasStatusEffect(StatusEffect.FETISH_PURE_VIRGIN) || Sex.getActivePartner().hasStatusEffect(StatusEffect.FETISH_PURE_VIRGIN_LUSTY_MAIDEN) || (Sex.getActivePartner().isVaginaVirgin() && Sex.getSexPace(Sex.getActivePartner()) != SexPace.SUB_EAGER)) {
                        bannedActions.add(action);
                    }
                    break;
                default:
                    break;
            }
        }
    }
    // --- Priority 6 | Perform actions based on foreplay or sex ---
    // Perform foreplay action if arousal is < 25 and haven't orgasmed yet:
    SexAction actionToPerform = null;
    if (Sex.isInForeplay()) {
        actionToPerform = performForeplayAction(sexActionPlayer);
        if (actionToPerform != null) {
            return actionToPerform;
        }
    } else {
        actionToPerform = performSexAction(sexActionPlayer);
        if (actionToPerform != null) {
            return actionToPerform;
        }
    }
    // --- Priority 7 using other options at random ---
    possibleActions.addAll(availableActions);
    possibleActions.removeAll(bannedActions);
    if (!possibleActions.isEmpty()) {
        return possibleActions.get(Util.random.nextInt(possibleActions.size()));
    }
    // Priority 9 (last resort):
    return SexActionUtility.PARTNER_NONE;
}
Also used : CoverableArea(com.lilithsthrone.game.character.body.CoverableArea) OrificeType(com.lilithsthrone.game.sex.OrificeType) ArrayList(java.util.ArrayList) GameCharacter(com.lilithsthrone.game.character.GameCharacter) SexActionInterface(com.lilithsthrone.game.sex.sexActions.SexActionInterface) SexAction(com.lilithsthrone.game.sex.sexActions.SexAction) PenetrationType(com.lilithsthrone.game.sex.PenetrationType) SexParticipantType(com.lilithsthrone.game.sex.SexParticipantType)

Example 8 with OrificeType

use of com.lilithsthrone.game.sex.OrificeType in project liliths-throne-public by Innoxia.

the class SexManagerDefault method performSexAction.

// private boolean removedAllPenetrationAfterForeplay = false;
private SexAction performSexAction(SexActionInterface sexActionPlayer) {
    List<SexActionInterface> availableActions = Sex.getAvailableSexActionsPartner();
    if (sexActionPlayer.getActionType() == SexActionType.PLAYER_STOP_PENETRATION || sexActionPlayer.equals(GenericActions.PLAYER_FORBID_PARTNER_SELF) || sexActionPlayer.equals(GenericActions.PLAYER_STOP_PARTNER_SELF) || sexActionPlayer.equals(GenericActions.PLAYER_STOP_ALL_PENETRATIONS)) {
        availableActions.removeIf(sexAction -> sexAction.getActionType() == SexActionType.PARTNER_PENETRATION);
    }
    bannedActions.add(PartnerSelfFingerMouth.PARTNER_SELF_FINGER_MOUTH_PENETRATION);
    availableActions.removeAll(bannedActions);
    List<SexActionInterface> returnableActions = new ArrayList<>();
    boolean isSexPenetration = false;
    boolean isSexPenetrationPossible = Sex.getActivePartner().hasPenis() || Sex.getActivePartner().getTailType().isSuitableForPenetration() || Main.game.getPlayer().hasPenis() || Main.game.getPlayer().getTailType().isSuitableForPenetration();
    // Is any sexual penetration happening:
    outerloop: for (GameCharacter penetrator : Sex.getAllParticipants()) {
        for (GameCharacter penetrated : Sex.getAllParticipants()) {
            if ((penetrator.equals(Sex.getActivePartner()) || penetrated.equals(Sex.getActivePartner())) && !penetrator.equals(penetrated)) {
                for (Entry<PenetrationType, Set<OrificeType>> e : Sex.getOngoingPenetrationMap(penetrator).get(penetrated).entrySet()) {
                    if (e.getKey().isTakesVirginity()) {
                        isSexPenetration = true;
                        break outerloop;
                    }
                }
            }
        }
    }
    // If there is no real penetration going on:
    if (!isSexPenetration && isSexPenetrationPossible) {
        // --- Stop foreplay actions: ---
        for (SexActionInterface action : availableActions) {
            if (action.getActionType() == SexActionType.PARTNER_STOP_PENETRATION) {
                if (!(action.getAssociatedPenetrationType() == PenetrationType.TONGUE && action.getAssociatedOrificeType() == OrificeType.MOUTH)) {
                    // Don't stop kissing actions:
                    returnableActions.add(action);
                }
            }
        }
        if (returnableActions.size() <= 1) {
            SexFlags.positioningBlockedPartner = false;
        }
        if (!returnableActions.isEmpty()) {
            return (SexAction) returnableActions.get(Util.random.nextInt(returnableActions.size()));
        }
        // Foreplay actions are stopped:
        // If the NPC has a preference, they are more likely to choose actions related to that:
        List<SexActionInterface> penetrativeActionList = new ArrayList<>();
        if (Sex.getActivePartner().getMainSexPreference() != null) {
            List<SexActionInterface> highPriorityList = new ArrayList<>();
            for (SexActionInterface action : availableActions) {
                if (action.getAssociatedOrificeType() == Sex.getActivePartner().getMainSexPreference().getOrificeType() && action.getAssociatedPenetrationType() == Sex.getActivePartner().getMainSexPreference().getPenetrationType() && !action.isPartnerSelfAction() && action.getActionType() != SexActionType.PARTNER_STOP_PENETRATION) {
                    highPriorityList.add(action);
                    if (action.getActionType() == SexActionType.PARTNER_PENETRATION) {
                        // If a penetrative action is in the list, always return that first.
                        penetrativeActionList.add(action);
                    }
                }
            }
            if (penetrativeActionList.isEmpty() && !highPriorityList.isEmpty() && Math.random() < 0.7f) {
                // 70% chance, so that there is some chance of using other actions as well:
                return (SexAction) highPriorityList.get(Util.random.nextInt(highPriorityList.size()));
            }
        }
        // --- Start penetrating: ---
        for (SexActionInterface action : availableActions) {
            if (action.getActionType() == SexActionType.PARTNER_PENETRATION && action.getParticipantType().isUsingSelfPenetrationType()) {
                if (action.getAssociatedPenetrationType() == PenetrationType.PENIS || action.getAssociatedPenetrationType() == PenetrationType.TAIL || action.getAssociatedPenetrationType() == PenetrationType.TAIL) {
                    // Anal penetrations:
                    if ((Sex.getActivePartner().hasFetish(Fetish.FETISH_ANAL_GIVING) || Sex.getPlayerPenetrationRequests().contains(OrificeType.ANUS)) && action.getAssociatedOrificeType() != null && action.getAssociatedOrificeType() == OrificeType.ANUS) {
                        penetrativeActionList.add(action);
                    }
                    // Nipple penetrations:
                    if ((Sex.getActivePartner().hasFetish(Fetish.FETISH_BREASTS_OTHERS) || Sex.getPlayerPenetrationRequests().contains(OrificeType.NIPPLE)) && action.getAssociatedOrificeType() != null && action.getAssociatedOrificeType() == OrificeType.NIPPLE) {
                        penetrativeActionList.add(action);
                    }
                    // Paizuri:
                    if ((Sex.getActivePartner().hasFetish(Fetish.FETISH_BREASTS_OTHERS) || Sex.getPlayerPenetrationRequests().contains(OrificeType.BREAST)) && action.getAssociatedOrificeType() != null && action.getAssociatedOrificeType() == OrificeType.BREAST) {
                        penetrativeActionList.add(action);
                    }
                    // Vaginal penetration on player:
                    if ((Sex.getActivePartner().hasFetish(Fetish.FETISH_IMPREGNATION) || Sex.getActivePartner().hasFetish(Fetish.FETISH_SEEDER) || Sex.getPlayerPenetrationRequests().contains(OrificeType.VAGINA)) && action.getAssociatedOrificeType() != null && action.getAssociatedOrificeType() == OrificeType.VAGINA && action.getAssociatedPenetrationType() != null && action.getAssociatedPenetrationType() == PenetrationType.PENIS) {
                        penetrativeActionList.add(action);
                    }
                    // Vaginal penetration for self:
                    if ((Sex.getActivePartner().hasFetish(Fetish.FETISH_PREGNANCY) || Sex.getActivePartner().hasFetish(Fetish.FETISH_BROODMOTHER)) && action.getAssociatedOrificeType() != null && action.getAssociatedOrificeType() == OrificeType.VAGINA && action.getAssociatedPenetrationType() != null && action.getAssociatedPenetrationType() == PenetrationType.PENIS) {
                        penetrativeActionList.add(action);
                    }
                }
            }
        }
        if (!penetrativeActionList.isEmpty()) {
            return (SexAction) penetrativeActionList.get(Util.random.nextInt(penetrativeActionList.size()));
        }
        for (SexActionInterface action : availableActions) {
            if (action.getActionType() == SexActionType.PARTNER_PENETRATION) {
                if (action.getAssociatedPenetrationType() == PenetrationType.PENIS || action.getAssociatedPenetrationType() == PenetrationType.TAIL) {
                    returnableActions.add(action);
                }
            }
        }
        returnableActions.removeAll(bannedActions);
        if (!returnableActions.isEmpty()) {
            return (SexAction) returnableActions.get(Util.random.nextInt(returnableActions.size()));
        }
    }
    // Ban stop penetration actions:
    for (SexActionInterface action : availableActions) {
        if (action.getActionType() == SexActionType.PARTNER_STOP_PENETRATION) {
            if (action.getAssociatedPenetrationType().isTakesVirginity()) {
                bannedActions.add(action);
            }
        }
    }
    return null;
}
Also used : Entry(java.util.Map.Entry) OrificeType(com.lilithsthrone.game.sex.OrificeType) ArrayList(java.util.ArrayList) GameCharacter(com.lilithsthrone.game.character.GameCharacter) SexActionInterface(com.lilithsthrone.game.sex.sexActions.SexActionInterface) SexAction(com.lilithsthrone.game.sex.sexActions.SexAction)

Example 9 with OrificeType

use of com.lilithsthrone.game.sex.OrificeType in project liliths-throne-public by Innoxia.

the class GenericOrgasms method getGenericPenisOrgasmDescription.

private static String getGenericPenisOrgasmDescription(GameCharacter characterOrgasming, OrgasmCumTarget cumTarget) {
    genericOrgasmSB.setLength(0);
    genericOrgasmSB.append(getPositionPreparation(characterOrgasming));
    GameCharacter characterPenetrated = null;
    OrificeType orificePenetrated = null;
    if (!Sex.getCharactersBeingPenetratedBy(characterOrgasming, PenetrationType.PENIS).isEmpty()) {
        characterPenetrated = Sex.getCharactersBeingPenetratedBy(characterOrgasming, PenetrationType.PENIS).get(0);
        orificePenetrated = Sex.getOrificesBeingPenetratedBy(characterOrgasming, PenetrationType.PENIS, characterPenetrated).get(0);
    }
    if (characterPenetrated == null || cumTarget != OrgasmCumTarget.INSIDE) {
        List<String> modifiers = new ArrayList<>();
        for (PenisModifier mod : PenisModifier.values()) {
            switch(mod) {
                case BARBED:
                    break;
                case BLUNT:
                    break;
                case FLARED:
                    if (characterOrgasming.hasPenisModifier(mod)) {
                        if (characterOrgasming.isPlayer()) {
                            modifiers.add(" The wide, flared head of your [npc1.cock] swells up, and you feel your [npc1.balls+] tightening as you start to cum.");
                        } else {
                            modifiers.add(" The wide, flared head of [npc.name]'s [npc.cock] swells up, and [npc.she] feels [npc.her] [npc.balls+] tightening as [npc.she] starts to cum.");
                        }
                    }
                    break;
                case KNOTTED:
                    if (characterOrgasming.hasPenisModifier(mod)) {
                        if (characterOrgasming.isPlayer()) {
                            modifiers.add(" The thick knot at the base of your [npc1.cock] swells up, and you feel your [npc1.balls+] tightening as you start to cum.");
                        } else {
                            modifiers.add(" The thick knot at the base of [npc.name]'s [npc.cock] swells up, and [npc.she] feels [npc.her] [npc.balls+] tightening as [npc.she] starts to cum.");
                        }
                    }
                    break;
                case PREHENSILE:
                    break;
                case RIBBED:
                    break;
                case SHEATHED:
                    break;
                case TAPERED:
                    break;
                case TENTACLED:
                    if (characterOrgasming.hasPenisModifier(mod)) {
                        if (characterOrgasming.isPlayer()) {
                            modifiers.add(" The little tentacles lining your [npc1.cock] start frantically wriggling, and you feel your [npc1.balls+] tightening as you start to cum.");
                        } else {
                            modifiers.add(" The little tentacles lining [npc.name]'s [npc.cock] start frantically wriggling, and [npc.she] feels [npc.her] [npc.balls+] tightening as [npc.she] starts to cum.");
                        }
                    }
                    break;
                case VEINY:
                    break;
            }
        }
        if (!modifiers.isEmpty()) {
            genericOrgasmSB.append(modifiers.get(Util.random.nextInt(modifiers.size())));
        } else {
            if (characterOrgasming.isPlayer()) {
                genericOrgasmSB.append(" Your [npc1.cock+] twitches, and you feel your [npc1.balls+] tightening as you start to cum.");
            } else {
                genericOrgasmSB.append(" [npc.Name]'s [npc1.cock+] twitches, and [npc.she] feels [npc.her] [npc.balls+] tightening as [npc.she] starts to cum.");
            }
        }
        if (characterPenetrated != null) {
            genericOrgasmSB.append("</br>");
            switch(orificePenetrated) {
                case ANUS:
                    if (characterOrgasming.isPlayer()) {
                        genericOrgasmSB.append("You slide your [npc1.cock+] out of [npc2.name]'s [npc2.asshole+]");
                    } else {
                        if (characterPenetrated.isPlayer()) {
                            genericOrgasmSB.append("[npc1.Name] slides [npc.her] [npc1.cock+] out of your [npc2.asshole+]");
                        } else {
                            genericOrgasmSB.append("[npc1.Name] slides [npc.her] [npc1.cock+] out of [npc2.name]'s [npc2.asshole+]");
                        }
                    }
                    break;
                case ASS:
                    if (characterOrgasming.isPlayer()) {
                        genericOrgasmSB.append("You slide your [npc1.cock+] out from between [npc2.name]'s ass cheeks");
                    } else {
                        if (characterPenetrated.isPlayer()) {
                            genericOrgasmSB.append("[npc1.Name] slides [npc.her] [npc1.cock+] out from between your ass cheeks");
                        } else {
                            genericOrgasmSB.append("[npc1.Name] slides [npc.her] [npc1.cock+] out from between [npc2.name]'s ass cheeks");
                        }
                    }
                    break;
                case BREAST:
                    if (characterOrgasming.isPlayer()) {
                        genericOrgasmSB.append("You slide your [npc1.cock+] out from between [npc2.name]'s [npc2.breasts+]");
                    } else {
                        if (characterPenetrated.isPlayer()) {
                            genericOrgasmSB.append("[npc1.Name] slides [npc.her] [npc1.cock+] out from between your [npc2.breasts+]");
                        } else {
                            genericOrgasmSB.append("[npc1.Name] slides [npc.her] [npc1.cock+] out from between [npc2.name]'s [npc2.breasts+]");
                        }
                    }
                    break;
                case MOUTH:
                    if (characterOrgasming.isPlayer()) {
                        genericOrgasmSB.append("You slide your [npc1.cock+] out of [npc2.name]'s mouth");
                    } else {
                        if (characterPenetrated.isPlayer()) {
                            genericOrgasmSB.append("[npc1.Name] slides [npc.her] [npc1.cock+] out of your mouth");
                        } else {
                            genericOrgasmSB.append("[npc1.Name] slides [npc.her] [npc1.cock+] out of [npc2.name]'s mouth");
                        }
                    }
                    break;
                case NIPPLE:
                    if (characterOrgasming.isPlayer()) {
                        genericOrgasmSB.append("You slide your [npc1.cock+] out of [npc2.name]'s [npc2.nipple+]");
                    } else {
                        if (characterPenetrated.isPlayer()) {
                            genericOrgasmSB.append("[npc1.Name] slides [npc.her] [npc1.cock+] out of your [npc2.nipple+]");
                        } else {
                            genericOrgasmSB.append("[npc1.Name] slides [npc.her] [npc1.cock+] out of [npc2.name]'s [npc2.nipple+]");
                        }
                    }
                    break;
                case THIGHS:
                    if (characterOrgasming.isPlayer()) {
                        genericOrgasmSB.append("You slide your [npc1.cock+] out from between [npc2.name]'s thighs");
                    } else {
                        if (characterPenetrated.isPlayer()) {
                            genericOrgasmSB.append("[npc1.Name] slides [npc.her] [npc1.cock+] out from between your thighs");
                        } else {
                            genericOrgasmSB.append("[npc1.Name] slides [npc.her] [npc1.cock+] out from between [npc2.name]'s thighs");
                        }
                    }
                    break;
                case URETHRA:
                    if (characterOrgasming.isPlayer()) {
                        genericOrgasmSB.append("You slide your [npc1.cock+] out of [npc2.name]'s [npc2.urethra+]");
                    } else {
                        if (characterPenetrated.isPlayer()) {
                            genericOrgasmSB.append("[npc1.Name] slides [npc.her] [npc1.cock+] out of your [npc2.urethra+]");
                        } else {
                            genericOrgasmSB.append("[npc1.Name] slides [npc.her] [npc1.cock+] out of [npc2.name]'s [npc2.urethra+]");
                        }
                    }
                    break;
                case VAGINA:
                    if (characterOrgasming.isPlayer()) {
                        genericOrgasmSB.append("You slide your [npc1.cock+] out of [npc2.name]'s [npc2.pussy+]");
                    } else {
                        if (characterPenetrated.isPlayer()) {
                            genericOrgasmSB.append("[npc1.Name] slides [npc.her] [npc1.cock+] out of your [npc2.pussy+]");
                        } else {
                            genericOrgasmSB.append("[npc1.Name] slides [npc.her] [npc1.cock+] out of [npc2.name]'s [npc2.pussy+]");
                        }
                    }
                    break;
                default:
                    break;
            }
            if (!characterOrgasming.getPenisModifiers().isEmpty()) {
                switch(characterOrgasming.getPenisModifiers().get(Util.random.nextInt(characterOrgasming.getPenisModifiers().size()))) {
                    case BARBED:
                        if (characterOrgasming.isPlayer()) {
                            genericOrgasmSB.append(", before reaching down and sliding your [pc.hand] up and down over your sensitive little barbs.");
                        } else {
                            genericOrgasmSB.append(", before reaching down and sliding [npc1.her] [npc1.hand] up and down over [npc1.her] sensitive little barbs.");
                        }
                        break;
                    case BLUNT:
                        if (characterOrgasming.isPlayer()) {
                            genericOrgasmSB.append(", before reaching down and starting to furiously masturbate; your [pc.hand] running up the length of your [pc.cock] to rub and tease your blunt head.");
                        } else {
                            genericOrgasmSB.append(", before reaching down and starting to furiously masturbate; [npc1.her] [npc1.hand] running up the length of [npc1.her] [npc1.cock] to rub and tease [npc1.her] blunt head.");
                        }
                        break;
                    case FLARED:
                        if (characterOrgasming.isPlayer()) {
                            genericOrgasmSB.append(", before reaching down and starting to furiously masturbate; your [pc.hand] running up the length of your [pc.cock] to rub and tease your wide, flared head.");
                        } else {
                            genericOrgasmSB.append(", before reaching down and starting to furiously masturbate; [npc1.her] [npc1.hand] running up the length of [npc1.her] [npc1.cock] to rub and tease [npc1.her] wide, flared head.");
                        }
                        break;
                    case KNOTTED:
                        if (characterOrgasming.isPlayer()) {
                            genericOrgasmSB.append(", before reaching down and starting to furiously masturbate; your [pc.hand] sliding down the length of your [pc.cock] to grip and rub at your swollen knot.");
                        } else {
                            genericOrgasmSB.append(", before reaching down and starting to furiously masturbate; [npc1.her] [npc1.hand] sliding down the length of [npc1.her] [npc1.cock] to grip and rub at [npc1.her] swollen knot.");
                        }
                        break;
                    case PREHENSILE:
                        if (characterOrgasming.isPlayer()) {
                            genericOrgasmSB.append(", before reaching down and starting to furiously masturbate; your [pc.hand] running up the length of your prehensile [pc.cock] as you curl it back against your [pc.fingers].");
                        } else {
                            genericOrgasmSB.append(", before reaching down and starting to furiously masturbate;" + " [npc1.her] [npc1.hand] sliding down the length of [npc1.her] prehensile [npc1.cock] as [npc1.she] curls it back against [npc1.her] [npc1.fingers].");
                        }
                        break;
                    case RIBBED:
                        if (characterOrgasming.isPlayer()) {
                            genericOrgasmSB.append(", before reaching down and sliding your [pc.hand] up and down over the bumpy ribs that line your [pc.cock].");
                        } else {
                            genericOrgasmSB.append(", before reaching down and sliding [npc1.her] [npc1.hand] up and down over the bumpy ribs that line [npc1.her] [npc1.cock].");
                        }
                        break;
                    case SHEATHED:
                        if (characterOrgasming.isPlayer()) {
                            genericOrgasmSB.append(", before reaching down and starting to furiously masturbate; your [pc.hand] sliding down the length of your [pc.cock] to bump against your sheath, before rising back up to your [pc.cockHead+].");
                        } else {
                            genericOrgasmSB.append(", before reaching down and starting to furiously masturbate;" + " [npc1.her] [npc1.hand] sliding down the length of [npc1.her] [npc1.cock] to bump against [npc1.her] sheath, before rising back up to [npc1.her] [npc1.cockHead+].");
                        }
                        break;
                    case TAPERED:
                        if (characterOrgasming.isPlayer()) {
                            genericOrgasmSB.append(", before reaching down and starting to furiously masturbate; your [pc.hand] running up the length of your [pc.cock] to rub and tease your tapered head.");
                        } else {
                            genericOrgasmSB.append(", before reaching down and starting to furiously masturbate; [npc1.her] [npc1.hand] running up the length of [npc1.her] [npc1.cock] to rub and tease [npc1.her] tapered head.");
                        }
                        break;
                    case TENTACLED:
                        if (characterOrgasming.isPlayer()) {
                            genericOrgasmSB.append(", before reaching down and sliding your [pc.hand] up and down over the squirming tentacles that line the sides of your [pc.cock].");
                        } else {
                            genericOrgasmSB.append(", before reaching down and sliding [npc1.her] [npc1.hand] up and down over the squirming tentacles that line the sides of [npc1.her] [npc1.cock].");
                        }
                        break;
                    case VEINY:
                        if (characterOrgasming.isPlayer()) {
                            genericOrgasmSB.append(", before reaching down and sliding your [pc.hand] up and down over your veiny [pc.cock].");
                        } else {
                            genericOrgasmSB.append(", before reaching down and sliding [npc1.her] [npc1.hand] up and down over [npc1.her] veiny [npc1.cock].");
                        }
                        break;
                }
            } else {
                if (characterOrgasming.isPlayer()) {
                    genericOrgasmSB.append(", before reaching down and starting to furiously masturbate; your [pc.hand] running up the length of your [pc.cock] to rub and tease your [pc.cockHead].");
                } else {
                    genericOrgasmSB.append(", before reaching down and starting to furiously masturbate; [npc1.her] [npc1.hand] running up the length of [npc1.her] [npc1.cock] to rub and tease [npc1.her] [npc1.cockHead].");
                }
            }
        }
    } else if (cumTarget == OrgasmCumTarget.INSIDE) {
        List<String> modifiers = new ArrayList<>();
        switch(orificePenetrated) {
            case ANUS:
            case NIPPLE:
            case VAGINA:
                String orificeName = (orificePenetrated == OrificeType.VAGINA ? "[npc2.pussy]" : (orificePenetrated == OrificeType.ANUS ? "[npc2.asshole]" : "[npc2.nipple]"));
                String orificeNamePlusDescriptor = (orificePenetrated == OrificeType.VAGINA ? "[npc2.pussy+]" : (orificePenetrated == OrificeType.ANUS ? "[npc2.asshole+]" : "[npc2.nipple+]"));
                if (characterOrgasming.hasPenisModifier(PenisModifier.KNOTTED)) {
                    if (characterOrgasming.isPlayer()) {
                        genericOrgasmSB.append(" Pushing forwards, you ram the knot at the base of your [npc1.cock+] against [npc2.name]'s " + orificeNamePlusDescriptor + "." + " It's already started to swell up so much that you don't manage to get it inside on the first thrust," + " but, after pulling back and slamming your [pc.hips] forwards, you manage to push the thick knot into [npc2.her] " + orificeNamePlusDescriptor + ".");
                    } else {
                        if (characterPenetrated.isPlayer()) {
                            genericOrgasmSB.append(" [npc1.Name] pushes forwards, and you feel [npc1.herHim] ramming the knot at the base of [npc1.her] [npc1.cock+] against your " + orificeNamePlusDescriptor + "." + " It's already started to swell up so much that [npc.she] doesn't manage to get it inside on the first thrust," + " but, after pulling back and slamming [npc1.her] [npc1.hips] forwards, [npc1.she] manages to push the thick knot into your " + orificeNamePlusDescriptor + ".");
                        } else {
                            genericOrgasmSB.append(" Ramming the knot at the base of [npc1.her] [npc1.cock+] into [npc2.name]'s " + orificeNamePlusDescriptor + ", [npc1.name] lets out [npc1.a_moan+] as it starts to swell up inside of [npc2.herHim].");
                        }
                    }
                } else {
                    if (characterOrgasming.isPlayer()) {
                        genericOrgasmSB.append(" Ramming your [npc1.cock+] deep into [npc2.name]'s " + orificeNamePlusDescriptor + ", you let out [npc1.a_moan+] as you feel your [npc1.cock+] start to twitch.");
                    } else {
                        if (characterPenetrated.isPlayer()) {
                            genericOrgasmSB.append(" Ramming [npc1.her] [npc1.cock+] deep into your " + orificeNamePlusDescriptor + ", [npc1.name] lets out [npc1.a_moan+] as it starts to twitch inside of you.");
                        } else {
                            genericOrgasmSB.append(" Ramming [npc1.her] [npc1.cock+] deep into [npc2.name]'s " + orificeNamePlusDescriptor + ", [npc1.name] lets out [npc1.a_moan+] as it starts to twitch inside of [npc2.herHim].");
                        }
                    }
                }
                modifiers.clear();
                for (PenisModifier mod : PenisModifier.values()) {
                    switch(mod) {
                        case BARBED:
                            if (characterOrgasming.hasPenisModifier(mod)) {
                                if (characterOrgasming.isPlayer()) {
                                    modifiers.add(" You continue to make small, thrusting movements, raking your barbs back against the inner walls of [npc2.her] " + orificeName + " and causing [npc2.herHim] to let out [npc2.a_moan+].");
                                } else {
                                    if (characterPenetrated.isPlayer()) {
                                        modifiers.add(" [npc1.Name] continues to make small, thrusting movements, raking [npc1.her] barbs back against the inner walls of your " + orificeName + " and causing you to let out [npc2.a_moan+].");
                                    } else {
                                        modifiers.add(" [npc1.Name] continues to make small, thrusting movements, raking [npc1.her] barbs back against the inner walls of [npc2.name]'s " + orificeName + " and causing [npc2.herHim] to let out [npc2.a_moan+].");
                                    }
                                }
                            }
                            break;
                        case BLUNT:
                            break;
                        case FLARED:
                            if (characterOrgasming.hasPenisModifier(mod)) {
                                if (characterOrgasming.isPlayer()) {
                                    modifiers.add(" You feel the wide, flared head of your [npc1.cock] swell up, making a seal with which to trap your [npc1.cum] deep within [npc2.her] " + orificeName + ".");
                                } else {
                                    if (characterPenetrated.isPlayer()) {
                                        modifiers.add(" The wide, flared head of [npc1.name]'s [npc1.cock] swells up, making a seal with which to trap [npc1.her] [npc1.cum] deep within your " + orificeName + ".");
                                    } else {
                                        modifiers.add(" The wide, flared head of [npc1.name]'s [npc1.cock] swells up, making a seal with which to trap [npc1.her] [npc1.cum] deep within [npc2.name]'s " + orificeName + ".");
                                    }
                                }
                            }
                            break;
                        case KNOTTED:
                            break;
                        case PREHENSILE:
                            break;
                        case RIBBED:
                            if (characterOrgasming.hasPenisModifier(mod)) {
                                if (characterOrgasming.isPlayer()) {
                                    modifiers.add(" You feel your ribbed [npc1.cock] bumping against the inner walls of [npc2.her] " + orificeName + ", which causes [npc2.herHim] to let out [npc2.a_moan+].");
                                } else {
                                    if (characterPenetrated.isPlayer()) {
                                        modifiers.add(" The ribbed length of [npc1.name]'s [npc1.cock] bumps against the inner walls of your " + orificeName + ", which causes you to let out [npc2.a_moan+].");
                                    } else {
                                        modifiers.add(" The ribbed length of [npc1.name]'s [npc1.cock] bumps against the inner walls of [npc2.name]'s " + orificeName + ", which causes [npc2.herHim] to let out [npc2.a_moan+].");
                                    }
                                }
                            }
                            break;
                        case SHEATHED:
                            break;
                        case TAPERED:
                            break;
                        case TENTACLED:
                            if (characterOrgasming.hasPenisModifier(mod)) {
                                if (characterOrgasming.isPlayer()) {
                                    modifiers.add(" You feel the wriggling tentacles lining your [npc1.cock] start to massage the inner walls of [npc2.her] " + orificeName + ", which causes [npc2.herHim] to let out [npc2.a_moan+].");
                                } else {
                                    if (characterPenetrated.isPlayer()) {
                                        modifiers.add(" The wriggling tentacles lining [npc1.name]'s [npc1.cock] start to massage the inner walls of your " + orificeName + ", which causes you to let out [npc2.a_moan+].");
                                    } else {
                                        modifiers.add(" The wriggling tentacles lining [npc1.name]'s [npc1.cock] start to massage the inner walls of [npc2.name]'s " + orificeName + ", which causes [npc2.herHim] to let out [npc2.a_moan+].");
                                    }
                                }
                            }
                            break;
                        case VEINY:
                            break;
                    }
                }
                if (!modifiers.isEmpty()) {
                    genericOrgasmSB.append(modifiers.get(Util.random.nextInt(modifiers.size())));
                }
                if (characterOrgasming.hasPenisModifier(PenisModifier.KNOTTED)) {
                    if (characterOrgasming.isPlayer()) {
                        genericOrgasmSB.append(" Keeping your [npc1.hips] pushed tightly against [npc2.name]'s " + orificeName + ", you let out [npc1.a_moan+] as you feel your knot swell up to its full size." + " Bucking back a little, you grin as you feel [npc2.name] pulled along with you; evidence that your [npc1.cock] is now firmly locked inside [npc2.her] " + orificeNamePlusDescriptor + ".");
                    } else {
                        if (characterPenetrated.isPlayer()) {
                            genericOrgasmSB.append(" Keeping [npc1.her] [npc1.hips] pushed tightly against your " + orificeName + ", [npc1.name] lets out [npc1.a_moan+] as [npc1.her] knot swells up to its full size." + " [npc.She] then bucks back a little, and you let out a startled cry as you're pulled along with [npc.herHim]; evidence that [npc1.her] [npc1.cock] is now firmly locked inside your " + orificeNamePlusDescriptor + ".");
                        } else {
                            genericOrgasmSB.append(" After just a moment, [npc1.her] knot has fully swollen in size, locking [npc1.her] [npc1.cock] inside [npc2.name]'s " + orificeName + ".");
                        }
                    }
                }
                break;
            case ASS:
                break;
            case BREAST:
                break;
            case MOUTH:
                if (characterOrgasming.hasPenisModifier(PenisModifier.KNOTTED)) {
                    if (characterOrgasming.isPlayer()) {
                        genericOrgasmSB.append(" Pushing forwards, you ram the knot at the base of your [npc1.cock+] against [npc2.name]'s [npc2.face+]." + " It's already started to swell up so much that you don't manage to get it past [npc2.her] [npc2.lips+] on the first thrust," + " but, after pulling back and slamming your [pc.hips] forwards, you manage to push the thick knot into [npc2.her] [npc2.mouth].");
                    } else {
                        if (characterPenetrated.isPlayer()) {
                            genericOrgasmSB.append(" [npc1.Name] pushes forwards, ramming the knot at the base of [npc1.her] [npc1.cock+] into your [npc2.face+]." + " It's already started to swell up so much that [npc.she] doesn't manage to get it past your [npc2.lips+] on the first thrust," + " but, after pulling back and slamming [npc1.her] [npc1.hips] forwards, [npc1.she] manages to push the thick knot into your [npc2.mouth].");
                        } else {
                            genericOrgasmSB.append(" Ramming the knot at the base of [npc1.her] [npc1.cock+] into [npc2.name]'s mouth, [npc1.name] lets out [npc1.a_moan+] as it starts to swell up inside of [npc2.herHim].");
                        }
                    }
                    if (characterOrgasming.isPlayer()) {
                        genericOrgasmSB.append(" Ramming the knot at the base of your [npc1.cock+] into [npc2.name]'s mouth, you let out [npc1.a_moan+] as you feel it start to swell up.");
                    } else {
                        if (characterPenetrated.isPlayer()) {
                            genericOrgasmSB.append(" Ramming the knot at the base of [npc1.her] [npc1.cock+] into your mouth, [npc1.name] lets out [npc1.a_moan+] as it starts to swell up inside of you.");
                        } else {
                            genericOrgasmSB.append(" Ramming the knot at the base of [npc1.her] [npc1.cock+] into [npc2.name]'s mouth, [npc1.name] lets out [npc1.a_moan+] as it starts to swell up inside of [npc2.herHim].");
                        }
                    }
                } else {
                    if (characterOrgasming.isPlayer()) {
                        genericOrgasmSB.append(" Ramming your [npc1.cock+] deep down [npc2.name]'s throat, you let out [npc1.a_moan+] as you feel your [npc1.cock+] start to twitch.");
                    } else {
                        if (characterPenetrated.isPlayer()) {
                            genericOrgasmSB.append(" Ramming [npc1.her] [npc1.cock+] deep down your throat, [npc1.name] lets out [npc1.a_moan+] as it starts to twitch inside of you.");
                        } else {
                            genericOrgasmSB.append(" Ramming [npc1.her] [npc1.cock+] deep down [npc2.name]'s throat, [npc1.name] lets out [npc1.a_moan+] as it starts to twitch inside of [npc2.herHim].");
                        }
                    }
                }
                modifiers.clear();
                for (PenisModifier mod : PenisModifier.values()) {
                    switch(mod) {
                        case BARBED:
                            if (characterOrgasming.hasPenisModifier(mod)) {
                                if (characterOrgasming.isPlayer()) {
                                    modifiers.add(" You continue to make small, thrusting movements, raking your barbs back against the lining of [npc2.her] throat and causing [npc2.herHim] to let out a choking [npc2.moan].");
                                } else {
                                    if (characterPenetrated.isPlayer()) {
                                        modifiers.add(" [npc1.Name] continues to make small, thrusting movements, raking [npc1.her] barbs back against the lining of your throat and causing you to let out a choking [npc2.moan].");
                                    } else {
                                        modifiers.add(" [npc1.Name] continues to make small, thrusting movements, raking [npc1.her] barbs back against the lining of [npc2.name]'s throat and causing [npc2.herHim] to let out a choking [npc2.moan].");
                                    }
                                }
                            }
                            break;
                        case BLUNT:
                            break;
                        case FLARED:
                            if (characterOrgasming.hasPenisModifier(mod)) {
                                if (characterOrgasming.isPlayer()) {
                                    modifiers.add(" You feel the wide, flared head of your [npc1.cock] swell up, making a seal with which to trap your [npc1.cum] deep down [npc2.her] throat.");
                                } else {
                                    if (characterPenetrated.isPlayer()) {
                                        modifiers.add(" The wide, flared head of [npc1.name]'s [npc1.cock] swells up, making a seal with which to trap [npc1.her] [npc1.cum] deep down your throat.");
                                    } else {
                                        modifiers.add(" The wide, flared head of [npc1.name]'s [npc1.cock] swells up, making a seal with which to trap [npc1.her] [npc1.cum] deep down [npc2.name]'s throat.");
                                    }
                                }
                            }
                            break;
                        case KNOTTED:
                            break;
                        case PREHENSILE:
                            break;
                        case RIBBED:
                            if (characterOrgasming.hasPenisModifier(mod)) {
                                if (characterOrgasming.isPlayer()) {
                                    modifiers.add(" You feel your ribbed [npc1.cock] bumping against the lining of [npc2.her] throat, which causes [npc2.herHim] to let out a muffled [npc2.moan].");
                                } else {
                                    if (characterPenetrated.isPlayer()) {
                                        modifiers.add(" The ribbed length of [npc1.name]'s [npc1.cock] bumps against the lining of your throat, which causes you to let out a muffled [npc2.moan].");
                                    } else {
                                        modifiers.add(" The ribbed length of [npc1.name]'s [npc1.cock] bumps against the lining of [npc2.name]'s throat, which causes [npc2.herHim] to let out a muffled [npc2.moan].");
                                    }
                                }
                            }
                            break;
                        case SHEATHED:
                            break;
                        case TAPERED:
                            break;
                        case TENTACLED:
                            if (characterOrgasming.hasPenisModifier(mod)) {
                                if (characterOrgasming.isPlayer()) {
                                    modifiers.add(" You feel the wriggling tentacles lining your [npc1.cock] start to massage the lining of [npc2.her] throat, which causes [npc2.herHim] to let out a muffled [npc2.moan].");
                                } else {
                                    if (characterPenetrated.isPlayer()) {
                                        modifiers.add(" The wriggling tentacles lining [npc1.name]'s [npc1.cock] start to massage the lining of your throat, which causes you to let out a muffled [npc2.moan].");
                                    } else {
                                        modifiers.add(" The wriggling tentacles lining [npc1.name]'s [npc1.cock] start to massage the lining of [npc2.name]'s throat, which causes [npc2.herHim] to let out a muffled [npc2.moan].");
                                    }
                                }
                            }
                            break;
                        case VEINY:
                            break;
                    }
                }
                if (!modifiers.isEmpty()) {
                    genericOrgasmSB.append(modifiers.get(Util.random.nextInt(modifiers.size())));
                }
                if (characterOrgasming.hasPenisModifier(PenisModifier.KNOTTED)) {
                    if (characterOrgasming.isPlayer()) {
                        genericOrgasmSB.append(" Keeping your [npc1.hips] pushed tightly against [npc2.name]'s [npc2.face], you let out [npc1.a_moan+] as you feel your knot swell up to its full size." + " Bucking back a little, you grin as [npc2.name]'s pulled along with you; evidence that your [npc1.cock] is now firmly locked inside [npc2.her] [npc2.mouth].");
                    } else {
                        if (characterPenetrated.isPlayer()) {
                            genericOrgasmSB.append(" Keeping [npc1.her] [npc1.hips] pushed tightly against your [npc2.face], [npc1.name] lets out [npc1.a_moan+] as [npc1.her] knot swells up to its full size." + " [npc.She] then bucks back a little, and you let out a very muffled cry as you're pulled along with [npc1.herHim]; evidence that [npc1.her] [npc1.cock] is now firmly locked inside your [npc2.mouth].");
                        } else {
                            genericOrgasmSB.append(" After just a moment, [npc1.her] knot has fully swollen in size, locking [npc1.her] [npc1.cock] inside [npc2.name]'s [npc2.mouth].");
                        }
                    }
                }
                break;
            case THIGHS:
                break;
            case URETHRA:
                break;
            default:
                break;
        }
    }
    if (characterOrgasming.isPlayer()) {
        genericOrgasmSB.append(" As your [npc1.balls+] tense up, ");
    } else {
        genericOrgasmSB.append(" As [npc1.her] [npc1.balls+] tense up, ");
    }
    genericOrgasmSB.append(getCumQuantityDescription(characterOrgasming));
    if (characterOrgasming.getPenisRawCumProductionValue() > 0) {
        genericOrgasmSB.append(cumTargetDescription(characterOrgasming, characterPenetrated, cumTarget));
    }
    if (characterOrgasming.hasPenisModifier(PenisModifier.KNOTTED) && cumTarget == OrgasmCumTarget.INSIDE) {
        if (characterOrgasming.isPlayer()) {
            genericOrgasmSB.append("</br>" + "Even after your [npc1.balls+] have pumped their entire load into [npc2.name], your knot remains swollen, locking you and your partner together." + " It takes a few minutes for it to start to deflate, and with a wet pop, you're finally able to pull your [npc1.cock+] free.");
        } else {
            if (characterPenetrated.isPlayer()) {
                genericOrgasmSB.append("</br>" + "Even after [npc1.name]'s [npc1.balls+] have pumped their entire load into you, [npc1.her] knot remains swollen, locking you and your partner together." + " It takes a few minutes for it to start to deflate, and with a wet pop, [npc1.she]'s finally able to pull [npc1.her] [npc1.cock+] free.");
            } else {
                genericOrgasmSB.append("</br>" + "Even after [npc1.name]'s [npc1.balls+] have pumped their entire load into [ncp2.name], [npc1.her] knot remains swollen, locking [npc1.herHim] and [npc1.her] partner together." + " It takes a few minutes for it to start to deflate, and with a wet pop, [npc1.she]'s finally able to pull [npc1.her] [npc1.cock+] free.");
            }
        }
    }
    if (characterPenetrated != null) {
        return UtilText.parse(characterOrgasming, characterPenetrated, genericOrgasmSB.toString());
    } else {
        return UtilText.parse(characterOrgasming, genericOrgasmSB.toString());
    }
}
Also used : OrificeType(com.lilithsthrone.game.sex.OrificeType) ArrayList(java.util.ArrayList) GameCharacter(com.lilithsthrone.game.character.GameCharacter) ArrayList(java.util.ArrayList) List(java.util.List) PenisModifier(com.lilithsthrone.game.character.body.valueEnums.PenisModifier)

Aggregations

OrificeType (com.lilithsthrone.game.sex.OrificeType)9 ArrayList (java.util.ArrayList)6 PenetrationType (com.lilithsthrone.game.sex.PenetrationType)5 GameCharacter (com.lilithsthrone.game.character.GameCharacter)4 CoverableArea (com.lilithsthrone.game.character.body.CoverableArea)3 SexType (com.lilithsthrone.game.sex.SexType)3 PenisModifier (com.lilithsthrone.game.character.body.valueEnums.PenisModifier)2 SexParticipantType (com.lilithsthrone.game.sex.SexParticipantType)2 SexAction (com.lilithsthrone.game.sex.sexActions.SexAction)2 SexActionInterface (com.lilithsthrone.game.sex.sexActions.SexActionInterface)2 HashSet (java.util.HashSet)2 Attribute (com.lilithsthrone.game.character.attributes.Attribute)1 FluidType (com.lilithsthrone.game.character.body.types.FluidType)1 FluidModifier (com.lilithsthrone.game.character.body.valueEnums.FluidModifier)1 OrificeModifier (com.lilithsthrone.game.character.body.valueEnums.OrificeModifier)1 Addiction (com.lilithsthrone.game.character.effects.Addiction)1 Perk (com.lilithsthrone.game.character.effects.Perk)1 StatusEffect (com.lilithsthrone.game.character.effects.StatusEffect)1 Fetish (com.lilithsthrone.game.character.fetishes.Fetish)1 FetishDesire (com.lilithsthrone.game.character.fetishes.FetishDesire)1