Compare commits
	
		
			2 Commits
		
	
	
		
			a6ba26e8b5
			...
			5b853dc5a8
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 5b853dc5a8 | |||
| 5a3552c2c0 | 
							
								
								
									
										2
									
								
								main.js
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								main.js
									
									
									
									
									
								
							| @ -276,7 +276,7 @@ main.prototype.init = function (mode, callback) { | ||||
|           coreData[t] = main[t]; | ||||
|         }); | ||||
|         main.core.init(coreData, callback); | ||||
|         main.core.resize(); | ||||
|         core.resize(); | ||||
|         // 自动放缩最大化
 | ||||
|         if (!main.replayChecking) { | ||||
|           if (core.getLocalStorage("autoScale") == null) { | ||||
|  | ||||
| @ -94,7 +94,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = | ||||
| 			} | ||||
| 		); | ||||
| 	}); | ||||
|     }, | ||||
| }, | ||||
|         "changingFloor": function (floorId, heroLoc) { | ||||
|       // 正在切换楼层过程中执行的操作;此函数的执行时间是“屏幕完全变黑“的那一刻
 | ||||
|       // floorId为要切换到的楼层ID;heroLoc表示勇士切换到的位置
 | ||||
| @ -1867,7 +1867,7 @@ var functions_d6ad677b_427a_4623_b50f_a445a3b0ef8a = | ||||
| 
 | ||||
| 	// 如需强行终止行走可以在这里条件判定:
 | ||||
| 	// core.stopAutomaticRoute();
 | ||||
|     }, | ||||
| }, | ||||
|         "moveDirectly": function (x, y, ignoreSteps) { | ||||
|       // 瞬间移动;x,y为要瞬间移动的点;ignoreSteps为减少的步数,可能之前已经被计算过
 | ||||
|       // 返回true代表成功瞬移,false代表没有成功瞬移
 | ||||
|  | ||||
| @ -2728,6 +2728,12 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = | ||||
| 
 | ||||
| 		main.dom.boss5.style.width = obj.totalWidth + 3 + "px"; | ||||
| 		main.dom.boss5.style.height = obj.totalHeight + 3 + "px"; | ||||
| 		main.dom.boss6.style.width = obj.totalWidth + 3 + "px"; | ||||
| 		main.dom.boss6.style.height = obj.totalHeight + 3 + "px"; | ||||
| 		main.dom.boss7.style.width = obj.totalWidth + 3 + "px"; | ||||
| 		main.dom.boss7.style.height = obj.totalHeight + 3 + "px"; | ||||
| 		main.dom.boss8.style.width = obj.totalWidth + 3 + "px"; | ||||
| 		main.dom.boss8.style.height = obj.totalHeight + 3 + "px"; | ||||
| 
 | ||||
| 		main.dom.boss.style.width = obj.totalWidth + 3 + "px"; | ||||
| 		main.dom.boss.style.height = obj.totalHeight + 3 + "px"; | ||||
| @ -8714,6 +8720,35 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = | ||||
| 		yellowgreen: "#9acd32", | ||||
| 		transparent: "#0000", | ||||
| 	}; | ||||
| 	// 计算两个数的最大公约数
 | ||||
| 	function gcdOfTwo(a, b) { | ||||
| 		while (b !== 0) { | ||||
| 			let temp = b; | ||||
| 			b = a % b; | ||||
| 			a = temp; | ||||
| 		} | ||||
| 		return a; | ||||
| 	} | ||||
| 
 | ||||
| 	// 计算任意项整数的最大公约数
 | ||||
| 	function gcd(...numbers) { | ||||
| 		if (numbers.length < 2) { | ||||
| 			throw new Error("至少需要两个数"); | ||||
| 		} | ||||
| 		return numbers.reduce((a, b) => gcdOfTwo(a, b)); | ||||
| 	} | ||||
| 	// 计算两个数的最小公倍数
 | ||||
| 	function lcmOfTwo(a, b) { | ||||
| 		return (a * b) / gcdOfTwo(a, b); | ||||
| 	} | ||||
| 
 | ||||
| 	// 计算任意项整数的最小公倍数
 | ||||
| 	function lcm(...numbers) { | ||||
| 		if (numbers.length < 2) { | ||||
| 			throw new Error("至少需要两个数"); | ||||
| 		} | ||||
| 		return numbers.reduce((a, b) => lcmOfTwo(a, b)); | ||||
| 	} | ||||
| 
 | ||||
