Gender Functions and Requirements for MV?

Oriceles

Veteran
Veteran
Joined
Apr 4, 2012
Messages
384
Reaction score
71
First Language
English
Primarily Uses
N/A
I want to add gender requirements to equipments, as well as conditional branches based on the gender of the party leader (can be used as quest trigger). Mr.Bubble made both scripts for Ace, I already checked the forums and went to Google to see if anybody have made a port or something similar for MV but I couldn't find anything.

Can anyone point me to a script capable of doing this or is willing to make a port please?
 

Trihan

Speedy Scripter
Veteran
Joined
Apr 12, 2012
Messages
2,604
Reaction score
1,961
First Language
English
Primarily Uses
RMMV
I can take a stab at porting them if you can wait until tomorrow so I can finish my Winterruption entry for RMN,
 

Oriceles

Veteran
Veteran
Joined
Apr 4, 2012
Messages
384
Reaction score
71
First Language
English
Primarily Uses
N/A
I can take a stab at porting them if you can wait until tomorrow so I can finish my Winterruption entry for RMN,
OMG thanks! i'll wait for it :kaoluv:
 

Trihan

Speedy Scripter
Veteran
Joined
Apr 12, 2012
Messages
2,604
Reaction score
1,961
First Language
English
Primarily Uses
RMMV
Needs some further testing, but here's the port of the gender options script:

Code:
//=============================================================================
// GenderFunctions.js
//=============================================================================

/*:
 * @plugindesc This is a simple plugin that provides developers the option to define the gender of Actors and Enemies in their game. With the use of plugin commands and new functionsm this opens up a variety of options for eventers and coders alike. (ported to MV for Oriceles)
 * @author Mr. Bubble (original), Trihan (port)
 *
 * @param Default actor gender
 * @desc Determines the default gender for actors if no notetag is found. 0: Genderless, 1: Male, 2: Female
 * @default 0
 *
 * @param Default enemy gender
 * @desc Determines the default gender for enemies if no notetag is found. 0: Genderless, 1: Male, 2: Female
 * @default 0
 *
 * @help
 *
 * --------
 * Notetags
 * --------
 * The following notetags are for Actors and Enemies only:
 *
 * <gender:none>
 * <gender:genderless>
 * Defines the Actors of enemy as genderless. The internal value that represents
 * genderless is 0.
 *
 * <gender:m>
 * <gender:male>
 * Defines the Actor or Enemy as male. The internal value that represents male
 * is 1.
 *
 * <gender:f>
 * <gender:female>
 * Defines the Actor or Enemy as female. The internal value that represents
 * female is 2.
 *
 * ----------------------------------
 * Conditional branch script calls
 * ----------------------------------
 * The following script calls are meant to be used in Conditional Branch event
 * commands within the Tab 4 "Script" box.
 *
 * this.leaderIsGenderless()
 * this.leaderIsMale()
 * this.leaderIsFemale()
 * These script calls check the gender of the party leader.
 *
 * this.memberIsGenderless(index)
 * this.memberIsMale(index)
 * this.memberIsFemale(index)
 * These script calls check the gender of the given party member where index is
 * the party position index. 0 is the party leader, 1 is the 2nd member, 2 is
 * the 3rd member, etc.
 *
 * this.actorIsGenderless(id)
 * this.actorIsMale(id)
 * this.actorIsFemale(id)
 * These script calls check an actor's gender where id is an actor id from the
 * database. These can check the gender of actors not in the current party.
 *
 * this.battlePartyIsGenderless()
 * this.battlePartyIsMale()
 * this.battlePartyIsFemale()
 * These script calls check if all members in the battle party have matching
 * genders.
 *
 * this.troopEnemyIsGenderless(index)
 * this.troopEnemyIsMale(index)
 * this.troopEnemyIsFemale(index)
 * These script calls check the gender of the given enemy in the current troop
 * where index is the enemy's troop position index. 0 is the first enemy, 1 is
 * the 2nd enemy, 2 is the 3rd enemy, etc. This script call only works in battle.
 *
 * this.enemyIsGenderless(id)
 * this.enemyIsMale(id)
 * this.enemyIsFemale(id)
 * These script calls check an enemy's gender where id is an enemy id from the
 * database. These can check the gender of enemies even when not in battle.
 *
 * -------------------------------
 * Variable operation script calls
 * -------------------------------
 * The following script calls are meant to be used in Variable Operation event
 * commands within the "Script" box. Each of these script calls return a number
 * which is then stored in the given Game Variable.
 *
 * this.partyGenderlessCount()
 * this.partyMaleCount()
 * this.partyFemaleCount()
 * These script calls count the number of party members that have a specified
 * gender and stores the number into the given Game Variable. This includes both
 * battle and reserve members in the party.
 *
 * this.battlePartyGenderlessCount()
 * this.battlePartyMaleCount()
 * this.battlePartyFemaleCount()
 * These script calls count the number of battle members in the party that have
 * a specified gender and stores the number into the given Game Variable. This
 * does not include reserve members.
 *
 * this.reservePartyGenderlessCount()
 * this.reservePartyMaleCount()
 * this.reservePartyFemaleCount()
 * These script calls count the number of reserve members in the party that have
 * the specified gender and stores the the number into the given Game Variable.
 * This does not include battle members.
 *
 * -------------
 * Compatibility
 * -------------
 * This plugin does not overwrite any default MV functions. All default
 * functions modified in this script are aliased.
 *
 * --------------------
 * Terms and Conditions
 * --------------------
 * Same as the original script
 */

