add tower builing game

This commit is contained in:
hamid zarghami
2025-12-09 10:48:48 +03:30
parent 8119203506
commit 53b9139506
79 changed files with 15363 additions and 3 deletions
+176
View File
@@ -0,0 +1,176 @@
import * as constant from './constant'
export const checkMoveDown = engine =>
(engine.checkTimeMovement(constant.moveDownMovement))
export const getMoveDownValue = (engine, store) => {
const pixelsPerFrame = store ? store.pixelsPerFrame : engine.pixelsPerFrame.bind(engine)
const successCount = engine.getVariable(constant.successCount)
const calHeight = engine.getVariable(constant.blockHeight) * 2
if (successCount <= 4) {
return pixelsPerFrame(calHeight * 1.25)
}
return pixelsPerFrame(calHeight)
}
export const getAngleBase = (engine) => {
const successCount = engine.getVariable(constant.successCount)
const gameScore = engine.getVariable(constant.gameScore)
const { hookAngle } = engine.getVariable(constant.gameUserOption)
if (hookAngle) {
return hookAngle(successCount, gameScore)
}
if (engine.getVariable(constant.hardMode)) {
return 90
}
switch (true) {
case successCount < 10:
return 30
case successCount < 20:
return 60
default:
return 80
}
}
export const getSwingBlockVelocity = (engine, time) => {
const successCount = engine.getVariable(constant.successCount)
const gameScore = engine.getVariable(constant.gameScore)
const { hookSpeed } = engine.getVariable(constant.gameUserOption)
if (hookSpeed) {
return hookSpeed(successCount, gameScore)
}
let hard
switch (true) {
case successCount < 1:
hard = 0
break
case successCount < 10:
hard = 1
break
case successCount < 20:
hard = 0.8
break
case successCount < 30:
hard = 0.7
break
default:
hard = 0.74
break
}
if (engine.getVariable(constant.hardMode)) {
hard = 1.1
}
return Math.sin(time / (200 / hard))
}
export const getLandBlockVelocity = (engine, time) => {
const successCount = engine.getVariable(constant.successCount)
const gameScore = engine.getVariable(constant.gameScore)
const { landBlockSpeed } = engine.getVariable(constant.gameUserOption)
if (landBlockSpeed) {
return landBlockSpeed(successCount, gameScore)
}
const { width } = engine
let hard
switch (true) {
case successCount < 5:
hard = 0
break
case successCount < 13:
hard = 0.001
break
case successCount < 23:
hard = 0.002
break
default:
hard = 0.003
break
}
return Math.cos(time / 200) * hard * width
}
export const getHookStatus = (engine) => {
if (engine.checkTimeMovement(constant.hookDownMovement)) {
return constant.hookDown
}
if (engine.checkTimeMovement(constant.hookUpMovement)) {
return constant.hookUp
}
return constant.hookNormal
}
export const touchEventHandler = (engine) => {
if (!engine.getVariable(constant.gameStartNow)) return
if (engine.debug && engine.paused) {
return
}
if (getHookStatus(engine) !== constant.hookNormal) {
return
}
engine.removeInstance('tutorial')
engine.removeInstance('tutorial-arrow')
const b = engine.getInstance(`block_${engine.getVariable(constant.blockCount)}`)
if (b && b.status === constant.swing) {
engine.setTimeMovement(constant.hookUpMovement, 500)
b.status = constant.beforeDrop
}
}
export const addSuccessCount = (engine) => {
const { setGameSuccess } = engine.getVariable(constant.gameUserOption)
const lastSuccessCount = engine.getVariable(constant.successCount)
const success = lastSuccessCount + 1
engine.setVariable(constant.successCount, success)
if (engine.getVariable(constant.hardMode)) {
engine.setVariable(constant.ropeHeight, engine.height * engine.utils.random(0.35, 0.55))
}
if (setGameSuccess) setGameSuccess(success)
}
export const addFailedCount = (engine) => {
const { setGameFailed } = engine.getVariable(constant.gameUserOption)
const lastFailedCount = engine.getVariable(constant.failedCount)
const failed = lastFailedCount + 1
engine.setVariable(constant.failedCount, failed)
engine.setVariable(constant.perfectCount, 0)
if (setGameFailed) setGameFailed(failed)
if (failed >= 3) {
engine.pauseAudio('bgm')
engine.playAudio('game-over')
engine.setVariable(constant.gameStartNow, false)
}
}
export const addScore = (engine, isPerfect) => {
const { setGameScore, successScore, perfectScore } = engine.getVariable(constant.gameUserOption)
const lastPerfectCount = engine.getVariable(constant.perfectCount, 0)
const lastGameScore = engine.getVariable(constant.gameScore)
const perfect = isPerfect ? lastPerfectCount + 1 : 0
const score = lastGameScore + (successScore || 25) + ((perfectScore || 25) * perfect)
engine.setVariable(constant.gameScore, score)
engine.setVariable(constant.perfectCount, perfect)
if (setGameScore) setGameScore(score)
}
export const drawYellowString = (engine, option) => {
const {
string, size, x, y, textAlign, fontName = 'wenxue', fontWeight = 'normal'
} = option
const { ctx } = engine
const fontSize = size
const lineSize = fontSize * 0.1
ctx.save()
ctx.beginPath()
const gradient = ctx.createLinearGradient(0, 0, 0, y)
gradient.addColorStop(0, '#FAD961')
gradient.addColorStop(1, '#F76B1C')
ctx.fillStyle = gradient
ctx.lineWidth = lineSize
ctx.strokeStyle = '#FFF'
ctx.textAlign = textAlign || 'center'
ctx.font = `${fontWeight} ${fontSize}px ${fontName}`
ctx.strokeText(string, x, y)
ctx.fillText(string, x, y)
ctx.restore()
}