| 	if (has(core.plugin.utils)) { | ||||
| 		throw new ReferenceError( | ||||
| @ -8721,6 +8756,10 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = | ||||
| 		); | ||||
| 	} | ||||
| 	core.plugin.utils = { | ||||
| 		gcdOfTwo, | ||||
| 		lcmOfTwo, | ||||
| 		gcd, | ||||
| 		lcm, | ||||
| 		has, | ||||
| 		slide, | ||||
| 		backDir, | ||||
| @ -8773,7 +8812,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = | ||||
| 			throw "未设置callback"; | ||||
| 		} | ||||
| 	}; | ||||
|   }, | ||||
| }, | ||||
|     "音频系统": function () { | ||||
|     // 在此增加新插件
 | ||||
|     /*首先,在造塔群下载所需的库文件,然后放置在塔目录下的 libs/thirdparty 或其他目录下,之后在 index.html 的最后加上下面这几行: | ||||
| @ -16478,6 +16517,41 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = | ||||
| 	boss5.style.transform = "translate(-50%,-50%)"; | ||||
| 	const ctx5 = boss5.getContext("2d"); | ||||
| 	main.dom.boss5 = boss5; | ||||
| 
 | ||||
| 	const boss6 = document.createElement("canvas"); //boss战画布设置
 | ||||
| 	boss6.style.position = "absolute"; | ||||
| 	boss6.style.zIndex = 305; | ||||
| 	boss6.style.display = "none"; | ||||
| 	boss6.id = "boss6"; | ||||
| 	main.dom.gameGroup.insertAdjacentElement("afterend", boss6); | ||||
| 	boss6.style.top = "50%"; | ||||
| 	boss6.style.left = "50%"; | ||||
| 	boss6.style.transform = "translate(-50%,-50%)"; | ||||
| 	const ctx6 = boss6.getContext("2d"); | ||||
| 	main.dom.boss6 = boss6; | ||||
| 	const boss7 = document.createElement("canvas"); //boss战画布设置
 | ||||
| 	boss7.style.position = "absolute"; | ||||
| 	boss7.style.zIndex = 306; | ||||
| 	boss7.style.display = "none"; | ||||
| 	boss7.id = "boss7"; | ||||
| 	main.dom.gameGroup.insertAdjacentElement("afterend", boss7); | ||||
| 	boss7.style.top = "50%"; | ||||
| 	boss7.style.left = "50%"; | ||||
| 	boss7.style.transform = "translate(-50%,-50%)"; | ||||
| 	const ctx7 = boss7.getContext("2d"); | ||||
| 	main.dom.boss7 = boss7; | ||||
| 	const boss8 = document.createElement("canvas"); //boss战画布设置
 | ||||
| 	boss8.style.position = "absolute"; | ||||
| 	boss8.style.zIndex = 307; | ||||
| 	boss8.style.display = "none"; | ||||
| 	boss8.id = "boss8"; | ||||
| 	main.dom.gameGroup.insertAdjacentElement("afterend", boss8); | ||||
| 	boss8.style.top = "50%"; | ||||
| 	boss8.style.left = "50%"; | ||||
| 	boss8.style.transform = "translate(-50%,-50%)"; | ||||
| 	const ctx8 = boss8.getContext("2d"); | ||||
| 	main.dom.boss8 = boss8; | ||||
| 
 | ||||
| 	boss.onclick = function (e) { | ||||
| 		try { | ||||
| 			e.preventDefault(); | ||||
| @ -16496,7 +16570,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = | ||||
| 			main.log(ee); | ||||
| 		} | ||||
| 	}; | ||||
| 
 | ||||
| 	const { sleep } = core.plugin.utils | ||||
| 
 | ||||
| 	class Boss { | ||||
| 		constructor() { | ||||
| @ -16504,14 +16578,14 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = | ||||
| 			this.bg = "bg_3512.webp"; | ||||
| 			this.heroImage = "tati_310101.webp" | ||||
| 			this.hero = { hp: 1000, atk: 100, def: 100, spell: 100, speed: 10, mdef: 10 } | ||||
| 			this.boss = { name: "菲奥奈", id: "angel", image: "tati_050143.webp", hp: 1000, atk: 100, def: 100, speed: 10, mdef: 10 } | ||||
| 			this.boss = { name: "菲奥奈", id: "angel", image: "tati_050143.webp", hp: 1000, atk: 200, def: 100, speed: 10, mdef: 10, skill: ['普通攻击', '重斩'], index: 0 } | ||||
| 			this.enemy = [ | ||||
| 				{ name: "小蝙蝠", id: "bat", hp: 1000, atk: 100, def: 100, speed: 10, mdef: 10 }, | ||||
| 				{ name: "红蝙蝠", id: "redBat", hp: 1000, atk: 100, def: 100, speed: 10, mdef: 10 }, | ||||
| 				{ name: "大蝙蝠", id: "bigBat", hp: 1000, atk: 100, def: 100, speed: 10, mdef: 10 }, | ||||
| 				{ name: "绿色史莱姆", id: "greenSlime", hp: 1000, atk: 100, def: 100, speed: 10, mdef: 10 }, | ||||
| 				{ name: "红色史莱姆", id: "redSlime", hp: 1000, atk: 100, def: 100, speed: 10, mdef: 10 }, | ||||
| 				{ name: "黑色史莱姆", id: "blackSlime", hp: 1000, atk: 100, def: 100, speed: 10, mdef: 10 }, | ||||
| 				{ name: "小蝙蝠", id: "bat", hp: 1000, atk: 100, def: 100, speed: 10, mdef: 10, skill: ['普通攻击', '重斩'], index: 0 }, | ||||
| 				{ name: "红蝙蝠", id: "redBat", hp: 1000, atk: 100, def: 100, speed: 10, mdef: 10, skill: ['普通攻击', '重斩'], index: 0 }, | ||||
| 				{ name: "大蝙蝠", id: "bigBat", hp: 1000, atk: 100, def: 100, speed: 10, mdef: 10, skill: ['普通攻击', '重斩'], index: 0 }, | ||||
| 				{ name: "绿色史莱姆", id: "greenSlime", hp: 1000, atk: 100, def: 100, speed: 10, mdef: 10, skill: ['普通攻击', '重斩'], index: 0 }, | ||||
| 				{ name: "红色史莱姆", id: "redSlime", hp: 1000, atk: 100, def: 100, speed: 10, mdef: 10, skill: ['普通攻击', '重斩'], index: 0 }, | ||||
| 				{ name: "黑色史莱姆", id: "blackSlime", hp: 1000, atk: 100, def: 100, speed: 10, mdef: 10, skill: ['普通攻击', '重斩'], index: 0 }, | ||||
| 			] | ||||
| 			this.bossImage = "tati_050143.webp" | ||||
| 			this.selection = "boss" | ||||
| @ -16525,7 +16599,13 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = | ||||
| 				[], | ||||
| 				[] | ||||
| 			] | ||||
| 			this.skills = { //技能列表,便于调用(可通过this.skills[name]调用)
 | ||||
| 				"菲奥奈": ['普通攻击', '重斩'] | ||||
| 			} | ||||
| 			this.turn = 0; | ||||
| 			this.playingAnimate = new Set(); | ||||
| 		} | ||||
| 
 | ||||
| 		click(px, py) { | ||||
| 			//点击效果
 | ||||
| 			const makeBox = ([x, y], [w, h]) => { | ||||
| @ -16543,18 +16623,169 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = | ||||
| 			const pos = [px, py]; | ||||
| 		} | ||||
| 		async bossStart() { | ||||
| 			boss.style.display = "block" | ||||
| 			this.turn = 0 | ||||
| 			core.lockControl() | ||||
| 			await this.blackBg() | ||||
| 			this.moveboss() | ||||
| 			await this.movehero() | ||||
| 			await this.moveStatus() | ||||
| 			this.drawenemy() | ||||
| 
 | ||||
| 			this.update() | ||||
| 			this.fight() | ||||
| 		} | ||||
| 		async bossEnd() { | ||||
| 			hero.hp = this.hero.hp | ||||
| 			await this.close() | ||||
| 			core.unlockControl() | ||||
| 
 | ||||
| 			core.unlockControl() | ||||
| 			core.updateStatusBar() | ||||
| 			if (hero.hp <= 0) { | ||||
| 				hero.hp = 0 | ||||
| 				core.events.lose("BOSS战失败"); | ||||
| 			} | ||||
| 		} | ||||
| 		async fight() { | ||||
| 			await this.drawturn() | ||||
| 			const fightList = [] | ||||
| 			fightList.push(['hero', this.hero.speed]) | ||||
| 			if (this.boss.hp > 0) fightList.push(["boss", this.boss.speed]) | ||||
| 			this.enemy.forEach((v, i) => { | ||||
| 				if (v.id && v.hp > 0) fightList.push([i, v.speed]) | ||||
| 			}) | ||||
| 			fightList.sort((a, b) => b[1] - a[1]) | ||||
| 			let damage; | ||||
| 			for (const v of fightList) { | ||||
| 				switch (v[0]) { | ||||
| 				case 'hero': | ||||
| 					await this.playanimate("sword", 1800, 800) //播放动画sword
 | ||||
| 					await sleep(200) //等待200ms
 | ||||
| 					break; | ||||
| 				case 'boss': | ||||
| 					if (this.boss.hp > 0) { | ||||
| 						this.selection = "boss" | ||||
| 						this.update() | ||||
| 
 | ||||
| 						switch (this.boss.skill[this.boss.index]) { //这里写boss技能的效果
 | ||||
| 						case "普通攻击": | ||||
| 							damage = Math.max(this.boss.atk - this.hero.def, 0) //基础伤害
 | ||||
| 							damage = Math.floor(damage * this.boss.speed / this.hero.speed) //速度比值伤害加成
 | ||||
| 							this.hero.hp -= damage //承受伤害
 | ||||
| 							core.status.hero.statistics.battleDamage += damage; //数据统计记录伤害
 | ||||
| 							await this.playanimate("sword", 350, 800) //播放动画sword
 | ||||
| 							await sleep(200) //等待200ms
 | ||||
| 							break; | ||||
| 
 | ||||
| 						} | ||||
| 						this.boss.index++ | ||||
| 						if (this.boss.index >= this.boss.skill.length) this.boss.index = 0 | ||||
| 					} | ||||
| 					break; | ||||
| 				default: | ||||
| 					const enemy = this.enemy[v[0]]; | ||||
| 					if (enemy.hp > 0) { | ||||
| 						this.selection = v[0] | ||||
| 						this.update() | ||||
| 
 | ||||
| 						switch (enemy.skill[enemy.index]) { //这里写boss召唤物(小怪)的技能效果
 | ||||
| 						case "普通攻击": | ||||
| 							damage = Math.max(enemy.atk - this.hero.def, 0) //基础伤害
 | ||||
| 							damage = Math.floor(damage * enemy.speed / enemy.speed) //速度比值伤害加成
 | ||||
| 							this.hero.hp -= damage //承受伤害
 | ||||
| 							core.status.hero.statistics.battleDamage += damage; //数据统计记录伤害
 | ||||
| 
 | ||||
| 							switch (enemy.id) { //根据怪物id选取不同的特效
 | ||||
| 
 | ||||
| 							case "bat": | ||||
| 								await this.playanimate("sword", 350, 800) //播放动画sword
 | ||||
| 
 | ||||
| 								break; | ||||
| 							case "redBat": | ||||
| 								await this.playanimate("Fire01", 350, 800) //播放动画Fire01
 | ||||
| 								break; | ||||
| 							case "bigBat": | ||||
| 								await this.playanimate("Fire02", 350, 800) //播放动画Fire02
 | ||||
| 								break; | ||||
| 							case "greenSlime": | ||||
| 								await this.playanimate("005-Attack03", 350, 800) //播放动画005-Attack03
 | ||||
| 								break; | ||||
| 							case "redSlime": | ||||
| 								await this.playanimate("012-Heal01", 350, 800) //播放动画012-Heal01
 | ||||
| 								break; | ||||
| 							case "blackSlime": | ||||
| 								await this.playanimate("sword", 350, 800) //播放动画sword
 | ||||
| 								break; | ||||
| 
 | ||||
| 							} | ||||
| 							await sleep(200) //等待200ms
 | ||||
| 							break; | ||||
| 						} | ||||
| 						if (enemy.index >= enemy.length) enemy.index = 0 | ||||
| 					} | ||||
| 					break; | ||||
| 
 | ||||
| 				} | ||||
| 				this.update() | ||||
| 
 | ||||
| 			} | ||||
| 			let end = true; | ||||
| 			if (this.boss.hp > 0) end = false; | ||||
| 			this.enemy.forEach(v => { if (v.hp > 0) end = false }) | ||||
| 
 | ||||
| 			if (this.hero.hp <= 0) end = true | ||||
| 			if (end) { this.bossEnd() } else { this.fight() } | ||||
| 		} | ||||
| 		drawturn() { | ||||
| 			boss8.style.display = "block" | ||||
| 			this.turn += 1 | ||||
| 			let time = 0, | ||||
| 				frame = 0, | ||||
| 				frame2 = 0, | ||||
| 				right = 1, | ||||
| 				once = 10; | ||||
| 			return new Promise((resolve) => { | ||||
| 				core.registerAnimationFrame("drawturn", true, (temptime) => { | ||||
| 					if (temptime - time > 1000 / 60) { | ||||
| 						time = temptime | ||||
| 						frame += 1 * right | ||||
| 						core.clearMap(ctx) | ||||
| 						if (core.domStyle.isVertical) { | ||||
| 							ctx.canvas.width = 1248; | ||||
| 							ctx.canvas.height = 2028; | ||||
| 							ctx.save(); //保存设置
 | ||||
| 							ctx.translate(1248, 0); //重新定位右上角为基准
 | ||||
| 							ctx.rotate(Math.PI / 2); //旋转90度
 | ||||
| 						} else { | ||||
| 							ctx.canvas.width = 2028; | ||||
| 							ctx.canvas.height = 1248; | ||||
| 						} | ||||
| 
 | ||||
| 						core.fillRect(ctx, 0, 624 - once * frame, 2028, once * frame * 2, 'rgba(0,0,0,0.7)') | ||||
| 						core.setTextAlign(ctx, "center") | ||||
| 						core.fillBoldText1( | ||||
| 							ctx, | ||||
| 							'ROUND ' + this.turn, | ||||
| 							1014, | ||||
| 							624, | ||||
| 							"#FFFFFF", | ||||
| 							"#000000", | ||||
| 							6, | ||||
| 							core.ui._buildFont(frame * 5, true) | ||||
| 						) | ||||
| 						if (1014 - once * frame * 7 <= 0) { | ||||
| 							frame -= 1 | ||||
| 							frame2++ | ||||
| 
 | ||||
| 							if (frame2 > 30) right = -1 | ||||
| 
 | ||||
| 						} | ||||
| 						if (frame < 0) { | ||||
| 							core.clearMap(ctx) | ||||
| 							core.unregisterAnimationFrame("drawturn") | ||||
| 							resolve() | ||||
| 						} | ||||
| 					} | ||||
| 				}) | ||||
| 			}) | ||||
| 		} | ||||
| 		drawenemy() { | ||||
| 			let block, | ||||
| @ -16567,7 +16798,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = | ||||
| 					farme += 1 | ||||
| 					let animate = Math.floor(farme / 30), | ||||
| 						posx = 700, | ||||
| 						posy = 350; | ||||
| 						posy = 500; | ||||
| 					core.clearMap(ctx5) | ||||
| 					if (core.domStyle.isVertical) { | ||||
| 						ctx5.canvas.width = 1248; | ||||
| @ -16584,7 +16815,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = | ||||
| 					if (enemy) { | ||||
| 
 | ||||
| 						core.drawWindowSkin("winskin.webp", ctx5, 650, 250, 400, 660, null, null, null, 3) | ||||
| 						if (this.selection === "boss") core.strokeRect(ctx5, 800, 600, 100, 150, "yellow", 6) | ||||
| 						if (this.selection === "boss") core.strokeRect(ctx5, 800, 300, 100, 150, "yellow", 6) | ||||
| 						const bossBlock = core.getBlockInfo(this.boss.id) | ||||
| 						core.drawImage( | ||||
| 							ctx5, | ||||
| @ -16594,7 +16825,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = | ||||
| 							32, | ||||
| 							48, | ||||
| 							800, | ||||
| 							600, | ||||
| 							300, | ||||
| 							96, | ||||
| 							144 | ||||
| 						); | ||||
| @ -16611,7 +16842,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = | ||||
| 							144 | ||||
| 						); | ||||
| 						for (let i = 0; i < this.enemy.length; i++) { | ||||
| 							if (this.enemy[i].id) { | ||||
| 							if (this.enemy[i].id && this.enemy[i].hp > 0) { | ||||
| 								block = core.getBlockInfo(this.enemy[i].id) | ||||
| 							} else { | ||||
| 								posx += 100 | ||||
| @ -16717,7 +16948,158 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = | ||||
| 			this.drawboss() | ||||
| 			this.drawhero() | ||||
| 			this.drawStatus() | ||||
| 			let dodraw = false | ||||
| 			for (let i = 0; i < this.enemy.length; i++) { | ||||
| 				if (this.enemy[i].id && this.enemy[i].hp > 0) { dodraw = true } | ||||
| 			} | ||||
| 			if (dodraw === true) this.drawenemy() | ||||
| 
 | ||||
| 		} | ||||
| 		playanimate(name, x, y, scalex = 10, scaley = 10) { | ||||
| 			const one = { | ||||
| 				name: name, | ||||
| 				x: x, | ||||
| 				y: y, | ||||
| 				scalex: scalex, | ||||
| 				scaley: scaley, | ||||
| 				farme: 0 | ||||
| 
 | ||||
| 			} | ||||
| 			let time = 0 | ||||
| 			boss6.style.display = "block" | ||||
| 			return new Promise((resolve) => { | ||||
| 				core.registerAnimationFrame("animateboss", true, (timestamp) => { | ||||
| 					if (timestamp - time > 1000 / 60) { | ||||
| 						time = timestamp; | ||||
| 						core.clearMap(ctx6); | ||||
| 
 | ||||
| 
 | ||||
| 						const data = flags["animate_" + one.name]; | ||||
| 						if (core.domStyle.isVertical) { | ||||
| 							ctx6.canvas.width = 1248; | ||||
| 							ctx6.canvas.height = 2028; | ||||
| 							ctx6.save(); //保存设置
 | ||||
| 							ctx6.translate(1248, 0); //重新定位右上角为基准
 | ||||
| 							ctx6.rotate(Math.PI / 2); //旋转90度
 | ||||
| 						} else { | ||||
| 							ctx6.canvas.width = 2028; | ||||
| 							ctx6.canvas.height = 1248; | ||||
| 						} | ||||
| 
 | ||||
| 						if (!data) { | ||||
| 
 | ||||
| 							core.registerAnimationFrame("animateboss") | ||||
| 							resolve() | ||||
| 						} else { | ||||
| 							data.imageList.forEach(function (image) { | ||||
| 								if ( | ||||
| 									one.farme >= (image.beforefarme ?? 0) && | ||||
| 									one.farme <= (image.afterfarme ?? data.allFarme) | ||||
| 								) { | ||||
| 									const img = core.material.images.images?.[image.image]; | ||||
| 									if (img) { | ||||
| 										const gla = image.globalAlpha ?? 100; | ||||
| 										const agla = image.aglobalAlpha ?? gla, | ||||
| 											beforefarme = image.beforefarme ?? 0; | ||||
| 										const afterfarme = image.afterfarme ?? data.allFarme; | ||||
| 
 | ||||
| 										ctx6.globalAlpha = | ||||
| 											(gla + | ||||
| 												((agla - gla) * (one.farme - beforefarme)) / | ||||
| 												(afterfarme - beforefarme || 1)) / | ||||
| 											100; | ||||
| 
 | ||||
| 										const cx = | ||||
| 											(image.cx ?? 0) + | ||||
| 											(((image.acx ?? 0) - (image.cx ?? 0)) * | ||||
| 												(one.farme - beforefarme)) / | ||||
| 											(afterfarme - beforefarme || 1), | ||||
| 											cy = | ||||
| 											(image.cy ?? 0) + | ||||
| 											(((image.acy ?? 0) - (image.cy ?? 0)) * | ||||
| 												(one.farme - beforefarme)) / | ||||
| 											(afterfarme - beforefarme || 1), | ||||
| 											cw = | ||||
| 											(image.cw ?? img.width) + | ||||
| 											(((image.acw ?? img.width) - (image.cw ?? img.width)) * | ||||
| 												(one.farme - beforefarme)) / | ||||
| 											(afterfarme - beforefarme || 1), | ||||
| 											ch = | ||||
| 											(image.ch ?? img.height) + | ||||
| 											(((image.acw ?? img.height) - (image.cw ?? img.height)) * | ||||
| 												(one.farme - beforefarme)) / | ||||
| 											(afterfarme - beforefarme || 1), | ||||
| 											x = | ||||
| 											(image.x ?? 0) + | ||||
| 											(((image.ax ?? 0) - (image.x ?? 0)) * | ||||
| 												(one.farme - beforefarme)) / | ||||
| 											(afterfarme - beforefarme || 1), | ||||
| 											y = | ||||
| 											(image.y ?? 0) + | ||||
| 											(((image.ay ?? 0) - (image.y ?? 0)) * | ||||
| 												(one.farme - beforefarme)) / | ||||
| 											(afterfarme - beforefarme || 1), | ||||
| 											w = | ||||
| 											(image.w ?? one.width) + | ||||
| 											(((image.aw ?? one.width) - (image.w ?? one.width)) * | ||||
| 												(one.farme - beforefarme)) / | ||||
| 											(afterfarme - beforefarme || 1), | ||||
| 											h = | ||||
| 											(image.h ?? one.height) + | ||||
| 											(((image.aw ?? one.height) - (image.w ?? one.height)) * | ||||
| 												(one.farme - beforefarme)) / | ||||
| 											(afterfarme - beforefarme || 1), | ||||
| 											angle = | ||||
| 											(Math.PI * | ||||
| 												((image.image.angle ?? 0) + | ||||
| 													(((image.aangle ?? 0) - (image.image.angle ?? 0)) * | ||||
| 														(one.farme - beforefarme)) / | ||||
| 													(afterfarme - beforefarme || 1))) / | ||||
| 											180; | ||||
| 
 | ||||
| 
 | ||||
| 										core.drawImage( | ||||
| 											ctx6, | ||||
| 											img, | ||||
| 											cx, | ||||
| 											cy, | ||||
| 											cw, | ||||
| 											ch, | ||||
| 											one.x + (x - data.px) * one.scalex, | ||||
| 											one.y + (y - data.py) * one.scaley, | ||||
| 											w * one.scalex, | ||||
| 											h * one.scaley, | ||||
| 											angle | ||||
| 										); | ||||
| 									} | ||||
| 
 | ||||
| 								} | ||||
| 							}); | ||||
| 							data.soundList.forEach(function (sound) { | ||||
| 								const lisen = | ||||
| 									sound.sound && | ||||
| 									core.sounds[sound.sound] && | ||||
| 									core.musicStatus.soundStatus; | ||||
| 								if (one.farme == sound.startfarme && lisen) { | ||||
| 									if (sound.stopbefore) core.stopSound(); | ||||
| 									core.playSound(sound.sound); | ||||
| 								} | ||||
| 							}); | ||||
| 							one.farme++; | ||||
| 							ctx6.restore(); | ||||
| 							if (one.farme > data.allFarme) { | ||||
| 								core.clearMap(ctx6) | ||||
| 								core.registerAnimationFrame("animateboss") | ||||
| 								resolve() | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				}); | ||||
| 
 | ||||
| 			}) | ||||
| 
 | ||||
| 		} | ||||
| 
 | ||||
| 		drawboss() { | ||||
| 			core.clearMap(ctx3) | ||||
| 			if (core.domStyle.isVertical) { | ||||
| @ -17391,7 +17773,6 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = | ||||
| 		close() { | ||||
| 			let globalAlpha = 0, | ||||
| 				time = 0 | ||||
| 			boss.style.display = 'block' | ||||
| 			return new Promise((resolve) => { | ||||
| 				core.registerAnimationFrame("closeblack", true, (temptime) => { | ||||
| 					if (temptime - time > 1000 / 60) { | ||||
| @ -17424,6 +17805,10 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = | ||||
| 							boss3.style.display = 'none' | ||||
| 							boss4.style.display = 'none' | ||||
| 							boss5.style.display = 'none' | ||||
| 							boss6.style.display = 'none' | ||||
| 							boss7.style.display = 'none' | ||||
| 							boss8.style.display = 'none' | ||||
| 
 | ||||
| 							core.registerAnimationFrame("closeblack2", true, (temptime) => { | ||||
| 								if (temptime - time > 1000 / 60) { | ||||
| 									time = temptime | ||||
| @ -17439,7 +17824,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = | ||||
| 										ctx.canvas.height = 1248; | ||||
| 									} | ||||
| 									ctx.globalAlpha = globalAlpha | ||||
| 									core.fillRect(ctx1, 0, 0, 2028, 1248, "#000000"); | ||||
| 									core.fillRect(ctx, 0, 0, 2028, 1248, "#000000"); | ||||
| 									ctx.restore(); | ||||
| 									globalAlpha -= 1 / 30 | ||||
| 									if (globalAlpha < 0) { | ||||
| @ -19249,7 +19634,7 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = | ||||
| 			}); | ||||
| 		} | ||||
| 	}); | ||||
|   }, | ||||
| }, | ||||
|     "intro&loop": function () { | ||||
|     // 在此增加新插件
 | ||||
|     this.introAndLoop = function (intro, time, loop) { | ||||
| @ -19605,14 +19990,15 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = | ||||
| 	const ctx = animateAttack.getContext("2d"); | ||||
| 
 | ||||
| 	main.dom.gameDraw.appendChild(animateAttack); | ||||
| 
 | ||||
| 	const { lcm, gcd } = core.plugin.utils | ||||
| 	this.drawAttackAnimate = function ( | ||||
| 		heroInfo, | ||||
| 		oneTurn, | ||||
| 		enemyInfo, | ||||
| 		equipInfo, | ||||
| 		farme, | ||||
| 		damageInfo | ||||
| 		damageInfo, | ||||
| 		onegcd | ||||
| 	) { | ||||
| 		let attack = false; | ||||
| 		if (heroInfo.isAttack) attack = true; | ||||
| @ -19852,8 +20238,8 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = | ||||
| 			"bold 36px pala" | ||||
| 		); | ||||
| 
 | ||||
| 		if (!attack) enemyInfo.now += (enemyInfo.speed / oneTurn) * 215; | ||||
| 		let enemynow = Math.min(100 + enemyInfo.now, 315); | ||||
| 		if (!attack) enemyInfo.now += enemyInfo.speed / onegcd; | ||||
| 		let enemynow = Math.min(100 + enemyInfo.now / oneTurn * 215, 315); | ||||
| 		ctx.fillStyle = "#FFFFFF"; | ||||
| 		ctx.beginPath(); | ||||
| 		ctx.moveTo(enemynow, 100); | ||||
| @ -19891,8 +20277,8 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = | ||||
| 		} | ||||
| 		core.drawLine(ctx, 100, 105, 315, 105, "#FFFFFF", 5); | ||||
| 		equipInfo.forEach(function (v) { | ||||
| 			if (!attack) v.now += (v.speed / oneTurn) * 215; | ||||
| 			let vnow = Math.min(100 + v.now, 315); | ||||
| 			if (!attack) v.now += v.speed / onegcd; | ||||
| 			let vnow = Math.min(100 + v.now / oneTurn * 215, 315); | ||||
| 			ctx.beginPath(); | ||||
| 			ctx.moveTo(vnow, 100); | ||||
| 			ctx.lineTo(vnow + 3, 90); | ||||
| @ -19903,41 +20289,60 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = | ||||
| 
 | ||||
| 			core.drawIcon(ctx, v.id, vnow - 16, 64, 32, 32); | ||||
| 		}); | ||||
| 		if (!attack) heroInfo.now += (heroInfo.speed / oneTurn) * 215; | ||||
| 		let heronow = Math.min(100 + heroInfo.now, 315); | ||||
| 		if (!attack) heroInfo.now += hero.speed / onegcd; | ||||
| 		let heronow = Math.min(100 + heroInfo.now / oneTurn * 215, 315); | ||||
| 		ctx.beginPath(); | ||||
| 		ctx.moveTo(heronow, 100); | ||||
| 		ctx.lineTo(heronow + 3, 90); | ||||
| 		ctx.lineTo(heronow - 3, 90); | ||||
| 		ctx.lineTo(heronow + 5, 90); | ||||
| 		ctx.lineTo(heronow - 5, 90); | ||||
| 		ctx.closePath(); | ||||
| 
 | ||||
| 		ctx.fill(); | ||||
| 		core.drawImage(ctx, "hero.webp", 0, 0, 32, 19, heronow - 16, 70, 32, 19); | ||||
| 		let nowattacking = false | ||||
| 		if (heroInfo.now >= oneTurn && !heroInfo.isAttack) { | ||||
| 
 | ||||
| 		if (heroInfo.now >= 215 && !heroInfo.isAttack) { | ||||
| 			heroInfo.isAttack = true; | ||||
| 			nowattacking = true | ||||
| 
 | ||||
| 		} | ||||
| 		if (enemyInfo.now >= oneTurn && !enemyInfo.isAttack) { | ||||
| 
 | ||||
| 			enemyInfo.isAttack = true; | ||||
| 			nowattacking = true | ||||
| 
 | ||||
| 		} | ||||
| 		const equipanimate = [] | ||||
| 		equipInfo.forEach(v => { | ||||
| 			if (v.now >= oneTurn && !v.isAttack) { | ||||
| 				v.isAttack = true; | ||||
| 				nowattacking = true | ||||
| 				equipanimate.push(v) | ||||
| 
 | ||||
| 			} | ||||
| 		}); | ||||
| 		if (!attack && nowattacking) { | ||||
| 			if (heroInfo.isAttack) { | ||||
| 				animateOnAttack("sword", true, () => { | ||||
| 				heroInfo.now -= 215; | ||||
| 					heroInfo.now = 0; | ||||
| 					heroInfo.isAttack = false; | ||||
| 				}); | ||||
| 			} | ||||
| 		if (enemyInfo.now >= 215 && !enemyInfo.isAttack) { | ||||
| 			enemyInfo.isAttack = true; | ||||
| 			if (enemyInfo.isAttack) { | ||||
| 				animateOnAttack("sword", false, () => { | ||||
| 				enemyInfo.now -= 215; | ||||
| 					enemyInfo.now = 0; | ||||
| 					enemyInfo.isAttack = false; | ||||
| 				}); | ||||
| 			} | ||||
| 		equipInfo.forEach((v) => { | ||||
| 			if (v.now >= 215 && !v.isAttack) { | ||||
| 				v.isAttack = true; | ||||
| 
 | ||||
| 			if (equipanimate.length > 0) { | ||||
| 				equipanimate.forEach(v => { | ||||
| 					animateOnAttack("sword", true, () => { | ||||
| 					v.now -= 215; | ||||
| 						v.now = 0; | ||||
| 						v.isAttack = false; | ||||
| 					}); | ||||
| 				}) | ||||
| 			} | ||||
| 		} | ||||
| 		}); | ||||
| 	}; | ||||
| 
 | ||||
| 	function animateOnAttack(name, onenemy, callback) { | ||||
| @ -19985,15 +20390,18 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = | ||||
| 		enemyInfo.name = core.material.enemys[enemyId].name; | ||||
| 		enemyInfo.now = 0; | ||||
| 		enemyInfo.isAttack = false; | ||||
| 		let oneTurn = heroInfo.speed + enemyInfo.speed; | ||||
| 		let oneTurn = [heroInfo.speed, enemyInfo.speed]; | ||||
| 		if (equipInfo.length > 0) { | ||||
| 			for (let i; i < equipInfo.length - 1; i++) { | ||||
| 				equipInfo[i].now = 0; | ||||
| 				equipInfo[i].isAttack = false; | ||||
| 				oneTurn += equipInfo[i].speed; | ||||
| 				oneTurn.push(equipInfo[i].speed); | ||||
| 			} | ||||
| 		} | ||||
| 		oneTurn *= 25; | ||||
| 
 | ||||
| 		const onegcd = gcd(...oneTurn) | ||||
| 		oneTurn = lcm(...oneTurn) / onegcd | ||||
| 		if (oneTurn < 60) oneTurn *= Math.round(60 / oneTurn) | ||||
| 		let time = 0, | ||||
| 			farme = 0; | ||||
| 
 | ||||
| @ -20006,7 +20414,8 @@ var plugins_bb40132b_638b_4a9f_b028_d3fe47acc8d1 = | ||||
| 					enemyInfo, | ||||
| 					equipInfo, | ||||
| 					farme, | ||||
| 					damageInfo | ||||
| 					damageInfo, | ||||
| 					onegcd | ||||
| 				); | ||||
| 				farme++; | ||||
| 			} | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user