Menu Addon for Summon System

This plugin upgrades how your pets are displayed in the menu! Instead of showing pets the same as your actors, this plugin moves them into a fresh new menu.

This menu consists of a catalog and an inspection page that provides all the information you need. All windows are customizable so you can for example hide level and experience information.

Optional: Undiscovered companions can be displayed by „???“
All windows are fully customizable by using JavaScript

Consequently

  • Players can see their pets‘ skills but cannot inspect or chant them
  • Players can no longer equip their pets
  • Without customizing, this menu will not show the current HP/MP or affected States, as it assumes that your pets are auto-healed when summoned
  • You can decide whether Level and Exp info should be displayed

Ultimately, these features can be exactly what you wish for your game or what you don’t wish for, so it’s up to you whether you want to include this plugin or not.

Biography Notetag

Can be assigned to any Actor.

<Biography>
Lorem ipsum...
</Biography>

Code Snippets

This plugin allows many code customizations. Here are some examples:

Exp & Stats, no HP/MP/TP, no States

This is the default code, useful when temporary battle information is not useful for the player (because pets are auto-healed when summoned).

Level and Exp are not shown when disabled in Plugin Manager.

// constants
const pet = arguments[0];
const faceWidth = ImageManager.faceWidth || Window_Base._faceWidth;
const faceHeight = ImageManager.faceHeight || Window_Base._faceHeight;

// draw
if (!pet) return;

let yName = 0;

if ('Face' == MK.SummoningMenuAddon.statusMenuPortraitStyle) {
    this.drawFace(
        pet.faceName(),
        pet.faceIndex(),
        0,
        0,
    );
    yName += faceHeight;
}
if ('Sprite' == MK.SummoningMenuAddon.statusMenuPortraitStyle) {
    this.drawCharacter(
        pet.characterName(),
        pet.characterIndex(),
        faceWidth / 2,
        this.height / 2,
    );
    yName += this.height / 2;
}
if ('Battler Sprite' == MK.SummoningMenuAddon.statusMenuPortraitStyle) {
    this.drawBattlerSprite(
        pet,
        faceWidth / 2,
        this.height / 2,
    );
    yName += this.height / 2;
}

this.drawText(
    pet.name(),
    0,
    yName,
    faceWidth,
    'center',
);

// Level
let x = faceWidth + 20;

if (MK.SummoningMenuAddon.showPetLevel) {
    const levelInfoWidth = 160;
    const y1 = this.height / 2 - 2 * this.lineHeight();

    this.changeTextColor(this.systemColor());
    this.drawText(
        TextManager.levelA,
        x,
        y1,
        levelInfoWidth,
    );
    this.resetTextColor();
    this.drawText(
        pet.level,
        x,
        y1,
        levelInfoWidth,
        'right',
    );

    // EXP
    if (!pet.isMaxLevel()) {
        this.changeTextColor(this.systemColor());
        this.drawText(
            MK.SummoningMenuAddon.Vocabulary.exp,
            x,
            y1 + this.lineHeight(),
            levelInfoWidth,
        );
        this.drawText(
            MK.SummoningMenuAddon.Vocabulary.toNextExp,
            x,
            y1 + 2 * this.lineHeight(),
            levelInfoWidth,
        );
        this.resetTextColor();
        this.drawText(
            pet.isMaxLevel() ? '-----' : pet.currentExp(),
            x,
            y1 + this.lineHeight(),
            levelInfoWidth,
            'right',
        );
        this.drawText(
            pet.isMaxLevel() ? '-----' : pet.nextRequiredExp(),
            x,
            y1 + 2 * this.lineHeight(),
            levelInfoWidth,
            'right',
        );
    }
    x += levelInfoWidth + 30;
}

// HP, MP, Atk, Def, etc.
const paramBoxWidth = Math.min(this.contentsWidth() - x, 400);
const xParamBox = this.contentsWidth() - paramBoxWidth;
const w2 = this.textWidth('9999');
const w1 = paramBoxWidth / 2 - w2;
const y2 = this.height / 2 - 2.5 * this.lineHeight();

