From 561370e0461550c9e519b036abc76596b8ee3224 Mon Sep 17 00:00:00 2001 From: Hitmux Date: Sun, 1 Feb 2026 13:23:33 +0800 Subject: [PATCH 1/5] =?UTF-8?q?feat:=20=E5=A4=9A=E4=BA=BA=E6=B8=B8?= =?UTF-8?q?=E6=88=8F=E5=8A=9F=E8=83=BD=E5=88=9D=E6=AD=A5=E9=A2=84=E8=A7=88?= =?UTF-8?q?=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加 Colyseus 服务端框架 (server/) - 添加网络客户端和状态同步 (src/network/) - 添加多人游戏界面 (连接/大厅/等待室) - 添加共享代码库 (shared/) - 添加玩家管理和所有权系统 - 添加多人领地/能量/迷雾系统 - 添加手动炮塔和怪物生成器 Co-Authored-By: Claude Opus 4.5 --- .gitignore | 6 +- README.md | 2 +- count-lines.sh | 143 ++ index.html | 109 + package-lock.json | 201 +- package.json | 5 +- server/.gitignore | 25 + server/README.md | 64 + server/package-lock.json | 1852 +++++++++++++++++ server/package.json | 26 + server/shared | 1 + server/src/config.ts | 81 + server/src/index.ts | 88 + server/src/rooms/GameRoom.ts | 1090 ++++++++++ server/src/rooms/LobbyRoom.ts | 392 ++++ server/src/rooms/index.ts | 6 + server/src/schema/BuildingState.ts | 68 + server/src/schema/BulletState.ts | 97 + server/src/schema/GameState.ts | 135 ++ server/src/schema/LobbyState.ts | 58 + server/src/schema/MonsterState.ts | 47 + server/src/schema/PlayerState.ts | 38 + server/src/schema/TowerState.ts | 36 + server/src/schema/VectorSchema.ts | 31 + server/src/schema/index.ts | 21 + server/src/shared/constants/index.ts | 4 + server/src/shared/constants/speedScale.ts | 6 + server/src/shared/index.ts | 6 + server/src/shared/math/circle.ts | 7 + server/src/shared/math/index.ts | 5 + server/src/shared/math/vector.ts | 20 + server/src/shared/types/index.ts | 5 + server/src/shared/types/messages.ts | 28 + server/src/shared/types/ownership.ts | 10 + server/src/shared/validation/index.ts | 24 + server/src/systems/combat/bulletManager.ts | 404 ++++ server/src/systems/combat/damageCalculator.ts | 74 + server/src/systems/combat/index.ts | 15 + server/src/systems/combat/towerAttack.ts | 270 +++ server/src/systems/energy/energyCalculator.ts | 237 +++ server/src/systems/energy/index.ts | 8 + server/src/systems/index.ts | 7 + server/src/systems/spatial/index.ts | 4 + server/src/systems/spatial/spatialHashGrid.ts | 237 +++ server/src/systems/territory/index.ts | 4 + .../systems/territory/territoryCalculator.ts | 261 +++ server/src/validation/collisionValidator.ts | 67 + server/src/validation/index.ts | 10 + server/src/validation/inputValidator.ts | 359 ++++ server/tsconfig.json | 23 + shared/constants/index.ts | 1 + shared/constants/speedScale.ts | 21 + shared/formulas/gameBalance.ts | 178 ++ shared/formulas/index.ts | 1 + shared/index.ts | 8 + shared/math/circleCollision.ts | 170 ++ shared/math/index.ts | 26 + shared/math/vector.ts | 137 ++ shared/tsconfig.json | 12 + shared/types/index.ts | 37 + shared/types/messages.ts | 222 ++ shared/types/ownership.ts | 98 + shared/validation/index.ts | 34 + shared/validation/monsterValidation.ts | 139 ++ shared/validation/towerValidation.ts | 292 +++ shared/validation/types.ts | 85 + src/buildings/building.ts | 56 +- src/buildings/index.ts | 1 + src/buildings/rendering/buildingRenderer.ts | 109 + src/buildings/rendering/index.ts | 4 + src/buildings/spawnerConfig.ts | 74 + src/buildings/variants/index.ts | 3 +- src/buildings/variants/monsterSpawner.ts | 294 +++ src/bullets/variants/explosive.ts | 29 + src/core/functions.ts | 206 +- src/core/math/circle.ts | 73 +- src/core/physics/obstacle.ts | 105 +- src/core/speedScale.ts | 9 +- src/entities/base/circleObject.ts | 11 +- src/game/entities/entityManager.ts | 8 + src/game/index.ts | 4 + src/game/player/index.ts | 13 + src/game/player/ownership.ts | 15 + src/game/player/playerManager.ts | 284 +++ src/game/rendering/worldRenderer.ts | 6 + src/game/waves/waveManager.ts | 144 ++ src/game/world.ts | 460 +++- src/monsters/ai/targetSelection.ts | 22 +- src/monsters/base/monster.ts | 165 +- src/monsters/base/monsterMortis.ts | 40 +- src/monsters/base/monsterShooter.ts | 38 +- src/monsters/base/monsterTerminator.ts | 29 +- src/monsters/rendering/index.ts | 4 + src/monsters/rendering/monsterRenderer.ts | 283 +++ src/network/config.ts | 15 + src/network/eventEmitter.ts | 77 + src/network/index.ts | 43 + src/network/messages.ts | 144 ++ src/network/networkClient.ts | 567 +++++ src/network/reconnectionManager.ts | 254 +++ src/network/rendering/clientPrediction.ts | 370 ++++ src/network/rendering/index.ts | 40 + src/network/rendering/interpolation.ts | 211 ++ src/network/rendering/localEffects.ts | 245 +++ src/network/rendering/networkWorldAdapter.ts | 529 +++++ src/network/rendering/renderProxy.ts | 564 +++++ src/network/validation/clientValidator.ts | 207 ++ src/network/validation/index.ts | 4 + src/styles/index.less | 867 ++++++++ src/systems/energy/energy.ts | 59 +- src/systems/energy/index.ts | 1 + src/systems/energy/mine.ts | 6 +- src/systems/energy/multiPlayerEnergy.ts | 65 + src/systems/fog/fogOfWar.ts | 20 +- src/systems/fog/fogRenderer.ts | 3 + src/systems/fog/index.ts | 1 + src/systems/fog/multiPlayerFogOfWar.ts | 79 + src/systems/save/saveManager.ts | 36 +- src/systems/territory/index.ts | 1 + src/systems/territory/multiPlayerTerritory.ts | 120 ++ src/systems/territory/territory.ts | 38 +- src/towers/base/index.ts | 1 + src/towers/base/tower.ts | 83 +- src/towers/base/towerBoomerang.ts | 49 +- src/towers/base/towerHammer.ts | 55 +- src/towers/base/towerHell.ts | 37 +- src/towers/base/towerLaser.ts | 49 +- src/towers/base/towerManualCannon.ts | 444 ++++ src/towers/base/towerRay.ts | 50 +- src/towers/config/manualCannonTower.ts | 57 + src/towers/index.ts | 6 +- src/towers/rendering/index.ts | 4 + src/towers/rendering/towerRenderer.ts | 300 +++ src/towers/variants/index.ts | 4 +- src/towers/variants/manualCannon.ts | 54 + src/types/index.ts | 38 + src/types/player.ts | 102 + src/types/worldLike.ts | 309 +++ src/ui/interfaces/battle/cheatMode.ts | 4 +- src/ui/interfaces/battle/gameController.ts | 2 +- src/ui/interfaces/battle/index.ts | 2 +- src/ui/interfaces/battle/manualCannonPanel.ts | 340 +++ src/ui/interfaces/battle/panelManager.ts | 67 +- src/ui/interfaces/battle/spawnerPanel.ts | 283 +++ src/ui/interfaces/battle/uiController.ts | 2 +- src/ui/interfaces/index.ts | 1 + src/ui/interfaces/mainInterface.ts | 7 + .../multiplayer/connectInterface.ts | 118 ++ src/ui/interfaces/multiplayer/index.ts | 8 + .../interfaces/multiplayer/lobbyInterface.ts | 301 +++ src/ui/interfaces/multiplayer/types.ts | 43 + .../multiplayer/waitingRoomInterface.ts | 267 +++ tsconfig.json | 5 +- vite.config.ts | 1 + 154 files changed, 17627 insertions(+), 699 deletions(-) create mode 100755 count-lines.sh create mode 100644 server/.gitignore create mode 100644 server/README.md create mode 100644 server/package-lock.json create mode 100644 server/package.json create mode 120000 server/shared create mode 100644 server/src/config.ts create mode 100644 server/src/index.ts create mode 100644 server/src/rooms/GameRoom.ts create mode 100644 server/src/rooms/LobbyRoom.ts create mode 100644 server/src/rooms/index.ts create mode 100644 server/src/schema/BuildingState.ts create mode 100644 server/src/schema/BulletState.ts create mode 100644 server/src/schema/GameState.ts create mode 100644 server/src/schema/LobbyState.ts create mode 100644 server/src/schema/MonsterState.ts create mode 100644 server/src/schema/PlayerState.ts create mode 100644 server/src/schema/TowerState.ts create mode 100644 server/src/schema/VectorSchema.ts create mode 100644 server/src/schema/index.ts create mode 100644 server/src/shared/constants/index.ts create mode 100644 server/src/shared/constants/speedScale.ts create mode 100644 server/src/shared/index.ts create mode 100644 server/src/shared/math/circle.ts create mode 100644 server/src/shared/math/index.ts create mode 100644 server/src/shared/math/vector.ts create mode 100644 server/src/shared/types/index.ts create mode 100644 server/src/shared/types/messages.ts create mode 100644 server/src/shared/types/ownership.ts create mode 100644 server/src/shared/validation/index.ts create mode 100644 server/src/systems/combat/bulletManager.ts create mode 100644 server/src/systems/combat/damageCalculator.ts create mode 100644 server/src/systems/combat/index.ts create mode 100644 server/src/systems/combat/towerAttack.ts create mode 100644 server/src/systems/energy/energyCalculator.ts create mode 100644 server/src/systems/energy/index.ts create mode 100644 server/src/systems/index.ts create mode 100644 server/src/systems/spatial/index.ts create mode 100644 server/src/systems/spatial/spatialHashGrid.ts create mode 100644 server/src/systems/territory/index.ts create mode 100644 server/src/systems/territory/territoryCalculator.ts create mode 100644 server/src/validation/collisionValidator.ts create mode 100644 server/src/validation/index.ts create mode 100644 server/src/validation/inputValidator.ts create mode 100644 server/tsconfig.json create mode 100644 shared/constants/index.ts create mode 100644 shared/constants/speedScale.ts create mode 100644 shared/formulas/gameBalance.ts create mode 100644 shared/formulas/index.ts create mode 100644 shared/index.ts create mode 100644 shared/math/circleCollision.ts create mode 100644 shared/math/index.ts create mode 100644 shared/math/vector.ts create mode 100644 shared/tsconfig.json create mode 100644 shared/types/index.ts create mode 100644 shared/types/messages.ts create mode 100644 shared/types/ownership.ts create mode 100644 shared/validation/index.ts create mode 100644 shared/validation/monsterValidation.ts create mode 100644 shared/validation/towerValidation.ts create mode 100644 shared/validation/types.ts create mode 100644 src/buildings/rendering/buildingRenderer.ts create mode 100644 src/buildings/rendering/index.ts create mode 100644 src/buildings/spawnerConfig.ts create mode 100644 src/buildings/variants/monsterSpawner.ts create mode 100644 src/game/player/index.ts create mode 100644 src/game/player/ownership.ts create mode 100644 src/game/player/playerManager.ts create mode 100644 src/monsters/rendering/index.ts create mode 100644 src/monsters/rendering/monsterRenderer.ts create mode 100644 src/network/config.ts create mode 100644 src/network/eventEmitter.ts create mode 100644 src/network/index.ts create mode 100644 src/network/messages.ts create mode 100644 src/network/networkClient.ts create mode 100644 src/network/reconnectionManager.ts create mode 100644 src/network/rendering/clientPrediction.ts create mode 100644 src/network/rendering/index.ts create mode 100644 src/network/rendering/interpolation.ts create mode 100644 src/network/rendering/localEffects.ts create mode 100644 src/network/rendering/networkWorldAdapter.ts create mode 100644 src/network/rendering/renderProxy.ts create mode 100644 src/network/validation/clientValidator.ts create mode 100644 src/network/validation/index.ts create mode 100644 src/systems/energy/multiPlayerEnergy.ts create mode 100644 src/systems/fog/multiPlayerFogOfWar.ts create mode 100644 src/systems/territory/multiPlayerTerritory.ts create mode 100644 src/towers/base/towerManualCannon.ts create mode 100644 src/towers/config/manualCannonTower.ts create mode 100644 src/towers/rendering/index.ts create mode 100644 src/towers/rendering/towerRenderer.ts create mode 100644 src/towers/variants/manualCannon.ts create mode 100644 src/types/player.ts create mode 100644 src/types/worldLike.ts create mode 100644 src/ui/interfaces/battle/manualCannonPanel.ts create mode 100644 src/ui/interfaces/battle/spawnerPanel.ts create mode 100644 src/ui/interfaces/multiplayer/connectInterface.ts create mode 100644 src/ui/interfaces/multiplayer/index.ts create mode 100644 src/ui/interfaces/multiplayer/lobbyInterface.ts create mode 100644 src/ui/interfaces/multiplayer/types.ts create mode 100644 src/ui/interfaces/multiplayer/waitingRoomInterface.ts diff --git a/.gitignore b/.gitignore index fd5340f..c222de8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,7 @@ node_modules/ dist/ +server/node_modules/ +server/dist/ .idea/ .claude/ CLAUDE.md @@ -11,4 +13,6 @@ toWebFile.sh doc/ issue.md Trace-20260118T203317.json -temp.md \ No newline at end of file +temp.md +upgrade.md +.ace-tool/ diff --git a/README.md b/README.md index d8359b7..1b3e7d6 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # ⚔️ HITWAR: 炮塔战争 -注意:目前2.3.1版本为预览版。**可能存在Bug**!!如遇,请反馈给 ck@hitmux.org or caokai674@gmail.com 或者提交issue +注意:目前2.4.0版本为预览版。**可能存在Bug**!!如遇,请反馈给 ck@hitmux.org or caokai674@gmail.com 或者提交issue ## **官方预览**: [Hitmux Game](https://game.hitmux.org) diff --git a/count-lines.sh b/count-lines.sh new file mode 100755 index 0000000..808addf --- /dev/null +++ b/count-lines.sh @@ -0,0 +1,143 @@ +#!/bin/bash + +# Code line counter script for CannonWar project +# Usage: ./count-lines.sh + +set -e + +PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +# Colors for output +GREEN='\033[0;32m' +BLUE='\033[0;34m' +YELLOW='\033[1;33m' +CYAN='\033[0;36m' +NC='\033[0m' # No Color + +# Excluded directories +EXCLUDE_DIRS="-not -path '*/node_modules/*' -not -path '*/dist/*' -not -path '*/.git/*'" + +# Function to count lines in a directory (returns only the number) +get_line_count() { + local dir="$1" + local pattern="$2" + local maxdepth="$3" + + if [ ! -d "$PROJECT_ROOT/$dir" ]; then + echo "0" + return + fi + + local depth_opt="" + if [ -n "$maxdepth" ]; then + depth_opt="-maxdepth $maxdepth" + fi + + local count=$(eval "find '$PROJECT_ROOT/$dir' $depth_opt -type f -name '$pattern' ! -name '*.d.ts' $EXCLUDE_DIRS 2>/dev/null" | xargs wc -l 2>/dev/null | tail -1 | awk '{print $1}') + echo "${count:-0}" +} + +# Function to count files +get_file_count() { + local dir="$1" + local maxdepth="$2" + + if [ ! -d "$PROJECT_ROOT/$dir" ]; then + echo "0" + return + fi + + local depth_opt="" + if [ -n "$maxdepth" ]; then + depth_opt="-maxdepth $maxdepth" + fi + + eval "find '$PROJECT_ROOT/$dir' $depth_opt -type f \( -name '*.ts' -o -name '*.tsx' -o -name '*.js' -o -name '*.jsx' -o -name '*.less' -o -name '*.css' -o -name '*.html' \) ! -name '*.d.ts' $EXCLUDE_DIRS 2>/dev/null" | wc -l +} + +# Function to display directory stats +show_dir_stats() { + local dir="$1" + local label="$2" + local maxdepth="$3" + + if [ ! -d "$PROJECT_ROOT/$dir" ]; then + echo -e "${YELLOW}Directory $dir does not exist${NC}" + return + fi + + local ts_count=$(get_line_count "$dir" "*.ts" "$maxdepth") + local tsx_count=$(get_line_count "$dir" "*.tsx" "$maxdepth") + local js_count=$(get_line_count "$dir" "*.js" "$maxdepth") + local less_count=$(get_line_count "$dir" "*.less" "$maxdepth") + local css_count=$(get_line_count "$dir" "*.css" "$maxdepth") + local html_count=$(get_line_count "$dir" "*.html" "$maxdepth") + + local ts_total=$((ts_count + tsx_count)) + local total=$((ts_total + js_count + less_count + css_count + html_count)) + + echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" + echo -e "${GREEN}📁 $label${NC}" + echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" + printf " %-20s %'10d lines\n" "TypeScript:" "$ts_total" + printf " %-20s %'10d lines\n" "JavaScript:" "$js_count" + printf " %-20s %'10d lines\n" "HTML:" "$html_count" + printf " %-20s %'10d lines\n" "LESS:" "$less_count" + printf " %-20s %'10d lines\n" "CSS:" "$css_count" + echo -e " ${CYAN}─────────────────────────────────────${NC}" + printf " ${YELLOW}%-20s %'10d lines${NC}\n" "Subtotal:" "$total" + echo "" +} + +# Calculate total for a directory +calc_total() { + local dir="$1" + local maxdepth="$2" + + local ts=$(($(get_line_count "$dir" "*.ts" "$maxdepth") + $(get_line_count "$dir" "*.tsx" "$maxdepth"))) + local js=$(get_line_count "$dir" "*.js" "$maxdepth") + local less=$(get_line_count "$dir" "*.less" "$maxdepth") + local css=$(get_line_count "$dir" "*.css" "$maxdepth") + local html=$(get_line_count "$dir" "*.html" "$maxdepth") + echo $((ts + js + less + css + html)) +} + +echo "" +echo -e "${GREEN}╔════════════════════════════════════════════╗${NC}" +echo -e "${GREEN}║ CannonWar Code Line Counter ║${NC}" +echo -e "${GREEN}╚════════════════════════════════════════════╝${NC}" +echo -e "${CYAN} (excludes node_modules, dist directories)${NC}" +echo "" + +# Show stats for each directory +show_dir_stats "." "Root Files" "1" +show_dir_stats "src" "Source Code (src/)" +show_dir_stats "server" "Server Code (server/)" +show_dir_stats "shared" "Shared Code (shared/)" + +# Calculate totals +root_total=$(calc_total "." "1") +src_total=$(calc_total "src") +server_total=$(calc_total "server") +shared_total=$(calc_total "shared") + +grand_total=$((root_total + src_total + server_total + shared_total)) + +# Count files +root_files=$(get_file_count "." "1") +src_files=$(get_file_count "src") +server_files=$(get_file_count "server") +shared_files=$(get_file_count "shared") +total_files=$((root_files + src_files + server_files + shared_files)) + +echo -e "${GREEN}╔════════════════════════════════════════════╗${NC}" +echo -e "${GREEN}║ SUMMARY ║${NC}" +echo -e "${GREEN}╚════════════════════════════════════════════╝${NC}" +echo "" +printf " %-15s %'10d lines (%d files)\n" "root/" "$root_total" "$root_files" +printf " %-15s %'10d lines (%d files)\n" "src/" "$src_total" "$src_files" +printf " %-15s %'10d lines (%d files)\n" "server/" "$server_total" "$server_files" +printf " %-15s %'10d lines (%d files)\n" "shared/" "$shared_total" "$shared_files" +echo -e " ${CYAN}─────────────────────────────────────────${NC}" +printf " ${YELLOW}%-15s %'10d lines (%d files)${NC}\n" "TOTAL:" "$grand_total" "$total_files" +echo "" diff --git a/index.html b/index.html index 90c41c5..e721d73 100644 --- a/index.html +++ b/index.html @@ -37,6 +37,7 @@

炮塔战争

+
@@ -66,6 +67,114 @@

炮塔战争

+ + + + + + + + + +