Skip to content

Commit

Permalink
feat: 增加建筑
Browse files Browse the repository at this point in the history
  • Loading branch information
lovezhangchuangxin committed Nov 10, 2024
1 parent 796ac0c commit ef31070
Show file tree
Hide file tree
Showing 38 changed files with 899 additions and 6 deletions.
1 change: 1 addition & 0 deletions packages/api/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
export * from './req'
export * from './types'
export * from './user'
export * from './structure'
15 changes: 15 additions & 0 deletions packages/api/src/structure.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { structuresMap } from 'packages/core/src'
import { req } from './req'

export class StructureApi {
/**
* 获取我的建组
*/
static async getStructures() {
return req<{
[type in keyof typeof structuresMap]: ConstructorParameters<
(typeof structuresMap)[type]
>
}>('GET', '/structure')
}
}
18 changes: 18 additions & 0 deletions packages/backend/src/controller/structure/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { ErrorCode } from '../../error/ErrorCode'
import { GameError } from '../../error/GameError'
import StructureService from '../../service/structure'
import { UserModel } from '@star-angry/db'
import { Context, Next } from 'koa'

export default class StructureController {
/**
* 获取建筑
*/
static async getStructures(ctx: Context) {
const { id } = (ctx.state.user?.data || {}) as UserModel
if (!id) {
throw new GameError(ErrorCode.PARAM_ERROR)
}
ctx.body = await StructureService.getStructures(id)
}
}
3 changes: 2 additions & 1 deletion packages/backend/src/router/index.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import KoaRouter from 'koa-router'
import userRouter from './user'
import structureRouter from './structure'

const routes = [userRouter]
const routes = [userRouter, structureRouter]
const router = new KoaRouter({
prefix: '/api',
})
Expand Down
8 changes: 8 additions & 0 deletions packages/backend/src/router/structure/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import StructureController from '../../controller/structure'
import KoaRouter from 'koa-router'

const structureRouter = new KoaRouter()

structureRouter.get('/structure', StructureController.getStructures)

export default structureRouter
55 changes: 55 additions & 0 deletions packages/backend/src/service/structure/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
import { EnergyStorage, processor, structuresMap } from '../../../../core/src'
import { ErrorCode } from '../../error/ErrorCode'
import { GameError } from '../../error/GameError'
import { GameDB } from '@star-angry/db'

export default class StructureService {
/**
* 获取建筑
*/
static async getStructures(userId: string) {
const data = await GameDB.getDB().getData()

const userData = data.userData[userId]
if (!userData) {
return {}
}
Object.values(userData.structure).forEach(async (structure) => {
if ('update' in structure) {
await StructureService.addIntent(userId, structure.id, 'update')
}
})

return userData.structure
}

/**
* 添加意图
*/
static async addIntent(userId: string, id: string, type: string) {
const data = await GameDB.getDB().getData()
const userData = data.userData[userId]
if (!userData) {
throw new GameError(ErrorCode.PARAM_ERROR)
}

const getUserObject = (userId: string, objectId?: string) => {
const userData = data.userData[userId]
if (!userData) {
return []
}
if (!objectId) {
return Object.values(userData.structure)
}
let object =
userData.structure[objectId as keyof typeof userData.structure]
if (!object) {
object = userData.structure[
objectId as keyof typeof userData.structure
] = new structuresMap[objectId as keyof typeof structuresMap]() as any
}
return [object!]
}
return processor({ objectId: id, type }, userId, getUserObject)
}
}
2 changes: 2 additions & 0 deletions packages/backend/src/socket/connection.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { UserModel } from '@star-angry/db'
import jwt from 'jsonwebtoken'
import { Server } from 'socket.io'
import { messageEventHandler, userEventHandler } from './event'
import { structureEventHandler } from './event/structure'

const users: Map<string, Partial<UserModel>> = new Map()

Expand All @@ -21,6 +22,7 @@ export const createConnection = (io: Server) => {
}