for (let i = 0; i < 8; i++) {
    this.changeTextColor(this.systemColor());
    this.drawText(
        TextManager.param(i),
        xParamBox + Math.floor(i / 4) * (w1 + w2),
        (i % 4) * this.lineHeight() + y2,
        w1 - 20,
    );
    this.resetTextColor();
    this.drawText(
        pet.param(i),
        xParamBox + Math.floor(i / 4) * (w1 + w2) + w1 - 20,
        (i % 4) * this.lineHeight() + y2,
        w2,
        'right',
    );
}

HP/MP/TP Gauges, current States, & Stats

Level and TP are not shown when disabled in Plugin Manager/database.

// constants
const pet = arguments[0];
const faceWidth = ImageManager.faceWidth || Window_Base._faceWidth;
const faceHeight = ImageManager.faceHeight || Window_Base._faceHeight;

// draw
if (!pet) return;

let yName = 0;

if ('Face' == MK.SummoningMenuAddon.statusMenuPortraitStyle) {
    this.drawFace(
        pet.faceName(),
        pet.faceIndex(),
        0,
        0,
    );
    yName += faceHeight;
}
if ('Sprite' == MK.SummoningMenuAddon.statusMenuPortraitStyle) {
    this.drawCharacter(
        pet.characterName(),
        pet.characterIndex(),
        faceWidth / 2,
        this.height / 2,
    );
    yName += this.height / 2;
}
if ('Battler Sprite' == MK.SummoningMenuAddon.statusMenuPortraitStyle) {
    this.drawBattlerSprite(
        pet,
        faceWidth / 2,
        this.height / 2,
    );
    yName += this.height / 2;
}

this.drawText(
    pet.name(),
    0,
    yName,
    faceWidth,
    'center',
);
let x = faceWidth + 20;

// Basic Info
const y1 = this.height / 2 - 2.5 * this.lineHeight();

if (MK.SummoningMenuAddon.showPetLevel) {
    this.drawActorLevel(pet, x, 0 * this.lineHeight() + y1);
}
this.drawActorIcons(pet, x, 1 * this.lineHeight() + y1);
this.placeBasicGauges(pet, x, 2 * this.lineHeight() + y1);

x += 200;

// Atk, Def, etc.
const paramBoxWidth = Math.min(this.contentsWidth() - x, 400);
const xParamBox = this.contentsWidth() - paramBoxWidth;
const w2 = this.textWidth('9999');
const w1 = paramBoxWidth / 2 - w2;
const y2 = this.height / 2 - 2 * this.lineHeight();

for (let i = 0; i < 6; i++) {
    this.changeTextColor(this.systemColor());
    this.drawText(
        TextManager.param(i + 2),
        xParamBox + Math.floor(i / 3) * (w1 + w2),
        (i % 3) * this.lineHeight() + y2,
        w1 - 20,
    );
    this.resetTextColor();
    this.drawText(
        pet.param(i + 2),
        xParamBox + Math.floor(i / 3) * (w1 + w2) + w1 - 20,
        (i % 3) * this.lineHeight() + y2,
        w2,
        'right',
    );
}
// constants
const pet = arguments[0];
const faceWidth = ImageManager.faceWidth || Window_Base._faceWidth;
const faceHeight = ImageManager.faceHeight || Window_Base._faceHeight;

// draw
if (!pet) return;

let yName = 0;

if ('Face' == MK.SummoningMenuAddon.statusMenuPortraitStyle) {
    this.drawFace(
        pet.faceName(),
        pet.faceIndex(),
        0,
        0,
    );
    yName += faceHeight;
}
if ('Sprite' == MK.SummoningMenuAddon.statusMenuPortraitStyle) {
    this.drawCharacter(
        pet.characterName(),
        pet.characterIndex(),
        faceWidth / 2,
        this.height / 2,
    );
    yName += this.height / 2;
}
if ('Battler Sprite' == MK.SummoningMenuAddon.statusMenuPortraitStyle) {
    this.drawBattlerSprite(
        pet,
        faceWidth / 2,
        this.height / 2,
    );
    yName += this.height / 2;
}