(function() {
    var parameters = PluginManager.parameters('GenderFunctions');
 
    _DataManager_isDatabaseLoaded = DataManager.isDatabaseLoaded;
    DataManager.isDatabaseLoaded = function() {
        if (!_DataManager_isDatabaseLoaded.call(this)) {
            return false;
        }
        for (var i = 0; i < $dataActors.length; i++) {
            if ($dataActors[i] !== null) {
                if ($dataActors[i].meta.gender) {
                    gender = $dataActors[i].meta.gender;
                    switch (gender) {
                        case 'none':
                        case 'genderless':
                            $dataActors[i].gender = 0;
                            break;
                        case 'm':
                        case 'male':
                            $dataActors[i].gender = 1;
                            break;
                        case 'f':
                        case 'female':
                            $dataActors[i].gender = 2;
                            break;
                    }
                } else {
                    $dataActors[i].gender = Number(parameters['Default actor gender']);
                }
            }
        }
        for (var i = 0; i < $dataEnemies.length; i++) {
            if ($dataEnemies[i] !== null) {
                if ($dataEnemies[i].meta.gender) {
                    gender = $dataEnemies[i].meta.gender;
                    switch (gender) {
                        case 'none':
                        case 'genderless':
                            $dataEnemies[i].gender = 0;
                            break;
                        case 'm':
                        case 'male':
                            $dataEnemies[i].gender = 1;
                            break;
                        case 'f':
                        case 'female':
                            $dataEnemies[i].gender = 2;
                            break;
                    }
                } else {
                    $dataEnemies[i].gender = Number(parameters['Default enemy gender']);
                }
            }
        }
        return true;
    };
 
    Object.defineProperty(Game_BattlerBase.prototype, 'gender', {
        get: function() {
            return this._gender;
        },
        configurable: true
    });
 
    Game_BattlerBase.prototype.isGenderless = function() {
        return this.gender === 0;
    };
 
    Game_BattlerBase.prototype.isMale = function() {
        return this.gender === 1;
    };
 
    Game_BattlerBase.prototype.isFemale = function() {
        return this.gender === 2;
    };
 
    _Game_Actor_setup = Game_Actor.prototype.setup;
    Game_Actor.prototype.setup = function(actorId) {
        this._gender = $dataActors[actorId].gender;
        _Game_Actor_setup.call(this, actorId);
    };

    _Game_Enemy_setup = Game_Enemy.prototype.setup;
    Game_Enemy.prototype.setup = function(enemyId, x, y) {
        this._gender = $dataEnemies[enemyId].gender;
        _Game_Enemy_setup.call(this, enemyId, x, y);
    };
 
    Game_Interpreter.prototype.leaderIsGenderless = function() {
        var leader = $gameParty.leader();
        if (leader) { return leader.isGenderless(); }
        return false;
    };
 
    Game_Interpreter.prototype.leaderIsMale = function() {
        var leader = $gameParty.leader();
        if (leader) { return leader.isMale(); }
        return false;
    };
 
    Game_Interpreter.prototype.leaderIsFemale = function() {
        var leader = $gameParty.leader();
        if (leader) { return leader.isFemale(); }
        return false;
    };
 
    Game_Interpreter.prototype.memberIsGenderless = function(index) {
        var member = $gameParty.members()[index];
        if (member) { return member.isGenderless(); }
        return false;
    };
 
    Game_Interpreter.prototype.memberIsMale = function(index) {
        var member = $gameParty.members()[index];
        if (member) { return member.isMale(); }
        return false;
    };
 
    Game_Interpreter.prototype.memberIsFemale = function(index) {
        var member = $gameParty.members()[index];
        if (member) { return member.isFemale(); }
        return false;
    };
 
    Game_Interpreter.prototype.actorIsGenderless = function(id) {
        var actor = $gameActors.actor(id);
        if (actor) { return actor.isGenderless(); }
        return false;
    };
 
    Game_Interpreter.prototype.actorIsMale = function(id) {
        var actor = $gameActors.actor(id);
        if (actor) { return actor.isMale(); }
        return false;
    };
 
    Game_Interpreter.prototype.actorIsFemale = function(id) {
        var actor = $gameActors.actor(id);
        if (actor) { return actor.isFemale(); }
        return false;
    };
 
    Game_Interpreter.prototype.battlePartyIsGenderless = function() {
        return $gameParty.battleMembers().every(function(member) {
            return member.isGenderless();
        });
    };
 
    Game_Interpreter.prototype.battlePartyIsMale = function() {
        return $gameParty.battleMembers().every(function(member) {
            return member.isMale();
        });
    };
 
    Game_Interpreter.prototype.battlePartyIsFemale = function() {
        return $gameParty.battleMembers().every(function(member) {
            return member.isFemale();
        });
    };
 
    Game_Interpreter.prototype.genderlessCount = function(group) {
        return group.reduce(function(total, member) {
            return member.isGenderless() ? total + 1 : total;
        }, 0);
    };
 
    Game_Interpreter.prototype.maleCount = function(group) {
        return group.reduce(function(total, member) {
            return member.isMale() ? total + 1 : total;
        }, 0);
    };
 
    Game_Interpreter.prototype.femaleCount = function(group) {
        return group.reduce(function(total, member) {
            return member.isFemale() ? total + 1 : total;
        }, 0);
    };
 
    Game_Interpreter.prototype.battlePartyGenderlessCount = function() {
        return this.genderlessCount($gameParty.battleMembers());
    };
 
    Game_Interpreter.prototype.battlePartyMaleCount = function() {
        return this.maleCount($gameParty.battleMembers());
    };
 
    Game_Interpreter.prototype.battlePartyFemaleCount = function() {
        return this.femaleCount($gameParty.battleMembers());
    };
 
    Game_Interpreter.prototype.reservePartyGenderlessCount = function() {
        var reserveParty = $gameParty.members().filter(function(member) { return !$gameParty.battleMembers().contains(member);
        });
        return this.genderlessCount(reserveParty);
    };
 
    Game_Interpreter.prototype.reservePartyMaleCount = function() {
        var reserveParty = $gameParty.members().filter(function(member) { return !$gameParty.battleMembers().contains(member);
        });
        return this.maleCount(reserveParty);
    };
 
    Game_Interpreter.prototype.reservePartyFemaleCount = function() {
        var reserveParty = $gameParty.members().filter(function(member) { return !$gameParty.battleMembers().contains(member);
        });
        return this.femaleCount(reserveParty);
    };
 
    Game_Interpreter.prototype.partyGenderlessCount = function() {
        return this.genderlessCount($gameParty.members());
    };
 
    Game_Interpreter.prototype.partyMaleCount = function() {
        return this.maleCount($gameParty.members());
    };
 
    Game_Interpreter.prototype.partyFemaleCount = function() {
        return this.femaleCount($gameParty.members());
    };
 
    Game_Interpreter.prototype.troopEnemyIsGenderless = function(index) {
        if ($gameParty.inBattle()) {
            var enemy = $gameTroop.members()[index];
            if (enemy) { return enemy.isGenderless(); }
        }
        return false;
    };
 
    Game_Interpreter.prototype.troopEnemyIsMale = function(index) {
        if ($gameParty.inBattle()) {
            var enemy = $gameTroop.members()[index];
            if (enemy) { return enemy.isMale(); }
        }
        return false;
    };
 
    Game_Interpreter.prototype.troopEnemyIsFemale = function(index) {
        if ($gameParty.inBattle()) {
            var enemy = $gameTroop.members()[index];
            if (enemy) { return enemy.isFemale(); }
        }
        return false;
    };
 
    Game_Interpreter.prototype.enemyIsGenderless = function(id) {
        var enemy = $dataEnemies[id];
        if (enemy) { return enemy.gender === 0; }
        return false;
    };
 
    Game_Interpreter.prototype.enemyIsMale = function(id) {
        var enemy = $dataEnemies[id];
        if (enemy) { return enemy.gender === 1; }
        return false;
    };
 
    Game_Interpreter.prototype.enemyIsFemale = function(id) {
        var enemy = $dataEnemies[id];
        if (enemy) { return enemy.gender === 2; }
        return false;
    };
})();
Edit: and here's Gender Requirements. Note that if you don't have Gender Functions enabled, you'll get an alert telling you so and the game will close after asking you to enable the dependency plugin.

