Files
Nyaruru_modifier_public/tool/tests/combat.test.js
T

23 lines
1.9 KiB
JavaScript

const test=require('node:test'),assert=require('node:assert/strict'),vm=require('node:vm');
const {installCombat}=require('../lib/combat');
test('combat scales player attacks and incoming damage, supports bullets and respects healing and scripted immunity',()=>{
function Character(team){this.battle={team,hp:100,unlimitHp:false};}
Character.prototype.battleObject=function(){return this.battle;};
Character.prototype.overrideBeAttackDamage=function(d){return d;};
Character.prototype.onAttackHit=function(info,target){const d=target.overrideBeAttackDamage(info.damage);if(!target.battle.unlimitHp)target.battle.hp-=d;return d;};
Character.prototype.requestDamage=function(d){this.battle.hp-=d;};
const p=new Character(0),lily=new Character(0),enemy=new Character(1),other=new Character(1),timers=[];
const c=vm.createContext({window:{},Game_CharacterBase:Character,$gamePlayer:p,$gameLily:lily,$gameActors:{},setInterval:fn=>timers.push(fn)});
const api=vm.runInContext(`(${installCombat.toString()})()`,c);
// The real Player and Event classes override the base method independently.
enemy.overrideBeAttackDamage=function(d){return d;};p.overrideBeAttackDamage=function(d){return d;};
api.change({outgoing:3,incoming:0.5});assert.equal(p.onAttackHit({damage:10},enemy),30);
assert.equal(enemy.onAttackHit({damage:10},p),5);p.requestDamage(10);assert.equal(p.battle.hp,90);
assert.equal(other.onAttackHit({damage:10,bulletOwner:p},enemy),30);
assert.equal(enemy.onAttackHit({damage:-10},p),-10);
api.change({oneHit:true});p.onAttackHit({damage:1},enemy);assert.ok(enemy.battle.hp<=0);
enemy.battle.hp=100;enemy.battle.unlimitHp=true;p.onAttackHit({damage:1},enemy);assert.equal(enemy.battle.hp,100);
assert.throws(()=>api.change({outgoing:Infinity}));assert.throws(()=>api.change({incoming:-1}));
c.$gameActors={};api.read();assert.equal(api.read().outgoing,1);assert.equal(api.read().oneHit,false);
});