fix: 第三阶段之后的bug

This commit is contained in:
unanmed 2024-11-17 20:33:51 +08:00
parent deabd10154
commit 59ef7a11a0
4 changed files with 52 additions and 32 deletions

View File

@ -9,7 +9,14 @@ main.floors.tower7=
"canFlyFrom": false, "canFlyFrom": false,
"canUseQuickShop": true, "canUseQuickShop": true,
"cannotViewMap": true, "cannotViewMap": true,
"images": [], "images": [
{
"name": "tower7.jpeg",
"canvas": "bg",
"x": 0,
"y": 0
}
],
"ratio": 2, "ratio": 2,
"defaultGround": "T526", "defaultGround": "T526",
"bgm": "tower.mp3", "bgm": "tower.mp3",

View File

@ -324,9 +324,9 @@ export namespace Hitbox {
if ( if (
Math.max(x1, x2) < Math.min(x3, x4) || Math.max(x1, x2) < Math.min(x3, x4) ||
Math.min(x1, x2) < Math.max(x3, x4) || Math.min(x1, x2) > Math.max(x3, x4) ||
Math.max(y1, y2) < Math.min(y3, y4) || Math.max(y1, y2) < Math.min(y3, y4) ||
Math.min(y1, y2) < Math.max(y3, y4) Math.min(y1, y2) > Math.max(y3, y4)
) { ) {
return false; return false;
} }
@ -334,7 +334,7 @@ export namespace Hitbox {
const d1 = cross(x1, y1, x2, y2, x3, y3); const d1 = cross(x1, y1, x2, y2, x3, y3);
const d2 = cross(x1, y1, x2, y2, x4, y4); const d2 = cross(x1, y1, x2, y2, x4, y4);
const d3 = cross(x3, y3, x4, y4, x1, y1); const d3 = cross(x3, y3, x4, y4, x1, y1);
const d4 = cross(x3, y3, x4, y4, x2, y3); const d4 = cross(x3, y3, x4, y4, x2, y2);
return d1 * d2 < 0 && d3 * d4 < 0; return d1 * d2 < 0 && d3 * d4 < 0;
} }

View File