Code:
//=============================================================================
// GenderRequirements.js
//=============================================================================

/*:
 * @plugindesc This is an addon plugin for Gender Functions which allows developers to define gender requirements for equipment, skills and items. (ported to MV for Oriceles)
 * @author Mr. Bubble (original), Trihan (port)
 *
 * @help
 *
 * --------
 * Notetags
 * --------
 * The following notetags are for Skills, Items, Weapons and Armours:
 *
 * <gender req:genderless>
 * <gender requirement:genderless>
 * Requires that the actor be genderless in order to use/equip the skill, item, weapon or armour.
 * Each tag listed above has the same effect. Simply choose whichever one you prefer.
 *
 * <gender req:m>
 * <gender req:male>
 * <gender requirement:male>
 * Requires that the actor be male in order to use/equip the skill, item, weapon or armour.
 * Each tag listed above has the same effect. Simply choose whichever one you prefer.
 *
 * <gender req: f>
 * <gender req: female>
 * <gender requirement: female>
 * Requires that the actor be female in order to use/equip the skill, item, weapon or armour.
 * Each tag listed above has the same effect. Simply choose whichever one you prefer.
 *
 * Multiple gender requirement tags may be added to the same notebox.
 *
 * Gender requirements for classes do not affect the "Change Class" event command.
 *
 * Please note that this port doesn't include class gender requirements for compatibility with
 * YEA - Class System (I'm not sure what its MV equivalent is, if there is one).
 *
 * The following notetags are for Actors and Enemies:
 *
 * <gender req: ignore>
 * <gender requirement: ignore>
 *
 * Allows the actor or enemy to ignore any imposed gender requirements for skills, items, weapons
 * and armours.
 * Each tag listed above has the same effect. Simply choose whichever one you prefer.
 *
 * If you need very specific exceptions made regarding gender requirements, it is recommended that
 * you create your own armour type(s) in your database and define equip permissions through that.
 *
 * -------------
 * Compatibility
 * -------------
 * This plugin does not overwrite any default MV functions. All default functions modified in this
 * plugin are aliased.
 *
 * --------------------
 * Terms and Conditions
 * --------------------
 * Same as the original script
 */

