Program: 171415
Project: 171415
Buggy source:
/** 
 * @param owner
 * @param playerKnowledgeOfThroat
 * @param playerKnowledgeOfBreasts
 * @param playerKnowledgeOfGroin
 * @return
 */
public String getDescription(GameCharacter owner){
  StringBuilder sb=new StringBuilder();
  if (owner.isPlayer()) {
    sb.append("String_Node_Str" + "String_Node_Str" + getGender().getColour().toWebHexString() + "String_Node_Str"+ owner.getAppearsAsGenderDescription()+ "String_Node_Str"+ "String_Node_Str");
  }
 else {
    if (owner.getPlayerKnowsAreasMap().get(CoverableArea.PENIS) && owner.getPlayerKnowsAreasMap().get(CoverableArea.VAGINA)) {
      sb.append("String_Node_Str" + "String_Node_Str" + getGender().getColour().toWebHexString() + "String_Node_Str"+ owner.getAppearsAsGenderDescription()+ "String_Node_Str"+ "String_Node_Str");
    }
 else {
      if (Main.game.getPlayer().hasPerk(Perk.OBSERVANT)) {
        sb.append("String_Node_Str" + "String_Node_Str" + getGender().getColour().toWebHexString() + "String_Node_Str"+ owner.getAppearsAsGenderDescription()+ "String_Node_Str"+ "String_Node_Str");
      }
 else {
        sb.append("String_Node_Str" + "String_Node_Str" + owner.getAppearsAsGenderDescription() + "String_Node_Str"+ "String_Node_Str");
      }
    }
  }
  if (owner.isPlayer()) {
    sb.append("String_Node_Str" + "String_Node_Str");
  }
 else {
    sb.append("String_Node_Str" + "String_Node_Str");
  }
  if (femininity <= Femininity.MASCULINE_STRONG.getMaximumFemininity()) {
    sb.append(UtilText.returnStringAtRandom("String_Node_Str" + Colour.MASCULINE_PLUS.toWebHexString() + "String_Node_Str","String_Node_Str" + Colour.MASCULINE_PLUS.toWebHexString() + "String_Node_Str"));
  }
 else   if (femininity <= Femininity.MASCULINE.getMaximumFemininity()) {
    sb.append(UtilText.returnStringAtRandom("String_Node_Str" + Colour.MASCULINE.toWebHexString() + "String_Node_Str","String_Node_Str" + Colour.MASCULINE.toWebHexString() + "String_Node_Str"));
  }
 else   if (femininity <= Femininity.ANDROGYNOUS.getMaximumFemininity()) {
    sb.append("String_Node_Str" + Colour.ANDROGYNOUS.toWebHexString() + "String_Node_Str");
  }
 else   if (femininity <= Femininity.FEMININE.getMaximumFemininity()) {
    sb.append(UtilText.returnStringAtRandom("String_Node_Str" + Colour.FEMININE.toWebHexString() + "String_Node_Str","String_Node_Str" + Colour.FEMININE.toWebHexString() + "String_Node_Str","String_Node_Str" + Colour.FEMININE.toWebHexString() + "String_Node_Str"));
  }
 else {
    sb.append(UtilText.returnStringAtRandom("String_Node_Str" + Colour.FEMININE_PLUS.toWebHexString() + "String_Node_Str","String_Node_Str" + Colour.FEMININE_PLUS.toWebHexString() + "String_Node_Str","String_Node_Str" + Colour.FEMININE_PLUS.toWebHexString() + "String_Node_Str","String_Node_Str" + Colour.FEMININE_PLUS.toWebHexString() + "String_Node_Str"));
  }
switch (face.getType()) {
case HUMAN:
    if (owner.isPlayer()) {
      sb.append("String_Node_Str" + owner.getEyeColour().toWebHexString() + "String_Node_Str"+ (face.isPiercedNose() ? "String_Node_Str" : "String_Node_Str"));
    }
 else {
      sb.append("String_Node_Str" + owner.getEyeColour().toWebHexString() + "String_Node_Str"+ (face.isPiercedNose() ? "String_Node_Str" : "String_Node_Str"));
    }
  break;
case ANGEL:
if (owner.isPlayer()) {
  sb.append("String_Node_Str" + "String_Node_Str" + owner.getEyeColour().toWebHexString() + "String_Node_Str"+ (face.isPiercedNose() ? "String_Node_Str" : "String_Node_Str"));
}
 else {
  sb.append("String_Node_Str" + "String_Node_Str" + owner.getEyeColour().toWebHexString() + "String_Node_Str"+ (face.isPiercedNose() ? "String_Node_Str" : "String_Node_Str"));
}
break;
case DEMON_COMMON:
if (owner.isPlayer()) {
sb.append("String_Node_Str" + owner.getEyeColour().toWebHexString() + "String_Node_Str"+ (face.isPiercedNose() ? "String_Node_Str" : "String_Node_Str"));
}
 else {
sb.append("String_Node_Str" + owner.getEyeColour().toWebHexString() + "String_Node_Str"+ (face.isPiercedNose() ? "String_Node_Str" : "String_Node_Str"));
}
break;
case DOG_MORPH:
if (owner.isPlayer()) {
sb.append("String_Node_Str" + "String_Node_Str" + owner.getEyeColour().toWebHexString() + "String_Node_Str"+ (face.isPiercedNose() ? "String_Node_Str" : "String_Node_Str"));
}
 else {
sb.append("String_Node_Str" + "String_Node_Str" + owner.getEyeColour().toWebHexString() + "String_Node_Str"+ (face.isPiercedNose() ? "String_Node_Str" : "String_Node_Str"));
}
break;
case LYCAN:
if (owner.isPlayer()) {
sb.append("String_Node_Str" + "String_Node_Str" + owner.getEyeColour().toWebHexString() + "String_Node_Str"+ (face.isPiercedNose() ? "String_Node_Str" : "String_Node_Str"));
}
 else {
sb.append("String_Node_Str" + "String_Node_Str" + owner.getEyeColour().toWebHexString() + "String_Node_Str"+ (face.isPiercedNose() ? "String_Node_Str" : "String_Node_Str"));
}
break;
case CAT_MORPH:
if (owner.isPlayer()) {
sb.append("String_Node_Str" + "String_Node_Str" + owner.getEyeColour().toWebHexString() + "String_Node_Str"+ (face.isPiercedNose() ? "String_Node_Str" : "String_Node_Str"));
}
 else {
sb.append("String_Node_Str" + "String_Node_Str" + owner.getEyeColour().toWebHexString() + "String_Node_Str"+ (face.isPiercedNose() ? "String_Node_Str" : "String_Node_Str"));
}
break;
case HORSE_MORPH:
if (owner.isPlayer()) {
sb.append("String_Node_Str" + "String_Node_Str" + owner.getEyeColour().toWebHexString() + "String_Node_Str"+ (face.isPiercedNose() ? "String_Node_Str" : "String_Node_Str"));
}
 else {
sb.append("String_Node_Str" + "String_Node_Str" + owner.getEyeColour().toWebHexString() + "String_Node_Str"+ (face.isPiercedNose() ? "String_Node_Str" : "String_Node_Str"));
}
break;
case SLIME:
if (owner.isPlayer()) sb.append("String_Node_Str" + "String_Node_Str" + owner.getEyeColour().toWebHexString() + "String_Node_Str"+ (face.isPiercedNose() ? "String_Node_Str" : "String_Node_Str"));
 else sb.append("String_Node_Str" + skinTypeColours.get(face.getType().getSkinType()).getName() + "String_Node_Str"+ "String_Node_Str"+ owner.getEyeColour().toWebHexString()+ "String_Node_Str"+ (face.isPiercedNose() ? "String_Node_Str" : "String_Node_Str"));
break;
case HARPY:
if (owner.isPlayer()) sb.append("String_Node_Str" + "String_Node_Str" + owner.getEyeColour().toWebHexString() + "String_Node_Str"+ (face.isPiercedNose() ? "String_Node_Str" : "String_Node_Str"));
 else sb.append("String_Node_Str" + "String_Node_Str" + owner.getEyeColour().toWebHexString() + "String_Node_Str"+ (face.isPiercedNose() ? "String_Node_Str" : "String_Node_Str"));
break;
default :
sb.append(face.getName(owner,true) + "String_Node_Str");
}
if (owner.isPlayer()) {
sb.append("String_Node_Str" + (face.getTongue().getType() == TongueType.HUMAN ? "String_Node_Str" : face.getTongue().getName(owner,true)) + (face.getTongue().isPierced() ? "String_Node_Str" : "String_Node_Str"));
if (face.isPiercedLip()) {
sb.append("String_Node_Str");
}
if (face.isVirgin()) {
sb.append("String_Node_Str" + Colour.GENERIC_SEX.toWebHexString() + "String_Node_Str");
}
 else {
switch (face.getCapacity().getMaximumSizeComfortableWithLube()) {
case NEGATIVE_UTILITY_VALUE:
case ZERO_MICROSCOPIC:
sb.append("String_Node_Str" + Colour.GENERIC_SEX.toWebHexString() + "String_Node_Str");
break;
case ONE_TINY:
sb.append("String_Node_Str" + Colour.GENERIC_SEX.toWebHexString() + "String_Node_Str");
break;
case TWO_AVERAGE:
sb.append("String_Node_Str" + Colour.GENERIC_SEX.toWebHexString() + "String_Node_Str");
break;
case THREE_LARGE:
sb.append("String_Node_Str" + Colour.GENERIC_SEX.toWebHexString() + "String_Node_Str");
break;
case FOUR_HUGE:
sb.append("String_Node_Str" + Colour.GENERIC_SEX.toWebHexString() + "String_Node_Str");
break;
case FIVE_ENORMOUS:
sb.append("String_Node_Str" + Colour.GENERIC_SEX.toWebHexString() + "String_Node_Str");
break;
case SIX_GIGANTIC:
sb.append("String_Node_Str" + Colour.GENERIC_SEX.toWebHexString() + "String_Node_Str");
break;
case SEVEN_STALLION:
sb.append("String_Node_Str" + Colour.GENERIC_SEX.toWebHexString() + "String_Node_Str"+ "String_Node_Str"+ Colour.GENERIC_EXCELLENT.toWebHexString()+ "String_Node_Str"+ "String_Node_Str"+ Colour.GENERIC_SEX.toWebHexString()+ "String_Node_Str");
break;
default :
break;
}
for (PenetrationType pt : PenetrationType.values()) {
if (Main.game.getPlayer().getVirginityLoss(new SexType(pt,OrificeType.MOUTH_PLAYER)) != null) {
sb.append("String_Node_Str" + Colour.GENERIC_ARCANE.toWebHexString() + "String_Node_Str"+ Main.game.getPlayer().getVirginityLoss(new SexType(pt,OrificeType.MOUTH_PLAYER))+ "String_Node_Str");
}
}
}
}
 else {
sb.append("String_Node_Str" + (face.getTongue().getType() == TongueType.HUMAN ? "String_Node_Str" : face.getTongue().getName(owner,true)) + (face.getTongue().isPierced() ? "String_Node_Str" : "String_Node_Str"));
if (face.isPiercedLip()) {
sb.append("String_Node_Str");
}
if (owner.getPlayerKnowsAreasMap().get(CoverableArea.MOUTH)) {
if (face.isVirgin()) {
sb.append("String_Node_Str" + Colour.GENERIC_SEX.toWebHexString() + "String_Node_Str");
}
 else {
switch (face.getCapacity().getMaximumSizeComfortableWithLube()) {
case NEGATIVE_UTILITY_VALUE:
case ZERO_MICROSCOPIC:
sb.append("String_Node_Str" + Colour.GENERIC_SEX.toWebHexString() + "String_Node_Str");
break;
case ONE_TINY:
sb.append("String_Node_Str" + Colour.GENERIC_SEX.toWebHexString() + "String_Node_Str");
break;
case TWO_AVERAGE:
sb.append("String_Node_Str" + Colour.GENERIC_SEX.toWebHexString() + "String_Node_Str");
break;
case THREE_LARGE:
sb.append("String_Node_Str" + Colour.GENERIC_SEX.toWebHexString() + "String_Node_Str");
break;
case FOUR_HUGE:
sb.append("String_Node_Str" + Colour.GENERIC_SEX.toWebHexString() + "String_Node_Str");
break;
case FIVE_ENORMOUS:
sb.append("String_Node_Str" + Colour.GENERIC_SEX.toWebHexString() + "String_Node_Str");
break;
case SIX_GIGANTIC:
sb.append("String_Node_Str" + Colour.GENERIC_SEX.toWebHexString() + "String_Node_Str");
break;
case SEVEN_STALLION:
sb.append("String_Node_Str" + Colour.GENERIC_SEX.toWebHexString() + "String_Node_Str"+ "String_Node_Str"+ Colour.GENERIC_EXCELLENT.toWebHexString()+ "String_Node_Str"+ "String_Node_Str"+ Colour.GENERIC_SEX.toWebHexString()+ "String_Node_Str"+ "String_Node_Str");
break;
default :
break;
}
}
}
 else {
sb.append("String_Node_Str" + Colour.GENERIC_SEX.toWebHexString() + "String_Node_Str");
}
}
switch (ear.getType()) {
case HUMAN:
if (owner.isPlayer()) sb.append("String_Node_Str" + (ear.isPierced() ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str");
 else sb.append("String_Node_Str" + (ear.isPierced() ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str");
break;
case DEMON_COMMON:
if (owner.isPlayer()) sb.append("String_Node_Str" + (ear.isPierced() ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str");
 else sb.append("String_Node_Str" + (ear.isPierced() ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str");
break;
case DOG_MORPH:
if (owner.isPlayer()) sb.append("String_Node_Str" + (ear.isPierced() ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str");
 else sb.append("String_Node_Str" + (ear.isPierced() ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str");
break;
case LYCAN:
if (owner.isPlayer()) sb.append("String_Node_Str" + (ear.isPierced() ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str");
 else sb.append("String_Node_Str" + (ear.isPierced() ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str");
break;
case CAT_MORPH:
if (owner.isPlayer()) sb.append("String_Node_Str" + (ear.isPierced() ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str");
 else sb.append("String_Node_Str" + (ear.isPierced() ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str");
break;
case HORSE_MORPH:
if (owner.isPlayer()) sb.append("String_Node_Str" + (ear.isPierced() ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str");
 else sb.append("String_Node_Str" + (ear.isPierced() ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str");
break;
case SLIME:
if (owner.isPlayer()) sb.append("String_Node_Str" + (ear.isPierced() ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str"+ skinTypeColours.get(BodyCoveringType.SLIME).getName()+ "String_Node_Str");
 else sb.append("String_Node_Str" + (ear.isPierced() ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str"+ skinTypeColours.get(BodyCoveringType.SLIME).getName()+ "String_Node_Str");
break;
case HARPY:
if (owner.isPlayer()) sb.append("String_Node_Str" + (ear.isPierced() ? "String_Node_Str" : "String_Node_Str"));
 else sb.append("String_Node_Str" + (ear.isPierced() ? "String_Node_Str" : "String_Node_Str"));
break;
default :
if (owner.isPlayer()) sb.append("String_Node_Str" + ear.getType().getDeterminer(owner) + "String_Node_Str"+ (ear.isPierced() ? "String_Node_Str" : "String_Node_Str")+ "String_Node_Str"+ ear.getName(owner,true)+ "String_Node_Str");
 else sb.append("String_Node_Str" + ear.getType().getDeterminer(owner) + "String_Node_Str"+ (ear.isPierced() ? "String_Node_Str" : "String_Node_Str")+ "String_Node_Str"+ ear.getName(owner,true)+ "String_Node_Str");
}
if (owner.isPlayer() && hair.getRawLengthValue() == 0) {
sb.append("String_Node_Str");
}
 else if (!owner.isPlayer() && hair.getRawLengthValue() == 0) {
sb.append("String_Node_Str");
}
 else {
switch (hair.getType()) {
case HAIR_HUMAN:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case HAIR_ANGEL:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case HAIR_CANINE_FUR:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case HAIR_LYCAN_FUR:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case HAIR_FELINE_FUR:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case HAIR_HORSE_HAIR:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case HAIR_SLIME:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case HAIR_HARPY:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
default :
if (owner.isPlayer()) sb.append("String_Node_Str" + hair.getLength().getDescriptor() + "String_Node_Str"+ skinTypeColours.get(hair.getType()).getName()+ "String_Node_Str"+ hair.getName(owner,true));
 else sb.append("String_Node_Str" + hair.getLength().getDescriptor() + "String_Node_Str"+ skinTypeColours.get(hair.getType()).getName()+ "String_Node_Str"+ hair.getName(owner,true));
}
}
switch (horn.getType()) {
case NONE:
sb.append("String_Node_Str");
break;
case DEMON_COMMON_MALE:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case DEMON_COMMON_FEMALE:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
default :
if (owner.isPlayer()) sb.append("String_Node_Str" + horn.getType().getDeterminer(owner) + "String_Node_Str"+ horn.getName(owner,true)+ "String_Node_Str");
 else sb.append("String_Node_Str" + horn.getType().getDeterminer(owner) + "String_Node_Str"+ horn.getName(owner,true)+ "String_Node_Str");
}
switch (face.getMakeupLevel()) {
case NONE:
break;
case MINIMAL:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case LOW:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case AVERAGE:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case HIGH:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case VERY_HIGH:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case EXTREME:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case MAXIMUM:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
}
sb.append("String_Node_Str");
if (owner.isPlayer()) {
sb.append("String_Node_Str" + (breast.getRawSizeValue() == 0 ? "String_Node_Str" : breast.getName(owner,false)) + "String_Node_Str");
}
 else {
sb.append("String_Node_Str" + (breast.getRawSizeValue() == 0 ? "String_Node_Str" : breast.getName(owner,false)) + "String_Node_Str");
}
if (femininity <= Femininity.MASCULINE_STRONG.getMaximumFemininity()) {
sb.append(UtilText.returnStringAtRandom("String_Node_Str" + Colour.MASCULINE_PLUS.toWebHexString() + "String_Node_Str","String_Node_Str" + Colour.MASCULINE_PLUS.toWebHexString() + "String_Node_Str"));
}
 else if (femininity <= Femininity.MASCULINE.getMaximumFemininity()) {
sb.append(UtilText.returnStringAtRandom("String_Node_Str" + Colour.MASCULINE.toWebHexString() + "String_Node_Str","String_Node_Str" + Colour.MASCULINE.toWebHexString() + "String_Node_Str"));
}
 else if (femininity <= Femininity.ANDROGYNOUS.getMaximumFemininity()) {
sb.append("String_Node_Str" + Colour.ANDROGYNOUS.toWebHexString() + "String_Node_Str");
}
 else if (femininity <= Femininity.FEMININE.getMaximumFemininity()) {
sb.append(UtilText.returnStringAtRandom("String_Node_Str" + Colour.FEMININE.toWebHexString() + "String_Node_Str","String_Node_Str" + Colour.FEMININE.toWebHexString() + "String_Node_Str"));
}
 else {
sb.append(UtilText.returnStringAtRandom("String_Node_Str" + Colour.FEMININE_PLUS.toWebHexString() + "String_Node_Str","String_Node_Str" + Colour.FEMININE_PLUS.toWebHexString() + "String_Node_Str","String_Node_Str" + Colour.FEMININE_PLUS.toWebHexString() + "String_Node_Str"));
}
if (owner.hasStatusEffect(StatusEffect.PREGNANT_1)) {
if (owner.isPlayer()) sb.append("String_Node_Str" + Colour.GENERIC_ARCANE.toWebHexString() + "String_Node_Str");
 else sb.append("String_Node_Str" + Colour.GENERIC_ARCANE.toWebHexString() + "String_Node_Str");
}
 else if (owner.hasStatusEffect(StatusEffect.PREGNANT_2)) {
if (owner.isPlayer()) sb.append("String_Node_Str" + Colour.GENERIC_ARCANE.toWebHexString() + "String_Node_Str");
 else sb.append("String_Node_Str" + Colour.GENERIC_ARCANE.toWebHexString() + "String_Node_Str");
}
 else if (owner.hasStatusEffect(StatusEffect.PREGNANT_3)) {
if (owner.isPlayer()) sb.append("String_Node_Str" + "String_Node_Str" + Colour.GENERIC_ARCANE.toWebHexString() + "String_Node_Str");
 else sb.append("String_Node_Str" + "String_Node_Str" + Colour.GENERIC_ARCANE.toWebHexString() + "String_Node_Str");
}
if (owner.isPlayer()) {
if (breast.getRawSizeValue() > 0) {
sb.append("String_Node_Str" + Util.intToString(breast.getRows()) + "String_Node_Str"+ (breast.getRows() == 1 ? "String_Node_Str" : "String_Node_Str")+ "String_Node_Str"+ breast.getSize().getDescriptor()+ "String_Node_Str");
switch (breast.getRows()) {
case 1:
sb.append("String_Node_Str");
if (breast.getSize() == CupSize.TRAINING) sb.append("String_Node_Str");
 else sb.append((Util.isVowel(breast.getSize().getCupSizeName().charAt(0)) ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str" + breast.getSize().getCupSizeName()+ "String_Node_Str");
break;
case 2:
sb.append("String_Node_Str");
if (breast.getSize() == CupSize.TRAINING) sb.append("String_Node_Str");
 else sb.append((Util.isVowel(breast.getSize().getCupSizeName().charAt(0)) ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str" + breast.getSize().getCupSizeName()+ "String_Node_Str");
sb.append("String_Node_Str");
if (CupSize.getCupSizeFromInt(breast.getSize().getMeasurement() - 1) == CupSize.TRAINING) sb.append("String_Node_Str");
 else sb.append((Util.isVowel(CupSize.getCupSizeFromInt(breast.getSize().getMeasurement() - 1).getCupSizeName().charAt(0)) ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str" + CupSize.getCupSizeFromInt(breast.getSize().getMeasurement() - 1).getCupSizeName()+ "String_Node_Str");
break;
case 3:
sb.append("String_Node_Str");
if (breast.getSize() == CupSize.TRAINING) sb.append("String_Node_Str");
 else sb.append((Util.isVowel(breast.getSize().getCupSizeName().charAt(0)) ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str" + breast.getSize().getCupSizeName()+ "String_Node_Str");
sb.append("String_Node_Str");
if (CupSize.getCupSizeFromInt(breast.getSize().getMeasurement() - 1) == CupSize.TRAINING) sb.append("String_Node_Str");
 else sb.append((Util.isVowel(CupSize.getCupSizeFromInt(breast.getSize().getMeasurement() - 1).getCupSizeName().charAt(0)) ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str" + CupSize.getCupSizeFromInt(breast.getSize().getMeasurement() - 1).getCupSizeName()+ "String_Node_Str");
sb.append("String_Node_Str");
if (CupSize.getCupSizeFromInt(breast.getSize().getMeasurement() - 2) == CupSize.TRAINING) sb.append("String_Node_Str");
 else sb.append((Util.isVowel(CupSize.getCupSizeFromInt(breast.getSize().getMeasurement() - 2).getCupSizeName().charAt(0)) ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str" + CupSize.getCupSizeFromInt(breast.getSize().getMeasurement() - 2).getCupSizeName()+ "String_Node_Str");
break;
default :
break;
}
if (breast.isPierced()) {
sb.append("String_Node_Str");
}
}
 else {
sb.append("String_Node_Str");
switch (breast.getRows()) {
case 1:
sb.append("String_Node_Str" + (breast.isPierced() ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str");
break;
case 2:
sb.append("String_Node_Str" + (breast.isPierced() ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str");
break;
case 3:
sb.append("String_Node_Str" + (breast.isPierced() ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str");
break;
default :
break;
}
}
}
 else {
if (breast.getRawSizeValue() > 0) {
sb.append("String_Node_Str" + Util.intToString(breast.getRows()) + "String_Node_Str"+ (breast.getRows() == 1 ? "String_Node_Str" : "String_Node_Str")+ "String_Node_Str"+ breast.getSize().getDescriptor()+ "String_Node_Str");
switch (breast.getRows()) {
case 1:
sb.append("String_Node_Str");
if (breast.getSize() == CupSize.TRAINING) sb.append("String_Node_Str");
 else sb.append((Util.isVowel(breast.getSize().getCupSizeName().charAt(0)) ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str" + breast.getSize().getCupSizeName()+ "String_Node_Str");
break;
case 2:
sb.append("String_Node_Str");
if (breast.getSize() == CupSize.TRAINING) sb.append("String_Node_Str");
 else sb.append((Util.isVowel(breast.getSize().getCupSizeName().charAt(0)) ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str" + breast.getSize().getCupSizeName()+ "String_Node_Str");
sb.append("String_Node_Str");
if (CupSize.getCupSizeFromInt(breast.getSize().getMeasurement() - 1) == CupSize.TRAINING) sb.append("String_Node_Str");
 else sb.append((Util.isVowel(CupSize.getCupSizeFromInt(breast.getSize().getMeasurement() - 1).getCupSizeName().charAt(0)) ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str" + CupSize.getCupSizeFromInt(breast.getSize().getMeasurement() - 1).getCupSizeName()+ "String_Node_Str");
break;
case 3:
sb.append("String_Node_Str");
if (breast.getSize() == CupSize.TRAINING) sb.append("String_Node_Str");
 else sb.append((Util.isVowel(breast.getSize().getCupSizeName().charAt(0)) ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str" + breast.getSize().getCupSizeName()+ "String_Node_Str");
sb.append("String_Node_Str");
if (CupSize.getCupSizeFromInt(breast.getSize().getMeasurement() - 1) == CupSize.TRAINING) sb.append("String_Node_Str");
 else sb.append((Util.isVowel(CupSize.getCupSizeFromInt(breast.getSize().getMeasurement() - 1).getCupSizeName().charAt(0)) ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str" + CupSize.getCupSizeFromInt(breast.getSize().getMeasurement() - 1).getCupSizeName()+ "String_Node_Str");
sb.append("String_Node_Str");
if (CupSize.getCupSizeFromInt(breast.getSize().getMeasurement() - 2) == CupSize.TRAINING) sb.append("String_Node_Str");
 else sb.append((Util.isVowel(CupSize.getCupSizeFromInt(breast.getSize().getMeasurement() - 2).getCupSizeName().charAt(0)) ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str" + CupSize.getCupSizeFromInt(breast.getSize().getMeasurement() - 2).getCupSizeName()+ "String_Node_Str");
break;
default :
break;
}
if (breast.isPierced()) {
sb.append("String_Node_Str");
}
}
 else {
sb.append("String_Node_Str");
switch (breast.getRows()) {
case 1:
sb.append("String_Node_Str" + (breast.isPierced() ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str");
break;
case 2:
sb.append("String_Node_Str" + (breast.isPierced() ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str");
break;
case 3:
sb.append("String_Node_Str" + (breast.isPierced() ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str");
break;
default :
break;
}
}
}
sb.append("String_Node_Str" + getBreastDescription(owner));
sb.append("String_Node_Str");
sb.append("String_Node_Str");
switch (arm.getType()) {
case HUMAN:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case ANGEL:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case DEMON_COMMON:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case DOG_MORPH:
if (owner.isPlayer()) sb.append("String_Node_Str" + "String_Node_Str");
 else sb.append("String_Node_Str" + "String_Node_Str");
break;
case LYCAN:
if (owner.isPlayer()) sb.append("String_Node_Str" + "String_Node_Str");
 else sb.append("String_Node_Str" + "String_Node_Str");
break;
case CAT_MORPH:
if (owner.isPlayer()) sb.append("String_Node_Str" + "String_Node_Str");
 else sb.append("String_Node_Str" + "String_Node_Str");
break;
case HORSE_MORPH:
if (owner.isPlayer()) sb.append("String_Node_Str" + "String_Node_Str");
 else sb.append("String_Node_Str" + "String_Node_Str");
break;
case SLIME:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case HARPY:
if (owner.isPlayer()) sb.append("String_Node_Str" + "String_Node_Str");
 else sb.append("String_Node_Str" + "String_Node_Str");
break;
default :
break;
}
sb.append("String_Node_Str");
switch (leg.getType()) {
case HUMAN:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case ANGEL:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case DEMON_COMMON:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case DOG_MORPH:
if (owner.isPlayer()) sb.append("String_Node_Str" + "String_Node_Str");
 else sb.append("String_Node_Str" + "String_Node_Str");
break;
case LYCAN:
if (owner.isPlayer()) sb.append("String_Node_Str" + "String_Node_Str");
 else sb.append("String_Node_Str" + "String_Node_Str");
break;
case CAT_MORPH:
if (owner.isPlayer()) sb.append("String_Node_Str" + "String_Node_Str");
 else sb.append("String_Node_Str" + "String_Node_Str");
break;
case HORSE_MORPH:
if (owner.isPlayer()) sb.append("String_Node_Str" + "String_Node_Str");
 else sb.append("String_Node_Str" + "String_Node_Str");
break;
case SLIME:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case HARPY:
if (owner.isPlayer()) sb.append("String_Node_Str" + "String_Node_Str");
 else sb.append("String_Node_Str" + "String_Node_Str");
break;
default :
break;
}
if (owner.isPlayer()) {
sb.append("String_Node_Str");
}
 else {
sb.append("String_Node_Str");
}
if (femininity <= Femininity.MASCULINE_STRONG.getMaximumFemininity()) {
sb.append(UtilText.returnStringAtRandom("String_Node_Str" + Colour.MASCULINE_PLUS.toWebHexString() + "String_Node_Str"));
}
 else if (femininity <= Femininity.MASCULINE.getMaximumFemininity()) {
sb.append(UtilText.returnStringAtRandom("String_Node_Str" + Colour.MASCULINE.toWebHexString() + "String_Node_Str"));
}
 else if (femininity <= Femininity.ANDROGYNOUS.getMaximumFemininity()) {
sb.append("String_Node_Str" + Colour.ANDROGYNOUS.toWebHexString() + "String_Node_Str");
}
 else if (femininity <= Femininity.FEMININE.getMaximumFemininity()) {
sb.append(UtilText.returnStringAtRandom("String_Node_Str" + Colour.FEMININE.toWebHexString() + "String_Node_Str"));
}
 else {
sb.append(UtilText.returnStringAtRandom("String_Node_Str" + Colour.FEMININE_PLUS.toWebHexString() + "String_Node_Str"));
}
sb.append("String_Node_Str");
sb.append("String_Node_Str");
switch (wing.getType()) {
case DEMON_COMMON:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case ANGEL:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
default :
break;
}
switch (tail.getType()) {
case DEMON_COMMON:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case DOG_MORPH:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case LYCAN:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case CAT_MORPH:
if (owner.isPlayer()) sb.append("String_Node_Str" + "String_Node_Str");
 else sb.append("String_Node_Str" + "String_Node_Str");
break;
case HORSE_MORPH:
if (owner.isPlayer()) sb.append("String_Node_Str" + "String_Node_Str");
 else sb.append("String_Node_Str" + "String_Node_Str");
break;
case HARPY:
if (owner.isPlayer()) sb.append("String_Node_Str" + "String_Node_Str");
 else sb.append("String_Node_Str" + "String_Node_Str");
break;
default :
break;
}
if (owner.isPlayer()) {
sb.append("String_Node_Str");
}
 else {
sb.append("String_Node_Str");
}
if (owner.getPlayerKnowsAreasMap().get(CoverableArea.ANUS)) {
sb.append("String_Node_Str" + getAssDescription(owner));
sb.append("String_Node_Str");
}
 else {
sb.append("String_Node_Str" + Colour.GENERIC_SEX.toWebHexString() + "String_Node_Str");
sb.append("String_Node_Str");
}
if (owner.getPlayerKnowsAreasMap().get(CoverableArea.VAGINA) && owner.getPlayerKnowsAreasMap().get(CoverableArea.PENIS)) {
if (vagina.getType() == VaginaType.NONE && penis.getType() == PenisType.NONE) {
sb.append("String_Node_Str" + getMoundDescription(owner) + "String_Node_Str");
}
}
if (owner.getPlayerKnowsAreasMap().get(CoverableArea.PENIS)) {
if (penis.getType() != PenisType.NONE) {
sb.append("String_Node_Str" + getPenisDescription(owner) + "String_Node_Str");
}
}
 else {
sb.append("String_Node_Str" + "String_Node_Str" + Colour.GENERIC_SEX.toWebHexString() + "String_Node_Str"+ "String_Node_Str");
}
if (owner.getPlayerKnowsAreasMap().get(CoverableArea.VAGINA)) {
if (vagina.getType() != VaginaType.NONE) {
sb.append("String_Node_Str" + getVaginaDescription(owner) + "String_Node_Str");
}
}
 else {
sb.append("String_Node_Str" + "String_Node_Str" + Colour.GENERIC_SEX.toWebHexString() + "String_Node_Str"+ "String_Node_Str");
}
if (!owner.isPlayer()) {
sb.append(getSexDetails(owner));
sb.append(getPregnancyDetails(owner));
}
return UtilText.parse(owner,sb.toString());
}

Fixed version (ground truth):
/** 
 * @param owner
 * @param playerKnowledgeOfThroat
 * @param playerKnowledgeOfBreasts
 * @param playerKnowledgeOfGroin
 * @return
 */
public String getDescription(GameCharacter owner){
  StringBuilder sb=new StringBuilder();
  if (owner.isPlayer()) {
    sb.append("String_Node_Str" + "String_Node_Str" + getGender().getColour().toWebHexString() + "String_Node_Str"+ owner.getAppearsAsGenderDescription()+ "String_Node_Str"+ "String_Node_Str");
  }
 else {
    if (owner.getPlayerKnowsAreasMap().get(CoverableArea.PENIS) && owner.getPlayerKnowsAreasMap().get(CoverableArea.VAGINA)) {
      sb.append("String_Node_Str" + "String_Node_Str" + getGender().getColour().toWebHexString() + "String_Node_Str"+ owner.getAppearsAsGenderDescription()+ "String_Node_Str"+ "String_Node_Str");
    }
 else {
      if (Main.game.getPlayer().hasPerk(Perk.OBSERVANT)) {
        sb.append("String_Node_Str" + "String_Node_Str" + getGender().getColour().toWebHexString() + "String_Node_Str"+ owner.getAppearsAsGenderDescription()+ "String_Node_Str"+ "String_Node_Str");
      }
 else {
        sb.append("String_Node_Str" + "String_Node_Str" + owner.getAppearsAsGenderDescription() + "String_Node_Str"+ "String_Node_Str");
      }
    }
  }
  if (owner.isPlayer()) {
    sb.append("String_Node_Str" + "String_Node_Str");
  }
 else {
    sb.append("String_Node_Str" + "String_Node_Str");
  }
  if (Femininity.valueOf(femininity) == Femininity.MASCULINE_STRONG) {
    sb.append(UtilText.returnStringAtRandom("String_Node_Str" + Colour.MASCULINE_PLUS.toWebHexString() + "String_Node_Str","String_Node_Str" + Colour.MASCULINE_PLUS.toWebHexString() + "String_Node_Str"));
  }
 else   if (Femininity.valueOf(femininity) == Femininity.MASCULINE) {
    sb.append(UtilText.returnStringAtRandom("String_Node_Str" + Colour.MASCULINE.toWebHexString() + "String_Node_Str","String_Node_Str" + Colour.MASCULINE.toWebHexString() + "String_Node_Str"));
  }
 else   if (Femininity.valueOf(femininity) == Femininity.ANDROGYNOUS) {
    sb.append("String_Node_Str" + Colour.ANDROGYNOUS.toWebHexString() + "String_Node_Str");
  }
 else   if (Femininity.valueOf(femininity) == Femininity.FEMININE) {
    sb.append(UtilText.returnStringAtRandom("String_Node_Str" + Colour.FEMININE.toWebHexString() + "String_Node_Str","String_Node_Str" + Colour.FEMININE.toWebHexString() + "String_Node_Str","String_Node_Str" + Colour.FEMININE.toWebHexString() + "String_Node_Str"));
  }
 else {
    sb.append(UtilText.returnStringAtRandom("String_Node_Str" + Colour.FEMININE_PLUS.toWebHexString() + "String_Node_Str","String_Node_Str" + Colour.FEMININE_PLUS.toWebHexString() + "String_Node_Str","String_Node_Str" + Colour.FEMININE_PLUS.toWebHexString() + "String_Node_Str","String_Node_Str" + Colour.FEMININE_PLUS.toWebHexString() + "String_Node_Str"));
  }
switch (face.getType()) {
case HUMAN:
    if (owner.isPlayer()) {
      sb.append("String_Node_Str" + owner.getEyeColour().toWebHexString() + "String_Node_Str"+ (face.isPiercedNose() ? "String_Node_Str" : "String_Node_Str"));
    }
 else {
      sb.append("String_Node_Str" + owner.getEyeColour().toWebHexString() + "String_Node_Str"+ (face.isPiercedNose() ? "String_Node_Str" : "String_Node_Str"));
    }
  break;
case ANGEL:
if (owner.isPlayer()) {
  sb.append("String_Node_Str" + "String_Node_Str" + owner.getEyeColour().toWebHexString() + "String_Node_Str"+ (face.isPiercedNose() ? "String_Node_Str" : "String_Node_Str"));
}
 else {
  sb.append("String_Node_Str" + "String_Node_Str" + owner.getEyeColour().toWebHexString() + "String_Node_Str"+ (face.isPiercedNose() ? "String_Node_Str" : "String_Node_Str"));
}
break;
case DEMON_COMMON:
if (owner.isPlayer()) {
sb.append("String_Node_Str" + owner.getEyeColour().toWebHexString() + "String_Node_Str"+ (face.isPiercedNose() ? "String_Node_Str" : "String_Node_Str"));
}
 else {
sb.append("String_Node_Str" + owner.getEyeColour().toWebHexString() + "String_Node_Str"+ (face.isPiercedNose() ? "String_Node_Str" : "String_Node_Str"));
}
break;
case DOG_MORPH:
if (owner.isPlayer()) {
sb.append("String_Node_Str" + "String_Node_Str" + owner.getEyeColour().toWebHexString() + "String_Node_Str"+ (face.isPiercedNose() ? "String_Node_Str" : "String_Node_Str"));
}
 else {
sb.append("String_Node_Str" + "String_Node_Str" + owner.getEyeColour().toWebHexString() + "String_Node_Str"+ (face.isPiercedNose() ? "String_Node_Str" : "String_Node_Str"));
}
break;
case LYCAN:
if (owner.isPlayer()) {
sb.append("String_Node_Str" + "String_Node_Str" + owner.getEyeColour().toWebHexString() + "String_Node_Str"+ (face.isPiercedNose() ? "String_Node_Str" : "String_Node_Str"));
}
 else {
sb.append("String_Node_Str" + "String_Node_Str" + owner.getEyeColour().toWebHexString() + "String_Node_Str"+ (face.isPiercedNose() ? "String_Node_Str" : "String_Node_Str"));
}
break;
case CAT_MORPH:
if (owner.isPlayer()) {
sb.append("String_Node_Str" + "String_Node_Str" + owner.getEyeColour().toWebHexString() + "String_Node_Str"+ (face.isPiercedNose() ? "String_Node_Str" : "String_Node_Str"));
}
 else {
sb.append("String_Node_Str" + "String_Node_Str" + owner.getEyeColour().toWebHexString() + "String_Node_Str"+ (face.isPiercedNose() ? "String_Node_Str" : "String_Node_Str"));
}
break;
case HORSE_MORPH:
if (owner.isPlayer()) {
sb.append("String_Node_Str" + "String_Node_Str" + owner.getEyeColour().toWebHexString() + "String_Node_Str"+ (face.isPiercedNose() ? "String_Node_Str" : "String_Node_Str"));
}
 else {
sb.append("String_Node_Str" + "String_Node_Str" + owner.getEyeColour().toWebHexString() + "String_Node_Str"+ (face.isPiercedNose() ? "String_Node_Str" : "String_Node_Str"));
}
break;
case SLIME:
if (owner.isPlayer()) sb.append("String_Node_Str" + "String_Node_Str" + owner.getEyeColour().toWebHexString() + "String_Node_Str"+ (face.isPiercedNose() ? "String_Node_Str" : "String_Node_Str"));
 else sb.append("String_Node_Str" + skinTypeColours.get(face.getType().getSkinType()).getName() + "String_Node_Str"+ "String_Node_Str"+ owner.getEyeColour().toWebHexString()+ "String_Node_Str"+ (face.isPiercedNose() ? "String_Node_Str" : "String_Node_Str"));
break;
case HARPY:
if (owner.isPlayer()) sb.append("String_Node_Str" + "String_Node_Str" + owner.getEyeColour().toWebHexString() + "String_Node_Str"+ (face.isPiercedNose() ? "String_Node_Str" : "String_Node_Str"));
 else sb.append("String_Node_Str" + "String_Node_Str" + owner.getEyeColour().toWebHexString() + "String_Node_Str"+ (face.isPiercedNose() ? "String_Node_Str" : "String_Node_Str"));
break;
default :
sb.append(face.getName(owner,true) + "String_Node_Str");
}
if (owner.isPlayer()) {
sb.append("String_Node_Str" + (face.getTongue().getType() == TongueType.HUMAN ? "String_Node_Str" : face.getTongue().getName(owner,true)) + (face.getTongue().isPierced() ? "String_Node_Str" : "String_Node_Str"));
if (face.isPiercedLip()) {
sb.append("String_Node_Str");
}
if (face.isVirgin()) {
sb.append("String_Node_Str" + Colour.GENERIC_SEX.toWebHexString() + "String_Node_Str");
}
 else {
switch (face.getCapacity().getMaximumSizeComfortableWithLube()) {
case NEGATIVE_UTILITY_VALUE:
case ZERO_MICROSCOPIC:
sb.append("String_Node_Str" + Colour.GENERIC_SEX.toWebHexString() + "String_Node_Str");
break;
case ONE_TINY:
sb.append("String_Node_Str" + Colour.GENERIC_SEX.toWebHexString() + "String_Node_Str");
break;
case TWO_AVERAGE:
sb.append("String_Node_Str" + Colour.GENERIC_SEX.toWebHexString() + "String_Node_Str");
break;
case THREE_LARGE:
sb.append("String_Node_Str" + Colour.GENERIC_SEX.toWebHexString() + "String_Node_Str");
break;
case FOUR_HUGE:
sb.append("String_Node_Str" + Colour.GENERIC_SEX.toWebHexString() + "String_Node_Str");
break;
case FIVE_ENORMOUS:
sb.append("String_Node_Str" + Colour.GENERIC_SEX.toWebHexString() + "String_Node_Str");
break;
case SIX_GIGANTIC:
sb.append("String_Node_Str" + Colour.GENERIC_SEX.toWebHexString() + "String_Node_Str");
break;
case SEVEN_STALLION:
sb.append("String_Node_Str" + Colour.GENERIC_SEX.toWebHexString() + "String_Node_Str"+ "String_Node_Str"+ Colour.GENERIC_EXCELLENT.toWebHexString()+ "String_Node_Str"+ "String_Node_Str"+ Colour.GENERIC_SEX.toWebHexString()+ "String_Node_Str");
break;
default :
break;
}
for (PenetrationType pt : PenetrationType.values()) {
if (Main.game.getPlayer().getVirginityLoss(new SexType(pt,OrificeType.MOUTH_PLAYER)) != null) {
sb.append("String_Node_Str" + Colour.GENERIC_ARCANE.toWebHexString() + "String_Node_Str"+ Main.game.getPlayer().getVirginityLoss(new SexType(pt,OrificeType.MOUTH_PLAYER))+ "String_Node_Str");
}
}
}
}
 else {
sb.append("String_Node_Str" + (face.getTongue().getType() == TongueType.HUMAN ? "String_Node_Str" : face.getTongue().getName(owner,true)) + (face.getTongue().isPierced() ? "String_Node_Str" : "String_Node_Str"));
if (face.isPiercedLip()) {
sb.append("String_Node_Str");
}
if (owner.getPlayerKnowsAreasMap().get(CoverableArea.MOUTH)) {
if (face.isVirgin()) {
sb.append("String_Node_Str" + Colour.GENERIC_SEX.toWebHexString() + "String_Node_Str");
}
 else {
switch (face.getCapacity().getMaximumSizeComfortableWithLube()) {
case NEGATIVE_UTILITY_VALUE:
case ZERO_MICROSCOPIC:
sb.append("String_Node_Str" + Colour.GENERIC_SEX.toWebHexString() + "String_Node_Str");
break;
case ONE_TINY:
sb.append("String_Node_Str" + Colour.GENERIC_SEX.toWebHexString() + "String_Node_Str");
break;
case TWO_AVERAGE:
sb.append("String_Node_Str" + Colour.GENERIC_SEX.toWebHexString() + "String_Node_Str");
break;
case THREE_LARGE:
sb.append("String_Node_Str" + Colour.GENERIC_SEX.toWebHexString() + "String_Node_Str");
break;
case FOUR_HUGE:
sb.append("String_Node_Str" + Colour.GENERIC_SEX.toWebHexString() + "String_Node_Str");
break;
case FIVE_ENORMOUS:
sb.append("String_Node_Str" + Colour.GENERIC_SEX.toWebHexString() + "String_Node_Str");
break;
case SIX_GIGANTIC:
sb.append("String_Node_Str" + Colour.GENERIC_SEX.toWebHexString() + "String_Node_Str");
break;
case SEVEN_STALLION:
sb.append("String_Node_Str" + Colour.GENERIC_SEX.toWebHexString() + "String_Node_Str"+ "String_Node_Str"+ Colour.GENERIC_EXCELLENT.toWebHexString()+ "String_Node_Str"+ "String_Node_Str"+ Colour.GENERIC_SEX.toWebHexString()+ "String_Node_Str"+ "String_Node_Str");
break;
default :
break;
}
}
}
 else {
sb.append("String_Node_Str" + Colour.GENERIC_SEX.toWebHexString() + "String_Node_Str");
}
}
switch (ear.getType()) {
case HUMAN:
if (owner.isPlayer()) sb.append("String_Node_Str" + (ear.isPierced() ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str");
 else sb.append("String_Node_Str" + (ear.isPierced() ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str");
break;
case DEMON_COMMON:
if (owner.isPlayer()) sb.append("String_Node_Str" + (ear.isPierced() ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str");
 else sb.append("String_Node_Str" + (ear.isPierced() ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str");
break;
case DOG_MORPH:
if (owner.isPlayer()) sb.append("String_Node_Str" + (ear.isPierced() ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str");
 else sb.append("String_Node_Str" + (ear.isPierced() ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str");
break;
case LYCAN:
if (owner.isPlayer()) sb.append("String_Node_Str" + (ear.isPierced() ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str");
 else sb.append("String_Node_Str" + (ear.isPierced() ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str");
break;
case CAT_MORPH:
if (owner.isPlayer()) sb.append("String_Node_Str" + (ear.isPierced() ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str");
 else sb.append("String_Node_Str" + (ear.isPierced() ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str");
break;
case HORSE_MORPH:
if (owner.isPlayer()) sb.append("String_Node_Str" + (ear.isPierced() ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str");
 else sb.append("String_Node_Str" + (ear.isPierced() ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str");
break;
case SLIME:
if (owner.isPlayer()) sb.append("String_Node_Str" + (ear.isPierced() ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str"+ skinTypeColours.get(BodyCoveringType.SLIME).getName()+ "String_Node_Str");
 else sb.append("String_Node_Str" + (ear.isPierced() ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str"+ skinTypeColours.get(BodyCoveringType.SLIME).getName()+ "String_Node_Str");
break;
case HARPY:
if (owner.isPlayer()) sb.append("String_Node_Str" + (ear.isPierced() ? "String_Node_Str" : "String_Node_Str"));
 else sb.append("String_Node_Str" + (ear.isPierced() ? "String_Node_Str" : "String_Node_Str"));
break;
default :
if (owner.isPlayer()) sb.append("String_Node_Str" + ear.getType().getDeterminer(owner) + "String_Node_Str"+ (ear.isPierced() ? "String_Node_Str" : "String_Node_Str")+ "String_Node_Str"+ ear.getName(owner,true)+ "String_Node_Str");
 else sb.append("String_Node_Str" + ear.getType().getDeterminer(owner) + "String_Node_Str"+ (ear.isPierced() ? "String_Node_Str" : "String_Node_Str")+ "String_Node_Str"+ ear.getName(owner,true)+ "String_Node_Str");
}
if (owner.isPlayer() && hair.getRawLengthValue() == 0) {
sb.append("String_Node_Str");
}
 else if (!owner.isPlayer() && hair.getRawLengthValue() == 0) {
sb.append("String_Node_Str");
}
 else {
switch (hair.getType()) {
case HAIR_HUMAN:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case HAIR_ANGEL:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case HAIR_CANINE_FUR:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case HAIR_LYCAN_FUR:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case HAIR_FELINE_FUR:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case HAIR_HORSE_HAIR:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case HAIR_SLIME:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case HAIR_HARPY:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
default :
if (owner.isPlayer()) sb.append("String_Node_Str" + hair.getLength().getDescriptor() + "String_Node_Str"+ skinTypeColours.get(hair.getType()).getName()+ "String_Node_Str"+ hair.getName(owner,true));
 else sb.append("String_Node_Str" + hair.getLength().getDescriptor() + "String_Node_Str"+ skinTypeColours.get(hair.getType()).getName()+ "String_Node_Str"+ hair.getName(owner,true));
}
}
switch (horn.getType()) {
case NONE:
sb.append("String_Node_Str");
break;
case DEMON_COMMON_MALE:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case DEMON_COMMON_FEMALE:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
default :
if (owner.isPlayer()) sb.append("String_Node_Str" + horn.getType().getDeterminer(owner) + "String_Node_Str"+ horn.getName(owner,true)+ "String_Node_Str");
 else sb.append("String_Node_Str" + horn.getType().getDeterminer(owner) + "String_Node_Str"+ horn.getName(owner,true)+ "String_Node_Str");
}
switch (face.getMakeupLevel()) {
case NONE:
break;
case MINIMAL:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case LOW:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case AVERAGE:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case HIGH:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case VERY_HIGH:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case EXTREME:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case MAXIMUM:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
}
sb.append("String_Node_Str");
if (owner.isPlayer()) {
sb.append("String_Node_Str" + (breast.getRawSizeValue() == 0 ? "String_Node_Str" : breast.getName(owner,false)) + "String_Node_Str");
}
 else {
sb.append("String_Node_Str" + (breast.getRawSizeValue() == 0 ? "String_Node_Str" : breast.getName(owner,false)) + "String_Node_Str");
}
if (femininity <= Femininity.MASCULINE_STRONG.getMaximumFemininity()) {
sb.append(UtilText.returnStringAtRandom("String_Node_Str" + Colour.MASCULINE_PLUS.toWebHexString() + "String_Node_Str","String_Node_Str" + Colour.MASCULINE_PLUS.toWebHexString() + "String_Node_Str"));
}
 else if (femininity <= Femininity.MASCULINE.getMaximumFemininity()) {
sb.append(UtilText.returnStringAtRandom("String_Node_Str" + Colour.MASCULINE.toWebHexString() + "String_Node_Str","String_Node_Str" + Colour.MASCULINE.toWebHexString() + "String_Node_Str"));
}
 else if (femininity <= Femininity.ANDROGYNOUS.getMaximumFemininity()) {
sb.append("String_Node_Str" + Colour.ANDROGYNOUS.toWebHexString() + "String_Node_Str");
}
 else if (femininity <= Femininity.FEMININE.getMaximumFemininity()) {
sb.append(UtilText.returnStringAtRandom("String_Node_Str" + Colour.FEMININE.toWebHexString() + "String_Node_Str","String_Node_Str" + Colour.FEMININE.toWebHexString() + "String_Node_Str"));
}
 else {
sb.append(UtilText.returnStringAtRandom("String_Node_Str" + Colour.FEMININE_PLUS.toWebHexString() + "String_Node_Str","String_Node_Str" + Colour.FEMININE_PLUS.toWebHexString() + "String_Node_Str","String_Node_Str" + Colour.FEMININE_PLUS.toWebHexString() + "String_Node_Str"));
}
if (owner.hasStatusEffect(StatusEffect.PREGNANT_1)) {
if (owner.isPlayer()) sb.append("String_Node_Str" + Colour.GENERIC_ARCANE.toWebHexString() + "String_Node_Str");
 else sb.append("String_Node_Str" + Colour.GENERIC_ARCANE.toWebHexString() + "String_Node_Str");
}
 else if (owner.hasStatusEffect(StatusEffect.PREGNANT_2)) {
if (owner.isPlayer()) sb.append("String_Node_Str" + Colour.GENERIC_ARCANE.toWebHexString() + "String_Node_Str");
 else sb.append("String_Node_Str" + Colour.GENERIC_ARCANE.toWebHexString() + "String_Node_Str");
}
 else if (owner.hasStatusEffect(StatusEffect.PREGNANT_3)) {
if (owner.isPlayer()) sb.append("String_Node_Str" + "String_Node_Str" + Colour.GENERIC_ARCANE.toWebHexString() + "String_Node_Str");
 else sb.append("String_Node_Str" + "String_Node_Str" + Colour.GENERIC_ARCANE.toWebHexString() + "String_Node_Str");
}
if (owner.isPlayer()) {
if (breast.getRawSizeValue() > 0) {
sb.append("String_Node_Str" + Util.intToString(breast.getRows()) + "String_Node_Str"+ (breast.getRows() == 1 ? "String_Node_Str" : "String_Node_Str")+ "String_Node_Str"+ breast.getSize().getDescriptor()+ "String_Node_Str");
switch (breast.getRows()) {
case 1:
sb.append("String_Node_Str");
if (breast.getSize() == CupSize.TRAINING) sb.append("String_Node_Str");
 else sb.append((Util.isVowel(breast.getSize().getCupSizeName().charAt(0)) ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str" + breast.getSize().getCupSizeName()+ "String_Node_Str");
break;
case 2:
sb.append("String_Node_Str");
if (breast.getSize() == CupSize.TRAINING) sb.append("String_Node_Str");
 else sb.append((Util.isVowel(breast.getSize().getCupSizeName().charAt(0)) ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str" + breast.getSize().getCupSizeName()+ "String_Node_Str");
sb.append("String_Node_Str");
if (CupSize.getCupSizeFromInt(breast.getSize().getMeasurement() - 1) == CupSize.TRAINING) sb.append("String_Node_Str");
 else sb.append((Util.isVowel(CupSize.getCupSizeFromInt(breast.getSize().getMeasurement() - 1).getCupSizeName().charAt(0)) ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str" + CupSize.getCupSizeFromInt(breast.getSize().getMeasurement() - 1).getCupSizeName()+ "String_Node_Str");
break;
case 3:
sb.append("String_Node_Str");
if (breast.getSize() == CupSize.TRAINING) sb.append("String_Node_Str");
 else sb.append((Util.isVowel(breast.getSize().getCupSizeName().charAt(0)) ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str" + breast.getSize().getCupSizeName()+ "String_Node_Str");
sb.append("String_Node_Str");
if (CupSize.getCupSizeFromInt(breast.getSize().getMeasurement() - 1) == CupSize.TRAINING) sb.append("String_Node_Str");
 else sb.append((Util.isVowel(CupSize.getCupSizeFromInt(breast.getSize().getMeasurement() - 1).getCupSizeName().charAt(0)) ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str" + CupSize.getCupSizeFromInt(breast.getSize().getMeasurement() - 1).getCupSizeName()+ "String_Node_Str");
sb.append("String_Node_Str");
if (CupSize.getCupSizeFromInt(breast.getSize().getMeasurement() - 2) == CupSize.TRAINING) sb.append("String_Node_Str");
 else sb.append((Util.isVowel(CupSize.getCupSizeFromInt(breast.getSize().getMeasurement() - 2).getCupSizeName().charAt(0)) ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str" + CupSize.getCupSizeFromInt(breast.getSize().getMeasurement() - 2).getCupSizeName()+ "String_Node_Str");
break;
default :
break;
}
if (breast.isPierced()) {
sb.append("String_Node_Str");
}
}
 else {
sb.append("String_Node_Str");
switch (breast.getRows()) {
case 1:
sb.append("String_Node_Str" + (breast.isPierced() ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str");
break;
case 2:
sb.append("String_Node_Str" + (breast.isPierced() ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str");
break;
case 3:
sb.append("String_Node_Str" + (breast.isPierced() ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str");
break;
default :
break;
}
}
}
 else {
if (breast.getRawSizeValue() > 0) {
sb.append("String_Node_Str" + Util.intToString(breast.getRows()) + "String_Node_Str"+ (breast.getRows() == 1 ? "String_Node_Str" : "String_Node_Str")+ "String_Node_Str"+ breast.getSize().getDescriptor()+ "String_Node_Str");
switch (breast.getRows()) {
case 1:
sb.append("String_Node_Str");
if (breast.getSize() == CupSize.TRAINING) sb.append("String_Node_Str");
 else sb.append((Util.isVowel(breast.getSize().getCupSizeName().charAt(0)) ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str" + breast.getSize().getCupSizeName()+ "String_Node_Str");
break;
case 2:
sb.append("String_Node_Str");
if (breast.getSize() == CupSize.TRAINING) sb.append("String_Node_Str");
 else sb.append((Util.isVowel(breast.getSize().getCupSizeName().charAt(0)) ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str" + breast.getSize().getCupSizeName()+ "String_Node_Str");
sb.append("String_Node_Str");
if (CupSize.getCupSizeFromInt(breast.getSize().getMeasurement() - 1) == CupSize.TRAINING) sb.append("String_Node_Str");
 else sb.append((Util.isVowel(CupSize.getCupSizeFromInt(breast.getSize().getMeasurement() - 1).getCupSizeName().charAt(0)) ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str" + CupSize.getCupSizeFromInt(breast.getSize().getMeasurement() - 1).getCupSizeName()+ "String_Node_Str");
break;
case 3:
sb.append("String_Node_Str");
if (breast.getSize() == CupSize.TRAINING) sb.append("String_Node_Str");
 else sb.append((Util.isVowel(breast.getSize().getCupSizeName().charAt(0)) ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str" + breast.getSize().getCupSizeName()+ "String_Node_Str");
sb.append("String_Node_Str");
if (CupSize.getCupSizeFromInt(breast.getSize().getMeasurement() - 1) == CupSize.TRAINING) sb.append("String_Node_Str");
 else sb.append((Util.isVowel(CupSize.getCupSizeFromInt(breast.getSize().getMeasurement() - 1).getCupSizeName().charAt(0)) ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str" + CupSize.getCupSizeFromInt(breast.getSize().getMeasurement() - 1).getCupSizeName()+ "String_Node_Str");
sb.append("String_Node_Str");
if (CupSize.getCupSizeFromInt(breast.getSize().getMeasurement() - 2) == CupSize.TRAINING) sb.append("String_Node_Str");
 else sb.append((Util.isVowel(CupSize.getCupSizeFromInt(breast.getSize().getMeasurement() - 2).getCupSizeName().charAt(0)) ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str" + CupSize.getCupSizeFromInt(breast.getSize().getMeasurement() - 2).getCupSizeName()+ "String_Node_Str");
break;
default :
break;
}
if (breast.isPierced()) {
sb.append("String_Node_Str");
}
}
 else {
sb.append("String_Node_Str");
switch (breast.getRows()) {
case 1:
sb.append("String_Node_Str" + (breast.isPierced() ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str");
break;
case 2:
sb.append("String_Node_Str" + (breast.isPierced() ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str");
break;
case 3:
sb.append("String_Node_Str" + (breast.isPierced() ? "String_Node_Str" : "String_Node_Str") + "String_Node_Str");
break;
default :
break;
}
}
}
sb.append("String_Node_Str" + getBreastDescription(owner));
sb.append("String_Node_Str");
sb.append("String_Node_Str");
switch (arm.getType()) {
case HUMAN:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case ANGEL:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case DEMON_COMMON:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case DOG_MORPH:
if (owner.isPlayer()) sb.append("String_Node_Str" + "String_Node_Str");
 else sb.append("String_Node_Str" + "String_Node_Str");
break;
case LYCAN:
if (owner.isPlayer()) sb.append("String_Node_Str" + "String_Node_Str");
 else sb.append("String_Node_Str" + "String_Node_Str");
break;
case CAT_MORPH:
if (owner.isPlayer()) sb.append("String_Node_Str" + "String_Node_Str");
 else sb.append("String_Node_Str" + "String_Node_Str");
break;
case HORSE_MORPH:
if (owner.isPlayer()) sb.append("String_Node_Str" + "String_Node_Str");
 else sb.append("String_Node_Str" + "String_Node_Str");
break;
case SLIME:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case HARPY:
if (owner.isPlayer()) sb.append("String_Node_Str" + "String_Node_Str");
 else sb.append("String_Node_Str" + "String_Node_Str");
break;
default :
break;
}
sb.append("String_Node_Str");
switch (leg.getType()) {
case HUMAN:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case ANGEL:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case DEMON_COMMON:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case DOG_MORPH:
if (owner.isPlayer()) sb.append("String_Node_Str" + "String_Node_Str");
 else sb.append("String_Node_Str" + "String_Node_Str");
break;
case LYCAN:
if (owner.isPlayer()) sb.append("String_Node_Str" + "String_Node_Str");
 else sb.append("String_Node_Str" + "String_Node_Str");
break;
case CAT_MORPH:
if (owner.isPlayer()) sb.append("String_Node_Str" + "String_Node_Str");
 else sb.append("String_Node_Str" + "String_Node_Str");
break;
case HORSE_MORPH:
if (owner.isPlayer()) sb.append("String_Node_Str" + "String_Node_Str");
 else sb.append("String_Node_Str" + "String_Node_Str");
break;
case SLIME:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case HARPY:
if (owner.isPlayer()) sb.append("String_Node_Str" + "String_Node_Str");
 else sb.append("String_Node_Str" + "String_Node_Str");
break;
default :
break;
}
if (owner.isPlayer()) {
sb.append("String_Node_Str");
}
 else {
sb.append("String_Node_Str");
}
if (femininity <= Femininity.MASCULINE_STRONG.getMaximumFemininity()) {
sb.append(UtilText.returnStringAtRandom("String_Node_Str" + Colour.MASCULINE_PLUS.toWebHexString() + "String_Node_Str"));
}
 else if (femininity <= Femininity.MASCULINE.getMaximumFemininity()) {
sb.append(UtilText.returnStringAtRandom("String_Node_Str" + Colour.MASCULINE.toWebHexString() + "String_Node_Str"));
}
 else if (femininity <= Femininity.ANDROGYNOUS.getMaximumFemininity()) {
sb.append("String_Node_Str" + Colour.ANDROGYNOUS.toWebHexString() + "String_Node_Str");
}
 else if (femininity <= Femininity.FEMININE.getMaximumFemininity()) {
sb.append(UtilText.returnStringAtRandom("String_Node_Str" + Colour.FEMININE.toWebHexString() + "String_Node_Str"));
}
 else {
sb.append(UtilText.returnStringAtRandom("String_Node_Str" + Colour.FEMININE_PLUS.toWebHexString() + "String_Node_Str"));
}
sb.append("String_Node_Str");
sb.append("String_Node_Str");
switch (wing.getType()) {
case DEMON_COMMON:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case ANGEL:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
default :
break;
}
switch (tail.getType()) {
case DEMON_COMMON:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case DOG_MORPH:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case LYCAN:
if (owner.isPlayer()) sb.append("String_Node_Str");
 else sb.append("String_Node_Str");
break;
case CAT_MORPH:
if (owner.isPlayer()) sb.append("String_Node_Str" + "String_Node_Str");
 else sb.append("String_Node_Str" + "String_Node_Str");
break;
case HORSE_MORPH:
if (owner.isPlayer()) sb.append("String_Node_Str" + "String_Node_Str");
 else sb.append("String_Node_Str" + "String_Node_Str");
break;
case HARPY:
if (owner.isPlayer()) sb.append("String_Node_Str" + "String_Node_Str");
 else sb.append("String_Node_Str" + "String_Node_Str");
break;
default :
break;
}
if (owner.isPlayer()) {
sb.append("String_Node_Str");
}
 else {
sb.append("String_Node_Str");
}
if (owner.getPlayerKnowsAreasMap().get(CoverableArea.ANUS)) {
sb.append("String_Node_Str" + getAssDescription(owner));
sb.append("String_Node_Str");
}
 else {
sb.append("String_Node_Str" + Colour.GENERIC_SEX.toWebHexString() + "String_Node_Str");
sb.append("String_Node_Str");
}
if (owner.getPlayerKnowsAreasMap().get(CoverableArea.VAGINA) && owner.getPlayerKnowsAreasMap().get(CoverableArea.PENIS)) {
if (vagina.getType() == VaginaType.NONE && penis.getType() == PenisType.NONE) {
sb.append("String_Node_Str" + getMoundDescription(owner) + "String_Node_Str");
}
}
if (owner.getPlayerKnowsAreasMap().get(CoverableArea.PENIS)) {
if (penis.getType() != PenisType.NONE) {
sb.append("String_Node_Str" + getPenisDescription(owner) + "String_Node_Str");
}
}
 else {
sb.append("String_Node_Str" + "String_Node_Str" + Colour.GENERIC_SEX.toWebHexString() + "String_Node_Str"+ "String_Node_Str");
}
if (owner.getPlayerKnowsAreasMap().get(CoverableArea.VAGINA)) {
if (vagina.getType() != VaginaType.NONE) {
sb.append("String_Node_Str" + getVaginaDescription(owner) + "String_Node_Str");
}
}
 else {
sb.append("String_Node_Str" + "String_Node_Str" + Colour.GENERIC_SEX.toWebHexString() + "String_Node_Str"+ "String_Node_Str");
}
if (!owner.isPlayer()) {
sb.append(getSexDetails(owner));
sb.append(getPregnancyDetails(owner));
}
return UtilText.parse(owner,sb.toString());
}