this.drawText(
    pet.name(),
    0,
    yName,
    faceWidth,
    'center',
);
let x = faceWidth + 20;

// Basic Info
if (MK.SummoningMenuAddon.showPetLevel) {
    this.drawActorLevel(pet, x, 0);
}
this.drawActorIcons(pet, x, 1 * this.lineHeight());
this.drawActorHp(pet, x, 2 * this.lineHeight(), 186);
this.drawActorMp(pet, x, 3 * this.lineHeight(), 186);
if ($dataSystem.optDisplayTp) {
    this.drawActorTp(pet, x, 4 * this.lineHeight(), 186);
}

x += 200;

// Atk, Def, etc.
const paramBoxWidth = Math.min(this.contentsWidth() - x, 400);
const xParamBox = this.contentsWidth() - paramBoxWidth;
const w2 = this.textWidth('9999');
const w1 = paramBoxWidth / 2 - w2;
const y2 = this.height / 2 - 2 * this.lineHeight();

for (let i = 0; i < 6; i++) {
    this.changeTextColor(this.systemColor());
    this.drawText(
        TextManager.param(i + 2),
        xParamBox + Math.floor(i / 3) * (w1 + w2),
        (i % 3) * this.lineHeight() + y2,
        w1 - 20,
    );
    this.resetTextColor();
    this.drawText(
        pet.param(i + 2),
        xParamBox + Math.floor(i / 3) * (w1 + w2) + w1 - 20,
        (i % 3) * this.lineHeight() + y2,
        w2,
        'right',
    );
}

Skills

This is the default code to display Skills

// constants
const pet = arguments[0];

// custom code
if (!pet) return;

this.changeTextColor(this.systemColor());
this.drawText(
    MK.SummoningMenuAddon.Vocabulary.skills,
    0,
    0.25 * this.lineHeight(),
    this.contentsWidth(),
    'center',
);
this.resetTextColor();

pet.skills().forEach((skill, i) => {
    this.drawItemName(
        skill,
        20,
        i * this.lineHeight() + 1.5 * this.lineHeight(),
        this.contentsWidth() - 20,
    );
});

Biography

This is the default code to show the pet’s biography.

// constants
const pet = arguments[0];

// custom code
if (!pet) return;
if (!pet.actor().meta) return;

const biography = (pet.actor().meta.petBiography || '').trim();
const nLines = biography.split('\n').length + 1;

if (biography) {
    this.drawTextEx(
        biography,
        0,
        this.height / 2 - nLines * this.lineHeight() / 2,
        this.contentsWidth(),
    );
}

Main Stats

Use this code to show ATK, DEF, …

// constants
const pet = arguments[0];

// draw
if (!pet) return;

const y = this.contentsHeight() / 2 - 4.5 * this.lineHeight();

for (let i = 0; i < 8; i++) {
    this.changeTextColor(this.systemColor());
    this.drawText(
        TextManager.param(i),
        10,
        i * this.lineHeight() + y,
        this.contentsWidth() - this.textWidth('99999') - 10,
    );
    this.resetTextColor();
    this.drawText(
        pet.param(i),
        0,
        i * this.lineHeight() + y,
        this.contentsWidth() - 10,
        'right',
    );
}

3rd Party Plugin Compatibility

VS Main Menu lets you define the command list in the main menu. If you want to add this menu through VS, follow this procedure:

Switch off „Is visible in Menu“ in „MK_Summon_MenuAddon“.

Go to „VS Main Menu Core“ -> Command Window List and create a new entry.

Symbolpets
Icon<as you prefer>
STR: Text<as you prefer>
JS: Text<empty>
JS: Showreturn true;

Alternatively
return $gameSwitches.value(1)
Replace 1 with a Switch ID to bind visibility
JS: Enablereturn $gameParty.pets().length;

Alternatively
return $gameSwitches.value(1)
Replace 1 with a Switch ID to bind accessibility
JS: Run CodeSceneManager.push(Scene_Pets);
JS: Personal Code<as it is>

Download

Right-click, save as…

downloads.aerosys.blog/plugins/MK_Summon_MenuAddon.js