(function() {
    if (PluginManager._scripts.contains("GenderFunctions")) {
      
        var regexGenderReq = /<gender *(?:requirement[s]?|req):\s*(\w*)>/i;
      
        var _DataManager_isDatabaseLoaded = DataManager.isDatabaseLoaded;
        DataManager.isDatabaseLoaded = function() {
            if (!_DataManager_isDatabaseLoaded.call(this)) {
                return false;
            }
            var groups = [$dataActors, $dataSkills, $dataItems, $dataWeapons, $dataArmors, $dataEnemies];
            for (var i = 0; i < groups.length; i++) {
                var group = groups[i];
                for (var j = 0; j < group.length; j++) {
                    var obj = group[j];
                    if (obj === null) { continue; }
                    var notes = obj.note.split("\n");
                    for (var k = 0; k < notes.length; k++) {
                        var match = notes[k].match(regexGenderReq);
                        if (match) {
                            match[1] = String(match[1]);
                            switch(match[1].toUpperCase()) {
                                case "IGNORE":
                                    if (group !== $dataActors && group !== $dataEnemies) { continue; }
                                    obj.ignoreGenderRequirements = true;
                                    break;
                                case "GENDERLESS":
                                case "NONE":
                                    if (group === $dataActors || group === $dataEnemies) { continue; }
                                    if (!obj.genderRequirements) { obj.genderRequirements = []; }
                                    if (!obj.genderRequirements.contains(0)) {
                                        obj.genderRequirements.push(0);
                                    }
                                    break;
                                case "MALE":
                                case "M":
                                    if (group === $dataActors || group === $dataEnemies) { continue; }
                                    if (!obj.genderRequirements) { obj.genderRequirements = []; }
                                    if (!obj.genderRequirements.contains(1)) {
                                        obj.genderRequirements.push(1);
                                    }
                                    break;
                                case "FEMALE":
                                case "F":
                                    if (group === $dataActors || group === $dataEnemies) { continue; }
                                    if (!obj.genderRequirements) { obj.genderRequirements = []; }
                                    if (!obj.genderRequirements.contains(2)) {
                                        obj.genderRequirements.push(2);
                                    }
                                    break;
                            }
                        }
                    }
                }
            }
            return true;
        };
      
        Game_BattlerBase.prototype.ignoreGenderRequirements = function() {
            if (this.isActor()) {
                return $dataActors[this.actorId()].ignoreGenderRequirements;
            } else {
                return $dataEnemies[this.enemyId()].ignoreGenderRequirements;
            }
        };
      
        Game_BattlerBase.prototype.meetsGenderConditions = function(item) {
            return !item.genderRequirements || this.ignoreGenderRequirements() || item.genderRequirements.contains(this.gender);
        };
      
        _Game_BattlerBase_canEquip = Game_BattlerBase.prototype.canEquip;
        Game_BattlerBase.prototype.canEquip = function(item) {
            return _Game_BattlerBase_canEquip.call(this, item) && this.meetsGenderConditions(item);
        };
      
        _Game_BattlerBase_meetsSkillConditions = Game_BattlerBase.prototype.meetsSkillConditions;
        Game_BattlerBase.prototype.meetsSkillConditions = function(skill) {
            return _Game_BattlerBase_meetsSkillConditions.call(this, skill) && this.meetsGenderConditions(skill);
        };
      
        _Game_BattlerBase_meetsItemConditions = Game_BattlerBase.prototype.meetsItemConditions;
        Game_BattlerBase.prototype.meetsItemConditions = function(item) {
            return _Game_BattlerBase_meetsItemConditions.call(this, item) && this.meetsGenderConditions(item);
        };
      
    } else {
        alert("You have installed the Gender Requirements plugin, which requires 'GenderFunctions', but you don't have the dependency installed. Please install it and restart the game.");
        this.close();
    }
})();
 
