/** * GameGlobal.js * Global constants, enums, and configuration for Tank War mini game. */ // ============================================================ // Screen & Canvas // ============================================================ const systemInfo = wx.getSystemInfoSync(); const SCREEN_WIDTH = systemInfo.windowWidth; const SCREEN_HEIGHT = systemInfo.windowHeight; const DEVICE_PIXEL_RATIO = systemInfo.pixelRatio || 1; // ============================================================ // Map Grid // ============================================================ // TILE_SIZE is determined by screen height so the map fills vertically const GRID_ROWS = 13; const GRID_COLS = 21; const TILE_SIZE = SCREEN_HEIGHT / GRID_ROWS; const MAP_WIDTH = TILE_SIZE * GRID_COLS; const MAP_HEIGHT = TILE_SIZE * GRID_ROWS; // Center map on screen — controls (joystick & fire button) overlay on the map const MAP_OFFSET_X = Math.floor((SCREEN_WIDTH - MAP_WIDTH) / 2); const MAP_OFFSET_Y = Math.floor((SCREEN_HEIGHT - MAP_HEIGHT) / 2); // ============================================================ // Terrain Types // ============================================================ const TERRAIN = { EMPTY: 0, BRICK: 1, STEEL: 2, RIVER: 3, FOREST: 4, BASE: 5, BASE_WALL: 6, // brick wall around base }; // ============================================================ // Direction // ============================================================ const DIRECTION = { UP: 0, DOWN: 1, LEFT: 2, RIGHT: 3, }; // Direction vectors (dx, dy) const DIR_VECTORS = { [DIRECTION.UP]: { dx: 0, dy: -1 }, [DIRECTION.DOWN]: { dx: 0, dy: 1 }, [DIRECTION.LEFT]: { dx: -1, dy: 0 }, [DIRECTION.RIGHT]: { dx: 1, dy: 0 }, }; // ============================================================ // Tank Types // ============================================================ const TANK_TYPE = { PLAYER: 'player', ENEMY_NORMAL: 'enemy_normal', ENEMY_FAST: 'enemy_fast', ENEMY_ARMOR: 'enemy_armor', ENEMY_BOSS: 'enemy_boss', }; // Tank configuration table const TANK_CONFIG = { [TANK_TYPE.PLAYER]: { speed: 2, hp: 1, color: '#FFD700', // gold size: TILE_SIZE * 0.85, }, [TANK_TYPE.ENEMY_NORMAL]: { speed: 1.5, hp: 1, color: '#AAAAAA', // gray size: TILE_SIZE * 0.85, score: 100, }, [TANK_TYPE.ENEMY_FAST]: { speed: 3, hp: 1, color: '#FF6347', // tomato size: TILE_SIZE * 0.85, score: 200, }, [TANK_TYPE.ENEMY_ARMOR]: { speed: 1, hp: 3, color: '#228B22', // forest green size: TILE_SIZE * 0.85, score: 300, }, [TANK_TYPE.ENEMY_BOSS]: { speed: 1.2, hp: 6, color: '#8B0000', // dark red size: TILE_SIZE * 1.2, colliderSize: TILE_SIZE * 0.85, score: 500, }, }; // ============================================================ // Bullet // ============================================================ const BULLET_SPEED = 5; const BULLET_SIZE = 6; // ============================================================ // Fire Level // ============================================================ const FIRE_LEVEL = { LV1: 1, // single shot, 1 bullet on screen LV2: 2, // rapid fire, 2 bullets on screen LV3: 3, // rapid fire + steel break, 2 bullets on screen }; const MAX_BULLETS_BY_LEVEL = { [FIRE_LEVEL.LV1]: 1, [FIRE_LEVEL.LV2]: 2, [FIRE_LEVEL.LV3]: 2, }; // ============================================================ // Power-Up Types // ============================================================ const POWERUP_TYPE = { STAR: 'star', CLOCK: 'clock', BOMB: 'bomb', HELMET: 'helmet', SHOVEL: 'shovel', TANK: 'tank', }; const POWERUP_DURATION = 15000; // ms, how long a power-up stays on map // ============================================================ // Game Settings // ============================================================ const DEFAULT_LIVES = 3; const ENEMIES_PER_LEVEL = 20; const MAX_ENEMIES_ON_SCREEN = 4; const ENEMY_SPAWN_INTERVAL = 3000; // ms const FREEZE_DURATION = 10000; // ms const SHIELD_DURATION = 15000; // ms const SHOVEL_DURATION = 20000; // ms const INVINCIBLE_BLINK_INTERVAL = 100; // ms // ============================================================ // Scene Names // ============================================================ const SCENE = { LOADING: 'loading', MENU: 'menu', GAME: 'game', RESULT: 'result', RANKING: 'ranking', SETTINGS: 'settings', SHOP: 'shop', SKIN: 'skin', BUFF_SELECT: 'buff_select', PVP_ROOM: 'pvp_room', PVP_GAME: 'pvp_game', PVP_RESULT: 'pvp_result', TEAM_ROOM: 'team_room', TEAM_GAME: 'team_game', TEAM_RESULT: 'team_result', TEAM_2V2_ROOM: 'team_2v2_room', CHAT_ROOM: 'chat_room', }; // ============================================================ // Game Modes // ============================================================ const GAME_MODE = { CLASSIC: 'classic', ENDLESS: 'endless', PVP: 'pvp', TEAM_2V2: 'team_2v2', TEAM_3V3: 'team_3v3', }; // ============================================================ // PVP Settings // ============================================================ const PVP_ROUND_TIME = 180; // seconds per round (legacy, unused in base-destruction mode) const PVP_RESPAWN_DELAY = 3000; // ms before respawn const PVP_MAX_LIVES = 5; // legacy, unused in base-destruction mode const PVP_WIN_KILLS = 5; // legacy, unused in base-destruction mode const PVP_BASE_HP = 5; // base hit points for 1v1 PVP mode // ============================================================ // Server Configuration // ============================================================ // const SERVER_URL = 'ws://192.168.1.103:3000'; // local testing server URL, replace with actual server URL in production const SERVER_URL = 'wss://game.igeek.site/tankwar/ws'; // ============================================================ // 3v3 Team Settings // ============================================================ const TEAM_SIZE = 3; const TEAM_RESPAWN_DELAY = 3000; // ms before respawn const TEAM_BASE_HP = 10; // base hit points for 3v3 mode const TEAM_RECONNECT_TIMEOUT = 60000; // ms, 60s to reconnect const TEAM_MATCH_TIMEOUT = 60000; // ms, 60s matchmaking timeout // ============================================================ // Battle Configuration (X vs X configurable) // ============================================================ const BATTLE_CONFIG = { '1v1': { teamSize: 1, baseHp: PVP_BASE_HP, respawnDelay: PVP_RESPAWN_DELAY, fillWithBots: false, mapPool: 'pvp', }, '2v2': { teamSize: 2, baseHp: 8, respawnDelay: TEAM_RESPAWN_DELAY, fillWithBots: true, mapPool: 'team', }, '3v3': { teamSize: 3, baseHp: TEAM_BASE_HP, respawnDelay: TEAM_RESPAWN_DELAY, fillWithBots: true, mapPool: 'team', }, }; // ============================================================ // Network Message Types // ============================================================ const NET_MSG = { // Room CREATE_ROOM: 'create_room', JOIN_ROOM: 'join_room', ROOM_CREATED: 'room_created', ROOM_JOINED: 'room_joined', ROOM_ERROR: 'room_error', OPPONENT_JOINED: 'opponent_joined', OPPONENT_LEFT: 'opponent_left', GAME_START: 'game_start', // Gameplay PLAYER_INPUT: 'player_input', PLAYER_STATE: 'player_state', BULLET_FIRE: 'bullet_fire', BULLET_HIT: 'bullet_hit', PLAYER_HIT: 'player_hit', PLAYER_KILLED: 'player_killed', GAME_OVER: 'game_over', // Sync PING: 'ping', PONG: 'pong', SYNC_STATE: 'sync_state', // Team (3v3) CREATE_TEAM: 'create_team', JOIN_TEAM: 'join_team', LEAVE_TEAM: 'leave_team', TEAM_READY: 'team_ready', TEAM_KICK: 'team_kick', TEAM_DISBAND: 'team_disband', TEAM_STATE: 'team_state', MATCH_START: 'match_start', MATCH_CANCEL: 'match_cancel', MATCH_FOUND: 'match_found', MATCH_TIMEOUT: 'match_timeout', BASE_HIT: 'base_hit', BASE_DESTROYED: 'base_destroyed', PLAYER_RESPAWN: 'player_respawn', TEAM_GAME_START: 'team_game_start', TEAM_GAME_OVER: 'team_game_over', TERRAIN_CHANGE: 'terrain_change', BOT_STATE: 'bot_state', RECONNECT: 'reconnect', RECONNECT_OK: 'reconnect_ok', PLAYER_DISCONNECT: 'player_disconnect', BOT_TAKEOVER: 'bot_takeover', SOLO_MATCH: 'solo_match', REMATCH: 'rematch', REMATCH_READY: 'rematch_ready', }; // ============================================================ // Colors // ============================================================ const COLORS = { BG: '#000000', BRICK: '#B5651D', STEEL: '#808080', RIVER: '#4169E1', FOREST: '#006400', BASE: '#FFD700', BASE_WALL: '#B5651D', HUD_TEXT: '#FFFFFF', MENU_BG: '#1a1a2e', MENU_TITLE: '#FFD700', MENU_BTN: '#16213e', MENU_BTN_TEXT: '#FFFFFF', MENU_BTN_BORDER: '#0f3460', }; // ============================================================ // Export // ============================================================ module.exports = { SCREEN_WIDTH, SCREEN_HEIGHT, DEVICE_PIXEL_RATIO, GRID_COLS, GRID_ROWS, TILE_SIZE, MAP_WIDTH, MAP_HEIGHT, MAP_OFFSET_X, MAP_OFFSET_Y, TERRAIN, DIRECTION, DIR_VECTORS, TANK_TYPE, TANK_CONFIG, BULLET_SPEED, BULLET_SIZE, FIRE_LEVEL, MAX_BULLETS_BY_LEVEL, POWERUP_TYPE, POWERUP_DURATION, DEFAULT_LIVES, ENEMIES_PER_LEVEL, MAX_ENEMIES_ON_SCREEN, ENEMY_SPAWN_INTERVAL, FREEZE_DURATION, SHIELD_DURATION, SHOVEL_DURATION, INVINCIBLE_BLINK_INTERVAL, SCENE, GAME_MODE, PVP_ROUND_TIME, PVP_RESPAWN_DELAY, PVP_MAX_LIVES, PVP_WIN_KILLS, PVP_BASE_HP, TEAM_SIZE, TEAM_RESPAWN_DELAY, TEAM_BASE_HP, TEAM_RECONNECT_TIMEOUT, TEAM_MATCH_TIMEOUT, BATTLE_CONFIG, NET_MSG, COLORS, SERVER_URL, };