@ -207,6 +207,7 @@ export class TowerBoss extends BarrageBoss {
*/ */
attackBoss(damage: number) { attackBoss(damage: number) {
this.hp -= damage; this.hp -= damage;
if (this.hp < 0) this.hp = 0;
this.healthBar.set(this.hp); this.healthBar.set(this.hp);
// 先用drawAnimate凑活一下等下个版本提供更好的 api // 先用drawAnimate凑活一下等下个版本提供更好的 api
if (this.stage === TowerBossStage.Stage3) { if (this.stage === TowerBossStage.Stage3) {
@ -291,7 +292,7 @@ export class TowerBoss extends BarrageBoss {
} }
if (time > 1500) { if (time > 1500) {
this.changeStage(TowerBossStage.Dialogue1, time); this.changeStage(TowerBossStage.Dialogue2, time);
this.attackTime = 2; this.attackTime = 2;
this.skill1Time = 1; this.skill1Time = 1;
this.skill2Time = 1; this.skill2Time = 1;
@ -451,24 +452,25 @@ export class TowerBoss extends BarrageBoss {
terrainClose(n: number) { terrainClose(n: number) {
for (let nx = n - 1; nx < 15 - n + 1; nx++) { for (let nx = n - 1; nx < 15 - n + 1; nx++) {
core.removeBlock(nx, n - 1); core.removeBlock(nx, n - 1);
core.removeBlock(nx, 15 - n + 1); core.removeBlock(nx, 15 - n);
core.setBgFgBlock('bg', 0, nx, n - 1); core.setBgFgBlock('bg', 0, nx, n - 1);
core.setBgFgBlock('bg', 0, nx, 15 - n + 1); core.setBgFgBlock('bg', 0, nx, 15 - n);
} }
for (let ny = n; ny < 15 - n; ny++) { for (let ny = n; ny < 15 - n; ny++) {
core.removeBlock(n - 1, ny); core.removeBlock(n - 1, ny);
core.removeBlock(15 - n + 1, ny); core.removeBlock(15 - n, ny);
core.setBgFgBlock('bg', 0, n - 1, ny); core.setBgFgBlock('bg', 0, n - 1, ny);
core.setBgFgBlock('bg', 0, 15 - n + 1, ny); core.setBgFgBlock('bg', 0, 15 - n, ny);
} }
for (let nx = n; nx < 15 - n; nx++) { for (let nx = n; nx < 15 - n; nx++) {
core.setBlock(527, nx, n); core.setBlock(527, nx, n);
core.setBlock(527, nx, 15 - n); core.setBlock(527, nx, 15 - n - 1);
} }
for (let ny = n + 1; ny < 15 - n - 1; ny++) { for (let ny = n + 1; ny < 15 - n - 1; ny++) {
core.setBlock(527, n, ny); core.setBlock(527, n, ny);
core.setBlock(527, 15 - n, ny); core.setBlock(527, 15 - n - 1, ny);
} }
core.stopAutomaticRoute();
core.setHeroLoc('x', 7); core.setHeroLoc('x', 7);
core.setHeroLoc('y', 7); core.setHeroLoc('y', 7);
core.setHeroLoc('direction', 'up'); core.setHeroLoc('direction', 'up');
@ -484,7 +486,7 @@ export class TowerBoss extends BarrageBoss {
} }
releaseSkill6(n: number, last: number) { releaseSkill6(n: number, last: number) {
const s = 13 - n * 2; const s = 15 - n * 2;
const x = Math.floor(Math.random() * s + n); const x = Math.floor(Math.random() * s + n);
const y = Math.floor(Math.random() * s + n); const y = Math.floor(Math.random() * s + n);
const proj = this.createProjectile(BoomProjectile, 0, 0); const proj = this.createProjectile(BoomProjectile, 0, 0);
@ -494,7 +496,9 @@ export class TowerBoss extends BarrageBoss {
async releaseSkill7(n: number) { async releaseSkill7(n: number) {
const count = Math.floor(Math.random() * 6 + 3); const count = Math.floor(Math.random() * 6 + 3);
const nodes: LocArr[] = []; const nodes: LocArr[] = [];
const s = 13 - n * 2; let lastX = -1;
let lastY = -1;
const s = 15 - n * 2;
const used = new Set<number>(); const used = new Set<number>();
let i = 0; let i = 0;
while (i < count) { while (i < count) {
@ -505,13 +509,13 @@ export class TowerBoss extends BarrageBoss {
i++; i++;
used.add(index); used.add(index);
nodes.push([x, y]); nodes.push([x, y]);
if (nodes.length > 1) { if (lastX !== -1 && lastY !== -1) {
const [lx, ly] = nodes[i - 1];
const proj = this.createProjectile(ChainProjectile, 0, 0); const proj = this.createProjectile(ChainProjectile, 0, 0);
proj.hitbox.setPoint1(lx, ly); proj.hitbox.setPoint1(lastX * 32 + 16, lastY * 32 + 16);
proj.hitbox.setPoint2(x, y); proj.hitbox.setPoint2(x * 32 + 16, y * 32 + 16);
} }
await sleep(200); lastX = x;
lastY = y;
} }
} }
@ -589,7 +593,7 @@ export class TowerBoss extends BarrageBoss {
this.attackTime++; this.attackTime++;
} }
if (this.hp <= 1000) { if (this.hp <= 0) {
this.changeStage(TowerBossStage.End, time); this.changeStage(TowerBossStage.End, time);
} }
} }

View File

@ -859,6 +859,7 @@ export class BoomProjectile extends Projectile<TowerBoss> {
ai(boss: TowerBoss, time: number, frame: number): void { ai(boss: TowerBoss, time: number, frame: number): void {
if (!this.animated && time > this.last + 1000) { if (!this.animated && time > this.last + 1000) {
this.animated = true;
core.drawAnimate('explosion1', this.bx, this.by); core.drawAnimate('explosion1', this.bx, this.by);
} }
if (time > this.last + 1100) { if (time > this.last + 1100) {
@ -871,30 +872,35 @@ export class BoomProjectile extends Projectile<TowerBoss> {
const end = this.last + 1000; const end = this.last + 1000;
const r = 12; const r = 12;
const mr = 27; const mr = 27;
ctx.save();
if (this.time < end) { if (this.time < end) {
const angle = this.time / 30; const angle = this.time / 500;
const sin = Math.sin(angle); const sin = Math.sin(angle);
const cos = Math.cos(angle); const cos = Math.cos(angle);
ctx.fillStyle = 'rgb(255,50,50)'; ctx.fillStyle = 'rgb(255,50,50)';
ctx.strokeStyle = 'rgb(255,50,50)'; ctx.strokeStyle = 'rgb(255,50,50)';
ctx.lineWidth = 1; ctx.lineWidth = 1.5;
ctx.globalAlpha = 0.8;
const cx = this.x + 16;
const cy = this.y + 16;
ctx.beginPath(); ctx.beginPath();
ctx.moveTo(this.x + r * cos, this.y + r * sin); ctx.arc(cx, cy, r, 0, Math.PI * 2);
ctx.lineTo(this.x + mr * cos, this.y + mr * sin); ctx.moveTo(cx + r * cos, cy + r * sin);
ctx.moveTo(this.x - r * cos, this.y - r * sin); ctx.lineTo(cx + mr * cos, cy + mr * sin);
ctx.lineTo(this.x - mr * cos, this.y - mr * sin); ctx.moveTo(cx - r * cos, cy - r * sin);
ctx.arc(this.x, this.y, r, 0, Math.PI * 2); ctx.lineTo(cx - mr * cos, cy - mr * sin);
ctx.stroke(); ctx.stroke();
ctx.beginPath(); ctx.beginPath();
ctx.arc(this.x, this.y, 2, 0, Math.PI * 2); ctx.arc(cx, cy, 2, 0, Math.PI * 2);
ctx.fill(); ctx.fill();
} }
if (this.time > end - 500) { if (this.time > end - 500) {
const dt = this.time - end + 500; const dt = this.time - end + 500;
const pos = this.y - (1 - dt / 500) * 480; const pos = this.y - (1 - dt / 500) * 480;
const img = core.material.images.images['boom.png']; const img = core.material.images.images['boom.png'];
ctx.drawImage(img, this.x - 16, pos - 80, 36, 80); ctx.drawImage(img, this.x, pos - 80, 36, 80);
} }
ctx.restore();
} }
} }
@ -934,22 +940,25 @@ export class ChainProjectile extends Projectile<TowerBoss> {
render(canvas: MotaOffscreenCanvas2D, transform: Transform): void { render(canvas: MotaOffscreenCanvas2D, transform: Transform): void {
const ctx = canvas.ctx; const ctx = canvas.ctx;
ctx.save();
ctx.beginPath(); ctx.beginPath();
ctx.moveTo(this.hitbox.x1, this.hitbox.y1); ctx.moveTo(this.hitbox.x1, this.hitbox.y1);
ctx.lineTo(this.hitbox.x2, this.hitbox.y2); ctx.lineTo(this.hitbox.x2, this.hitbox.y2);
const progress = (this.time - 1000) / 1000;
if (this.time < 1000) { if (this.time < 1000) {
ctx.globalAlpha = 0.6; ctx.globalAlpha = 0.6;
ctx.strokeStyle = 'rgb(220,100,255)'; ctx.strokeStyle = 'rgb(220,100,255)';
ctx.stroke(); ctx.stroke();
} else { } else {
ctx.lineWidth = 2;
ctx.strokeStyle = '#fff'; ctx.strokeStyle = '#fff';
ctx.shadowBlur = 3; ctx.shadowBlur = 12;
ctx.shadowColor = '#62c8f4'; ctx.shadowColor = '#62c8f4';
ctx.globalAlpha = 0.6; ctx.globalAlpha = 1 - progress;
ctx.stroke(); ctx.stroke();
ctx.shadowBlur = 0;
ctx.shadowColor = '';
} }
ctx.restore();
} }
} }