Last edited:

Oriceles

Veteran
Veteran
Joined
Apr 4, 2012
Messages
384
Reaction score
71
First Language
English
Primarily Uses
N/A
You save the day again Trihan!!! thank you so much!!! :kaocry:
 

Trihan

Speedy Scripter
Veteran
Joined
Apr 12, 2012
Messages
2,604
Reaction score
1,961
First Language
English
Primarily Uses
RMMV
Been testing it a bit and there's an issue with gender requirements for equipment, trying to fix it now~

Fixed. Jesus christ that was a tricky one to debug. Had to set the gender in Gender Functions before calling the original setup function; the way it was before, initEquips was removing unequippable items before the gender was set. First plugin has been updated with the necessary change.
 
Last edited:

Oriceles

Veteran
Veteran
Joined
Apr 4, 2012
Messages
384
Reaction score
71
First Language
English
Primarily Uses
N/A
Gonna do the general checks and playtest with this tomorrow, I'll let you know if I spot something. :kaothx:
 

Zarsla

Veteran
Veteran
Joined
Jan 23, 2015
Messages
710
Reaction score
228
First Language
English
Primarily Uses
@Trihan Can I use this plugin in my game? And is their a way through script calls or plugin commands to change an actor or enemy gender. For example I let the player pick their gender, so I use a script call to set Actor 1 to male if the player picks male, but female if the player picks female?
 

Trihan

Speedy Scripter
Veteran
Joined
Apr 12, 2012
Messages
2,604
Reaction score
1,961
First Language
English
Primarily Uses
RMMV
Hi Zarsla! Of course you can use it in your game. There isn't currently a plugin command you can use to change genders, but you can use $dataActors[id].gender = whatever or $dataEnemies[id].gender = whatever.

The only proviso with this is because it's a property of the database object, if you change the gender of an enemy it will change it for every instance of that enemy in the game, and changes won't persist in save games. My free time is severely limited right now, but if you need more from this I might be able to take a look at adding those commands for you.
 

Piyan Glupak

Veteran
Veteran
Joined
Nov 14, 2016
Messages
68
Reaction score
39
First Language
English
Thank you to Trihan for porting this useful plugin over. Here is a version with a very minor amendment that makes it include reserve members of the party if used from within battles:
JavaScript:
//=============================================================================
// GenderFunctions.js
//=============================================================================