userEventHandler(socket, io)
structureEventHandler(socket, io)
messageEventHandler(socket, io)

socket.on('disconnect', () => {
Expand Down
28 changes: 28 additions & 0 deletions packages/backend/src/socket/event/structure/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import { Server, Socket } from 'socket.io'
import { Result } from '../../../utils/result'
import { ErrorCode } from '../../../error/ErrorCode'
import StructureService from '../../../service/structure'

export const structureEventHandler = (socket: Socket, io: Server) => {
// 获取自己的所有建筑
socket.on('getStructures', async (callback) => {
const userId = socket.userId
if (!userId) {
return callback(Result.error(ErrorCode.PARAM_ERROR))
}

const data = await StructureService.getStructures(userId)
return callback(Result.success(data))
})

// 添加意图
socket.on('addIntent', async (id: string, type: string, callback) => {
const userId = socket.userId
if (!userId || !id) {
return callback(Result.error(ErrorCode.PARAM_ERROR))
}

const data = await StructureService.addIntent(userId, id, type)
return callback(Result.success(data))
})
}
1 change: 1 addition & 0 deletions packages/core/src/constant/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './res'
4 changes: 4 additions & 0 deletions packages/core/src/constant/res.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export enum ResourceType {
metal = 'metal',
energy = 'energy',
}
3 changes: 3 additions & 0 deletions packages/core/src/index.ts
Original file line number Diff line number Diff line change
@@ -1 +1,4 @@
export * from './map'
export * from './constant'
export * from './structure'
export * from './processor'
1 change: 1 addition & 0 deletions packages/core/src/processor/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './processor'
8 changes: 8 additions & 0 deletions packages/core/src/processor/intents/energy-mine/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { mine } from './mine'
import { upgrade } from './upgrade'

export default {
update: mine,
mine,
upgrade,
}
15 changes: 15 additions & 0 deletions packages/core/src/processor/intents/energy-mine/mine.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { EnergyMine, EnergyStorage, StructureType } from '../../../structure'

export const mine = (object: EnergyMine, planetObjects: StructureType[]) => {
// 找到仓库
const storage = planetObjects.find((o) => o instanceof EnergyStorage)

if (!storage) {
return false
}

// 更新资源
const output = object.update()
storage.addStore(output)
return true
}
30 changes: 30 additions & 0 deletions packages/core/src/processor/intents/energy-mine/upgrade.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import {
EnergyMine,
EnergyStorage,
MetalStorage,
StructureType,
} from '../../../structure'

export const upgrade = (object: EnergyMine, planetObjects: StructureType[]) => {
// 找到仓库
const energyStorage = planetObjects.find((o) => o instanceof EnergyStorage)
const metalStorage = planetObjects.find((o) => o instanceof MetalStorage)
if (!energyStorage || !metalStorage) {
return false
}

// 获取升级所需资源
const cost = object.calcUpgradeCost(object.level)
if (energyStorage.store < cost.energy || metalStorage.store < cost.metal) {
return false
}

// 更新资源
if (object.upgrade()) {
energyStorage.addStore(-cost.energy)
metalStorage.addStore(-cost.metal)
return true
}

return false
}
5 changes: 5 additions & 0 deletions packages/core/src/processor/intents/energy-storage/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { upgrade } from './upgrade'

export default {
upgrade,
}
28 changes: 28 additions & 0 deletions packages/core/src/processor/intents/energy-storage/upgrade.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import { EnergyStorage, MetalStorage, StructureType } from '../../../structure'

export const upgrade = (
object: EnergyStorage,
planetObjects: StructureType[],
) => {
// 找到仓库
const energyStorage = planetObjects.find((o) => o instanceof EnergyStorage)
const metalStorage = planetObjects.find((o) => o instanceof MetalStorage)
if (!energyStorage || !metalStorage) {
return false
}

// 获取升级所需资源
const cost = object.calcUpgradeCost(object.level)
if (energyStorage.store < cost.energy || metalStorage.store < cost.metal) {
return false
}

// 更新资源
if (object.upgrade()) {
energyStorage.addStore(-cost.energy)
metalStorage.addStore(-cost.metal)
return true
}

return false
}
21 changes: 21 additions & 0 deletions packages/core/src/processor/intents/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { StructureType } from '../../structure'
import energyMineIntents from './energy-mine'
import energyStorageIntents from './energy-storage'
import metalMineIntents from './metal-mine'
import metalStorageIntents from './metal-storage'

const intentsMap = {
energyMine: energyMineIntents,
energyStorage: energyStorageIntents,
metalMine: metalMineIntents,
metalStorage: metalStorageIntents,
}

export const getIntentHandler = (object: StructureType, type: string) => {
const intents = intentsMap[object.id as keyof typeof intentsMap]
if (!intents) {
return
}

return intents[type as keyof typeof intents]
}
8 changes: 8 additions & 0 deletions packages/core/src/processor/intents/metal-mine/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { mine } from './mine'
import { upgrade } from './upgrade'

export default {
update: mine,
mine,
upgrade,
}
14 changes: 14 additions & 0 deletions packages/core/src/processor/intents/metal-mine/mine.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { MetalMine, MetalStorage, StructureType } from '../../../structure'

export const mine = (object: MetalMine, planetObjects: StructureType[]) => {
// 找到仓库
const storage = planetObjects.find((o) => o instanceof MetalStorage)
if (!storage) {
return false
}

// 更新资源
const output = object.update()
storage.addStore(output)
return true
}
30 changes: 30 additions & 0 deletions packages/core/src/processor/intents/metal-mine/upgrade.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import {
EnergyStorage,
MetalMine,
MetalStorage,
StructureType,
} from '../../../structure'

export const upgrade = (object: MetalMine, planetObjects: StructureType[]) => {
// 找到仓库
const energyStorage = planetObjects.find((o) => o instanceof EnergyStorage)
const metalStorage = planetObjects.find((o) => o instanceof MetalStorage)
if (!energyStorage || !metalStorage) {
return false
}

// 获取升级所需资源
const cost = object.calcUpgradeCost(object.level)
if (energyStorage.store < cost.energy || metalStorage.store < cost.metal) {
return false
}

// 更新资源
if (object.upgrade()) {
energyStorage.addStore(-cost.energy)
metalStorage.addStore(-cost.metal)
return true
}

return false
}
5 changes: 5 additions & 0 deletions packages/core/src/processor/intents/metal-storage/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { upgrade } from './upgrade'

export default {
upgrade,
}
28 changes: 28 additions & 0 deletions packages/core/src/processor/intents/metal-storage/upgrade.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import { EnergyStorage, MetalStorage, StructureType } from '../../../structure'

export const upgrade = (
object: MetalStorage,
planetObjects: StructureType[],
) => {
// 找到仓库
const energyStorage = planetObjects.find((o) => o instanceof EnergyStorage)
const metalStorage = planetObjects.find((o) => o instanceof MetalStorage)
if (!energyStorage || !metalStorage) {
return false
}

// 获取升级所需资源
const cost = object.calcUpgradeCost(object.level)
if (energyStorage.store < cost.energy || metalStorage.store < cost.metal) {
return false
}

// 更新资源
if (object.upgrade()) {
energyStorage.addStore(-cost.energy)
metalStorage.addStore(-cost.metal)
return true
}

return false
}
22 changes: 22 additions & 0 deletions packages/core/src/processor/processor.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { StructureType } from '../structure'
import { getIntentHandler } from './intents'

export const processor = (
intent: any,
userId: string,
getUserObject: (userId: string, objectId?: string) => StructureType[],
) => {
const { objectId, type } = intent
const object = getUserObject(userId, objectId)[0]
if (!object) {
return false
}

const handler = getIntentHandler(object, type)
if (!handler) {
return false
}

const planetObjects = getUserObject(userId)
return handler(object as any, planetObjects)
}
Loading

0 comments on commit ef31070

Please sign in to comment.