//=============================================================================
// 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;
};
})();