/*:
 * @plugindesc This is a simple plugin that provides developers the option to define the gender of Actors and Enemies in their game. With the use of plugin commands and new functionsm this opens up a variety of options for eventers and coders alike. (ported to MV for Oriceles)
 * @author Mr. Bubble (original), Trihan (port), with minor amendment to make it more suitable for battles
 *
 * @param Default actor gender
 * @desc Determines the default gender for actors if no notetag is found. 0: Genderless, 1: Male, 2: Female
 * @default 0
 *
 * @param Default enemy gender
 * @desc Determines the default gender for enemies if no notetag is found. 0: Genderless, 1: Male, 2: Female
 * @default 0
 *
 * @help
 *
 * --------
 * Notetags
 * --------
 * The following notetags are for Actors and Enemies only:
 *
 * <gender:none>
 * <gender:genderless>
 * Defines the Actors of enemy as genderless. The internal value that represents
 * genderless is 0.
 *
 * <gender:m>
 * <gender:male>
 * Defines the Actor or Enemy as male. The internal value that represents male
 * is 1.
 *
 * <gender:f>
 * <gender:female>
 * Defines the Actor or Enemy as female. The internal value that represents
 * female is 2.
 *
 * ----------------------------------
 * Conditional branch script calls
 * ----------------------------------
 * The following script calls are meant to be used in Conditional Branch event
 * commands within the Tab 4 "Script" box.
 *
 * this.leaderIsGenderless()
 * this.leaderIsMale()
 * this.leaderIsFemale()
 * These script calls check the gender of the party leader.
 *
 * this.memberIsGenderless(index)
 * this.memberIsMale(index)
 * this.memberIsFemale(index)
 * These script calls check the gender of the given party member where index is
 * the party position index. 0 is the party leader, 1 is the 2nd member, 2 is
 * the 3rd member, etc.
 *
 * this.actorIsGenderless(id)
 * this.actorIsMale(id)
 * this.actorIsFemale(id)
 * These script calls check an actor's gender where id is an actor id from the
 * database. These can check the gender of actors not in the current party.
 *
 * this.battlePartyIsGenderless()
 * this.battlePartyIsMale()
 * this.battlePartyIsFemale()
 * These script calls check if all members in the battle party have matching
 * genders.
 *
 * this.troopEnemyIsGenderless(index)
 * this.troopEnemyIsMale(index)
 * this.troopEnemyIsFemale(index)
 * These script calls check the gender of the given enemy in the current troop
 * where index is the enemy's troop position index. 0 is the first enemy, 1 is
 * the 2nd enemy, 2 is the 3rd enemy, etc. This script call only works in battle.
 *
 * this.enemyIsGenderless(id)
 * this.enemyIsMale(id)
 * this.enemyIsFemale(id)
 * These script calls check an enemy's gender where id is an enemy id from the
 * database. These can check the gender of enemies even when not in battle.
 *
 * -------------------------------
 * Variable operation script calls
 * -------------------------------
 * The following script calls are meant to be used in Variable Operation event
 * commands within the "Script" box. Each of these script calls return a number
 * which is then stored in the given Game Variable.
 *
 * this.partyGenderlessCount()
 * this.partyMaleCount()
 * this.partyFemaleCount()
 * These script calls count the number of party members that have a specified
 * gender and stores the number into the given Game Variable. This includes both
 * battle and reserve members in the party.
 *
 * this.battlePartyGenderlessCount()
 * this.battlePartyMaleCount()
 * this.battlePartyFemaleCount()
 * These script calls count the number of battle members in the party that have
 * a specified gender and stores the number into the given Game Variable. This
 * does not include reserve members.
 *
 * this.reservePartyGenderlessCount()
 * this.reservePartyMaleCount()
 * this.reservePartyFemaleCount()
 * These script calls count the number of reserve members in the party that have
 * the specified gender and stores the the number into the given Game Variable.
 * This does not include battle members.
 *
 * -------------
 * Compatibility
 * -------------
 * This plugin does not overwrite any default MV functions. All default
 * functions modified in this script are aliased.
 *
 * --------------------
 * Terms and Conditions
 * --------------------
 * Same as the original script
 */

