refactor: 永夜/极昼

This commit is contained in:
unanmed 2024-10-03 16:26:46 +08:00
parent 849e121b77
commit 3baee32c51
7 changed files with 68 additions and 22 deletions

View File

@ -269,7 +269,13 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = {
version: core.firstData.version, version: core.firstData.version,
guid: core.getGuid(), guid: core.getGuid(),
time: new Date().getTime(), time: new Date().getTime(),
skills: Mota.Plugin.require('skillTree_g').saveSkillTree() skills: Mota.Plugin.require('skillTree_g').saveSkillTree(),
night: [
...Mota.require(
'module',
'Mechanism'
).NightSpecial.saveNight()
]
}; };
return data; return data;
@ -318,6 +324,19 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = {
core.setFlag('__fromLoad__', true); core.setFlag('__fromLoad__', true);
Mota.Plugin.require('skillTree_g').loadSkillTree(data.skills); Mota.Plugin.require('skillTree_g').loadSkillTree(data.skills);
const Night = Mota.require('module', 'Mechanism').NightSpecial;
if (!data.night) {
// 兼容旧版
Night.loadNight([]);
for (const [key, value] of Object.entries(data.hero.flags)) {
if (key.startsWith('night_')) {
const [, floorId] = key.split('_');
Night.addNight(floorId, value);
delete data.hero.flags[key];
}
}
}
// 切换到对应的楼层 // 切换到对应的楼层
core.changeFloor(data.floorId, null, data.hero.loc, 0, function () { core.changeFloor(data.floorId, null, data.hero.loc, 0, function () {

View File

@ -1,6 +1,7 @@
import { DamageEnemy, ensureFloorDamage, getSingleEnemy } from './damage'; import { DamageEnemy, ensureFloorDamage, getSingleEnemy } from './damage';
import { findDir, has } from '../../plugin/game/utils'; import { findDir, has } from '../../plugin/game/utils';
import { hook, loading } from '../game'; import { hook, loading } from '../game';
import { NightSpecial } from '../mechanism/misc';
export interface CurrentEnemy { export interface CurrentEnemy {
enemy: DamageEnemy; enemy: DamageEnemy;
@ -198,18 +199,12 @@ function init() {
// 极昼永夜 // 极昼永夜
if (special.has(22)) { if (special.has(22)) {
flags[`night_${floorId}`] ??= 0; NightSpecial.addNight(floorId, -enemy.info.night!);
flags[`night_${floorId}`] -= enemy.info.night!;
} }
if (special.has(23)) { if (special.has(23)) {
flags[`night_${floorId}`] ??= 0; NightSpecial.addNight(floorId, enemy.info.day!);
flags[`night_${floorId}`] += enemy.info.day;
} }
// if (core.plugin.skillTree.getSkillLevel(11) > 0) {
// core.plugin.study.declineStudiedSkill();
// }
// 如果是融化怪,需要特殊标记一下 // 如果是融化怪,需要特殊标记一下
if (special.has(25) && has(x) && has(y)) { if (special.has(25) && has(x) && has(y)) {
flags[`melt_${floorId}`] ??= {}; flags[`melt_${floorId}`] ??= {};

View File

@ -3,6 +3,7 @@ import { Range } from '../util/range';
import { ensureArray, has, manhattan } from '@/plugin/game/utils'; import { ensureArray, has, manhattan } from '@/plugin/game/utils';
import EventEmitter from 'eventemitter3'; import EventEmitter from 'eventemitter3';
import { hook } from '../game'; import { hook } from '../game';
import { NightSpecial } from '../mechanism/misc';
// todo: 光环划分优先级,从而可以实现光环的多级运算 // todo: 光环划分优先级,从而可以实现光环的多级运算
@ -335,12 +336,14 @@ export class DamageEnemy<T extends EnemyIds = EnemyIds> {
} }
// 极昼永夜 // 极昼永夜
info.atk -= flags[`night_${floorId}`] ?? 0; const night = NightSpecial.getNight(floorId);
info.def -= flags[`night_${floorId}`] ?? 0; info.atk -= night;
info.def -= night;
// 融化融化不属于怪物光环因此不能用provide和inject计算需要在这里计算 // 融化融化不属于怪物光环因此不能用provide和inject计算需要在这里计算
if (has(flags[`melt_${floorId}`]) && has(this.x) && has(this.y)) { const melt = flags[`melt_${floorId}`];
for (const [loc, per] of Object.entries(flags[`melt_${floorId}`])) { if (has(melt) && has(this.x) && has(this.y)) {
for (const [loc, per] of Object.entries(melt)) {
const [mx, my] = loc.split(',').map(v => parseInt(v)); const [mx, my] = loc.split(',').map(v => parseInt(v));
if ( if (
Math.abs(mx + dx - this.x) <= 1 && Math.abs(mx + dx - this.x) <= 1 &&

View File

@ -33,7 +33,8 @@ Mota.register('var', 'gameListener', gameListener);
Mota.register('var', 'loading', loading); Mota.register('var', 'loading', loading);
// ----- 模块注册 // ----- 模块注册
Mota.register('module', 'Mechanism', { Mota.register('module', 'Mechanism', {
BluePalace: miscMechanism.BluePalace BluePalace: miscMechanism.BluePalace,
NightSpecial: miscMechanism.NightSpecial
}); });
Mota.register('module', 'State', { Mota.register('module', 'State', {
ItemState, ItemState,

View File

@ -2,6 +2,34 @@ import { backDir, has } from '@/plugin/game/utils';
import { loading } from '../game'; import { loading } from '../game';
import type { LayerDoorAnimate } from '@/core/render/preset/floor'; import type { LayerDoorAnimate } from '@/core/render/preset/floor';
/**
* /
*/
export namespace NightSpecial {
let nightMap = new Map<FloorIds, number>();
export function getNight(floor: FloorIds) {
return nightMap.get(floor) ?? 0;
}
export function addNight(floor: FloorIds, value: number) {
const num = nightMap.get(floor) ?? 0;
nightMap.set(floor, num + value);
}
export function saveNight() {
return nightMap.entries();
}
export function loadNight(night: IterableIterator<[FloorIds, number]>) {
nightMap = new Map(night);
}
export function getAll() {
return nightMap;
}
}
export namespace BluePalace { export namespace BluePalace {
type DoorConvertInfo = [id: AllIds, x: number, y: number]; type DoorConvertInfo = [id: AllIds, x: number, y: number];

View File

@ -2,6 +2,7 @@ import { logger } from '@/core/common/logger';
import { EventEmitter } from 'eventemitter3'; import { EventEmitter } from 'eventemitter3';
import { cloneDeep, isNil } from 'lodash-es'; import { cloneDeep, isNil } from 'lodash-es';
import { ItemState } from './item'; import { ItemState } from './item';
import { NightSpecial } from '../mechanism/misc';
/** /**
* *
@ -85,7 +86,7 @@ function getRealStatus(
// 永夜、极昼 // 永夜、极昼
if (name === 'atk' || name === 'def') { if (name === 'atk' || name === 'def') {
s += window.flags?.[`night_${floorId}`] ?? 0; s += NightSpecial.getNight(floorId);
} }
// 技能 // 技能
@ -93,8 +94,7 @@ function getRealStatus(
const level = getSkillLevel(2); const level = getSkillLevel(2);
if (name === 'atk') { if (name === 'atk') {
s *= 1 + 0.1 * level; s *= 1 + 0.1 * level;
} } else if (name === 'def') {
if (name === 'def') {
s *= 1 - 0.1 * level; s *= 1 - 0.1 * level;
} }
} }
@ -102,18 +102,17 @@ function getRealStatus(
const level = getSkillLevel(10); const level = getSkillLevel(10);
if (name === 'atk') { if (name === 'atk') {
s *= 1 - 0.1 * level; s *= 1 - 0.1 * level;
} } else if (name === 'def') {
if (name === 'def') {
s *= 1 + 0.1 * level; s *= 1 + 0.1 * level;
} }
} }
// buff // buff
if (typeof s === 'number') if (typeof s === 'number') {
s *= core.getBuff(name as keyof NumbericHeroStatus); s *= core.getBuff(name as keyof NumbericHeroStatus);
s = Math.floor(s);
}
// 取整
if (typeof s === 'number') s = Math.floor(s);
return s; return s;
} }

View File

@ -102,6 +102,7 @@ interface VariableInterface {
interface ModuleInterface { interface ModuleInterface {
Mechanism: { Mechanism: {
BluePalace: typeof misc.BluePalace; BluePalace: typeof misc.BluePalace;
NightSpecial: typeof misc.NightSpecial;
}; };
Effect: { Effect: {
Portal: typeof portal; Portal: typeof portal;