I've been recently working on an active TPB rework plugin where only enemies actually have to wait for their TPB bar to fill. I've done this by just checking if a battler is an actor and setting their tpbChargeTime to one if true. Additionally, I also added an !isGuard() and !isRestricted() check because both guarding and restriction states are rendered useless if an actor just blazes through to their next turn. Thus, I only wanted an actor's TPB bar to show if they're guarding or restricted because it's useless otherwise, so I first tried drawing the TPB bar only when an actor's guarding.
JavaScript:
Game_Actor.prototype.performAction = function(action) { Game_Battler.prototype.performAction.call(this, action); if (action.isAttack()) { this.performAttack(); } else if (action.isGuard()) { let index = $gameParty.members().map(e => e._actorId).indexOf(this._actorId); //Finds the party index of actor Window_BattleStatus.prototype.drawTimeGauge(index); this.requestMotion("guard"); } else if (action.isMagicSkill()) { this.requestMotion("spell"); } else if (action.isSkill()) { this.requestMotion("skill"); } else if (action.isItem()) { this.requestMotion("item"); } }; Window_BattleStatus.prototype.drawItemStatus = function(index) { const actor = this.actor(index); const rect = this.itemRectWithPadding(index); const nameX = this.nameX(rect); const nameY = this.nameY(rect); const stateIconX = this.stateIconX(rect); const stateIconY = this.stateIconY(rect); const basicGaugesX = this.basicGaugesX(rect); const basicGaugesY = this.basicGaugesY(rect); // this.placeTimeGauge(actor, nameX, nameY); this.placeActorName(actor, nameX, nameY); this.placeStateIcon(actor, stateIconX, stateIconY); this.placeBasicGauges(actor, basicGaugesX, basicGaugesY); }; Window_BattleStatus.prototype.drawTimeGauge = function(index) { //Newly made function console.log(this); //Shows Window_StatusBase instead of Window_BattleStatus const actor = this.actor(index); const rect = this.itemRectWithPadding(index); const nameX = this.nameX(rect); const nameY = this.nameY(rect); this.placeTimeGauge(actor, nameX, nameY); } Window_StatusBase.prototype.placeTimeGauge = function(actor, x, y) { if (BattleManager.isTpb()) { this.placeGauge(actor, "time", x, y); } }; Window_StatusBase.prototype.placeGauge = function(actor, type, x, y) { const key = "actor%1-gauge-%2".format(actor.actorId(), type); const sprite = this.createInnerSprite(key, Sprite_Gauge); sprite.setup(actor, type); sprite.move(x, y); sprite.show(); }; Window_StatusBase.prototype.createInnerSprite = function(key, spriteClass) { const dict = this._additionalSprites; if (dict[key]) { //Can't read dict properly because this(context) is supposed to be Window_BattleStatus so it crashes return dict[key]; } else { const sprite = new spriteClass(); dict[key] = sprite; this.addInnerChild(sprite); return sprite; } };
Spoiler: Error
Essentially the problem is that whenever I try calling Window_BattleStatus.prototype.drawTimeGauge or any other method using Window_BattleStatus, it uses the super class instead of the child class as the context. I've tried using .call(index), .call(Window_BattleStatus.prototype, index) but nothing has worked so far.
I've been at my ropes for a couple of day so far and I tried reading rmmz_window code but it's so different from the other engine code that I'm completely baffled by everything is says. I've also come up with the idea to just draw the TPB bar invisible and update the color when guarding or just have the bar blip in and out like after attacking an enemy, but once again, rmmz_window code blind folds and beats me over with a bat.
If anyone can explain a solution or a workaround to me like I'm 5 years old I would be really grateful.