feat: 发布咸鱼喵喵全能助手,加入全收集地图与图文说明
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
function installCombat() {
|
||||
if (window.__nyaruruCombat) return window.__nyaruruCombat;
|
||||
let settings={outgoing:1,incoming:1,oneHit:false}, attacker=null, touched=Date.now(), actors=$gameActors;
|
||||
const prototype=Game_CharacterBase.prototype;
|
||||
const hit=prototype.onAttackHit, direct=prototype.requestDamage, hooked=new WeakMap();
|
||||
const playerSide=c=>c===$gamePlayer || (typeof $gameLily!=='undefined' && c===$gameLily);
|
||||
function reset(){settings={outgoing:1,incoming:1,oneHit:false};}
|
||||
function touch(){if(actors!==$gameActors){reset();actors=$gameActors;}touched=Date.now();}
|
||||
function scale(character,value){
|
||||
if(!(value>0))return value;
|
||||
if(playerSide(character))return value*settings.incoming;
|
||||
const target=character.battleObject?.(), source=attacker?.battleObject?.();
|
||||
if(playerSide(attacker) && target && source && target.team!==source.team){
|
||||
const scaled=value*settings.outgoing;
|
||||
return settings.oneHit && !target.unlimitHp ? Math.max(scaled,target.hp+1) : scaled;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
prototype.onAttackHit=function(info,character,...args){
|
||||
const previous=attacker;attacker=info?.bulletOwner||this;
|
||||
const already=character&&hooked.has(character);
|
||||
if(character&&!already){
|
||||
const descriptor=Object.getOwnPropertyDescriptor(character,'overrideBeAttackDamage'),original=character.overrideBeAttackDamage;
|
||||
hooked.set(character,{descriptor});
|
||||
Object.defineProperty(character,'overrideBeAttackDamage',{configurable:true,writable:true,enumerable:false,value(...values){return scale(this,original.apply(this,values));}});
|
||||
}
|
||||
try{return hit.call(this,info,character,...args);}finally{
|
||||
attacker=previous;
|
||||
if(character&&!already){const {descriptor}=hooked.get(character);if(descriptor)Object.defineProperty(character,'overrideBeAttackDamage',descriptor);else delete character.overrideBeAttackDamage;hooked.delete(character);}
|
||||
}
|
||||
};
|
||||
prototype.requestDamage=function(value,...args){return direct.call(this,playerSide(this)&&value>0?value*settings.incoming:value,...args);};
|
||||
const api={touch,clear:reset,read(){touch();return{ok:true,...settings};},change(patch){
|
||||
touch();const next={...settings};
|
||||
for(const key of ['outgoing','incoming'])if(patch[key]!==undefined){if(typeof patch[key]!=='number'||!Number.isFinite(patch[key])||patch[key]<0||patch[key]>1000)throw Error('倍率必须为 0~1000 的数字');next[key]=patch[key];}
|
||||
if(patch.oneHit!==undefined){if(typeof patch.oneHit!=='boolean')throw Error('秒杀开关无效');next.oneHit=patch.oneHit;}
|
||||
settings=next;return api.read();
|
||||
}};
|
||||
Object.defineProperty(window,'__nyaruruCombat',{value:api,configurable:true});
|
||||
setInterval(()=>{if(Date.now()-touched>120000||actors!==$gameActors){reset();actors=$gameActors;}},1000);
|
||||
return api;
|
||||
}
|
||||
module.exports={installCombat};
|
||||
Reference in New Issue
Block a user