Jay's Dual Tech system

● ARCHIVED · READ-ONLY
Started by HeroicJay 329 posts Page 8 of 17 View original ↗
  1. Hi Jay, 


    I'm using Yanfly's Party Limit Gauge, and I'm using that currency as a dualtech cost. I made the dualtech to be a component for him. All's good so far, but do you have any trick to avoid paying two times the same currency? IT would be okay it was any other currency, but the Party Limit Gauge is sort of a team currency, so I don't want to pay the same cost twice...
  2. It should only be paid twice if both members of the tech have components that use the Party Limit Gauge. So make the component for the other person something else (it could be some dummy skill that doesn't do anything and doesn't appear in the character's menus if need be).


    Plus, the same sort of "team currency", as you put it (or as I have referred to it in the past, "universal cost"), is not something you want more than one person spending in a dualtech anyway (you'd be able to use the skill if you had enough Party Limit for one person to spend but not both, and depending on how Yanfly coded the Party Limit Gauge, there's a possibility you could wind up with negative Limit.)
  3. Does this work with Yanfly's ATB system?
  4. I keep getting asked that over and over. The answer remains the same: yes.


    The Jay's Journey demo uses Yanfly's CTB and dualtechs. ATB isn't really all that different.


    Though keep in mind that you still can't link characters' turns (except for a patch that I put in for Elleye's ATB, which came out before Yanfly's, and even that doesn't work the way I'd prefer). In other words, using a dualtech only actually counts as the turn of the one character that directly used the dualtech. Even in the default battle system. Since I was not planning to do otherwise in Jay's Journey, I really haven't considered such a patch high priority, and it's not exactly a trivial thing to write, but I know lots of people want a version that does that. Sorry for dragging my feet on it.


    (Actually, Jay's Journey does modify Atolla's CTB charge for Group Meditation, and it resets Cindel's CTB charge entirely for Double Jump. But those aren't automatic; they're done by modifying the CTB charge counters themselves as part of the skills' effects, and both dualtechs can only be called by Jay anyway.)
  5. Well if you could write a compatibility patch for yanfly's ATB that would be great.


    Because "can't link characters' turns" isn't a true dual tech system for Yanfly ATB users. (and I mean absolutely no offense by this)


    I mean if its any indication, Chrono Trigger had an dual tech system that ran with ATB.


    OH! I GOT IT!


    When you write your patch, write in a set of code that prevents the player from using a dual tech skill (The skill which is for both actors) UNLESS both actor's ATB gauges are completely filled! And then once the skill is executed, both actor's ATB gauges are reduced to 0 and the other actor(the other one apart of the dual tech) has their turn skipped.


    That way, players can't execute a skill when the other actor "isn't ready yet" and it prevents the other actor from using their turn when they participated in the dual tech skill.
  6. deathsia said:
    When you write your patch, write in a set of code that prevents the player from using a dual tech skill (The skill which is for both actors) UNLESS both actor's ATB gauges are completely filled! And then once the skill is executed, both actor's ATB gauges are reduced to 0 and the other actor(the other one apart of the dual tech) has their turn skipped.


    That way, players can't execute a skill when the other actor "isn't ready yet" and it prevents the other actor from using their turn when they participated in the dual tech skill.



    That's not how Yanfly's ATB works. Under Yanfly's ATB, when someone's ATB bar fills, time effectively stops.


    Believe me, if it worked like Chrono Trigger, I'd have already written it.


    A CTB patch is in progress. (It should be easy enough, I hope, to port to ATB later on.) I'm aiming for a system similar to how FF4:TAY did it. It's... proving to be quite the hassle. For example: My partially-written code is skipping turns when Marsha and Therese use "Fire Slash", which I expect... but Lucius is losing them too sometimes, and I have yet work out why.


    BTW, the way I'm doing it right now is not unprecedented. It's actually closer to being proper dualtechs than Steiner's Magic Sword abilities in FF9. There, the only restriction was that Vivi had to be in the party knowing the corresponding spell; Vivi didn't spend a darned thing, not even to the tune of one MP, when assisting Steiner.


    And funny thing is, for as annoying as this is to write for CTB and ATB... I actually think the DTB would be the harder one.
  7. HeroicJay said:
    That's not how Yanfly's ATB works. Under Yanfly's ATB, when someone's ATB bar fills, time effectively stops.



    Well crud...I need to hit up yanfly and ask him to implement a "semi-active" and Active ATB mode then...I'll see if I can do that.
  8. not sure if any one has asked this but can enemies use dual techs?
  9. ScytheX said:
    not sure if any one has asked this but can enemies use dual techs?



    No, but if you're using Yanfly's Action Sequence plugins, you can fake it without too much trouble. It's harder to fake for actors, due to things like the display of "which characters are involved in this tech" and visibly hiding the tech when all the characters aren't present.


    Also, dualtechs are defined for specific actors. There are no "specific" enemies; monsters change in every battle formation, and you can place multiple copies of the same monster in a single formation.
  10. I've been having some trouble when using this with Yanfly's party limit gauge mod.
    The gauge isn't emptying when they use the skill.
  11. Which skill has the <Party Limit Cost> tag? Remember: for dualtechs, you spend the cost of the component skill, not the cost of the dualtech skill, unless:


    a. You set the skill as a component to itself, or


    b. The actor directly using the dualtech is not on the list of actors in the "Dual" tag.


    (Also, make sure only one actor is spending any Part Limit, since it's a "universal cost".)
  12. Hey I can't seem to download your Dual Tech System Script, it keeps saying theres a virus, is there anyother place I can download it from?
  13. @HeroicJay This looks like an awesome script! Is there a way for this to remove the actor restriction completely? or maybe link to character class instead?


    I ask this because in my game the actor classes are selectable so there would be no way to know which actor is what class beforehand. I would like it if say a fighter-classed actor and a mage-classed actor with the right skills can dual tech, regardless of which actors they are.
  14. boat said:
    Hey I can't seem to download your Dual Tech System Script, it keeps saying theres a virus, is there anyother place I can download it from?



    Weird. Maybe try this.

    Spoiler
    //=============================================================================
    // Dualtech system
    // Jay_Dualtechs.js
    // Version 1.1
    //=============================================================================

    var Imported = Imported || {};
    Imported.Jay_Dualtechs = true;

    var Jay = Jay || {};
    Jay.Dualtechs = Jay.Dualtechs || {};

    //=============================================================================
    /*:
    * @plugindesc Adds functionality for multitech skills.
    *
    * @author Jason R. Godding
    *
    * @param Cycle Actors
    * @desc Set to "true" to have skill costs cycle between actors.
    * Set to "false" to display costs for all actors at once.
    * @default false
    *
    * @param Cycle Length
    * @desc How long it takes to switch actors with "Cycle Actors".
    * 60 = 1 second.
    * @default 60
    *
    * @help Allows certain skills to be dualtechs, combining two characters' skills
    * into one. For dualtechs that do not have special unlock conditions, just
    * have the characters learn them at level 1; they won't show up unless
    * both characters are present and have the necessary skills.
    *
    * A dualtech skill should have the following tag in its note box:
    * <Dual:ID1,Skill1,ID2,Skill2,ID3,...,HitRate>
    *
    * ID1 is the character ID of one of the characters involved.
    * Skill1 is the skill required for that character, either as an ID or skill name.
    * ID2 and Skill2 likewise refer to the second character. You can include up
    * to 10 characters with skills.
    *
    * Hit Rate is optional and only useful for dualtechs that are not Certain Hit.
    * Without it, it will use the Hit Rate of the user, which I plan to configure
    * differently in the future.) HitRate is always defined last. You may define
    * the following values for Hit Rate:
    *
    * user - Uses the user's hit rate.
    * first - Uses the first actor's (ID1's) hit rate.
    * second - Uses the second actor's (ID2's) hit rate.
    * highest - Uses the hit rate of the actor whose hit rate is highest.
    * lowest - Uses the hit rate of the actor whose hit rate is lowest.
    *
    * For battle algorithms, "a" still refers to the user of the skill (defined as the
    * one who actually used the skill from the menu), and "b" to the target. But now,
    * there is "c", the character defined by ID1, and "d", the character defined by ID2,
    * which do not change based on which character selected the skill. These continue on
    * to "e" for ID3, "f" for ID4, all the way up to "l".
    *
    * If Game_Actor.icon() is defined, it will show an icon of each user of the skill.
    * Otherwise, it will show the characters' names, which can get kind of unweildy.
    * Game_Actor.icon() is not defined in here.
    *
    * The component skills of the actors can use any sort of cost you can dream of, even
    * those defined with other plugins. However, and this is important, certain "universal"
    * costs must ONLY be defined for at most one character in the tech! Universal costs
    * are those not tied to a specific actor, like items, gold, Yanfly's Party Limit gauge,
    * and so on. You can use multiple universal costs, but each cost can only be used by
    * one character. Non-universal costs (such as HP, MP, or TP) are perfectly valid
    * for multiple characters to use.
    *
    * Teaching a multitech skill to someone other than those defined in the Dual tag will
    * cause the user to be treated as a member of the multitech, but without having to
    * define a component (the user will spend the costs associated with the multitech).
    * However, it will only work with the user. (Example: If the Dual tag lists Joe and Bob,
    * but Alice learns the tech, then Alice can use it as a triple tech. However, Joe
    * and Bob would not be able to use it while keeping Alice as a part of it.)
    *
    * If you define the dualtech as a component for itself for any actor, then you drop
    * the dependency on another skill and instead use the costs and restrictions defined
    * to the dualtech. One or both characters may be set this way. It is not recommended to
    * set a skill as a component to itself for any actor if the user of the skill is not,
    * itself, defined in the dual tag.
    *
    * If a different skill is listed as the component, the MP and other associated costs
    * of the dualtech skill will be ignored (but not its restrictions).
    *
    * It is not required that all members of the tech learn the tech itself - if Joe and Bob
    * have a dualtech, you can teach it only to Joe and it will still work. However, Bob will
    * not be able to initiate the dualtech. Bob must still learn his component skill either way,
    * though.
    *
    * This does not define animations for the characters; only the user will animate. If you
    * are using side-view battles, it is recommended you use a plugin that allows for such
    * animations, such as Yanfly's Action Sequence plugins.
    *
    * At present, choosing to use a dualtech will only actually use up the turn of the
    * character who uses the skill. Also, dualtechs are not compatible with enemy battlers.
    *
    * This is compatible with Yanfly's Skill Core plugin v. 1.01, as well as any other
    * plugins that affect the skill cost that follow the recommendation below. Please
    * place this plugin after all such plugins in your plugin list.
    *
    * === NOTE TO OTHER PLUGIN WRITERS ===
    *
    * If you are writing a plugin that adds other sorts of skill costs or modifies the
    * display of the skill cost in any way, please have Window_SkillList.drawSkillCost
    * return the width of the remaining text area after drawing the cost of your skill
    * to maintain compatibility with this plugin.
    *
    * ====================================
    *
    * Version 1.1 - You can now define up to 10 characters for a tech.
    *
    * Version 1.0.5d - Fixed an incompatibility issue with Bobstah's Battle Commands.
    *
    * Version 1.0.5c - Fixed a couple of minor issues for triple techs.
    *
    * Version 1.0.5b - Last version contained a clumsy bug that let actors use non-
    * dualtech skills even when they have insufficient MP! Oops. Fixed that.
    *
    * Version 1.0.5 - Fixed another minor bug and added commands for determining which
    * actor's Hit Rate to use for a skill.
    *
    * Version 1.0.4 - Fixed a minor bug and added a segment to the help file.
    *
    * Version 1.0.3 - Added the option to cycle between actors instead of displaying all
    * of them at once.
    *
    * Version 1.0.2 - Fixed compatibility with Yanfly's Skill Core (and other similar
    * plugins.)
    *
    * Version 1.0.1 - Fixed an issue where skills temporarily granted to an actor through
    * Traits would not activate dualtechs.
    *
    * Version 1.0 - First version.
    *
    * This plugin is free for non-commercial and commercial use, but please credit
    * Jason R. Godding if you use it. Thank you.
    *
    */

    Jay.Parameters = Jay.Parameters || {};
    Jay.Parameters.Dualtechs = PluginManager.parameters('Jay_Dualtechs');

    Jay.Param = Jay.Param || {};
    Jay.Param.CycleActors = String(Jay.Parameters.Dualtechs['Cycle Actors']) === 'true';
    Jay.Param.CycleLength = Number(Jay.Parameters.Dualtechs['Cycle Length']);

    Jay.Dualtechs.dualSkillData = function(dualData) {
    var dualParams = dualData.split(',');
    var returnParams = {};
    var len = dualParams.length;

    if(len%2 === 0) { // Or, in other words, if the number of parameters is even
    returnParams.accType = 'user';
    }
    else {
    returnParams.accType = dualParams[len-1];
    len--;
    }

    returnParams.actors = [];
    returnParams.skills = [];

    for(var i=0; i < len; i += 2) {
    returnParams.actors.push(Number(dualParams));
    if(isNaN(dualParams[i+1])) {
    returnParams.skills.push($dataSkills.filter(function(skill) {
    return skill !== null && skill.name === dualParams[i+1];
    })[0].id);
    }
    else {
    returnParams.skills.push(Number(dualParams[i+1]));
    }
    }

    return returnParams;
    }

    Window_SkillList.prototype.includes = function(item) {
    if (!item || item.stypeId !== this._stypeId) {
    return false;
    }

    if(!item.meta.Dual) {
    return true;
    }

    var dualParams = Jay.Dualtechs.dualSkillData(item.meta.Dual);

    for(var i=0; i<dualParams.actors.length; i++) {
    var actorId = dualParams.actors;
    var skillId = dualParams.skills;
    if ($gameParty.members().indexOf($gameActors.actor(actorId)) === -1) {
    return false;
    }
    if(!$gameActors.actor(actorId).skills().contains($dataSkills[skillId])) {
    return false;
    }
    }

    return true;
    };

    Jay.Dualtechs.updateWindow = Window_SkillList.prototype.update;
    Window_SkillList.prototype.update = function() {
    if (Jay.Param.CycleActors && !this._cycleTimer) {
    this._cycleTimer = 0;
    this._cyclePhase = 0;
    }
    this._cycleTimer += 1;
    if(this._cycleTimer >= Jay.Param.CycleLength + 1) {
    this._cycleTimer = 1;
    this._cyclePhase += 1;
    if(this._cyclePhase >= 2520) {
    this._cyclePhase = 0;
    }
    this.refresh();
    }
    Jay.Dualtechs.updateWindow.call(this);
    }

    Jay.Dualtechs.drawSkillCost = Window_SkillList.prototype.drawSkillCost;
    Window_SkillList.prototype.drawSkillCost = function(skill, x, y, width) {
    if(!skill.meta.Dual) {
    return this.drawNonDualSkillCost(skill, x, y, width);
    }

    var dualParams = Jay.Dualtechs.dualSkillData(skill.meta.Dual);
    var actorCount = dualParams.actors.length;
    var endWidth = width;

    var userIsInTech = dualParams.actors.contains(this._actor.actorId());

    if(Jay.Param.CycleActors) {
    if(!userIsInTech) {
    actorCount++;
    }
    var actorToShow = this._cyclePhase%actorCount;
    if(!userIsInTech) {
    actorToShow--;
    }
    if(actorToShow === -1) {
    endWidth = this.drawComponentSkillCost(this._actor, skill, x, y, endWidth);
    }
    else {
    endWidth = this.drawComponentSkillCost($gameActors.actor(dualParams.actors[actorToShow]),
    $dataSkills[dualParams.skills[actorToShow]], x, y, endWidth);
    }
    }
    else {
    for(var i=actorCount-1; i>=0; i--) {
    endWidth = this.drawComponentSkillCost($gameActors.actor(dualParams.actors),
    $dataSkills[dualParams.skills], x, y, endWidth);
    }
    if(!userIsInTech) {
    endWidth = this.drawComponentSkillCost(this._actor, skill, x, y, endWidth);
    }
    }

    return endWidth;
    }

    Window_SkillList.prototype.drawNonDualSkillCost = function(skill, x, y, width) {
    var returnWidth = Jay.Dualtechs.drawSkillCost.call(this, skill, x, y, width);

    if (returnWidth === undefined) {
    if (this._actor.skillTpCost(skill) > 0) {
    returnWidth = width - this.textWidth(skill.tpCost);
    } else if (this._actor.skillMpCost(skill) > 0) {
    returnWidth = width - this.textWidth(skill.mpCost);
    } else {
    returnWidth = width;
    }
    }

    return returnWidth;
    }

    Window_SkillList.prototype.drawComponentSkillCost = function(actor, skill, x, y, width) {
    var endWidth = this.drawNonDualSkillCost(skill, x, y, width);

    this.resetTextColor();

    if(actor.icon) {
    this.drawIcon(actor.icon(), x + endWidth - Window_Base._iconWidth - 2, y + 2);
    endWidth -= Window_Base._iconWidth + 10;
    }
    else {
    if(endWidth === width) {
    this.drawText(actor.name(), x, y, endWidth, 'right');
    endWidth -= this.textWidth(" " + actor.name());
    }
    else {
    this.drawText(actor.name() + ":", x, y, endWidth, 'right');
    endWidth -= this.textWidth(" " + actor.name() + ":");
    }
    }

    return endWidth;
    }

    Jay.Dualtechs.meetsSkillConditions = Game_BattlerBase.prototype.meetsSkillConditions;
    Game_BattlerBase.prototype.meetsSkillConditions = function(skill) {
    if(skill.meta.Dual) {
    if (this.isEnemy()) {
    return false;
    }

    var dualParams = Jay.Dualtechs.dualSkillData(skill.meta.Dual);

    var actorList = $gameParty.members();
    var testedUser = false;

    for(var i=0; i<dualParams.actors.length; i++) {
    var actor = $gameActors.actor(dualParams.actors);
    if(actorList.indexOf(actor) === -1) {
    return false;
    }
    if(!Jay.Dualtechs.meetsSkillConditions.call(actor, $dataSkills[dualParams.skills])) {
    return false;
    }
    if(this === actor) {
    testedUser = true;
    if(!(this.meetsUsableItemConditions(skill) && this.isSkillWtypeOk(skill) &&
    !this.isSkillSealed(skill.id) &&
    !this.isSkillTypeSealed(skill.stypeId))) {
    return false;
    }
    }
    }

    if(testedUser) {
    return true;
    }
    }

    return Jay.Dualtechs.meetsSkillConditions.call(this, skill);
    }

    Jay.Dualtechs.paySkillCost = Game_BattlerBase.prototype.paySkillCost;
    Game_BattlerBase.prototype.paySkillCost = function(skill) {
    if(skill.meta.Dual) {
    var dualParams = Jay.Dualtechs.dualSkillData(skill.meta.Dual);
    var userPaid = false;

    for(var i=0; i<dualParams.actors.length; i++) {
    Jay.Dualtechs.paySkillCost.call($gameActors.actor(dualParams.actors),
    $dataSkills[dualParams.skills]);
    if(this === $gameActors.actor(dualParams.actors)) {
    userPaid = true;
    }
    }

    if(userPaid) {
    return;
    }
    }

    Jay.Dualtechs.paySkillCost.call(this, skill);
    }

    Jay.Dualtechs.evalDamageFormula = Game_Action.prototype.evalDamageFormula;
    Game_Action.prototype.evalDamageFormula = function(target) {
    if(!this.item().meta.Dual) {
    return Jay.Dualtechs.evalDamageFormula.call(this, target);
    }
    try {
    var item = this.item();
    var dualParams = Jay.Dualtechs.dualSkillData(item.meta.Dual);
    var c = $gameActors.actor(dualParams.actors[0]);
    var d = $gameActors.actor(dualParams.actors[1]);
    var e = $gameActors.actor(dualParams.actors[2]);
    var f = $gameActors.actor(dualParams.actors[3]);
    var g = $gameActors.actor(dualParams.actors[4]);
    var h = $gameActors.actor(dualParams.actors[5]);
    var i = $gameActors.actor(dualParams.actors[6]);
    var j = $gameActors.actor(dualParams.actors[7]);
    var k = $gameActors.actor(dualParams.actors[8]);
    var l = $gameActors.actor(dualParams.actors[9]);
    var a = this.subject();
    var b = target;
    var v = $gameVariables._data;
    var sign = ([3, 4].contains(item.damage.type) ? -1 : 1);
    return Math.max(eval(item.damage.formula), 0) * sign;
    }
    catch (e) {
    return 0;
    }
    }

    Game_Action.prototype.itemHit = function(target) {
    if (this.isPhysical()) {
    var hitRate = this.subject().hit;
    if (this.item().meta.Dual) {
    var dualParams = Jay.Dualtechs.dualSkillData(this.item().meta.Dual);
    switch (dualParams.accType) {
    case "user":
    hitRate = this.subject().hit;
    break;
    case "first":
    case "actor1":
    hitRate = $gameActors.actor(dualParams.actors[0]).hit;
    break;
    case "second":
    case "actor2":
    hitRate = $gameActors.actor(dualParams.actors[1]).hit;
    break;
    case "actor3":
    hitRate = $gameActors.actor(dualParams.actors[2]).hit;
    break;
    case "actor4":
    hitRate = $gameActors.actor(dualParams.actors[3]).hit;
    break;
    case "actor5":
    hitRate = $gameActors.actor(dualParams.actors[4]).hit;
    break;
    case "actor6":
    hitRate = $gameActors.actor(dualParams.actors[5]).hit;
    break;
    case "actor7":
    hitRate = $gameActors.actor(dualParams.actors[6]).hit;
    break;
    case "actor8":
    hitRate = $gameActors.actor(dualParams.actors[7]).hit;
    break;
    case "actor9":
    hitRate = $gameActors.actor(dualParams.actors[8]).hit;
    break;
    case "actor10":
    hitRate = $gameActors.actor(dualParams.actors[9]).hit;
    break;
    case "higher":
    case "highest":
    case "max":
    for(var i=0; i<dualParams.actors.length; i++) {
    var newHitRate = $gameActors.actor(dualParams.actors).hit;
    if (newHitRate > hitRate) {
    hitRate = newHitRate;
    }
    }
    break;
    case "lower":
    case "lowest":
    case "min":
    for(var i=0; i<dualParams.actors.length; i++) {
    var newHitRate = $gameActors.actor(dualParams.actors).hit;
    if (newHitRate < hitRate) {
    hitRate = newHitRate;
    }
    }
    break;
    }
    }
    return this.item().successRate * 0.01 * hitRate;
    } else {
    return this.item().successRate * 0.01;
    }
    };







    watermark said:
    @HeroicJay This looks like an awesome script! Is there a way for this to remove the actor restriction completely? or maybe link to character class instead?


    I ask this because in my game the actor classes are selectable so there would be no way to know which actor is what class beforehand. I would like it if say a fighter-classed actor and a mage-classed actor with the right skills can dual tech, regardless of which actors they are.



    This would be a lot more complicated than the plugin as it currently exists. The issue is: what happens if there is more than one mage-classed actor with the right skill, and you open the Fighter's skill menu? RPG Maker MV normally does not list skills multiple times, but that seems like the only correct behavior. Inserting the duplicate skills - including code to check precisely which duplicate you selected - would certainly not be easy.


    Even worse is if you were to go beyond dualtechs into triple/quad/etc. Let's say you have a Fighter/Mage/Mage triple tech, and both Mage skills are different. In a party with one Fighter (A) and three mages (B, C, and D), when opening A's menu, you'd need to check - and potentially list - the triple tech for ABC, ACB, ABD, ADB, ACD, and ADC.


    I totally understand why this feature sounds so appealing, but I probably won't do it.
  15. Hey Jay. You've got a great plugin here if I do say so myself. 


    I'm trying to set up a series of dualtechs similar to the FF9 Magic Sword skills, the difference being the only MP cost is that of the mage. I have the dualtech set as a component of itself and everything works fine, but the user's name is still being displayed under the costs even if it doesn't cost anything. 


    Pictures in the spoiler,

    Spoiler
    78d609c19e.jpg


    The battle screen


    937f37ec89.png


    The Fire Sword skill page 



    I know I can use icons for the characters; it isn't a text overlapping problem in essence. I just don't want Kyle's name to show up at all with the skill costs. 
  16. watermark said:
    @HeroicJay This looks like an awesome script! Is there a way for this to remove the actor restriction completely? or maybe link to character class instead?


    I ask this because in my game the actor classes are selectable so there would be no way to know which actor is what class beforehand. I would like it if say a fighter-classed actor and a mage-classed actor with the right skills can dual tech, regardless of which actors they are.



    I actually had not accounted for a scenario where someone wouldn't want a character's name/icon to appear at all (my own demo has a dualtech that's cost-free for BOTH characters, and proudly displays both of them anyway), so the plugin at present doesn't auto-hide like that. The only solution that comes to mind without your own plugin or an update to mine would be to assign Kyle to icon 0 (presuming that's blank like the default), but that would cross over into all dualtech skills, not just your Fire Sword.


    As for changes to the plugin itself, yeah, I suppose I could throw a parameter in the plugin that says "If the currently-selected user displays no cost, do not display their name/icon", and it probably wouldn't be that hard. ONLY the currently-selected user, though; I want it to remain clear to the player who is and isn't involved in dualtechs (so if I added this functionality and you used it, it would display "Allison: 5 MP" for Kyle, but if, hypothetically, you gave the dualtech to Allison, her own menu would display "Kyle Allison: 5 MP". That way, the player still knows that Kyle is necessary for the tech.) Does this sound fair?
  17. HeroicJay said:
    I actually had not accounted for a scenario where someone wouldn't want a character's name/icon to appear at all (my own demo has a dualtech that's cost-free for BOTH characters, and proudly displays both of them anyway), so the plugin at present doesn't auto-hide like that. The only solution that comes to mind without your own plugin or an update to mine would be to assign Kyle to icon 0 (presuming that's blank like the default), but that would cross over into all dualtech skills, not just your Fire Sword.


    As for changes to the plugin itself, yeah, I suppose I could throw a parameter in the plugin that says "If the currently-selected user displays no cost, do not display their name/icon", and it probably wouldn't be that hard.



    That should work for now, since I don't plan on implementing any other dualtechs involving Kyle (outside of the magic sword skilltype) until the late game. But yeah, the option to have the functionality would certainly be appreciated. Thanks for the quick response, and keep up the good work!  


    edit: Sorry, didn't see your edit until after I responded & refreshed the page.


    I understand where you're coming from with your proposal. However, there's still the potential that the player would read the "Kyle Allison 5mp" line as "Oh... does it cost 5mp for both characters?" I still think the developer has a responsibility to convey who's involved in the dualtech, but that can easily be done in the skill description. Note how I had "Combo. with Allison" in the description for Fire Sword. Of course, if you gave that skill to Allison, it'd be weird to still see "Combo. with Allison", but that can simply be avoided by writing out something like "Kyle & Allison dualtech." or something. 


    I understand the need for plainly listing who's involved in a dualtech, but the clarity of how much that skill costs for each actor involved is just as important if not more. I just feel it's not space efficient to put actor names/icons where the skill costs should be if they don't use a resource for it. 
  18. Leysos said:
    I understand where you're coming from with your proposal. However, there's still the potential that the player would read the "Kyle Allison 5mp" line as "Oh... does it cost 5mp for both characters?" I still think the developer has a responsibility to convey who's involved in the dualtech, but that can easily be done in the skill description. Note how I had "Combo. with Allison" in the description for Fire Sword. Of course, if you gave that skill to Allison, it'd be weird to still see "Combo. with Allison", but that can simply be avoided by writing out something like "Kyle & Allison dualtech." or something. 


    I understand the need for plainly listing who's involved in a dualtech, but the clarity of how much that skill costs for each actor involved is just as important if not more. I just feel it's not space efficient to put actor names/icons where the skill costs should be if they don't use a resource for it. 



    That little bit of confusion is easily solved: just put Allison first in the dualtech tag. Then it'll display "Allison: 5 MP Kyle", which is not ambiguous. I only listed it the other way around because that's the order you already had it. Or use "Cycle Actors", which is a huge space efficiency saver in and of itself, and would cycle between "Allison: 5 MP" and "Kyle".


    Speaking of, the hardest part of adding the "Always Show User" parameter (or, rather, adding what happens when it's set to "false") was accounting for Cycle Actors. It wasn't undoable (it's ready now, in fact), but it'll become a huge mess if I have to check every actor - and would probably be a lot slower, too. I think we can both agree that a completely unacceptable solution (and what would have happened had I not added the extra check) would be displaying NOTHING for the cost for one second per actor that isn't getting displayed per cycle, if even one actor in the tech has a cost to display.
  19. HeroicJay said:
    That little bit of confusion is easily solved: just put Allison first in the dualtech tag. Then it'll display "Allison: 5 MP Kyle", which is not ambiguous. I only listed it the other way around because that's the order you already had it. Or use "Cycle Actors", which is a huge space efficiency saver in and of itself, and would cycle between "Allison: 5 MP" and "Kyle".


    Speaking of, the hardest part of adding the "Always Show User" parameter (or, rather, adding what happens when it's set to "false") was accounting for Cycle Actors. It wasn't undoable (it's ready now, in fact), but it'll become a huge mess if I have to check every actor - and would probably be a lot slower, too. I think we can both agree that a completely unacceptable solution (and what would have happened had I not added the extra check) would be displaying NOTHING for the cost for one second per actor that isn't getting displayed per cycle, if even one actor in the tech has a cost to display.



    Now that could potentially be read as Allison using Kyle as a resource.  I understand; it's a way of tackling the problem, but it still just looks too clunky for my tastes. 


    Still, you have a point. I didn't take into account the cycling actors parameter when typing that up (mainly because I don't plan on using it unless there's overlapping text/icons when there are multiple actor costs (I haven't gotten that far yet)). Displaying nothing would be very bad, even for a second, so I thank you for taking that into consideration. 


    Either way, you work fast. I appreciate you updating the plugin, even though I get the feeling the need for the functionality isn't as common. Still, I'm sure someone besides me could benefit from it. You've earned a fan.


    btw, boat isn't the only one who had a false positive in an antivirus program when trying to download the plugin. I know how to circumvent it, but I'm just letting you know the issue isn't just a one-off. 
  20. Leysos said:
    btw, boat isn't the only one who had a false positive in an antivirus program when trying to download the plugin. I know how to circumvent it, but I'm just letting you know the issue isn't just a one-off. 



    Hm. My best guess is that your antivirus doesn't trust .js files. Do you have this sort of trouble with other plugins on Pastebin?