@Override
 public final float encodeTable(SheetGraphics graphics, ReportSession session, Bounds bounds)
     throws DocumentException {
   mobilityPenalty =
       Math.min(0, StatsModifiers.allStatsModifiers(session.getHero()).getMobilityPenalty());
   return super.encodeTable(graphics, session, bounds);
 }
  @Override
  public void encode(Sheet sheet, SheetGraphics graphics, ReportSession session)
      throws DocumentException {
    sheet.startPortraitPage(graphics, session);
    int firstSet = 0, secondSet = 0;
    boolean DBT = hasDBT(session.getCharacter());
    firstSet += encodeSpiritForms(graphics, session, firstSet, DBT);
    if (DBT) {
      firstSet += PADDING;
      secondSet = firstSet;
      firstSet += encodeArsenal(graphics, session, firstSet) + PADDING;
      firstSet += encodePanoply(graphics, session, firstSet, 80) + PADDING;
      firstSet += encodeMovementAndHealth(graphics, session, firstSet, 99);

      secondSet += encodeCombatStats(graphics, session, secondSet) + PADDING;
      encodePowers(graphics, session, secondSet, firstSet - secondSet, false);
    } else {
      encodePowers(graphics, session, secondSet, firstSet, true);
    }

    firstSet += PADDING;

    int remaining = (int) (pageConfiguration.getContentHeight() - firstSet);
    encodeKnacks(graphics, session, firstSet, remaining);
    encodeAnimalForms(graphics, session, firstSet, remaining);
  }
 @Override
 public SimpleEssenceContent create(ReportSession session) {
   return new SimpleEssenceContent(resources, session.getCharacter(), session.getHero());
 }
 @Override
 protected void addThirdCell(
     SheetGraphics graphics, ReportSession reportSession, PdfPTable table) {
   CombatStatsContent content = reportSession.createContent(CombatStatsContent.class);
   table.addCell(createCommonActionsTable(graphics, content));
 }
 @Override
 protected void addSecondCell(
     SheetGraphics graphics, ReportSession reportSession, PdfPTable table) {
   CombatStatsContent content = reportSession.createContent(CombatStatsContent.class);
   addAsCell(graphics, table, content.getKnockdownAndStunningTexts());
 }
 @Override
 protected void addFirstCell(
     SheetGraphics graphics, ReportSession reportSession, PdfPTable table) {
   CombatStatsContent content = reportSession.createContent(CombatStatsContent.class);
   table.addCell(new TableCell(createCombatAttackList(graphics, content), Rectangle.BOX));
 }