(function() {
    var parameters = PluginManager.parameters('GenderFunctions');
 
    _DataManager_isDatabaseLoaded = DataManager.isDatabaseLoaded;
    DataManager.isDatabaseLoaded = function() {
        if (!_DataManager_isDatabaseLoaded.call(this)) {
            return false;
        }
        for (var i = 0; i < $dataActors.length; i++) {
            if ($dataActors[i] !== null) {
                if ($dataActors[i].meta.gender) {
                    gender = $dataActors[i].meta.gender;
                    switch (gender) {
                        case 'none':
                        case 'genderless':
                            $dataActors[i].gender = 0;
                            break;
                        case 'm':
                        case 'male':
                            $dataActors[i].gender = 1;
                            break;
                        case 'f':
                        case 'female':
                            $dataActors[i].gender = 2;
                            break;
                    }
                } else {
                    $dataActors[i].gender = Number(parameters['Default actor gender']);
                }
            }
        }
        for (var i = 0; i < $dataEnemies.length; i++) {
            if ($dataEnemies[i] !== null) {
                if ($dataEnemies[i].meta.gender) {
                    gender = $dataEnemies[i].meta.gender;
                    switch (gender) {
                        case 'none':
                        case 'genderless':
                            $dataEnemies[i].gender = 0;
                            break;
                        case 'm':
                        case 'male':
                            $dataEnemies[i].gender = 1;
                            break;
                        case 'f':
                        case 'female':
                            $dataEnemies[i].gender = 2;
                            break;
                    }
                } else {
                    $dataEnemies[i].gender = Number(parameters['Default enemy gender']);
                }
            }
        }
        return true;
    };
 
    Object.defineProperty(Game_BattlerBase.prototype, 'gender', {
        get: function() {
            return this._gender;
        },
        configurable: true
    });
 
    Game_BattlerBase.prototype.isGenderless = function() {
        return this.gender === 0;
    };
 
    Game_BattlerBase.prototype.isMale = function() {
        return this.gender === 1;
    };
 
    Game_BattlerBase.prototype.isFemale = function() {
        return this.gender === 2;
    };
 
    _Game_Actor_setup = Game_Actor.prototype.setup;
    Game_Actor.prototype.setup = function(actorId) {
        this._gender = $dataActors[actorId].gender;
        _Game_Actor_setup.call(this, actorId);
    };

    _Game_Enemy_setup = Game_Enemy.prototype.setup;
    Game_Enemy.prototype.setup = function(enemyId, x, y) {
        this._gender = $dataEnemies[enemyId].gender;
        _Game_Enemy_setup.call(this, enemyId, x, y);
    };
 
    Game_Interpreter.prototype.leaderIsGenderless = function() {
        var leader = $gameParty.leader();
        if (leader) { return leader.isGenderless(); }
        return false;
    };
 
    Game_Interpreter.prototype.leaderIsMale = function() {
        var leader = $gameParty.leader();
        if (leader) { return leader.isMale(); }
        return false;
    };
 
    Game_Interpreter.prototype.leaderIsFemale = function() {
        var leader = $gameParty.leader();
        if (leader) { return leader.isFemale(); }
        return false;
    };
 
    Game_Interpreter.prototype.memberIsGenderless = function(index) {
        var member = $gameParty.allMembers()[index];
        if (member) { return member.isGenderless(); }
        return false;
    };
 
    Game_Interpreter.prototype.memberIsMale = function(index) {
        var member = $gameParty.allMembers()[index];
        if (member) { return member.isMale(); }
        return false;
    };
 
    Game_Interpreter.prototype.memberIsFemale = function(index) {
        var member = $gameParty.allMembers()[index];
        if (member) { return member.isFemale(); }
        return false;
    };
 
    Game_Interpreter.prototype.actorIsGenderless = function(id) {
        var actor = $gameActors.actor(id);
        if (actor) { return actor.isGenderless(); }
        return false;
    };
 
    Game_Interpreter.prototype.actorIsMale = function(id) {
        var actor = $gameActors.actor(id);
        if (actor) { return actor.isMale(); }
        return false;
    };
 
    Game_Interpreter.prototype.actorIsFemale = function(id) {
        var actor = $gameActors.actor(id);
        if (actor) { return actor.isFemale(); }
        return false;
    };
 
    Game_Interpreter.prototype.battlePartyIsGenderless = function() {
        return $gameParty.battleMembers().every(function(member) {
            return member.isGenderless();
        });
    };
 
    Game_Interpreter.prototype.battlePartyIsMale = function() {
        return $gameParty.battleMembers().every(function(member) {
            return member.isMale();
        });
    };
 
    Game_Interpreter.prototype.battlePartyIsFemale = function() {
        return $gameParty.battleMembers().every(function(member) {
            return member.isFemale();
        });
    };
 
    Game_Interpreter.prototype.genderlessCount = function(group) {
        return group.reduce(function(total, member) {
            return member.isGenderless() ? total + 1 : total;
        }, 0);
    };
 
    Game_Interpreter.prototype.maleCount = function(group) {
        return group.reduce(function(total, member) {
            return member.isMale() ? total + 1 : total;
        }, 0);
    };
 
    Game_Interpreter.prototype.femaleCount = function(group) {
        return group.reduce(function(total, member) {
            return member.isFemale() ? total + 1 : total;
        }, 0);
    };
 
    Game_Interpreter.prototype.battlePartyGenderlessCount = function() {
        return this.genderlessCount($gameParty.battleMembers());
    };
 
    Game_Interpreter.prototype.battlePartyMaleCount = function() {
        return this.maleCount($gameParty.battleMembers());
    };
 
    Game_Interpreter.prototype.battlePartyFemaleCount = function() {
        return this.femaleCount($gameParty.battleMembers());
    };
 
    Game_Interpreter.prototype.reservePartyGenderlessCount = function() {
        var reserveParty = $gameParty.allMembers().filter(function(member) { return !$gameParty.battleMembers().contains(member);
        });
        return this.genderlessCount(reserveParty);
    };
 
    Game_Interpreter.prototype.reservePartyMaleCount = function() {
        var reserveParty = $gameParty.allMembers().filter(function(member) { return !$gameParty.battleMembers().contains(member);
        });
        return this.maleCount(reserveParty);
    };
 
    Game_Interpreter.prototype.reservePartyFemaleCount = function() {
        var reserveParty = $gameParty.allMembers().filter(function(member) { return !$gameParty.battleMembers().contains(member);
        });
        return this.femaleCount(reserveParty);
    };
 
    Game_Interpreter.prototype.partyGenderlessCount = function() {
        return this.genderlessCount($gameParty.members());
    };
 
    Game_Interpreter.prototype.partyMaleCount = function() {
        return this.maleCount($gameParty.allMembers());
    };
 
    Game_Interpreter.prototype.partyFemaleCount = function() {
        return this.femaleCount($gameParty.allMembers());
    };
 
    Game_Interpreter.prototype.troopEnemyIsGenderless = function(index) {
        if ($gameParty.inBattle()) {
            var enemy = $gameTroop.members()[index];
            if (enemy) { return enemy.isGenderless(); }
        }
        return false;
    };
 
    Game_Interpreter.prototype.troopEnemyIsMale = function(index) {
        if ($gameParty.inBattle()) {
            var enemy = $gameTroop.members()[index];
            if (enemy) { return enemy.isMale(); }
        }
        return false;
    };
 
    Game_Interpreter.prototype.troopEnemyIsFemale = function(index) {
        if ($gameParty.inBattle()) {
            var enemy = $gameTroop.members()[index];
            if (enemy) { return enemy.isFemale(); }
        }
        return false;
    };
 
    Game_Interpreter.prototype.enemyIsGenderless = function(id) {
        var enemy = $dataEnemies[id];
        if (enemy) { return enemy.gender === 0; }
        return false;
    };
 
    Game_Interpreter.prototype.enemyIsMale = function(id) {
        var enemy = $dataEnemies[id];
        if (enemy) { return enemy.gender === 1; }
        return false;
    };
 
    Game_Interpreter.prototype.enemyIsFemale = function(id) {
        var enemy = $dataEnemies[id];
        if (enemy) { return enemy.gender === 2; }
        return false;
    };
})();
 

Users Who Are Viewing This Thread (Users: 0, Guests: 1)

Latest Threads

Latest Posts

Latest Profile Posts

Our latest feature is an interview with... me?!

People4_2 (Capelet off and on) added!

Just beat the last of us 2 last night and starting jedi: fallen order right now, both use unreal engine & when I say i knew 80% of jedi's buttons right away because they were the same buttons as TLOU2 its ridiculous, even the same narrow hallway crawl and barely-made-it jump they do. Unreal Engine is just big budget RPG Maker the way they make games nearly identical at its core lol.
Can someone recommend some fun story-heavy RPGs to me? Coming up with good gameplay is a nightmare! I was thinking of making some gameplay platforming-based, but that doesn't work well in RPG form*. I also was thinking of removing battles, but that would be too much like OneShot. I don't even know how to make good puzzles!
one bad plugin combo later and one of my followers is moonwalking off the screen on his own... I didn't even more yet on the new map lol.

Forum statistics

Threads
106,035
Messages
1,018,455
Members
137,821
Latest member
Capterson
Top