diff --git a/manifest.json b/manifest.json index 03e8d8e13..c20d03438 100644 --- a/manifest.json +++ b/manifest.json @@ -101,6 +101,7 @@ "bin-debug/modules/mapEditor/view/MeWarPanel.js", "bin-debug/modules/mapEditor/view/MeWarRulePanel.js", "bin-debug/modules/mapEditor/view/MeWarView.js", + "bin-debug/modules/mapManagement/view/MmAcceptMapPanel.js", "bin-debug/modules/mapManagement/view/MmAvailabilityChangePanel.js", "bin-debug/modules/mapManagement/view/MmAvailabilityListPanel.js", "bin-debug/modules/mapManagement/view/MmAvailabilitySearchPanel.js", @@ -152,8 +153,8 @@ "bin-debug/modules/multiCustomWar/model/McwTurnManager.js", "bin-debug/modules/multiCustomWar/model/McwUnit.js", "bin-debug/modules/multiCustomWar/model/McwUnitMap.js", - "bin-debug/modules/multiCustomWar/model/McwWar.js", "bin-debug/Platform.js", + "bin-debug/modules/multiCustomWar/view/McwActionPlannerView.js", "bin-debug/modules/multiCustomWar/view/McwBackgroundPanel.js", "bin-debug/modules/multiCustomWar/view/McwCoListPanel.js", "bin-debug/modules/multiCustomWar/view/McwCursorView.js", @@ -292,6 +293,6 @@ "bin-debug/modules/mapEditor/model/MeUnit.js", "bin-debug/modules/mapEditor/model/MeUnitMap.js", "bin-debug/modules/mapEditor/model/MeUtility.js", - "bin-debug/modules/multiCustomWar/view/McwActionPlannerView.js" + "bin-debug/modules/multiCustomWar/model/McwWar.js" ] } \ No newline at end of file diff --git a/resource/config/NetMessageProto.json b/resource/config/NetMessageProto.json index aadfbebdd..8bff880e0 100644 --- a/resource/config/NetMessageProto.json +++ b/resource/config/NetMessageProto.json @@ -1 +1 @@ -{"nested":{"TileCategoryCfg":{"fields":{"category":{"type":"uint32","id":1},"tileTypes":{"rule":"repeated","type":"uint32","id":2}}},"UnitCategoryCfg":{"fields":{"category":{"type":"uint32","id":1},"unitTypes":{"rule":"repeated","type":"uint32","id":2}}},"TileTemplateCfg":{"fields":{"type":{"type":"uint32","id":1},"defenseAmount":{"type":"uint32","id":2},"defenseUnitCategory":{"type":"uint32","id":3},"maxBuildPoint":{"type":"uint32","id":4},"maxCapturePoint":{"type":"uint32","id":5},"isDefeatedOnCapture":{"type":"uint32","id":6},"repairAmount":{"type":"uint32","id":7},"repairUnitCategory":{"type":"uint32","id":8},"incomePerTurn":{"type":"uint32","id":9},"visionRange":{"type":"uint32","id":10},"isVisionEnabledForAllPlayers":{"type":"uint32","id":11},"hideUnitCategory":{"type":"uint32","id":12},"isDestroyedWithAdjacentMeteor":{"type":"uint32","id":13},"produceUnitCategory":{"type":"uint32","id":14},"globalAttackBonus":{"type":"uint32","id":15},"globalDefenseBonus":{"type":"uint32","id":16},"maxHp":{"type":"uint32","id":17},"armorType":{"type":"uint32","id":18},"isAffectedByLuck":{"type":"uint32","id":19},"loadCoUnitCategory":{"type":"uint32","id":20}}},"UnitTemplateCfg":{"fields":{"type":{"type":"uint32","id":1},"minAttackRange":{"type":"uint32","id":2},"maxAttackRange":{"type":"uint32","id":3},"canAttackAfterMove":{"type":"uint32","id":4},"canAttackDivingUnits":{"type":"uint32","id":5},"primaryWeaponMaxAmmo":{"type":"uint32","id":6},"maxHp":{"type":"uint32","id":7},"armorType":{"type":"uint32","id":8},"isAffectedByLuck":{"type":"uint32","id":9},"moveRange":{"type":"uint32","id":10},"moveType":{"type":"uint32","id":11},"maxFuel":{"type":"uint32","id":12},"fuelConsumptionPerTurn":{"type":"uint32","id":13},"fuelConsumptionInDiving":{"type":"uint32","id":14},"isDestroyedOnOutOfFuel":{"type":"uint32","id":15},"maxLoadUnitsCount":{"type":"uint32","id":16},"loadUnitCategory":{"type":"uint32","id":17},"canLaunchLoadedUnits":{"type":"uint32","id":18},"canDropLoadedUnits":{"type":"uint32","id":19},"canSupplyLoadedUnits":{"type":"uint32","id":20},"repairAmountForLoadedUnits":{"type":"uint32","id":21},"loadableTileCategory":{"type":"uint32","id":22},"canSupplyAdjacentUnits":{"type":"uint32","id":23},"produceUnitType":{"type":"uint32","id":24},"maxProduceMaterial":{"type":"uint32","id":25},"maxBuildMaterial":{"type":"uint32","id":26},"canCaptureTile":{"type":"uint32","id":27},"canLaunchSilo":{"type":"uint32","id":28},"productionCost":{"type":"uint32","id":29},"visionRange":{"type":"uint32","id":30},"flareMaxAmmo":{"type":"uint32","id":31},"flareMaxRange":{"type":"uint32","id":32},"flareRadius":{"type":"uint32","id":33}}},"DamageChartCfg":{"fields":{"attackerType":{"type":"uint32","id":1},"armorType":{"type":"uint32","id":2},"weaponType":{"type":"uint32","id":3},"damage":{"type":"uint32","id":4}}},"MoveCostCfg":{"fields":{"tileType":{"type":"uint32","id":1},"moveType":{"type":"uint32","id":2},"cost":{"type":"uint32","id":3}}},"UnitPromotionCfg":{"fields":{"promotion":{"type":"uint32","id":1},"attackBonus":{"type":"uint32","id":2},"defenseBonus":{"type":"uint32","id":3}}},"VisionBonusCfg":{"fields":{"unitType":{"type":"uint32","id":1},"tileType":{"type":"uint32","id":2},"visionBonus":{"type":"uint32","id":3}}},"BuildableTileCfg":{"fields":{"unitType":{"type":"uint32","id":1},"srcTileType":{"type":"uint32","id":2},"dstTileType":{"type":"uint32","id":3}}},"PlayerRankCfg":{"fields":{"minScore":{"type":"uint32","id":1},"rank":{"type":"uint32","id":2}}},"CoBasicCfg":{"fields":{"coId":{"type":"uint32","id":1},"name":{"type":"string","id":2},"zoneRadius":{"type":"uint32","id":3},"boardCostPercentage":{"type":"int32","id":4},"zoneExpansionEnergyList":{"rule":"repeated","type":"uint32","id":5},"powerEnergyList":{"rule":"repeated","type":"int32","id":6},"isEnabled":{"type":"uint32","id":7},"designer":{"type":"string","id":8},"fullPortrait":{"type":"string","id":9},"tier":{"type":"uint32","id":10},"passiveSkills":{"rule":"repeated","type":"uint32","id":20},"powerSkills":{"rule":"repeated","type":"uint32","id":21},"superPowerSkills":{"rule":"repeated","type":"uint32","id":22}}},"CoSkillCfg":{"fields":{"skillId":{"type":"uint32","id":1},"name":{"type":"string","id":2},"showZone":{"type":"uint32","id":3},"desc":{"rule":"repeated","type":"string","id":4},"attackBonus":{"rule":"repeated","type":"int32","id":10},"defenseBonus":{"rule":"repeated","type":"int32","id":11},"moveRangeBonus":{"rule":"repeated","type":"int32","id":12},"maxAttackRangeBonus":{"rule":"repeated","type":"int32","id":13},"selfHpGain":{"rule":"repeated","type":"int32","id":14},"enemyHpGain":{"rule":"repeated","type":"int32","id":15},"selfPrimaryAmmoGain":{"rule":"repeated","type":"int32","id":16},"enemyPrimaryAmmoGain":{"rule":"repeated","type":"int32","id":17},"selfFuelGain":{"rule":"repeated","type":"int32","id":18},"enemyFuelGain":{"rule":"repeated","type":"int32","id":19},"selfMaterialGain":{"rule":"repeated","type":"int32","id":20},"enemyMaterialGain":{"rule":"repeated","type":"int32","id":21},"selfHpRecovery":{"rule":"repeated","type":"int32","id":22},"indiscriminateAreaDamage":{"rule":"repeated","type":"int32","id":23},"selfPromotionGain":{"rule":"repeated","type":"int32","id":24},"unitVisionRangeBonus":{"rule":"repeated","type":"int32","id":25},"unitTrueVision":{"rule":"repeated","type":"int32","id":26},"attackBonusByPromotion":{"rule":"repeated","type":"int32","id":27},"defenseBonusByPromotion":{"rule":"repeated","type":"int32","id":28},"promotionBonusByAttack":{"rule":"repeated","type":"int32","id":29},"selfPrimaryAmmoRecovery":{"rule":"repeated","type":"int32","id":30},"selfFuelRecovery":{"rule":"repeated","type":"int32","id":31}}},"FullConfig":{"fields":{"TileCategory":{"rule":"repeated","type":"TileCategoryCfg","id":1},"UnitCategory":{"rule":"repeated","type":"UnitCategoryCfg","id":2},"TileTemplate":{"rule":"repeated","type":"TileTemplateCfg","id":3},"UnitTemplate":{"rule":"repeated","type":"UnitTemplateCfg","id":4},"DamageChart":{"rule":"repeated","type":"DamageChartCfg","id":5},"MoveCost":{"rule":"repeated","type":"MoveCostCfg","id":6},"UnitPromotion":{"rule":"repeated","type":"UnitPromotionCfg","id":7},"VisionBonus":{"rule":"repeated","type":"VisionBonusCfg","id":8},"BuildableTile":{"rule":"repeated","type":"BuildableTileCfg","id":9},"PlayerRank":{"rule":"repeated","type":"PlayerRankCfg","id":10},"CoBasic":{"rule":"repeated","type":"CoBasicCfg","id":11},"CoSkill":{"rule":"repeated","type":"CoSkillCfg","id":12}}},"MapRawData":{"fields":{"mapDesigner":{"type":"string","id":1},"mapName":{"type":"string","id":2},"mapNameEnglish":{"type":"string","id":3},"mapWidth":{"type":"uint32","id":4},"mapHeight":{"type":"uint32","id":5},"isMultiPlayer":{"type":"bool","id":6},"isSinglePlayer":{"type":"bool","id":7},"playersCount":{"type":"uint32","id":8},"tileBases":{"rule":"repeated","type":"uint32","id":9},"tileObjects":{"rule":"repeated","type":"uint32","id":10},"units":{"rule":"repeated","type":"uint32","id":11},"unitDataList":{"rule":"repeated","type":"SerializedWarUnit","id":12},"tileDataList":{"rule":"repeated","type":"SerializedWarTile","id":13},"designerUserId":{"type":"uint32","id":14},"modifiedTime":{"type":"uint32","id":15},"warRuleList":{"rule":"repeated","type":"RuleForWar","id":16}}},"MapExtraData":{"fields":{"mapFileName":{"type":"string","id":1},"mapDesigner":{"type":"string","id":2},"mapName":{"type":"string","id":3},"mapNameEnglish":{"type":"string","id":4},"mapWidth":{"type":"uint32","id":5},"mapHeight":{"type":"uint32","id":6},"playersCount":{"type":"uint32","id":7},"designerUserId":{"type":"uint32","id":8},"modifiedTime":{"type":"uint32","id":9},"isDeleted":{"type":"uint32","id":10},"rating":{"type":"float","id":11},"canMcw":{"type":"uint32","id":20},"canWr":{"type":"uint32","id":21},"canScw":{"type":"uint32","id":22},"mcwPlayedTimes":{"type":"uint32","id":30},"mcwTotalTurns":{"type":"uint32","id":31},"mcwP1Wins":{"type":"uint32","id":32},"mcwP1Loses":{"type":"uint32","id":33},"mcwP1Draws":{"type":"uint32","id":34},"mcwP2Wins":{"type":"uint32","id":35},"mcwP2Loses":{"type":"uint32","id":36},"mcwP2Draws":{"type":"uint32","id":37},"mcwP3Wins":{"type":"uint32","id":38},"mcwP3Loses":{"type":"uint32","id":39},"mcwP3Draws":{"type":"uint32","id":40},"mcwP4Wins":{"type":"uint32","id":41},"mcwP4Loses":{"type":"uint32","id":42},"mcwP4Draws":{"type":"uint32","id":43},"rankPlayedTimes":{"type":"uint32","id":50},"rankTotalTurns":{"type":"uint32","id":51},"rankP1Wins":{"type":"uint32","id":52},"rankP1Loses":{"type":"uint32","id":53},"rankP1Draws":{"type":"uint32","id":54},"rankP2Wins":{"type":"uint32","id":55},"rankP2Loses":{"type":"uint32","id":56},"rankP2Draws":{"type":"uint32","id":57},"rankP3Wins":{"type":"uint32","id":58},"rankP3Loses":{"type":"uint32","id":59},"rankP3Draws":{"type":"uint32","id":60},"rankP4Wins":{"type":"uint32","id":61},"rankP4Loses":{"type":"uint32","id":62},"rankP4Draws":{"type":"uint32","id":63}}},"MapEditorData":{"fields":{"designerUserId":{"type":"uint32","id":1},"slotIndex":{"type":"uint32","id":2},"reviewStatus":{"type":"uint32","id":3},"mapRawData":{"type":"MapRawData","id":4},"rejectReason":{"type":"string","id":5}}},"RuleForPlayer":{"fields":{"playerIndex":{"type":"uint32","id":1},"teamIndex":{"type":"uint32","id":2}}},"RuleForWar":{"fields":{"ruleName":{"type":"string","id":1},"ruleNameEnglish":{"type":"string","id":2},"hasFog":{"type":"uint32","id":20},"initialFund":{"type":"uint32","id":21},"incomeModifier":{"type":"uint32","id":22},"initialEnergy":{"type":"uint32","id":23},"energyGrowthModifier":{"type":"uint32","id":24},"moveRangeModifier":{"type":"int32","id":25},"attackPowerModifier":{"type":"int32","id":26},"visionRangeModifier":{"type":"int32","id":27},"bannedCoIdList":{"rule":"repeated","type":"int32","id":28},"luckLowerLimit":{"type":"int32","id":29},"luckUpperLimit":{"type":"int32","id":30},"playerRuleList":{"rule":"repeated","type":"RuleForPlayer","id":31}}},"SerializedWarTile":{"fields":{"gridX":{"type":"uint32","id":1},"gridY":{"type":"uint32","id":2},"baseViewId":{"type":"uint32","id":3},"objectViewId":{"type":"uint32","id":4},"currentHp":{"type":"uint32","id":5},"currentBuildPoint":{"type":"uint32","id":6},"currentCapturePoint":{"type":"uint32","id":7}}},"SerializedWarUnit":{"fields":{"gridX":{"type":"uint32","id":1},"gridY":{"type":"uint32","id":2},"viewId":{"type":"uint32","id":3},"unitId":{"type":"uint32","id":4},"state":{"type":"uint32","id":5},"primaryWeaponCurrentAmmo":{"type":"uint32","id":6},"currentHp":{"type":"uint32","id":7},"isCapturingTile":{"type":"bool","id":8},"isDiving":{"type":"bool","id":9},"flareCurrentAmmo":{"type":"uint32","id":10},"currentFuel":{"type":"uint32","id":11},"currentBuildMaterial":{"type":"uint32","id":12},"currentProduceMaterial":{"type":"uint32","id":13},"currentPromotion":{"type":"uint32","id":14},"isBuildingTile":{"type":"bool","id":15},"loaderUnitId":{"type":"uint32","id":16}}},"SerializedWarPlayer":{"fields":{"fund":{"type":"uint32","id":1},"hasVotedForDraw":{"type":"bool","id":2},"isAlive":{"type":"bool","id":3},"playerIndex":{"type":"uint32","id":4},"teamIndex":{"type":"uint32","id":5},"userId":{"type":"uint32","id":6},"nickname":{"type":"string","id":7},"coId":{"type":"uint32","id":8},"coUnitId":{"type":"uint32","id":9},"coCurrentEnergy":{"type":"uint32","id":10},"coUsingSkillType":{"type":"uint32","id":11},"coIsDestroyedInTurn":{"type":"bool","id":12},"watchOngoingSrcUserIdList":{"rule":"repeated","type":"uint32","id":13},"watchRequestSrcUserIdList":{"rule":"repeated","type":"uint32","id":14}}},"SerializedWarTurn":{"fields":{"turnIndex":{"type":"uint32","id":1},"playerIndex":{"type":"uint32","id":2},"turnPhaseCode":{"type":"uint32","id":3},"enterTurnTime":{"type":"uint32","id":4}}},"SerializedWarTileMap":{"fields":{"tiles":{"rule":"repeated","type":"SerializedWarTile","id":1}}},"SerializedWarUnitMap":{"fields":{"nextUnitId":{"type":"uint32","id":1},"units":{"rule":"repeated","type":"SerializedWarUnit","id":2}}},"SerializedWarFogMapForPath":{"fields":{"playerIndex":{"type":"uint32","id":1},"encodedMap":{"type":"string","id":2}}},"SerializedWarFogMap":{"fields":{"forceFogCode":{"type":"uint32","id":1},"forceExpirePlayerIndex":{"type":"uint32","id":2},"forceExpireTurnIndex":{"type":"uint32","id":3},"mapsForPath":{"rule":"repeated","type":"SerializedWarFogMapForPath","id":4}}},"SerializedWarField":{"fields":{"fogMap":{"type":"SerializedWarFogMap","id":1},"tileMap":{"type":"SerializedWarTileMap","id":2},"unitMap":{"type":"SerializedWarUnitMap","id":3}}},"SerializedWar":{"fields":{"warId":{"type":"uint32","id":1},"configVersion":{"type":"string","id":2},"mapFileName":{"type":"string","id":3},"singlePlayerWarType":{"type":"uint32","id":4},"saveSlotIndex":{"type":"uint32","id":5},"warName":{"type":"string","id":6},"warPassword":{"type":"string","id":7},"warComment":{"type":"string","id":8},"hasFogByDefault":{"type":"bool","id":9},"timeLimit":{"type":"uint32","id":10},"initialFund":{"type":"uint32","id":11},"incomeModifier":{"type":"uint32","id":12},"initialEnergy":{"type":"uint32","id":13},"energyGrowthModifier":{"type":"uint32","id":14},"moveRangeModifier":{"type":"int32","id":15},"attackPowerModifier":{"type":"int32","id":16},"visionRangeModifier":{"type":"int32","id":17},"bannedCoIdList":{"rule":"repeated","type":"int32","id":18},"luckLowerLimit":{"type":"int32","id":19},"luckUpperLimit":{"type":"int32","id":20},"warRuleIndex":{"type":"uint32","id":21},"isSinglePlayerCheating":{"type":"bool","id":22},"nextActionId":{"type":"uint32","id":31},"remainingVotesForDraw":{"type":"uint32","id":32},"executedActions":{"rule":"repeated","type":"WarActionContainer","id":34},"players":{"rule":"repeated","type":"SerializedWarPlayer","id":35},"turn":{"type":"SerializedWarTurn","id":36},"field":{"type":"SerializedWarField","id":37},"seedRandomState":{"type":"SeedRandomState","id":38},"seedRandomInitState":{"type":"SeedRandomState","id":39}}},"WarUnitRepairData":{"fields":{"unitId":{"type":"uint32","id":1},"gridIndex":{"type":"GridIndex","id":2},"deltaHp":{"type":"uint32","id":3},"deltaPrimaryWeaponAmmo":{"type":"uint32","id":4},"deltaFuel":{"type":"uint32","id":5},"deltaFlareAmmo":{"type":"uint32","id":6}}},"WarUseCoSkillExtraData":{"fields":{"indiscriminateAreaDamageCenter":{"type":"GridIndex","id":1}}},"WarActionPlayerBeginTurn":{"fields":{"remainingFund":{"type":"uint32","id":1},"isDefeated":{"type":"bool","id":2},"repairDataByTile":{"rule":"repeated","type":"WarUnitRepairData","id":3},"repairDataByUnit":{"rule":"repeated","type":"WarUnitRepairData","id":4},"recoverDataByCo":{"rule":"repeated","type":"WarUnitRepairData","id":5}}},"WarActionPlayerEndTurn":{"fields":{}},"WarActionPlayerSurrender":{"fields":{"isBoot":{"type":"bool","id":1}}},"WarActionPlayerProduceUnit":{"fields":{"discoveredUnits":{"rule":"repeated","type":"SerializedWarUnit","id":1},"discoveredTiles":{"rule":"repeated","type":"SerializedWarTile","id":2},"gridIndex":{"type":"GridIndex","id":3},"unitType":{"type":"uint32","id":4},"cost":{"type":"uint32","id":5}}},"WarActionPlayerDeleteUnit":{"fields":{"gridIndex":{"type":"GridIndex","id":1}}},"WarActionPlayerVoteForDraw":{"fields":{"isAgree":{"type":"bool","id":1}}},"WarActionUnitWait":{"fields":{"path":{"type":"MovePath","id":1},"launchUnitId":{"type":"uint32","id":2},"discoveredUnits":{"rule":"repeated","type":"SerializedWarUnit","id":3},"discoveredTiles":{"rule":"repeated","type":"SerializedWarTile","id":4},"actingUnits":{"rule":"repeated","type":"SerializedWarUnit","id":5},"actingTiles":{"rule":"repeated","type":"SerializedWarTile","id":6}}},"WarActionUnitBeLoaded":{"fields":{"path":{"type":"MovePath","id":1},"launchUnitId":{"type":"uint32","id":2},"discoveredUnits":{"rule":"repeated","type":"SerializedWarUnit","id":3},"discoveredTiles":{"rule":"repeated","type":"SerializedWarTile","id":4},"actingUnits":{"rule":"repeated","type":"SerializedWarUnit","id":5},"actingTiles":{"rule":"repeated","type":"SerializedWarTile","id":6}}},"WarActionUnitCaptureTile":{"fields":{"path":{"type":"MovePath","id":1},"launchUnitId":{"type":"uint32","id":2},"discoveredUnits":{"rule":"repeated","type":"SerializedWarUnit","id":3},"discoveredTiles":{"rule":"repeated","type":"SerializedWarTile","id":4},"actingUnits":{"rule":"repeated","type":"SerializedWarUnit","id":5},"actingTiles":{"rule":"repeated","type":"SerializedWarTile","id":6}}},"WarActionUnitAttack":{"fields":{"path":{"type":"MovePath","id":1},"launchUnitId":{"type":"uint32","id":2},"discoveredUnits":{"rule":"repeated","type":"SerializedWarUnit","id":3},"discoveredTiles":{"rule":"repeated","type":"SerializedWarTile","id":4},"actingUnits":{"rule":"repeated","type":"SerializedWarUnit","id":5},"actingTiles":{"rule":"repeated","type":"SerializedWarTile","id":6},"targetGridIndex":{"type":"GridIndex","id":7},"attackDamage":{"type":"uint32","id":8},"counterDamage":{"type":"uint32","id":9},"lostPlayerIndex":{"type":"uint32","id":10},"attackerUnitAfterAction":{"type":"SerializedWarUnit","id":11},"targetUnitAfterAction":{"type":"SerializedWarUnit","id":12},"attackerCoEnergy":{"type":"uint32","id":13},"targetCoEnergy":{"type":"uint32","id":14}}},"WarActionUnitDrop":{"fields":{"path":{"type":"MovePath","id":1},"launchUnitId":{"type":"uint32","id":2},"discoveredUnits":{"rule":"repeated","type":"SerializedWarUnit","id":3},"discoveredTiles":{"rule":"repeated","type":"SerializedWarTile","id":4},"actingUnits":{"rule":"repeated","type":"SerializedWarUnit","id":5},"actingTiles":{"rule":"repeated","type":"SerializedWarTile","id":6},"dropDestinations":{"rule":"repeated","type":"DropDestination","id":7},"isDropBlocked":{"type":"bool","id":8}}},"WarActionUnitBuildTile":{"fields":{"path":{"type":"MovePath","id":1},"launchUnitId":{"type":"uint32","id":2},"discoveredUnits":{"rule":"repeated","type":"SerializedWarUnit","id":3},"discoveredTiles":{"rule":"repeated","type":"SerializedWarTile","id":4},"actingUnits":{"rule":"repeated","type":"SerializedWarUnit","id":5},"actingTiles":{"rule":"repeated","type":"SerializedWarTile","id":6}}},"WarActionUnitDive":{"fields":{"path":{"type":"MovePath","id":1},"launchUnitId":{"type":"uint32","id":2},"discoveredUnits":{"rule":"repeated","type":"SerializedWarUnit","id":3},"discoveredTiles":{"rule":"repeated","type":"SerializedWarTile","id":4},"actingUnits":{"rule":"repeated","type":"SerializedWarUnit","id":5},"actingTiles":{"rule":"repeated","type":"SerializedWarTile","id":6}}},"WarActionUnitSurface":{"fields":{"path":{"type":"MovePath","id":1},"launchUnitId":{"type":"uint32","id":2},"discoveredUnits":{"rule":"repeated","type":"SerializedWarUnit","id":3},"discoveredTiles":{"rule":"repeated","type":"SerializedWarTile","id":4},"actingUnits":{"rule":"repeated","type":"SerializedWarUnit","id":5},"actingTiles":{"rule":"repeated","type":"SerializedWarTile","id":6}}},"WarActionUnitJoin":{"fields":{"path":{"type":"MovePath","id":1},"launchUnitId":{"type":"uint32","id":2},"discoveredUnits":{"rule":"repeated","type":"SerializedWarUnit","id":3},"discoveredTiles":{"rule":"repeated","type":"SerializedWarTile","id":4},"actingUnits":{"rule":"repeated","type":"SerializedWarUnit","id":5},"actingTiles":{"rule":"repeated","type":"SerializedWarTile","id":6}}},"WarActionUnitLaunchFlare":{"fields":{"path":{"type":"MovePath","id":1},"launchUnitId":{"type":"uint32","id":2},"discoveredUnits":{"rule":"repeated","type":"SerializedWarUnit","id":3},"discoveredTiles":{"rule":"repeated","type":"SerializedWarTile","id":4},"actingUnits":{"rule":"repeated","type":"SerializedWarUnit","id":5},"actingTiles":{"rule":"repeated","type":"SerializedWarTile","id":6},"targetGridIndex":{"type":"GridIndex","id":7}}},"WarActionUnitLaunchSilo":{"fields":{"path":{"type":"MovePath","id":1},"launchUnitId":{"type":"uint32","id":2},"discoveredUnits":{"rule":"repeated","type":"SerializedWarUnit","id":3},"discoveredTiles":{"rule":"repeated","type":"SerializedWarTile","id":4},"actingUnits":{"rule":"repeated","type":"SerializedWarUnit","id":5},"actingTiles":{"rule":"repeated","type":"SerializedWarTile","id":6},"targetGridIndex":{"type":"GridIndex","id":7}}},"WarActionUnitProduceUnit":{"fields":{"path":{"type":"MovePath","id":1},"launchUnitId":{"type":"uint32","id":2},"discoveredUnits":{"rule":"repeated","type":"SerializedWarUnit","id":3},"discoveredTiles":{"rule":"repeated","type":"SerializedWarTile","id":4},"actingUnits":{"rule":"repeated","type":"SerializedWarUnit","id":5},"actingTiles":{"rule":"repeated","type":"SerializedWarTile","id":6},"cost":{"type":"uint32","id":7}}},"WarActionUnitSupply":{"fields":{"path":{"type":"MovePath","id":1},"launchUnitId":{"type":"uint32","id":2},"discoveredUnits":{"rule":"repeated","type":"SerializedWarUnit","id":3},"discoveredTiles":{"rule":"repeated","type":"SerializedWarTile","id":4},"actingUnits":{"rule":"repeated","type":"SerializedWarUnit","id":5},"actingTiles":{"rule":"repeated","type":"SerializedWarTile","id":6}}},"WarActionUnitLoadCo":{"fields":{"path":{"type":"MovePath","id":1},"launchUnitId":{"type":"uint32","id":2},"discoveredUnits":{"rule":"repeated","type":"SerializedWarUnit","id":3},"discoveredTiles":{"rule":"repeated","type":"SerializedWarTile","id":4},"actingUnits":{"rule":"repeated","type":"SerializedWarUnit","id":5},"actingTiles":{"rule":"repeated","type":"SerializedWarTile","id":6},"cost":{"type":"uint32","id":7}}},"WarActionUnitUseCoSkill":{"fields":{"path":{"type":"MovePath","id":1},"launchUnitId":{"type":"uint32","id":2},"skillType":{"type":"uint32","id":3},"discoveredUnits":{"rule":"repeated","type":"SerializedWarUnit","id":4},"discoveredTiles":{"rule":"repeated","type":"SerializedWarTile","id":5},"actingUnits":{"rule":"repeated","type":"SerializedWarUnit","id":6},"actingTiles":{"rule":"repeated","type":"SerializedWarTile","id":7},"extraDataList":{"rule":"repeated","type":"WarUseCoSkillExtraData","id":8}}},"WarActionContainer":{"fields":{"actionId":{"type":"uint32","id":1},"WarActionPlayerBeginTurn":{"type":"WarActionPlayerBeginTurn","id":11},"WarActionPlayerEndTurn":{"type":"WarActionPlayerEndTurn","id":12},"WarActionPlayerSurrender":{"type":"WarActionPlayerSurrender","id":13},"WarActionPlayerProduceUnit":{"type":"WarActionPlayerProduceUnit","id":14},"WarActionPlayerDeleteUnit":{"type":"WarActionPlayerDeleteUnit","id":15},"WarActionPlayerVoteForDraw":{"type":"WarActionPlayerVoteForDraw","id":16},"WarActionUnitWait":{"type":"WarActionUnitWait","id":17},"WarActionUnitBeLoaded":{"type":"WarActionUnitBeLoaded","id":18},"WarActionUnitCaptureTile":{"type":"WarActionUnitCaptureTile","id":19},"WarActionUnitAttack":{"type":"WarActionUnitAttack","id":20},"WarActionUnitDrop":{"type":"WarActionUnitDrop","id":21},"WarActionUnitBuildTile":{"type":"WarActionUnitBuildTile","id":22},"WarActionUnitDive":{"type":"WarActionUnitDive","id":23},"WarActionUnitSurface":{"type":"WarActionUnitSurface","id":24},"WarActionUnitJoin":{"type":"WarActionUnitJoin","id":25},"WarActionUnitLaunchFlare":{"type":"WarActionUnitLaunchFlare","id":26},"WarActionUnitLaunchSilo":{"type":"WarActionUnitLaunchSilo","id":27},"WarActionUnitProduceUnit":{"type":"WarActionUnitProduceUnit","id":28},"WarActionUnitSupply":{"type":"WarActionUnitSupply","id":29},"WarActionUnitLoadCo":{"type":"WarActionUnitLoadCo","id":30},"WarActionUnitUseCoSkill":{"type":"WarActionUnitUseCoSkill","id":31}}},"GridIndex":{"fields":{"x":{"type":"uint32","id":1},"y":{"type":"uint32","id":2}}},"MovePath":{"fields":{"nodes":{"rule":"repeated","type":"GridIndex","id":1},"isBlocked":{"type":"bool","id":2},"fuelConsumption":{"type":"uint32","id":3}}},"DropDestination":{"fields":{"unitId":{"type":"uint32","id":1},"gridIndex":{"type":"GridIndex","id":2}}},"SeedRandomState":{"fields":{"i":{"type":"uint32","id":1},"j":{"type":"uint32","id":2},"S":{"rule":"repeated","type":"uint32","id":3}}},"BannedCoIdList":{"fields":{"bannedCoIdList":{"rule":"repeated","type":"int32","id":1}}},"McrWaitingInfo":{"fields":{"infoId":{"type":"uint32","id":0},"mapFileName":{"type":"string","id":1},"warName":{"type":"string","id":4},"warPassword":{"type":"string","id":5},"warComment":{"type":"string","id":6},"configVersion":{"type":"string","id":7},"warRuleIndex":{"type":"uint32","id":10},"createTime":{"type":"uint32","id":11},"playerInfoList":{"rule":"repeated","type":"WarPlayerInfo","id":12},"hasFog":{"type":"uint32","id":30},"timeLimit":{"type":"uint32","id":31},"initialFund":{"type":"uint32","id":32},"incomeModifier":{"type":"uint32","id":33},"initialEnergy":{"type":"uint32","id":34},"energyGrowthModifier":{"type":"uint32","id":35},"moveRangeModifier":{"type":"int32","id":36},"attackPowerModifier":{"type":"int32","id":37},"visionRangeModifier":{"type":"int32","id":38},"bannedCoIdList":{"rule":"repeated","type":"int32","id":39},"luckLowerLimit":{"type":"int32","id":40},"luckUpperLimit":{"type":"int32","id":41}}},"McwOngoingDetail":{"fields":{"id":{"type":"uint32","id":1},"configVersion":{"type":"string","id":2},"mapFileName":{"type":"string","id":3},"warName":{"type":"string","id":6},"warPassword":{"type":"string","id":7},"warComment":{"type":"string","id":8},"hasFog":{"type":"uint32","id":11},"timeLimit":{"type":"uint32","id":12},"initialFund":{"type":"uint32","id":13},"incomeModifier":{"type":"uint32","id":14},"initialEnergy":{"type":"uint32","id":15},"energyGrowthModifier":{"type":"uint32","id":16},"moveRangeModifier":{"type":"int32","id":17},"attackPowerModifier":{"type":"int32","id":18},"visionRangeModifier":{"type":"int32","id":19},"p1UserId":{"type":"uint32","id":20},"p1TeamIndex":{"type":"uint32","id":21},"p1IsAlive":{"type":"bool","id":22},"p1CoId":{"type":"int32","id":23},"p1UserNickname":{"type":"string","id":24},"p2UserId":{"type":"uint32","id":25},"p2TeamIndex":{"type":"uint32","id":26},"p2IsAlive":{"type":"bool","id":27},"p2CoId":{"type":"int32","id":28},"p2UserNickname":{"type":"string","id":29},"p3UserId":{"type":"uint32","id":30},"p3TeamIndex":{"type":"uint32","id":31},"p3IsAlive":{"type":"bool","id":32},"p3CoId":{"type":"int32","id":33},"p3UserNickname":{"type":"string","id":34},"p4UserId":{"type":"uint32","id":35},"p4TeamIndex":{"type":"uint32","id":36},"p4IsAlive":{"type":"bool","id":37},"p4CoId":{"type":"int32","id":38},"p4UserNickname":{"type":"string","id":39},"playerIndexInTurn":{"type":"uint32","id":40},"turnIndex":{"type":"uint32","id":41},"enterTurnTime":{"type":"uint32","id":42}}},"McwReplayInfo":{"fields":{"replayId":{"type":"uint32","id":1},"configVersion":{"type":"string","id":2},"mapFileName":{"type":"string","id":3},"hasFog":{"type":"uint32","id":6},"turnIndex":{"type":"uint32","id":7},"nextActionId":{"type":"uint32","id":8},"warEndTime":{"type":"uint32","id":9},"p1UserId":{"type":"uint32","id":20},"p1TeamIndex":{"type":"uint32","id":21},"p1UserNickname":{"type":"string","id":22},"p2UserId":{"type":"uint32","id":23},"p2TeamIndex":{"type":"uint32","id":24},"p2UserNickname":{"type":"string","id":25},"p3UserId":{"type":"uint32","id":26},"p3TeamIndex":{"type":"uint32","id":27},"p3UserNickname":{"type":"string","id":28},"p4UserId":{"type":"uint32","id":29},"p4TeamIndex":{"type":"uint32","id":30},"p4UserNickname":{"type":"string","id":31}}},"McwWatchRequesterInfo":{"fields":{"userId":{"type":"uint32","id":1},"nickname":{"type":"string","id":2},"isRequestingOthers":{"type":"bool","id":3},"isWatchingOthers":{"type":"bool","id":4}}},"McwWatchInfo":{"fields":{"mcwDetail":{"type":"McwOngoingDetail","id":1},"ongoingDstUserIds":{"rule":"repeated","type":"uint32","id":2},"requestDstUserIds":{"rule":"repeated","type":"uint32","id":3},"ongoingSrcUserIds":{"rule":"repeated","type":"uint32","id":4},"requestSrcUserIds":{"rule":"repeated","type":"uint32","id":5},"requesterInfos":{"rule":"repeated","type":"McwWatchRequesterInfo","id":6}}},"UserBriefInfo":{"fields":{"userId":{"type":"uint32","id":1},"nickname":{"type":"string","id":2}}},"WarPlayerInfo":{"fields":{"playerIndex":{"type":"uint32","id":1},"userId":{"type":"uint32","id":2},"teamIndex":{"type":"uint32","id":3},"coId":{"type":"uint32","id":4},"nickname":{"type":"string","id":5}}},"SaveSlotInfo":{"fields":{"slotIndex":{"type":"uint32","id":1},"mapFileName":{"type":"string","id":2},"warType":{"type":"uint32","id":3},"configVersion":{"type":"string","id":4}}},"MessageContainer":{"fields":{"C_Heartbeat":{"type":"C_Heartbeat","id":0},"S_Heartbeat":{"type":"S_Heartbeat","id":1},"C_Register":{"type":"C_Register","id":2},"S_Register":{"type":"S_Register","id":3},"C_Login":{"type":"C_Login","id":4},"S_Login":{"type":"S_Login","id":5},"C_Logout":{"type":"C_Logout","id":6},"S_Logout":{"type":"S_Logout","id":7},"S_Error":{"type":"S_Error","id":9},"S_ServerDisconnect":{"type":"S_ServerDisconnect","id":11},"S_NewestConfigVersion":{"type":"S_NewestConfigVersion","id":13},"C_GetUserPublicInfo":{"type":"C_GetUserPublicInfo","id":20},"S_GetUserPublicInfo":{"type":"S_GetUserPublicInfo","id":21},"C_UserChangeNickname":{"type":"C_UserChangeNickname","id":22},"S_UserChangeNickname":{"type":"S_UserChangeNickname","id":23},"C_UserChangeDiscordId":{"type":"C_UserChangeDiscordId","id":24},"S_UserChangeDiscordId":{"type":"S_UserChangeDiscordId","id":25},"C_UserGetOnlineUsers":{"type":"C_UserGetOnlineUsers","id":26},"S_UserGetOnlineUsers":{"type":"S_UserGetOnlineUsers","id":27},"C_MapGetEnabledExtraDataList":{"type":"C_MapGetEnabledExtraDataList","id":40},"S_MapGetEnabledExtraDataList":{"type":"S_MapGetEnabledExtraDataList","id":41},"C_MapGetExtraData":{"type":"C_MapGetExtraData","id":42},"S_MapGetExtraData":{"type":"S_MapGetExtraData","id":43},"C_MapGetRawData":{"type":"C_MapGetRawData","id":44},"S_MapGetRawData":{"type":"S_MapGetRawData","id":45},"C_MeGetDataList":{"type":"C_MeGetDataList","id":50},"S_MeGetDataList":{"type":"S_MeGetDataList","id":51},"C_MeGetData":{"type":"C_MeGetData","id":52},"S_MeGetData":{"type":"S_MeGetData","id":53},"C_MeSaveMap":{"type":"C_MeSaveMap","id":54},"S_MeSaveMap":{"type":"S_MeSaveMap","id":55},"C_MmChangeAvailability":{"type":"C_MmChangeAvailability","id":100},"S_MmChangeAvailability":{"type":"S_MmChangeAvailability","id":101},"C_MmReloadAllMaps":{"type":"C_MmReloadAllMaps","id":102},"S_MmReloadAllMaps":{"type":"S_MmReloadAllMaps","id":103},"C_MmMergeMap":{"type":"C_MmMergeMap","id":104},"S_MmMergeMap":{"type":"S_MmMergeMap","id":105},"C_MmDeleteMap":{"type":"C_MmDeleteMap","id":106},"S_MmDeleteMap":{"type":"S_MmDeleteMap","id":107},"C_MmGetReviewingMaps":{"type":"C_MmGetReviewingMaps","id":108},"S_MmGetReviewingMaps":{"type":"S_MmGetReviewingMaps","id":109},"C_MmReviewMap":{"type":"C_MmReviewMap","id":110},"S_MmReviewMap":{"type":"S_MmReviewMap","id":111},"C_McrCreateWar":{"type":"C_McrCreateWar","id":1001},"S_McrCreateWar":{"type":"S_McrCreateWar","id":1002},"C_McrExitWar":{"type":"C_McrExitWar","id":1003},"S_McrExitWar":{"type":"S_McrExitWar","id":1004},"C_McrGetJoinedWaitingInfos":{"type":"C_McrGetJoinedWaitingInfos","id":1005},"S_McrGetJoinedWaitingInfos":{"type":"S_McrGetJoinedWaitingInfos","id":1006},"C_McrGetUnjoinedWaitingInfos":{"type":"C_McrGetUnjoinedWaitingInfos","id":1007},"S_McrGetUnjoinedWaitingInfos":{"type":"S_McrGetUnjoinedWaitingInfos","id":1008},"C_McrJoinWar":{"type":"C_McrJoinWar","id":1009},"S_McrJoinWar":{"type":"S_McrJoinWar","id":1010},"C_McrGetJoinedOngoingInfos":{"type":"C_McrGetJoinedOngoingInfos","id":1011},"S_McrGetJoinedOngoingInfos":{"type":"S_McrGetJoinedOngoingInfos","id":1012},"C_McrContinueWar":{"type":"C_McrContinueWar","id":1013},"S_McrContinueWar":{"type":"S_McrContinueWar","id":1014},"C_McrGetReplayInfos":{"type":"C_McrGetReplayInfos","id":1015},"S_McrGetReplayInfos":{"type":"S_McrGetReplayInfos","id":1016},"C_McrGetReplayData":{"type":"C_McrGetReplayData","id":1017},"S_McrGetReplayData":{"type":"S_McrGetReplayData","id":1018},"C_McwWatchMakeRequest":{"type":"C_McwWatchMakeRequest","id":1031},"S_McwWatchMakeRequest":{"type":"S_McwWatchMakeRequest","id":1032},"C_McwWatchHandleRequest":{"type":"C_McwWatchHandleRequest","id":1033},"S_McwWatchHandleRequest":{"type":"S_McwWatchHandleRequest","id":1034},"C_McwWatchDeleteWatcher":{"type":"C_McwWatchDeleteWatcher","id":1035},"S_McwWatchDeleteWatcher":{"type":"S_McwWatchDeleteWatcher","id":1036},"C_McwWatchGetUnwatchedWarInfos":{"type":"C_McwWatchGetUnwatchedWarInfos","id":1037},"S_McwWatchGetUnwatchedWarInfos":{"type":"S_McwWatchGetUnwatchedWarInfos","id":1038},"C_McwWatchGetOngoingWarInfos":{"type":"C_McwWatchGetOngoingWarInfos","id":1039},"S_McwWatchGetOngoingWarInfos":{"type":"S_McwWatchGetOngoingWarInfos","id":1040},"C_McwWatchGetRequestedWarInfos":{"type":"C_McwWatchGetRequestedWarInfos","id":1041},"S_McwWatchGetRequestedWarInfos":{"type":"S_McwWatchGetRequestedWarInfos","id":1042},"C_McwWatchGetWatchedWarInfos":{"type":"C_McwWatchGetWatchedWarInfos","id":1043},"S_McwWatchGetWatchedWarInfos":{"type":"S_McwWatchGetWatchedWarInfos","id":1044},"C_McwWatchContinueWar":{"type":"C_McwWatchContinueWar","id":1045},"S_McwWatchContinueWar":{"type":"S_McwWatchContinueWar","id":1046},"C_McwPlayerBeginTurn":{"type":"C_McwPlayerBeginTurn","id":1101},"S_McwPlayerBeginTurn":{"type":"S_McwPlayerBeginTurn","id":1102},"C_McwPlayerEndTurn":{"type":"C_McwPlayerEndTurn","id":1103},"S_McwPlayerEndTurn":{"type":"S_McwPlayerEndTurn","id":1104},"C_McwPlayerSurrender":{"type":"C_McwPlayerSurrender","id":1105},"S_McwPlayerSurrender":{"type":"S_McwPlayerSurrender","id":1106},"C_McwPlayerProduceUnit":{"type":"C_McwPlayerProduceUnit","id":1107},"S_McwPlayerProduceUnit":{"type":"S_McwPlayerProduceUnit","id":1108},"C_McwPlayerDeleteUnit":{"type":"C_McwPlayerDeleteUnit","id":1109},"S_McwPlayerDeleteUnit":{"type":"S_McwPlayerDeleteUnit","id":1110},"C_McwPlayerVoteForDraw":{"type":"C_McwPlayerVoteForDraw","id":1111},"S_McwPlayerVoteForDraw":{"type":"S_McwPlayerVoteForDraw","id":1112},"C_McwPlayerSyncWar":{"type":"C_McwPlayerSyncWar","id":1113},"S_McwPlayerSyncWar":{"type":"S_McwPlayerSyncWar","id":1114},"C_McwUnitWait":{"type":"C_McwUnitWait","id":1151},"S_McwUnitWait":{"type":"S_McwUnitWait","id":1152},"C_McwUnitBeLoaded":{"type":"C_McwUnitBeLoaded","id":1153},"S_McwUnitBeLoaded":{"type":"S_McwUnitBeLoaded","id":1154},"C_McwUnitCaptureTile":{"type":"C_McwUnitCaptureTile","id":1155},"S_McwUnitCaptureTile":{"type":"S_McwUnitCaptureTile","id":1156},"C_McwUnitAttack":{"type":"C_McwUnitAttack","id":1157},"S_McwUnitAttack":{"type":"S_McwUnitAttack","id":1158},"C_McwUnitDrop":{"type":"C_McwUnitDrop","id":1159},"S_McwUnitDrop":{"type":"S_McwUnitDrop","id":1160},"C_McwUnitBuildTile":{"type":"C_McwUnitBuildTile","id":1161},"S_McwUnitBuildTile":{"type":"S_McwUnitBuildTile","id":1162},"C_McwUnitDive":{"type":"C_McwUnitDive","id":1163},"S_McwUnitDive":{"type":"S_McwUnitDive","id":1164},"C_McwUnitSurface":{"type":"C_McwUnitSurface","id":1165},"S_McwUnitSurface":{"type":"S_McwUnitSurface","id":1166},"C_McwUnitJoin":{"type":"C_McwUnitJoin","id":1167},"S_McwUnitJoin":{"type":"S_McwUnitJoin","id":1168},"C_McwUnitLaunchFlare":{"type":"C_McwUnitLaunchFlare","id":1169},"S_McwUnitLaunchFlare":{"type":"S_McwUnitLaunchFlare","id":1170},"C_McwUnitLaunchSilo":{"type":"C_McwUnitLaunchSilo","id":1171},"S_McwUnitLaunchSilo":{"type":"S_McwUnitLaunchSilo","id":1172},"C_McwUnitProduceUnit":{"type":"C_McwUnitProduceUnit","id":1173},"S_McwUnitProduceUnit":{"type":"S_McwUnitProduceUnit","id":1174},"C_McwUnitSupply":{"type":"C_McwUnitSupply","id":1175},"S_McwUnitSupply":{"type":"S_McwUnitSupply","id":1176},"C_McwUnitLoadCo":{"type":"C_McwUnitLoadCo","id":1177},"S_McwUnitLoadCo":{"type":"S_McwUnitLoadCo","id":1178},"C_McwUnitUseCoSkill":{"type":"C_McwUnitUseCoSkill","id":1179},"S_McwUnitUseCoSkill":{"type":"S_McwUnitUseCoSkill","id":1180},"C_ScrCreateWar":{"type":"C_ScrCreateWar","id":1501},"S_ScrCreateWar":{"type":"S_ScrCreateWar","id":1502},"C_ScrGetSaveSlotInfoList":{"type":"C_ScrGetSaveSlotInfoList","id":1503},"S_ScrGetSaveSlotInfoList":{"type":"S_ScrGetSaveSlotInfoList","id":1504},"C_ScrContinueWar":{"type":"C_ScrContinueWar","id":1505},"S_ScrContinueWar":{"type":"S_ScrContinueWar","id":1506},"C_ScrSaveWar":{"type":"C_ScrSaveWar","id":1507},"S_ScrSaveWar":{"type":"S_ScrSaveWar","id":1508},"C_ScrCreateCustomWar":{"type":"C_ScrCreateCustomWar","id":1509},"S_ScrCreateCustomWar":{"type":"S_ScrCreateCustomWar","id":1510}}},"C_Heartbeat":{"fields":{"counter":{"type":"uint32","id":1}}},"S_Heartbeat":{"fields":{"errorCode":{"type":"uint32","id":1},"counter":{"type":"uint32","id":2},"timestamp":{"type":"uint32","id":3}}},"C_Register":{"fields":{"account":{"type":"string","id":1},"password":{"type":"string","id":2},"nickname":{"type":"string","id":3}}},"S_Register":{"fields":{"errorCode":{"type":"uint32","id":1},"account":{"type":"string","id":2},"password":{"type":"string","id":3}}},"C_Login":{"fields":{"account":{"type":"string","id":1},"password":{"type":"string","id":2},"isAutoRelogin":{"type":"bool","id":3}}},"S_Login":{"fields":{"errorCode":{"type":"uint32","id":1},"userId":{"type":"uint32","id":2},"account":{"type":"string","id":3},"password":{"type":"string","id":4},"nickname":{"type":"string","id":5},"isAdmin":{"type":"uint32","id":10},"isCoCommitee":{"type":"uint32","id":11},"isMapCommitee":{"type":"uint32","id":12},"rank2pScore":{"type":"uint32","id":20},"discordId":{"type":"string","id":30}}},"C_Logout":{"fields":{}},"S_Logout":{"fields":{"errorCode":{"type":"uint32","id":1},"reason":{"type":"uint32","id":2}}},"S_Error":{"fields":{"errorCode":{"type":"uint32","id":1}}},"C_MapGetEnabledExtraDataList":{"fields":{}},"S_MapGetEnabledExtraDataList":{"fields":{"errorCode":{"type":"uint32","id":1},"dataList":{"rule":"repeated","type":"MapExtraData","id":2}}},"C_MapGetExtraData":{"fields":{"mapFileName":{"type":"string","id":1}}},"S_MapGetExtraData":{"fields":{"errorCode":{"type":"uint32","id":1},"mapFileName":{"type":"string","id":2},"mapExtraData":{"type":"MapExtraData","id":3}}},"C_MapGetRawData":{"fields":{"mapFileName":{"type":"string","id":1}}},"S_MapGetRawData":{"fields":{"errorCode":{"type":"uint32","id":1},"mapFileName":{"type":"string","id":2},"mapRawData":{"type":"MapRawData","id":3}}},"C_MeGetDataList":{"fields":{}},"S_MeGetDataList":{"fields":{"errorCode":{"type":"uint32","id":1},"dataList":{"rule":"repeated","type":"MapEditorData","id":2}}},"C_MeGetData":{"fields":{"slotIndex":{"type":"uint32","id":1}}},"S_MeGetData":{"fields":{"errorCode":{"type":"uint32","id":1},"slotIndex":{"type":"uint32","id":2},"data":{"type":"MapEditorData","id":3}}},"C_MeSaveMap":{"fields":{"slotIndex":{"type":"uint32","id":1},"mapRawData":{"type":"MapRawData","id":2},"needReview":{"type":"bool","id":3}}},"S_MeSaveMap":{"fields":{"errorCode":{"type":"uint32","id":1},"isValidForReview":{"type":"bool","id":2}}},"S_NewestConfigVersion":{"fields":{"version":{"type":"string","id":1}}},"C_MmChangeAvailability":{"fields":{"mapFileName":{"type":"string","id":1},"canMcw":{"type":"bool","id":2},"canWr":{"type":"bool","id":3},"canScw":{"type":"bool","id":4}}},"S_MmChangeAvailability":{"fields":{"errorCode":{"type":"uint32","id":1},"mapFileName":{"type":"string","id":2},"canMcw":{"type":"bool","id":3},"canWr":{"type":"bool","id":4},"canScw":{"type":"bool","id":5}}},"C_MmReloadAllMaps":{"fields":{}},"S_MmReloadAllMaps":{"fields":{"errorCode":{"type":"uint32","id":1}}},"C_MmMergeMap":{"fields":{"srcMapFileName":{"type":"string","id":1},"dstMapFileName":{"type":"string","id":2}}},"S_MmMergeMap":{"fields":{"errorCode":{"type":"uint32","id":1},"srcMapFileName":{"type":"string","id":2},"dstMapFileName":{"type":"string","id":3},"dstMapRawData":{"type":"MapRawData","id":4},"dstMapExtraData":{"type":"MapExtraData","id":5}}},"C_MmDeleteMap":{"fields":{"mapFileName":{"type":"string","id":1}}},"S_MmDeleteMap":{"fields":{"errorCode":{"type":"uint32","id":1},"mapFileName":{"type":"string","id":2}}},"C_MmGetReviewingMaps":{"fields":{}},"S_MmGetReviewingMaps":{"fields":{"errorCode":{"type":"uint32","id":1},"maps":{"rule":"repeated","type":"MapEditorData","id":2}}},"C_MmReviewMap":{"fields":{"designerUserId":{"type":"uint32","id":1},"slotIndex":{"type":"uint32","id":2},"modifiedTime":{"type":"uint32","id":3},"isAccept":{"type":"bool","id":4},"rejectReason":{"type":"string","id":5}}},"S_MmReviewMap":{"fields":{"errorCode":{"type":"uint32","id":1},"isAccept":{"type":"bool","id":2}}},"S_ServerDisconnect":{"fields":{"errorCode":{"type":"uint32","id":1}}},"C_GetUserPublicInfo":{"fields":{"userId":{"type":"uint32","id":1}}},"S_GetUserPublicInfo":{"fields":{"errorCode":{"type":"uint32","id":0},"id":{"type":"uint32","id":1},"nickname":{"type":"string","id":2},"registerTime":{"type":"uint32","id":3},"lastLoginTime":{"type":"uint32","id":4},"loginCount":{"type":"uint32","id":5},"onlineTime":{"type":"uint32","id":6},"discordId":{"type":"string","id":7},"isAdmin":{"type":"uint32","id":10},"isCoCommitee":{"type":"uint32","id":11},"isMapCommitee":{"type":"uint32","id":12},"mcw2pWins":{"type":"uint32","id":20},"mcw2pLoses":{"type":"uint32","id":21},"mcw2pDraws":{"type":"uint32","id":22},"mcw3pWins":{"type":"uint32","id":23},"mcw3pLoses":{"type":"uint32","id":24},"mcw3pDraws":{"type":"uint32","id":25},"mcw4pWins":{"type":"uint32","id":26},"mcw4pLoses":{"type":"uint32","id":27},"mcw4pDraws":{"type":"uint32","id":28},"rank2pWins":{"type":"uint32","id":40},"rank2pLoses":{"type":"uint32","id":41},"rank2pDraws":{"type":"uint32","id":42},"rank2pScore":{"type":"uint32","id":43}}},"C_UserChangeNickname":{"fields":{"nickname":{"type":"string","id":1}}},"S_UserChangeNickname":{"fields":{"errorCode":{"type":"uint32","id":1},"nickname":{"type":"string","id":2}}},"C_UserChangeDiscordId":{"fields":{"discordId":{"type":"string","id":1}}},"S_UserChangeDiscordId":{"fields":{"errorCode":{"type":"uint32","id":1},"discordId":{"type":"string","id":2}}},"C_UserGetOnlineUsers":{"fields":{}},"S_UserGetOnlineUsers":{"fields":{"errorCode":{"type":"uint32","id":1},"totalCount":{"type":"uint32","id":2},"userInfos":{"rule":"repeated","type":"UserBriefInfo","id":3}}},"C_McrCreateWar":{"fields":{"mapFileName":{"type":"string","id":1},"warName":{"type":"string","id":4},"warPassword":{"type":"string","id":5},"warComment":{"type":"string","id":6},"configVersion":{"type":"string","id":7},"playerIndex":{"type":"uint32","id":8},"teamIndex":{"type":"uint32","id":9},"coId":{"type":"uint32","id":10},"warRuleIndex":{"type":"uint32","id":11},"hasFog":{"type":"uint32","id":20},"timeLimit":{"type":"uint32","id":21},"initialFund":{"type":"uint32","id":22},"incomeModifier":{"type":"uint32","id":23},"initialEnergy":{"type":"uint32","id":24},"energyGrowthModifier":{"type":"uint32","id":25},"moveRangeModifier":{"type":"int32","id":26},"attackPowerModifier":{"type":"int32","id":27},"visionRangeModifier":{"type":"int32","id":28},"bannedCoIdList":{"rule":"repeated","type":"int32","id":29},"luckLowerLimit":{"type":"int32","id":30},"luckUpperLimit":{"type":"int32","id":31}}},"S_McrCreateWar":{"fields":{"errorCode":{"type":"uint32","id":1}}},"C_McrExitWar":{"fields":{"infoId":{"type":"uint32","id":1}}},"S_McrExitWar":{"fields":{"errorCode":{"type":"uint32","id":1}}},"C_McrGetJoinedWaitingInfos":{"fields":{}},"S_McrGetJoinedWaitingInfos":{"fields":{"errorCode":{"type":"uint32","id":1},"warInfos":{"rule":"repeated","type":"McrWaitingInfo","id":2}}},"C_McrGetUnjoinedWaitingInfos":{"fields":{}},"S_McrGetUnjoinedWaitingInfos":{"fields":{"errorCode":{"type":"uint32","id":1},"warInfos":{"rule":"repeated","type":"McrWaitingInfo","id":2}}},"C_McrJoinWar":{"fields":{"infoId":{"type":"uint32","id":1},"playerIndex":{"type":"uint32","id":2},"teamIndex":{"type":"uint32","id":3},"coId":{"type":"uint32","id":4}}},"S_McrJoinWar":{"fields":{"errorCode":{"type":"uint32","id":1},"isStarted":{"type":"bool","id":2}}},"C_McrGetJoinedOngoingInfos":{"fields":{}},"S_McrGetJoinedOngoingInfos":{"fields":{"infos":{"rule":"repeated","type":"McwOngoingDetail","id":1}}},"C_McrContinueWar":{"fields":{"warId":{"type":"uint32","id":1}}},"S_McrContinueWar":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"war":{"type":"SerializedWar","id":3}}},"C_McrGetReplayInfos":{"fields":{"replayId":{"type":"uint32","id":1},"mapName":{"type":"string","id":2}}},"S_McrGetReplayInfos":{"fields":{"errorCode":{"type":"uint32","id":1},"replayId":{"type":"uint32","id":2},"mapName":{"type":"string","id":3},"infos":{"rule":"repeated","type":"McwReplayInfo","id":4}}},"C_McrGetReplayData":{"fields":{"replayId":{"type":"uint32","id":1}}},"S_McrGetReplayData":{"fields":{"errorCode":{"type":"uint32","id":1},"replayId":{"type":"uint32","id":2},"encodedWar":{"type":"bytes","id":3},"userNicknames":{"rule":"repeated","type":"string","id":4}}},"C_McwWatchMakeRequest":{"fields":{"warId":{"type":"uint32","id":1},"dstUserIds":{"rule":"repeated","type":"uint32","id":2}}},"S_McwWatchMakeRequest":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"dstUserIds":{"rule":"repeated","type":"uint32","id":3}}},"C_McwWatchHandleRequest":{"fields":{"warId":{"type":"uint32","id":1},"acceptSrcUserIds":{"rule":"repeated","type":"uint32","id":2},"declineSrcUserIds":{"rule":"repeated","type":"uint32","id":3}}},"S_McwWatchHandleRequest":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"acceptSrcUserIds":{"rule":"repeated","type":"uint32","id":3},"declineSrcUserIds":{"rule":"repeated","type":"uint32","id":4}}},"C_McwWatchDeleteWatcher":{"fields":{"warId":{"type":"uint32","id":1},"watcherUserIds":{"rule":"repeated","type":"uint32","id":2}}},"S_McwWatchDeleteWatcher":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"watcherUserIds":{"rule":"repeated","type":"uint32","id":3}}},"C_McwWatchGetUnwatchedWarInfos":{"fields":{}},"S_McwWatchGetUnwatchedWarInfos":{"fields":{"errorCode":{"type":"uint32","id":1},"infos":{"rule":"repeated","type":"McwWatchInfo","id":2}}},"C_McwWatchGetRequestedWarInfos":{"fields":{}},"S_McwWatchGetRequestedWarInfos":{"fields":{"errorCode":{"type":"uint32","id":1},"infos":{"rule":"repeated","type":"McwWatchInfo","id":2}}},"C_McwWatchGetWatchedWarInfos":{"fields":{}},"S_McwWatchGetWatchedWarInfos":{"fields":{"errorCode":{"type":"uint32","id":1},"infos":{"rule":"repeated","type":"McwWatchInfo","id":2}}},"C_McwWatchGetOngoingWarInfos":{"fields":{}},"S_McwWatchGetOngoingWarInfos":{"fields":{"errorCode":{"type":"uint32","id":1},"infos":{"rule":"repeated","type":"McwWatchInfo","id":2}}},"C_McwWatchContinueWar":{"fields":{"warId":{"type":"uint32","id":1}}},"S_McwWatchContinueWar":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"war":{"type":"SerializedWar","id":3}}},"C_McwPlayerSyncWar":{"fields":{"warId":{"type":"uint32","id":1},"nextActionId":{"type":"uint32","id":2},"requestType":{"type":"uint32","id":3}}},"S_McwPlayerSyncWar":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"nextActionId":{"type":"uint32","id":3},"war":{"type":"SerializedWar","id":4},"status":{"type":"uint32","id":5},"requestType":{"type":"uint32","id":6}}},"C_McwPlayerBeginTurn":{"fields":{"warId":{"type":"uint32","id":1},"actionId":{"type":"uint32","id":2}}},"S_McwPlayerBeginTurn":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"actionContainer":{"type":"WarActionContainer","id":3}}},"C_McwPlayerEndTurn":{"fields":{"warId":{"type":"uint32","id":1},"actionId":{"type":"uint32","id":2}}},"S_McwPlayerEndTurn":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"actionContainer":{"type":"WarActionContainer","id":3}}},"C_McwPlayerSurrender":{"fields":{"warId":{"type":"uint32","id":1},"actionId":{"type":"uint32","id":2},"isBoot":{"type":"bool","id":3}}},"S_McwPlayerSurrender":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"actionContainer":{"type":"WarActionContainer","id":3}}},"C_McwPlayerProduceUnit":{"fields":{"warId":{"type":"uint32","id":1},"actionId":{"type":"uint32","id":2},"gridIndex":{"type":"GridIndex","id":3},"unitType":{"type":"uint32","id":4}}},"S_McwPlayerProduceUnit":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"actionContainer":{"type":"WarActionContainer","id":3}}},"C_McwPlayerDeleteUnit":{"fields":{"warId":{"type":"uint32","id":1},"actionId":{"type":"uint32","id":2},"gridIndex":{"type":"GridIndex","id":3}}},"S_McwPlayerDeleteUnit":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"actionContainer":{"type":"WarActionContainer","id":3}}},"C_McwPlayerVoteForDraw":{"fields":{"warId":{"type":"uint32","id":1},"actionId":{"type":"uint32","id":2},"isAgree":{"type":"bool","id":3}}},"S_McwPlayerVoteForDraw":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"actionContainer":{"type":"WarActionContainer","id":3}}},"C_McwUnitWait":{"fields":{"warId":{"type":"uint32","id":1},"actionId":{"type":"uint32","id":2},"path":{"rule":"repeated","type":"GridIndex","id":3},"launchUnitId":{"type":"uint32","id":4}}},"S_McwUnitWait":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"actionContainer":{"type":"WarActionContainer","id":3}}},"C_McwUnitBeLoaded":{"fields":{"warId":{"type":"uint32","id":1},"actionId":{"type":"uint32","id":2},"path":{"rule":"repeated","type":"GridIndex","id":3},"launchUnitId":{"type":"uint32","id":4}}},"S_McwUnitBeLoaded":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"actionContainer":{"type":"WarActionContainer","id":3}}},"C_McwUnitCaptureTile":{"fields":{"warId":{"type":"uint32","id":1},"actionId":{"type":"uint32","id":2},"path":{"rule":"repeated","type":"GridIndex","id":3},"launchUnitId":{"type":"uint32","id":4}}},"S_McwUnitCaptureTile":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"actionContainer":{"type":"WarActionContainer","id":3}}},"C_McwUnitAttack":{"fields":{"warId":{"type":"uint32","id":1},"actionId":{"type":"uint32","id":2},"path":{"rule":"repeated","type":"GridIndex","id":3},"launchUnitId":{"type":"uint32","id":4},"targetGridIndex":{"type":"GridIndex","id":5}}},"S_McwUnitAttack":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"actionContainer":{"type":"WarActionContainer","id":3}}},"C_McwUnitDrop":{"fields":{"warId":{"type":"uint32","id":1},"actionId":{"type":"uint32","id":2},"path":{"rule":"repeated","type":"GridIndex","id":3},"launchUnitId":{"type":"uint32","id":4},"dropDestinations":{"rule":"repeated","type":"DropDestination","id":5}}},"S_McwUnitDrop":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"actionContainer":{"type":"WarActionContainer","id":3}}},"C_McwUnitBuildTile":{"fields":{"warId":{"type":"uint32","id":1},"actionId":{"type":"uint32","id":2},"path":{"rule":"repeated","type":"GridIndex","id":3},"launchUnitId":{"type":"uint32","id":4}}},"S_McwUnitBuildTile":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"actionContainer":{"type":"WarActionContainer","id":3}}},"C_McwUnitDive":{"fields":{"warId":{"type":"uint32","id":1},"actionId":{"type":"uint32","id":2},"path":{"rule":"repeated","type":"GridIndex","id":3},"launchUnitId":{"type":"uint32","id":4}}},"S_McwUnitDive":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"actionContainer":{"type":"WarActionContainer","id":3}}},"C_McwUnitSurface":{"fields":{"warId":{"type":"uint32","id":1},"actionId":{"type":"uint32","id":2},"path":{"rule":"repeated","type":"GridIndex","id":3},"launchUnitId":{"type":"uint32","id":4}}},"S_McwUnitSurface":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"actionContainer":{"type":"WarActionContainer","id":3}}},"C_McwUnitJoin":{"fields":{"warId":{"type":"uint32","id":1},"actionId":{"type":"uint32","id":2},"path":{"rule":"repeated","type":"GridIndex","id":3},"launchUnitId":{"type":"uint32","id":4}}},"S_McwUnitJoin":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"actionContainer":{"type":"WarActionContainer","id":3}}},"C_McwUnitLaunchFlare":{"fields":{"warId":{"type":"uint32","id":1},"actionId":{"type":"uint32","id":2},"path":{"rule":"repeated","type":"GridIndex","id":3},"launchUnitId":{"type":"uint32","id":4},"targetGridIndex":{"type":"GridIndex","id":5}}},"S_McwUnitLaunchFlare":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"actionContainer":{"type":"WarActionContainer","id":3}}},"C_McwUnitLaunchSilo":{"fields":{"warId":{"type":"uint32","id":1},"actionId":{"type":"uint32","id":2},"path":{"rule":"repeated","type":"GridIndex","id":3},"launchUnitId":{"type":"uint32","id":4},"targetGridIndex":{"type":"GridIndex","id":5}}},"S_McwUnitLaunchSilo":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"actionContainer":{"type":"WarActionContainer","id":3}}},"C_McwUnitProduceUnit":{"fields":{"warId":{"type":"uint32","id":1},"actionId":{"type":"uint32","id":2},"path":{"rule":"repeated","type":"GridIndex","id":3},"launchUnitId":{"type":"uint32","id":4}}},"S_McwUnitProduceUnit":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"actionContainer":{"type":"WarActionContainer","id":3}}},"C_McwUnitSupply":{"fields":{"warId":{"type":"uint32","id":1},"actionId":{"type":"uint32","id":2},"path":{"rule":"repeated","type":"GridIndex","id":3},"launchUnitId":{"type":"uint32","id":4}}},"S_McwUnitSupply":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"actionContainer":{"type":"WarActionContainer","id":3}}},"C_McwUnitLoadCo":{"fields":{"warId":{"type":"uint32","id":1},"actionId":{"type":"uint32","id":2},"path":{"rule":"repeated","type":"GridIndex","id":3},"launchUnitId":{"type":"uint32","id":4}}},"S_McwUnitLoadCo":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"actionContainer":{"type":"WarActionContainer","id":3}}},"C_McwUnitUseCoSkill":{"fields":{"warId":{"type":"uint32","id":1},"actionId":{"type":"uint32","id":2},"path":{"rule":"repeated","type":"GridIndex","id":3},"launchUnitId":{"type":"uint32","id":4},"skillType":{"type":"uint32","id":5}}},"S_McwUnitUseCoSkill":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"actionContainer":{"type":"WarActionContainer","id":3}}},"C_ScrCreateWar":{"fields":{"mapFileName":{"type":"string","id":1},"saveSlotIndex":{"type":"uint32","id":2},"configVersion":{"type":"string","id":3},"playerInfoList":{"rule":"repeated","type":"WarPlayerInfo","id":4},"hasFog":{"type":"uint32","id":20},"initialFund":{"type":"uint32","id":22},"incomeModifier":{"type":"uint32","id":23},"initialEnergy":{"type":"uint32","id":24},"energyGrowthModifier":{"type":"uint32","id":25},"moveRangeModifier":{"type":"int32","id":26},"attackPowerModifier":{"type":"int32","id":27},"visionRangeModifier":{"type":"int32","id":28},"luckLowerLimit":{"type":"int32","id":30},"luckUpperLimit":{"type":"int32","id":31}}},"S_ScrCreateWar":{"fields":{"errorCode":{"type":"uint32","id":1},"warData":{"type":"SerializedWar","id":2}}},"C_ScrGetSaveSlotInfoList":{"fields":{}},"S_ScrGetSaveSlotInfoList":{"fields":{"errorCode":{"type":"uint32","id":1},"infoList":{"rule":"repeated","type":"SaveSlotInfo","id":2}}},"C_ScrContinueWar":{"fields":{"slotIndex":{"type":"uint32","id":1}}},"S_ScrContinueWar":{"fields":{"errorCode":{"type":"uint32","id":1},"slotIndex":{"type":"uint32","id":2},"encodedWar":{"type":"bytes","id":3}}},"C_ScrSaveWar":{"fields":{"slotIndex":{"type":"uint32","id":1},"warData":{"type":"SerializedWar","id":2}}},"S_ScrSaveWar":{"fields":{"errorCode":{"type":"uint32","id":1},"slotIndex":{"type":"uint32","id":2}}},"C_ScrCreateCustomWar":{"fields":{"warData":{"type":"SerializedWar","id":1}}},"S_ScrCreateCustomWar":{"fields":{"errorCode":{"type":"uint32","id":1},"warData":{"type":"SerializedWar","id":2}}},"RPCC_SayHello":{"fields":{"name":{"type":"string","id":1}}},"RPCS_SayHello":{"fields":{"message":{"type":"string","id":1}}},"ReplayValidator":{"methods":{"sayHello":{"requestType":"RPCC_SayHello","responseType":"RPCS_SayHello"}}}}} \ No newline at end of file +{"nested":{"TileCategoryCfg":{"fields":{"category":{"type":"uint32","id":1},"tileTypes":{"rule":"repeated","type":"uint32","id":2}}},"UnitCategoryCfg":{"fields":{"category":{"type":"uint32","id":1},"unitTypes":{"rule":"repeated","type":"uint32","id":2}}},"TileTemplateCfg":{"fields":{"type":{"type":"uint32","id":1},"defenseAmount":{"type":"uint32","id":2},"defenseUnitCategory":{"type":"uint32","id":3},"maxBuildPoint":{"type":"uint32","id":4},"maxCapturePoint":{"type":"uint32","id":5},"isDefeatedOnCapture":{"type":"uint32","id":6},"repairAmount":{"type":"uint32","id":7},"repairUnitCategory":{"type":"uint32","id":8},"incomePerTurn":{"type":"uint32","id":9},"visionRange":{"type":"uint32","id":10},"isVisionEnabledForAllPlayers":{"type":"uint32","id":11},"hideUnitCategory":{"type":"uint32","id":12},"isDestroyedWithAdjacentMeteor":{"type":"uint32","id":13},"produceUnitCategory":{"type":"uint32","id":14},"globalAttackBonus":{"type":"uint32","id":15},"globalDefenseBonus":{"type":"uint32","id":16},"maxHp":{"type":"uint32","id":17},"armorType":{"type":"uint32","id":18},"isAffectedByLuck":{"type":"uint32","id":19},"loadCoUnitCategory":{"type":"uint32","id":20}}},"UnitTemplateCfg":{"fields":{"type":{"type":"uint32","id":1},"minAttackRange":{"type":"uint32","id":2},"maxAttackRange":{"type":"uint32","id":3},"canAttackAfterMove":{"type":"uint32","id":4},"canAttackDivingUnits":{"type":"uint32","id":5},"primaryWeaponMaxAmmo":{"type":"uint32","id":6},"maxHp":{"type":"uint32","id":7},"armorType":{"type":"uint32","id":8},"isAffectedByLuck":{"type":"uint32","id":9},"moveRange":{"type":"uint32","id":10},"moveType":{"type":"uint32","id":11},"maxFuel":{"type":"uint32","id":12},"fuelConsumptionPerTurn":{"type":"uint32","id":13},"fuelConsumptionInDiving":{"type":"uint32","id":14},"isDestroyedOnOutOfFuel":{"type":"uint32","id":15},"maxLoadUnitsCount":{"type":"uint32","id":16},"loadUnitCategory":{"type":"uint32","id":17},"canLaunchLoadedUnits":{"type":"uint32","id":18},"canDropLoadedUnits":{"type":"uint32","id":19},"canSupplyLoadedUnits":{"type":"uint32","id":20},"repairAmountForLoadedUnits":{"type":"uint32","id":21},"loadableTileCategory":{"type":"uint32","id":22},"canSupplyAdjacentUnits":{"type":"uint32","id":23},"produceUnitType":{"type":"uint32","id":24},"maxProduceMaterial":{"type":"uint32","id":25},"maxBuildMaterial":{"type":"uint32","id":26},"canCaptureTile":{"type":"uint32","id":27},"canLaunchSilo":{"type":"uint32","id":28},"productionCost":{"type":"uint32","id":29},"visionRange":{"type":"uint32","id":30},"flareMaxAmmo":{"type":"uint32","id":31},"flareMaxRange":{"type":"uint32","id":32},"flareRadius":{"type":"uint32","id":33}}},"DamageChartCfg":{"fields":{"attackerType":{"type":"uint32","id":1},"armorType":{"type":"uint32","id":2},"weaponType":{"type":"uint32","id":3},"damage":{"type":"uint32","id":4}}},"MoveCostCfg":{"fields":{"tileType":{"type":"uint32","id":1},"moveType":{"type":"uint32","id":2},"cost":{"type":"uint32","id":3}}},"UnitPromotionCfg":{"fields":{"promotion":{"type":"uint32","id":1},"attackBonus":{"type":"uint32","id":2},"defenseBonus":{"type":"uint32","id":3}}},"VisionBonusCfg":{"fields":{"unitType":{"type":"uint32","id":1},"tileType":{"type":"uint32","id":2},"visionBonus":{"type":"uint32","id":3}}},"BuildableTileCfg":{"fields":{"unitType":{"type":"uint32","id":1},"srcTileType":{"type":"uint32","id":2},"dstTileType":{"type":"uint32","id":3}}},"PlayerRankCfg":{"fields":{"minScore":{"type":"uint32","id":1},"rank":{"type":"uint32","id":2}}},"CoBasicCfg":{"fields":{"coId":{"type":"uint32","id":1},"name":{"type":"string","id":2},"zoneRadius":{"type":"uint32","id":3},"boardCostPercentage":{"type":"int32","id":4},"zoneExpansionEnergyList":{"rule":"repeated","type":"uint32","id":5},"powerEnergyList":{"rule":"repeated","type":"int32","id":6},"isEnabled":{"type":"uint32","id":7},"designer":{"type":"string","id":8},"fullPortrait":{"type":"string","id":9},"tier":{"type":"uint32","id":10},"passiveSkills":{"rule":"repeated","type":"uint32","id":20},"powerSkills":{"rule":"repeated","type":"uint32","id":21},"superPowerSkills":{"rule":"repeated","type":"uint32","id":22}}},"CoSkillCfg":{"fields":{"skillId":{"type":"uint32","id":1},"name":{"type":"string","id":2},"showZone":{"type":"uint32","id":3},"desc":{"rule":"repeated","type":"string","id":4},"attackBonus":{"rule":"repeated","type":"int32","id":10},"defenseBonus":{"rule":"repeated","type":"int32","id":11},"moveRangeBonus":{"rule":"repeated","type":"int32","id":12},"maxAttackRangeBonus":{"rule":"repeated","type":"int32","id":13},"selfHpGain":{"rule":"repeated","type":"int32","id":14},"enemyHpGain":{"rule":"repeated","type":"int32","id":15},"selfPrimaryAmmoGain":{"rule":"repeated","type":"int32","id":16},"enemyPrimaryAmmoGain":{"rule":"repeated","type":"int32","id":17},"selfFuelGain":{"rule":"repeated","type":"int32","id":18},"enemyFuelGain":{"rule":"repeated","type":"int32","id":19},"selfMaterialGain":{"rule":"repeated","type":"int32","id":20},"enemyMaterialGain":{"rule":"repeated","type":"int32","id":21},"selfHpRecovery":{"rule":"repeated","type":"int32","id":22},"indiscriminateAreaDamage":{"rule":"repeated","type":"int32","id":23},"selfPromotionGain":{"rule":"repeated","type":"int32","id":24},"unitVisionRangeBonus":{"rule":"repeated","type":"int32","id":25},"unitTrueVision":{"rule":"repeated","type":"int32","id":26},"attackBonusByPromotion":{"rule":"repeated","type":"int32","id":27},"defenseBonusByPromotion":{"rule":"repeated","type":"int32","id":28},"promotionBonusByAttack":{"rule":"repeated","type":"int32","id":29},"selfPrimaryAmmoRecovery":{"rule":"repeated","type":"int32","id":30},"selfFuelRecovery":{"rule":"repeated","type":"int32","id":31}}},"FullConfig":{"fields":{"TileCategory":{"rule":"repeated","type":"TileCategoryCfg","id":1},"UnitCategory":{"rule":"repeated","type":"UnitCategoryCfg","id":2},"TileTemplate":{"rule":"repeated","type":"TileTemplateCfg","id":3},"UnitTemplate":{"rule":"repeated","type":"UnitTemplateCfg","id":4},"DamageChart":{"rule":"repeated","type":"DamageChartCfg","id":5},"MoveCost":{"rule":"repeated","type":"MoveCostCfg","id":6},"UnitPromotion":{"rule":"repeated","type":"UnitPromotionCfg","id":7},"VisionBonus":{"rule":"repeated","type":"VisionBonusCfg","id":8},"BuildableTile":{"rule":"repeated","type":"BuildableTileCfg","id":9},"PlayerRank":{"rule":"repeated","type":"PlayerRankCfg","id":10},"CoBasic":{"rule":"repeated","type":"CoBasicCfg","id":11},"CoSkill":{"rule":"repeated","type":"CoSkillCfg","id":12}}},"MapRawData":{"fields":{"mapDesigner":{"type":"string","id":1},"mapName":{"type":"string","id":2},"mapNameEnglish":{"type":"string","id":3},"mapWidth":{"type":"uint32","id":4},"mapHeight":{"type":"uint32","id":5},"isMultiPlayer":{"type":"bool","id":6},"isSinglePlayer":{"type":"bool","id":7},"playersCount":{"type":"uint32","id":8},"tileBases":{"rule":"repeated","type":"uint32","id":9},"tileObjects":{"rule":"repeated","type":"uint32","id":10},"units":{"rule":"repeated","type":"uint32","id":11},"unitDataList":{"rule":"repeated","type":"SerializedWarUnit","id":12},"tileDataList":{"rule":"repeated","type":"SerializedWarTile","id":13},"designerUserId":{"type":"uint32","id":14},"modifiedTime":{"type":"uint32","id":15},"warRuleList":{"rule":"repeated","type":"RuleForWar","id":16}}},"MapExtraData":{"fields":{"mapFileName":{"type":"string","id":1},"mapDesigner":{"type":"string","id":2},"mapName":{"type":"string","id":3},"mapNameEnglish":{"type":"string","id":4},"mapWidth":{"type":"uint32","id":5},"mapHeight":{"type":"uint32","id":6},"playersCount":{"type":"uint32","id":7},"designerUserId":{"type":"uint32","id":8},"modifiedTime":{"type":"uint32","id":9},"isDeleted":{"type":"uint32","id":10},"rating":{"type":"float","id":11},"canMcw":{"type":"uint32","id":20},"canWr":{"type":"uint32","id":21},"canScw":{"type":"uint32","id":22},"mcwPlayedTimes":{"type":"uint32","id":30},"mcwTotalTurns":{"type":"uint32","id":31},"mcwP1Wins":{"type":"uint32","id":32},"mcwP1Loses":{"type":"uint32","id":33},"mcwP1Draws":{"type":"uint32","id":34},"mcwP2Wins":{"type":"uint32","id":35},"mcwP2Loses":{"type":"uint32","id":36},"mcwP2Draws":{"type":"uint32","id":37},"mcwP3Wins":{"type":"uint32","id":38},"mcwP3Loses":{"type":"uint32","id":39},"mcwP3Draws":{"type":"uint32","id":40},"mcwP4Wins":{"type":"uint32","id":41},"mcwP4Loses":{"type":"uint32","id":42},"mcwP4Draws":{"type":"uint32","id":43},"rankPlayedTimes":{"type":"uint32","id":50},"rankTotalTurns":{"type":"uint32","id":51},"rankP1Wins":{"type":"uint32","id":52},"rankP1Loses":{"type":"uint32","id":53},"rankP1Draws":{"type":"uint32","id":54},"rankP2Wins":{"type":"uint32","id":55},"rankP2Loses":{"type":"uint32","id":56},"rankP2Draws":{"type":"uint32","id":57},"rankP3Wins":{"type":"uint32","id":58},"rankP3Loses":{"type":"uint32","id":59},"rankP3Draws":{"type":"uint32","id":60},"rankP4Wins":{"type":"uint32","id":61},"rankP4Loses":{"type":"uint32","id":62},"rankP4Draws":{"type":"uint32","id":63}}},"MapEditorData":{"fields":{"designerUserId":{"type":"uint32","id":1},"slotIndex":{"type":"uint32","id":2},"reviewStatus":{"type":"uint32","id":3},"mapRawData":{"type":"MapRawData","id":4},"rejectReason":{"type":"string","id":5},"reviewComment":{"type":"string","id":6}}},"RuleForPlayer":{"fields":{"playerIndex":{"type":"uint32","id":1},"teamIndex":{"type":"uint32","id":2}}},"RuleForWar":{"fields":{"ruleName":{"type":"string","id":1},"ruleNameEnglish":{"type":"string","id":2},"hasFog":{"type":"uint32","id":20},"initialFund":{"type":"uint32","id":21},"incomeModifier":{"type":"uint32","id":22},"initialEnergy":{"type":"uint32","id":23},"energyGrowthModifier":{"type":"uint32","id":24},"moveRangeModifier":{"type":"int32","id":25},"attackPowerModifier":{"type":"int32","id":26},"visionRangeModifier":{"type":"int32","id":27},"bannedCoIdList":{"rule":"repeated","type":"int32","id":28},"luckLowerLimit":{"type":"int32","id":29},"luckUpperLimit":{"type":"int32","id":30},"playerRuleList":{"rule":"repeated","type":"RuleForPlayer","id":31}}},"SerializedWarTile":{"fields":{"gridX":{"type":"uint32","id":1},"gridY":{"type":"uint32","id":2},"baseViewId":{"type":"uint32","id":3},"objectViewId":{"type":"uint32","id":4},"currentHp":{"type":"uint32","id":5},"currentBuildPoint":{"type":"uint32","id":6},"currentCapturePoint":{"type":"uint32","id":7}}},"SerializedWarUnit":{"fields":{"gridX":{"type":"uint32","id":1},"gridY":{"type":"uint32","id":2},"viewId":{"type":"uint32","id":3},"unitId":{"type":"uint32","id":4},"state":{"type":"uint32","id":5},"primaryWeaponCurrentAmmo":{"type":"uint32","id":6},"currentHp":{"type":"uint32","id":7},"isCapturingTile":{"type":"bool","id":8},"isDiving":{"type":"bool","id":9},"flareCurrentAmmo":{"type":"uint32","id":10},"currentFuel":{"type":"uint32","id":11},"currentBuildMaterial":{"type":"uint32","id":12},"currentProduceMaterial":{"type":"uint32","id":13},"currentPromotion":{"type":"uint32","id":14},"isBuildingTile":{"type":"bool","id":15},"loaderUnitId":{"type":"uint32","id":16}}},"SerializedWarPlayer":{"fields":{"fund":{"type":"uint32","id":1},"hasVotedForDraw":{"type":"bool","id":2},"isAlive":{"type":"bool","id":3},"playerIndex":{"type":"uint32","id":4},"teamIndex":{"type":"uint32","id":5},"userId":{"type":"uint32","id":6},"nickname":{"type":"string","id":7},"coId":{"type":"uint32","id":8},"coUnitId":{"type":"uint32","id":9},"coCurrentEnergy":{"type":"uint32","id":10},"coUsingSkillType":{"type":"uint32","id":11},"coIsDestroyedInTurn":{"type":"bool","id":12},"watchOngoingSrcUserIdList":{"rule":"repeated","type":"uint32","id":13},"watchRequestSrcUserIdList":{"rule":"repeated","type":"uint32","id":14}}},"SerializedWarTurn":{"fields":{"turnIndex":{"type":"uint32","id":1},"playerIndex":{"type":"uint32","id":2},"turnPhaseCode":{"type":"uint32","id":3},"enterTurnTime":{"type":"uint32","id":4}}},"SerializedWarTileMap":{"fields":{"tiles":{"rule":"repeated","type":"SerializedWarTile","id":1}}},"SerializedWarUnitMap":{"fields":{"nextUnitId":{"type":"uint32","id":1},"units":{"rule":"repeated","type":"SerializedWarUnit","id":2}}},"SerializedWarFogMapForPath":{"fields":{"playerIndex":{"type":"uint32","id":1},"encodedMap":{"type":"string","id":2}}},"SerializedWarFogMap":{"fields":{"forceFogCode":{"type":"uint32","id":1},"forceExpirePlayerIndex":{"type":"uint32","id":2},"forceExpireTurnIndex":{"type":"uint32","id":3},"mapsForPath":{"rule":"repeated","type":"SerializedWarFogMapForPath","id":4}}},"SerializedWarField":{"fields":{"fogMap":{"type":"SerializedWarFogMap","id":1},"tileMap":{"type":"SerializedWarTileMap","id":2},"unitMap":{"type":"SerializedWarUnitMap","id":3}}},"SerializedWar":{"fields":{"warId":{"type":"uint32","id":1},"configVersion":{"type":"string","id":2},"mapFileName":{"type":"string","id":3},"singlePlayerWarType":{"type":"uint32","id":4},"saveSlotIndex":{"type":"uint32","id":5},"warName":{"type":"string","id":6},"warPassword":{"type":"string","id":7},"warComment":{"type":"string","id":8},"hasFogByDefault":{"type":"bool","id":9},"timeLimit":{"type":"uint32","id":10},"initialFund":{"type":"uint32","id":11},"incomeModifier":{"type":"uint32","id":12},"initialEnergy":{"type":"uint32","id":13},"energyGrowthModifier":{"type":"uint32","id":14},"moveRangeModifier":{"type":"int32","id":15},"attackPowerModifier":{"type":"int32","id":16},"visionRangeModifier":{"type":"int32","id":17},"bannedCoIdList":{"rule":"repeated","type":"int32","id":18},"luckLowerLimit":{"type":"int32","id":19},"luckUpperLimit":{"type":"int32","id":20},"warRuleIndex":{"type":"uint32","id":21},"isSinglePlayerCheating":{"type":"bool","id":22},"nextActionId":{"type":"uint32","id":31},"remainingVotesForDraw":{"type":"uint32","id":32},"executedActions":{"rule":"repeated","type":"WarActionContainer","id":34},"players":{"rule":"repeated","type":"SerializedWarPlayer","id":35},"turn":{"type":"SerializedWarTurn","id":36},"field":{"type":"SerializedWarField","id":37},"seedRandomState":{"type":"SeedRandomState","id":38},"seedRandomInitState":{"type":"SeedRandomState","id":39}}},"WarUnitRepairData":{"fields":{"unitId":{"type":"uint32","id":1},"gridIndex":{"type":"GridIndex","id":2},"deltaHp":{"type":"uint32","id":3},"deltaPrimaryWeaponAmmo":{"type":"uint32","id":4},"deltaFuel":{"type":"uint32","id":5},"deltaFlareAmmo":{"type":"uint32","id":6}}},"WarUseCoSkillExtraData":{"fields":{"indiscriminateAreaDamageCenter":{"type":"GridIndex","id":1}}},"WarActionPlayerBeginTurn":{"fields":{"remainingFund":{"type":"uint32","id":1},"isDefeated":{"type":"bool","id":2},"repairDataByTile":{"rule":"repeated","type":"WarUnitRepairData","id":3},"repairDataByUnit":{"rule":"repeated","type":"WarUnitRepairData","id":4},"recoverDataByCo":{"rule":"repeated","type":"WarUnitRepairData","id":5}}},"WarActionPlayerEndTurn":{"fields":{}},"WarActionPlayerSurrender":{"fields":{"isBoot":{"type":"bool","id":1}}},"WarActionPlayerProduceUnit":{"fields":{"discoveredUnits":{"rule":"repeated","type":"SerializedWarUnit","id":1},"discoveredTiles":{"rule":"repeated","type":"SerializedWarTile","id":2},"gridIndex":{"type":"GridIndex","id":3},"unitType":{"type":"uint32","id":4},"cost":{"type":"uint32","id":5}}},"WarActionPlayerDeleteUnit":{"fields":{"gridIndex":{"type":"GridIndex","id":1}}},"WarActionPlayerVoteForDraw":{"fields":{"isAgree":{"type":"bool","id":1}}},"WarActionUnitWait":{"fields":{"path":{"type":"MovePath","id":1},"launchUnitId":{"type":"uint32","id":2},"discoveredUnits":{"rule":"repeated","type":"SerializedWarUnit","id":3},"discoveredTiles":{"rule":"repeated","type":"SerializedWarTile","id":4},"actingUnits":{"rule":"repeated","type":"SerializedWarUnit","id":5},"actingTiles":{"rule":"repeated","type":"SerializedWarTile","id":6}}},"WarActionUnitBeLoaded":{"fields":{"path":{"type":"MovePath","id":1},"launchUnitId":{"type":"uint32","id":2},"discoveredUnits":{"rule":"repeated","type":"SerializedWarUnit","id":3},"discoveredTiles":{"rule":"repeated","type":"SerializedWarTile","id":4},"actingUnits":{"rule":"repeated","type":"SerializedWarUnit","id":5},"actingTiles":{"rule":"repeated","type":"SerializedWarTile","id":6}}},"WarActionUnitCaptureTile":{"fields":{"path":{"type":"MovePath","id":1},"launchUnitId":{"type":"uint32","id":2},"discoveredUnits":{"rule":"repeated","type":"SerializedWarUnit","id":3},"discoveredTiles":{"rule":"repeated","type":"SerializedWarTile","id":4},"actingUnits":{"rule":"repeated","type":"SerializedWarUnit","id":5},"actingTiles":{"rule":"repeated","type":"SerializedWarTile","id":6}}},"WarActionUnitAttack":{"fields":{"path":{"type":"MovePath","id":1},"launchUnitId":{"type":"uint32","id":2},"discoveredUnits":{"rule":"repeated","type":"SerializedWarUnit","id":3},"discoveredTiles":{"rule":"repeated","type":"SerializedWarTile","id":4},"actingUnits":{"rule":"repeated","type":"SerializedWarUnit","id":5},"actingTiles":{"rule":"repeated","type":"SerializedWarTile","id":6},"targetGridIndex":{"type":"GridIndex","id":7},"attackDamage":{"type":"uint32","id":8},"counterDamage":{"type":"uint32","id":9},"lostPlayerIndex":{"type":"uint32","id":10},"attackerUnitAfterAction":{"type":"SerializedWarUnit","id":11},"targetUnitAfterAction":{"type":"SerializedWarUnit","id":12},"attackerCoEnergy":{"type":"uint32","id":13},"targetCoEnergy":{"type":"uint32","id":14}}},"WarActionUnitDrop":{"fields":{"path":{"type":"MovePath","id":1},"launchUnitId":{"type":"uint32","id":2},"discoveredUnits":{"rule":"repeated","type":"SerializedWarUnit","id":3},"discoveredTiles":{"rule":"repeated","type":"SerializedWarTile","id":4},"actingUnits":{"rule":"repeated","type":"SerializedWarUnit","id":5},"actingTiles":{"rule":"repeated","type":"SerializedWarTile","id":6},"dropDestinations":{"rule":"repeated","type":"DropDestination","id":7},"isDropBlocked":{"type":"bool","id":8}}},"WarActionUnitBuildTile":{"fields":{"path":{"type":"MovePath","id":1},"launchUnitId":{"type":"uint32","id":2},"discoveredUnits":{"rule":"repeated","type":"SerializedWarUnit","id":3},"discoveredTiles":{"rule":"repeated","type":"SerializedWarTile","id":4},"actingUnits":{"rule":"repeated","type":"SerializedWarUnit","id":5},"actingTiles":{"rule":"repeated","type":"SerializedWarTile","id":6}}},"WarActionUnitDive":{"fields":{"path":{"type":"MovePath","id":1},"launchUnitId":{"type":"uint32","id":2},"discoveredUnits":{"rule":"repeated","type":"SerializedWarUnit","id":3},"discoveredTiles":{"rule":"repeated","type":"SerializedWarTile","id":4},"actingUnits":{"rule":"repeated","type":"SerializedWarUnit","id":5},"actingTiles":{"rule":"repeated","type":"SerializedWarTile","id":6}}},"WarActionUnitSurface":{"fields":{"path":{"type":"MovePath","id":1},"launchUnitId":{"type":"uint32","id":2},"discoveredUnits":{"rule":"repeated","type":"SerializedWarUnit","id":3},"discoveredTiles":{"rule":"repeated","type":"SerializedWarTile","id":4},"actingUnits":{"rule":"repeated","type":"SerializedWarUnit","id":5},"actingTiles":{"rule":"repeated","type":"SerializedWarTile","id":6}}},"WarActionUnitJoin":{"fields":{"path":{"type":"MovePath","id":1},"launchUnitId":{"type":"uint32","id":2},"discoveredUnits":{"rule":"repeated","type":"SerializedWarUnit","id":3},"discoveredTiles":{"rule":"repeated","type":"SerializedWarTile","id":4},"actingUnits":{"rule":"repeated","type":"SerializedWarUnit","id":5},"actingTiles":{"rule":"repeated","type":"SerializedWarTile","id":6}}},"WarActionUnitLaunchFlare":{"fields":{"path":{"type":"MovePath","id":1},"launchUnitId":{"type":"uint32","id":2},"discoveredUnits":{"rule":"repeated","type":"SerializedWarUnit","id":3},"discoveredTiles":{"rule":"repeated","type":"SerializedWarTile","id":4},"actingUnits":{"rule":"repeated","type":"SerializedWarUnit","id":5},"actingTiles":{"rule":"repeated","type":"SerializedWarTile","id":6},"targetGridIndex":{"type":"GridIndex","id":7}}},"WarActionUnitLaunchSilo":{"fields":{"path":{"type":"MovePath","id":1},"launchUnitId":{"type":"uint32","id":2},"discoveredUnits":{"rule":"repeated","type":"SerializedWarUnit","id":3},"discoveredTiles":{"rule":"repeated","type":"SerializedWarTile","id":4},"actingUnits":{"rule":"repeated","type":"SerializedWarUnit","id":5},"actingTiles":{"rule":"repeated","type":"SerializedWarTile","id":6},"targetGridIndex":{"type":"GridIndex","id":7}}},"WarActionUnitProduceUnit":{"fields":{"path":{"type":"MovePath","id":1},"launchUnitId":{"type":"uint32","id":2},"discoveredUnits":{"rule":"repeated","type":"SerializedWarUnit","id":3},"discoveredTiles":{"rule":"repeated","type":"SerializedWarTile","id":4},"actingUnits":{"rule":"repeated","type":"SerializedWarUnit","id":5},"actingTiles":{"rule":"repeated","type":"SerializedWarTile","id":6},"cost":{"type":"uint32","id":7}}},"WarActionUnitSupply":{"fields":{"path":{"type":"MovePath","id":1},"launchUnitId":{"type":"uint32","id":2},"discoveredUnits":{"rule":"repeated","type":"SerializedWarUnit","id":3},"discoveredTiles":{"rule":"repeated","type":"SerializedWarTile","id":4},"actingUnits":{"rule":"repeated","type":"SerializedWarUnit","id":5},"actingTiles":{"rule":"repeated","type":"SerializedWarTile","id":6}}},"WarActionUnitLoadCo":{"fields":{"path":{"type":"MovePath","id":1},"launchUnitId":{"type":"uint32","id":2},"discoveredUnits":{"rule":"repeated","type":"SerializedWarUnit","id":3},"discoveredTiles":{"rule":"repeated","type":"SerializedWarTile","id":4},"actingUnits":{"rule":"repeated","type":"SerializedWarUnit","id":5},"actingTiles":{"rule":"repeated","type":"SerializedWarTile","id":6},"cost":{"type":"uint32","id":7}}},"WarActionUnitUseCoSkill":{"fields":{"path":{"type":"MovePath","id":1},"launchUnitId":{"type":"uint32","id":2},"skillType":{"type":"uint32","id":3},"discoveredUnits":{"rule":"repeated","type":"SerializedWarUnit","id":4},"discoveredTiles":{"rule":"repeated","type":"SerializedWarTile","id":5},"actingUnits":{"rule":"repeated","type":"SerializedWarUnit","id":6},"actingTiles":{"rule":"repeated","type":"SerializedWarTile","id":7},"extraDataList":{"rule":"repeated","type":"WarUseCoSkillExtraData","id":8}}},"WarActionContainer":{"fields":{"actionId":{"type":"uint32","id":1},"WarActionPlayerBeginTurn":{"type":"WarActionPlayerBeginTurn","id":11},"WarActionPlayerEndTurn":{"type":"WarActionPlayerEndTurn","id":12},"WarActionPlayerSurrender":{"type":"WarActionPlayerSurrender","id":13},"WarActionPlayerProduceUnit":{"type":"WarActionPlayerProduceUnit","id":14},"WarActionPlayerDeleteUnit":{"type":"WarActionPlayerDeleteUnit","id":15},"WarActionPlayerVoteForDraw":{"type":"WarActionPlayerVoteForDraw","id":16},"WarActionUnitWait":{"type":"WarActionUnitWait","id":17},"WarActionUnitBeLoaded":{"type":"WarActionUnitBeLoaded","id":18},"WarActionUnitCaptureTile":{"type":"WarActionUnitCaptureTile","id":19},"WarActionUnitAttack":{"type":"WarActionUnitAttack","id":20},"WarActionUnitDrop":{"type":"WarActionUnitDrop","id":21},"WarActionUnitBuildTile":{"type":"WarActionUnitBuildTile","id":22},"WarActionUnitDive":{"type":"WarActionUnitDive","id":23},"WarActionUnitSurface":{"type":"WarActionUnitSurface","id":24},"WarActionUnitJoin":{"type":"WarActionUnitJoin","id":25},"WarActionUnitLaunchFlare":{"type":"WarActionUnitLaunchFlare","id":26},"WarActionUnitLaunchSilo":{"type":"WarActionUnitLaunchSilo","id":27},"WarActionUnitProduceUnit":{"type":"WarActionUnitProduceUnit","id":28},"WarActionUnitSupply":{"type":"WarActionUnitSupply","id":29},"WarActionUnitLoadCo":{"type":"WarActionUnitLoadCo","id":30},"WarActionUnitUseCoSkill":{"type":"WarActionUnitUseCoSkill","id":31}}},"GridIndex":{"fields":{"x":{"type":"uint32","id":1},"y":{"type":"uint32","id":2}}},"MovePath":{"fields":{"nodes":{"rule":"repeated","type":"GridIndex","id":1},"isBlocked":{"type":"bool","id":2},"fuelConsumption":{"type":"uint32","id":3}}},"DropDestination":{"fields":{"unitId":{"type":"uint32","id":1},"gridIndex":{"type":"GridIndex","id":2}}},"SeedRandomState":{"fields":{"i":{"type":"uint32","id":1},"j":{"type":"uint32","id":2},"S":{"rule":"repeated","type":"uint32","id":3}}},"BannedCoIdList":{"fields":{"bannedCoIdList":{"rule":"repeated","type":"int32","id":1}}},"McrWaitingInfo":{"fields":{"infoId":{"type":"uint32","id":0},"mapFileName":{"type":"string","id":1},"warName":{"type":"string","id":4},"warPassword":{"type":"string","id":5},"warComment":{"type":"string","id":6},"configVersion":{"type":"string","id":7},"warRuleIndex":{"type":"uint32","id":10},"createTime":{"type":"uint32","id":11},"playerInfoList":{"rule":"repeated","type":"WarPlayerInfo","id":12},"hasFog":{"type":"uint32","id":30},"timeLimit":{"type":"uint32","id":31},"initialFund":{"type":"uint32","id":32},"incomeModifier":{"type":"uint32","id":33},"initialEnergy":{"type":"uint32","id":34},"energyGrowthModifier":{"type":"uint32","id":35},"moveRangeModifier":{"type":"int32","id":36},"attackPowerModifier":{"type":"int32","id":37},"visionRangeModifier":{"type":"int32","id":38},"bannedCoIdList":{"rule":"repeated","type":"int32","id":39},"luckLowerLimit":{"type":"int32","id":40},"luckUpperLimit":{"type":"int32","id":41}}},"McwOngoingDetail":{"fields":{"id":{"type":"uint32","id":1},"configVersion":{"type":"string","id":2},"mapFileName":{"type":"string","id":3},"warName":{"type":"string","id":6},"warPassword":{"type":"string","id":7},"warComment":{"type":"string","id":8},"hasFog":{"type":"uint32","id":11},"timeLimit":{"type":"uint32","id":12},"initialFund":{"type":"uint32","id":13},"incomeModifier":{"type":"uint32","id":14},"initialEnergy":{"type":"uint32","id":15},"energyGrowthModifier":{"type":"uint32","id":16},"moveRangeModifier":{"type":"int32","id":17},"attackPowerModifier":{"type":"int32","id":18},"visionRangeModifier":{"type":"int32","id":19},"p1UserId":{"type":"uint32","id":20},"p1TeamIndex":{"type":"uint32","id":21},"p1IsAlive":{"type":"bool","id":22},"p1CoId":{"type":"int32","id":23},"p1UserNickname":{"type":"string","id":24},"p2UserId":{"type":"uint32","id":25},"p2TeamIndex":{"type":"uint32","id":26},"p2IsAlive":{"type":"bool","id":27},"p2CoId":{"type":"int32","id":28},"p2UserNickname":{"type":"string","id":29},"p3UserId":{"type":"uint32","id":30},"p3TeamIndex":{"type":"uint32","id":31},"p3IsAlive":{"type":"bool","id":32},"p3CoId":{"type":"int32","id":33},"p3UserNickname":{"type":"string","id":34},"p4UserId":{"type":"uint32","id":35},"p4TeamIndex":{"type":"uint32","id":36},"p4IsAlive":{"type":"bool","id":37},"p4CoId":{"type":"int32","id":38},"p4UserNickname":{"type":"string","id":39},"playerIndexInTurn":{"type":"uint32","id":40},"turnIndex":{"type":"uint32","id":41},"enterTurnTime":{"type":"uint32","id":42}}},"McwReplayInfo":{"fields":{"replayId":{"type":"uint32","id":1},"configVersion":{"type":"string","id":2},"mapFileName":{"type":"string","id":3},"hasFog":{"type":"uint32","id":6},"turnIndex":{"type":"uint32","id":7},"nextActionId":{"type":"uint32","id":8},"warEndTime":{"type":"uint32","id":9},"p1UserId":{"type":"uint32","id":20},"p1TeamIndex":{"type":"uint32","id":21},"p1UserNickname":{"type":"string","id":22},"p2UserId":{"type":"uint32","id":23},"p2TeamIndex":{"type":"uint32","id":24},"p2UserNickname":{"type":"string","id":25},"p3UserId":{"type":"uint32","id":26},"p3TeamIndex":{"type":"uint32","id":27},"p3UserNickname":{"type":"string","id":28},"p4UserId":{"type":"uint32","id":29},"p4TeamIndex":{"type":"uint32","id":30},"p4UserNickname":{"type":"string","id":31}}},"McwWatchRequesterInfo":{"fields":{"userId":{"type":"uint32","id":1},"nickname":{"type":"string","id":2},"isRequestingOthers":{"type":"bool","id":3},"isWatchingOthers":{"type":"bool","id":4}}},"McwWatchInfo":{"fields":{"mcwDetail":{"type":"McwOngoingDetail","id":1},"ongoingDstUserIds":{"rule":"repeated","type":"uint32","id":2},"requestDstUserIds":{"rule":"repeated","type":"uint32","id":3},"ongoingSrcUserIds":{"rule":"repeated","type":"uint32","id":4},"requestSrcUserIds":{"rule":"repeated","type":"uint32","id":5},"requesterInfos":{"rule":"repeated","type":"McwWatchRequesterInfo","id":6}}},"UserBriefInfo":{"fields":{"userId":{"type":"uint32","id":1},"nickname":{"type":"string","id":2}}},"WarPlayerInfo":{"fields":{"playerIndex":{"type":"uint32","id":1},"userId":{"type":"uint32","id":2},"teamIndex":{"type":"uint32","id":3},"coId":{"type":"uint32","id":4},"nickname":{"type":"string","id":5}}},"SaveSlotInfo":{"fields":{"slotIndex":{"type":"uint32","id":1},"mapFileName":{"type":"string","id":2},"warType":{"type":"uint32","id":3},"configVersion":{"type":"string","id":4}}},"MessageContainer":{"fields":{"C_Heartbeat":{"type":"C_Heartbeat","id":0},"S_Heartbeat":{"type":"S_Heartbeat","id":1},"C_Register":{"type":"C_Register","id":2},"S_Register":{"type":"S_Register","id":3},"C_Login":{"type":"C_Login","id":4},"S_Login":{"type":"S_Login","id":5},"C_Logout":{"type":"C_Logout","id":6},"S_Logout":{"type":"S_Logout","id":7},"S_Error":{"type":"S_Error","id":9},"S_ServerDisconnect":{"type":"S_ServerDisconnect","id":11},"S_NewestConfigVersion":{"type":"S_NewestConfigVersion","id":13},"C_GetUserPublicInfo":{"type":"C_GetUserPublicInfo","id":20},"S_GetUserPublicInfo":{"type":"S_GetUserPublicInfo","id":21},"C_UserChangeNickname":{"type":"C_UserChangeNickname","id":22},"S_UserChangeNickname":{"type":"S_UserChangeNickname","id":23},"C_UserChangeDiscordId":{"type":"C_UserChangeDiscordId","id":24},"S_UserChangeDiscordId":{"type":"S_UserChangeDiscordId","id":25},"C_UserGetOnlineUsers":{"type":"C_UserGetOnlineUsers","id":26},"S_UserGetOnlineUsers":{"type":"S_UserGetOnlineUsers","id":27},"C_MapGetEnabledExtraDataList":{"type":"C_MapGetEnabledExtraDataList","id":40},"S_MapGetEnabledExtraDataList":{"type":"S_MapGetEnabledExtraDataList","id":41},"C_MapGetExtraData":{"type":"C_MapGetExtraData","id":42},"S_MapGetExtraData":{"type":"S_MapGetExtraData","id":43},"C_MapGetRawData":{"type":"C_MapGetRawData","id":44},"S_MapGetRawData":{"type":"S_MapGetRawData","id":45},"C_MeGetDataList":{"type":"C_MeGetDataList","id":50},"S_MeGetDataList":{"type":"S_MeGetDataList","id":51},"C_MeGetData":{"type":"C_MeGetData","id":52},"S_MeGetData":{"type":"S_MeGetData","id":53},"C_MeSaveMap":{"type":"C_MeSaveMap","id":54},"S_MeSaveMap":{"type":"S_MeSaveMap","id":55},"C_MmChangeAvailability":{"type":"C_MmChangeAvailability","id":100},"S_MmChangeAvailability":{"type":"S_MmChangeAvailability","id":101},"C_MmReloadAllMaps":{"type":"C_MmReloadAllMaps","id":102},"S_MmReloadAllMaps":{"type":"S_MmReloadAllMaps","id":103},"C_MmMergeMap":{"type":"C_MmMergeMap","id":104},"S_MmMergeMap":{"type":"S_MmMergeMap","id":105},"C_MmDeleteMap":{"type":"C_MmDeleteMap","id":106},"S_MmDeleteMap":{"type":"S_MmDeleteMap","id":107},"C_MmGetReviewingMaps":{"type":"C_MmGetReviewingMaps","id":108},"S_MmGetReviewingMaps":{"type":"S_MmGetReviewingMaps","id":109},"C_MmReviewMap":{"type":"C_MmReviewMap","id":110},"S_MmReviewMap":{"type":"S_MmReviewMap","id":111},"C_McrCreateWar":{"type":"C_McrCreateWar","id":1001},"S_McrCreateWar":{"type":"S_McrCreateWar","id":1002},"C_McrExitWar":{"type":"C_McrExitWar","id":1003},"S_McrExitWar":{"type":"S_McrExitWar","id":1004},"C_McrGetJoinedWaitingInfos":{"type":"C_McrGetJoinedWaitingInfos","id":1005},"S_McrGetJoinedWaitingInfos":{"type":"S_McrGetJoinedWaitingInfos","id":1006},"C_McrGetUnjoinedWaitingInfos":{"type":"C_McrGetUnjoinedWaitingInfos","id":1007},"S_McrGetUnjoinedWaitingInfos":{"type":"S_McrGetUnjoinedWaitingInfos","id":1008},"C_McrJoinWar":{"type":"C_McrJoinWar","id":1009},"S_McrJoinWar":{"type":"S_McrJoinWar","id":1010},"C_McrGetJoinedOngoingInfos":{"type":"C_McrGetJoinedOngoingInfos","id":1011},"S_McrGetJoinedOngoingInfos":{"type":"S_McrGetJoinedOngoingInfos","id":1012},"C_McrContinueWar":{"type":"C_McrContinueWar","id":1013},"S_McrContinueWar":{"type":"S_McrContinueWar","id":1014},"C_McrGetReplayInfos":{"type":"C_McrGetReplayInfos","id":1015},"S_McrGetReplayInfos":{"type":"S_McrGetReplayInfos","id":1016},"C_McrGetReplayData":{"type":"C_McrGetReplayData","id":1017},"S_McrGetReplayData":{"type":"S_McrGetReplayData","id":1018},"C_McwWatchMakeRequest":{"type":"C_McwWatchMakeRequest","id":1031},"S_McwWatchMakeRequest":{"type":"S_McwWatchMakeRequest","id":1032},"C_McwWatchHandleRequest":{"type":"C_McwWatchHandleRequest","id":1033},"S_McwWatchHandleRequest":{"type":"S_McwWatchHandleRequest","id":1034},"C_McwWatchDeleteWatcher":{"type":"C_McwWatchDeleteWatcher","id":1035},"S_McwWatchDeleteWatcher":{"type":"S_McwWatchDeleteWatcher","id":1036},"C_McwWatchGetUnwatchedWarInfos":{"type":"C_McwWatchGetUnwatchedWarInfos","id":1037},"S_McwWatchGetUnwatchedWarInfos":{"type":"S_McwWatchGetUnwatchedWarInfos","id":1038},"C_McwWatchGetOngoingWarInfos":{"type":"C_McwWatchGetOngoingWarInfos","id":1039},"S_McwWatchGetOngoingWarInfos":{"type":"S_McwWatchGetOngoingWarInfos","id":1040},"C_McwWatchGetRequestedWarInfos":{"type":"C_McwWatchGetRequestedWarInfos","id":1041},"S_McwWatchGetRequestedWarInfos":{"type":"S_McwWatchGetRequestedWarInfos","id":1042},"C_McwWatchGetWatchedWarInfos":{"type":"C_McwWatchGetWatchedWarInfos","id":1043},"S_McwWatchGetWatchedWarInfos":{"type":"S_McwWatchGetWatchedWarInfos","id":1044},"C_McwWatchContinueWar":{"type":"C_McwWatchContinueWar","id":1045},"S_McwWatchContinueWar":{"type":"S_McwWatchContinueWar","id":1046},"C_McwPlayerBeginTurn":{"type":"C_McwPlayerBeginTurn","id":1101},"S_McwPlayerBeginTurn":{"type":"S_McwPlayerBeginTurn","id":1102},"C_McwPlayerEndTurn":{"type":"C_McwPlayerEndTurn","id":1103},"S_McwPlayerEndTurn":{"type":"S_McwPlayerEndTurn","id":1104},"C_McwPlayerSurrender":{"type":"C_McwPlayerSurrender","id":1105},"S_McwPlayerSurrender":{"type":"S_McwPlayerSurrender","id":1106},"C_McwPlayerProduceUnit":{"type":"C_McwPlayerProduceUnit","id":1107},"S_McwPlayerProduceUnit":{"type":"S_McwPlayerProduceUnit","id":1108},"C_McwPlayerDeleteUnit":{"type":"C_McwPlayerDeleteUnit","id":1109},"S_McwPlayerDeleteUnit":{"type":"S_McwPlayerDeleteUnit","id":1110},"C_McwPlayerVoteForDraw":{"type":"C_McwPlayerVoteForDraw","id":1111},"S_McwPlayerVoteForDraw":{"type":"S_McwPlayerVoteForDraw","id":1112},"C_McwPlayerSyncWar":{"type":"C_McwPlayerSyncWar","id":1113},"S_McwPlayerSyncWar":{"type":"S_McwPlayerSyncWar","id":1114},"C_McwUnitWait":{"type":"C_McwUnitWait","id":1151},"S_McwUnitWait":{"type":"S_McwUnitWait","id":1152},"C_McwUnitBeLoaded":{"type":"C_McwUnitBeLoaded","id":1153},"S_McwUnitBeLoaded":{"type":"S_McwUnitBeLoaded","id":1154},"C_McwUnitCaptureTile":{"type":"C_McwUnitCaptureTile","id":1155},"S_McwUnitCaptureTile":{"type":"S_McwUnitCaptureTile","id":1156},"C_McwUnitAttack":{"type":"C_McwUnitAttack","id":1157},"S_McwUnitAttack":{"type":"S_McwUnitAttack","id":1158},"C_McwUnitDrop":{"type":"C_McwUnitDrop","id":1159},"S_McwUnitDrop":{"type":"S_McwUnitDrop","id":1160},"C_McwUnitBuildTile":{"type":"C_McwUnitBuildTile","id":1161},"S_McwUnitBuildTile":{"type":"S_McwUnitBuildTile","id":1162},"C_McwUnitDive":{"type":"C_McwUnitDive","id":1163},"S_McwUnitDive":{"type":"S_McwUnitDive","id":1164},"C_McwUnitSurface":{"type":"C_McwUnitSurface","id":1165},"S_McwUnitSurface":{"type":"S_McwUnitSurface","id":1166},"C_McwUnitJoin":{"type":"C_McwUnitJoin","id":1167},"S_McwUnitJoin":{"type":"S_McwUnitJoin","id":1168},"C_McwUnitLaunchFlare":{"type":"C_McwUnitLaunchFlare","id":1169},"S_McwUnitLaunchFlare":{"type":"S_McwUnitLaunchFlare","id":1170},"C_McwUnitLaunchSilo":{"type":"C_McwUnitLaunchSilo","id":1171},"S_McwUnitLaunchSilo":{"type":"S_McwUnitLaunchSilo","id":1172},"C_McwUnitProduceUnit":{"type":"C_McwUnitProduceUnit","id":1173},"S_McwUnitProduceUnit":{"type":"S_McwUnitProduceUnit","id":1174},"C_McwUnitSupply":{"type":"C_McwUnitSupply","id":1175},"S_McwUnitSupply":{"type":"S_McwUnitSupply","id":1176},"C_McwUnitLoadCo":{"type":"C_McwUnitLoadCo","id":1177},"S_McwUnitLoadCo":{"type":"S_McwUnitLoadCo","id":1178},"C_McwUnitUseCoSkill":{"type":"C_McwUnitUseCoSkill","id":1179},"S_McwUnitUseCoSkill":{"type":"S_McwUnitUseCoSkill","id":1180},"C_ScrCreateWar":{"type":"C_ScrCreateWar","id":1501},"S_ScrCreateWar":{"type":"S_ScrCreateWar","id":1502},"C_ScrGetSaveSlotInfoList":{"type":"C_ScrGetSaveSlotInfoList","id":1503},"S_ScrGetSaveSlotInfoList":{"type":"S_ScrGetSaveSlotInfoList","id":1504},"C_ScrContinueWar":{"type":"C_ScrContinueWar","id":1505},"S_ScrContinueWar":{"type":"S_ScrContinueWar","id":1506},"C_ScrSaveWar":{"type":"C_ScrSaveWar","id":1507},"S_ScrSaveWar":{"type":"S_ScrSaveWar","id":1508},"C_ScrCreateCustomWar":{"type":"C_ScrCreateCustomWar","id":1509},"S_ScrCreateCustomWar":{"type":"S_ScrCreateCustomWar","id":1510}}},"C_Heartbeat":{"fields":{"counter":{"type":"uint32","id":1}}},"S_Heartbeat":{"fields":{"errorCode":{"type":"uint32","id":1},"counter":{"type":"uint32","id":2},"timestamp":{"type":"uint32","id":3}}},"C_Register":{"fields":{"account":{"type":"string","id":1},"password":{"type":"string","id":2},"nickname":{"type":"string","id":3}}},"S_Register":{"fields":{"errorCode":{"type":"uint32","id":1},"account":{"type":"string","id":2},"password":{"type":"string","id":3}}},"C_Login":{"fields":{"account":{"type":"string","id":1},"password":{"type":"string","id":2},"isAutoRelogin":{"type":"bool","id":3}}},"S_Login":{"fields":{"errorCode":{"type":"uint32","id":1},"userId":{"type":"uint32","id":2},"account":{"type":"string","id":3},"password":{"type":"string","id":4},"nickname":{"type":"string","id":5},"isAdmin":{"type":"uint32","id":10},"isCoCommitee":{"type":"uint32","id":11},"isMapCommitee":{"type":"uint32","id":12},"rank2pScore":{"type":"uint32","id":20},"discordId":{"type":"string","id":30}}},"C_Logout":{"fields":{}},"S_Logout":{"fields":{"errorCode":{"type":"uint32","id":1},"reason":{"type":"uint32","id":2}}},"S_Error":{"fields":{"errorCode":{"type":"uint32","id":1}}},"C_MapGetEnabledExtraDataList":{"fields":{}},"S_MapGetEnabledExtraDataList":{"fields":{"errorCode":{"type":"uint32","id":1},"dataList":{"rule":"repeated","type":"MapExtraData","id":2}}},"C_MapGetExtraData":{"fields":{"mapFileName":{"type":"string","id":1}}},"S_MapGetExtraData":{"fields":{"errorCode":{"type":"uint32","id":1},"mapFileName":{"type":"string","id":2},"mapExtraData":{"type":"MapExtraData","id":3}}},"C_MapGetRawData":{"fields":{"mapFileName":{"type":"string","id":1}}},"S_MapGetRawData":{"fields":{"errorCode":{"type":"uint32","id":1},"mapFileName":{"type":"string","id":2},"mapRawData":{"type":"MapRawData","id":3}}},"C_MeGetDataList":{"fields":{}},"S_MeGetDataList":{"fields":{"errorCode":{"type":"uint32","id":1},"dataList":{"rule":"repeated","type":"MapEditorData","id":2}}},"C_MeGetData":{"fields":{"slotIndex":{"type":"uint32","id":1}}},"S_MeGetData":{"fields":{"errorCode":{"type":"uint32","id":1},"slotIndex":{"type":"uint32","id":2},"data":{"type":"MapEditorData","id":3}}},"C_MeSaveMap":{"fields":{"slotIndex":{"type":"uint32","id":1},"mapRawData":{"type":"MapRawData","id":2},"needReview":{"type":"bool","id":3}}},"S_MeSaveMap":{"fields":{"errorCode":{"type":"uint32","id":1},"isValidForReview":{"type":"bool","id":2}}},"S_NewestConfigVersion":{"fields":{"version":{"type":"string","id":1}}},"C_MmChangeAvailability":{"fields":{"mapFileName":{"type":"string","id":1},"canMcw":{"type":"bool","id":2},"canWr":{"type":"bool","id":3},"canScw":{"type":"bool","id":4}}},"S_MmChangeAvailability":{"fields":{"errorCode":{"type":"uint32","id":1},"mapFileName":{"type":"string","id":2},"canMcw":{"type":"bool","id":3},"canWr":{"type":"bool","id":4},"canScw":{"type":"bool","id":5}}},"C_MmReloadAllMaps":{"fields":{}},"S_MmReloadAllMaps":{"fields":{"errorCode":{"type":"uint32","id":1}}},"C_MmMergeMap":{"fields":{"srcMapFileName":{"type":"string","id":1},"dstMapFileName":{"type":"string","id":2}}},"S_MmMergeMap":{"fields":{"errorCode":{"type":"uint32","id":1},"srcMapFileName":{"type":"string","id":2},"dstMapFileName":{"type":"string","id":3},"dstMapRawData":{"type":"MapRawData","id":4},"dstMapExtraData":{"type":"MapExtraData","id":5}}},"C_MmDeleteMap":{"fields":{"mapFileName":{"type":"string","id":1}}},"S_MmDeleteMap":{"fields":{"errorCode":{"type":"uint32","id":1},"mapFileName":{"type":"string","id":2}}},"C_MmGetReviewingMaps":{"fields":{}},"S_MmGetReviewingMaps":{"fields":{"errorCode":{"type":"uint32","id":1},"maps":{"rule":"repeated","type":"MapEditorData","id":2}}},"C_MmReviewMap":{"fields":{"designerUserId":{"type":"uint32","id":1},"slotIndex":{"type":"uint32","id":2},"modifiedTime":{"type":"uint32","id":3},"isAccept":{"type":"bool","id":4},"reviewComment":{"type":"string","id":5}}},"S_MmReviewMap":{"fields":{"errorCode":{"type":"uint32","id":1},"isAccept":{"type":"bool","id":2}}},"S_ServerDisconnect":{"fields":{"errorCode":{"type":"uint32","id":1}}},"C_GetUserPublicInfo":{"fields":{"userId":{"type":"uint32","id":1}}},"S_GetUserPublicInfo":{"fields":{"errorCode":{"type":"uint32","id":0},"id":{"type":"uint32","id":1},"nickname":{"type":"string","id":2},"registerTime":{"type":"uint32","id":3},"lastLoginTime":{"type":"uint32","id":4},"loginCount":{"type":"uint32","id":5},"onlineTime":{"type":"uint32","id":6},"discordId":{"type":"string","id":7},"isAdmin":{"type":"uint32","id":10},"isCoCommitee":{"type":"uint32","id":11},"isMapCommitee":{"type":"uint32","id":12},"mcw2pWins":{"type":"uint32","id":20},"mcw2pLoses":{"type":"uint32","id":21},"mcw2pDraws":{"type":"uint32","id":22},"mcw3pWins":{"type":"uint32","id":23},"mcw3pLoses":{"type":"uint32","id":24},"mcw3pDraws":{"type":"uint32","id":25},"mcw4pWins":{"type":"uint32","id":26},"mcw4pLoses":{"type":"uint32","id":27},"mcw4pDraws":{"type":"uint32","id":28},"rank2pWins":{"type":"uint32","id":40},"rank2pLoses":{"type":"uint32","id":41},"rank2pDraws":{"type":"uint32","id":42},"rank2pScore":{"type":"uint32","id":43}}},"C_UserChangeNickname":{"fields":{"nickname":{"type":"string","id":1}}},"S_UserChangeNickname":{"fields":{"errorCode":{"type":"uint32","id":1},"nickname":{"type":"string","id":2}}},"C_UserChangeDiscordId":{"fields":{"discordId":{"type":"string","id":1}}},"S_UserChangeDiscordId":{"fields":{"errorCode":{"type":"uint32","id":1},"discordId":{"type":"string","id":2}}},"C_UserGetOnlineUsers":{"fields":{}},"S_UserGetOnlineUsers":{"fields":{"errorCode":{"type":"uint32","id":1},"totalCount":{"type":"uint32","id":2},"userInfos":{"rule":"repeated","type":"UserBriefInfo","id":3}}},"C_McrCreateWar":{"fields":{"mapFileName":{"type":"string","id":1},"warName":{"type":"string","id":4},"warPassword":{"type":"string","id":5},"warComment":{"type":"string","id":6},"configVersion":{"type":"string","id":7},"playerIndex":{"type":"uint32","id":8},"teamIndex":{"type":"uint32","id":9},"coId":{"type":"uint32","id":10},"warRuleIndex":{"type":"uint32","id":11},"hasFog":{"type":"uint32","id":20},"timeLimit":{"type":"uint32","id":21},"initialFund":{"type":"uint32","id":22},"incomeModifier":{"type":"uint32","id":23},"initialEnergy":{"type":"uint32","id":24},"energyGrowthModifier":{"type":"uint32","id":25},"moveRangeModifier":{"type":"int32","id":26},"attackPowerModifier":{"type":"int32","id":27},"visionRangeModifier":{"type":"int32","id":28},"bannedCoIdList":{"rule":"repeated","type":"int32","id":29},"luckLowerLimit":{"type":"int32","id":30},"luckUpperLimit":{"type":"int32","id":31}}},"S_McrCreateWar":{"fields":{"errorCode":{"type":"uint32","id":1}}},"C_McrExitWar":{"fields":{"infoId":{"type":"uint32","id":1}}},"S_McrExitWar":{"fields":{"errorCode":{"type":"uint32","id":1}}},"C_McrGetJoinedWaitingInfos":{"fields":{}},"S_McrGetJoinedWaitingInfos":{"fields":{"errorCode":{"type":"uint32","id":1},"warInfos":{"rule":"repeated","type":"McrWaitingInfo","id":2}}},"C_McrGetUnjoinedWaitingInfos":{"fields":{}},"S_McrGetUnjoinedWaitingInfos":{"fields":{"errorCode":{"type":"uint32","id":1},"warInfos":{"rule":"repeated","type":"McrWaitingInfo","id":2}}},"C_McrJoinWar":{"fields":{"infoId":{"type":"uint32","id":1},"playerIndex":{"type":"uint32","id":2},"teamIndex":{"type":"uint32","id":3},"coId":{"type":"uint32","id":4}}},"S_McrJoinWar":{"fields":{"errorCode":{"type":"uint32","id":1},"isStarted":{"type":"bool","id":2}}},"C_McrGetJoinedOngoingInfos":{"fields":{}},"S_McrGetJoinedOngoingInfos":{"fields":{"infos":{"rule":"repeated","type":"McwOngoingDetail","id":1}}},"C_McrContinueWar":{"fields":{"warId":{"type":"uint32","id":1}}},"S_McrContinueWar":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"war":{"type":"SerializedWar","id":3}}},"C_McrGetReplayInfos":{"fields":{"replayId":{"type":"uint32","id":1},"mapName":{"type":"string","id":2}}},"S_McrGetReplayInfos":{"fields":{"errorCode":{"type":"uint32","id":1},"replayId":{"type":"uint32","id":2},"mapName":{"type":"string","id":3},"infos":{"rule":"repeated","type":"McwReplayInfo","id":4}}},"C_McrGetReplayData":{"fields":{"replayId":{"type":"uint32","id":1}}},"S_McrGetReplayData":{"fields":{"errorCode":{"type":"uint32","id":1},"replayId":{"type":"uint32","id":2},"encodedWar":{"type":"bytes","id":3},"userNicknames":{"rule":"repeated","type":"string","id":4}}},"C_McwWatchMakeRequest":{"fields":{"warId":{"type":"uint32","id":1},"dstUserIds":{"rule":"repeated","type":"uint32","id":2}}},"S_McwWatchMakeRequest":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"dstUserIds":{"rule":"repeated","type":"uint32","id":3}}},"C_McwWatchHandleRequest":{"fields":{"warId":{"type":"uint32","id":1},"acceptSrcUserIds":{"rule":"repeated","type":"uint32","id":2},"declineSrcUserIds":{"rule":"repeated","type":"uint32","id":3}}},"S_McwWatchHandleRequest":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"acceptSrcUserIds":{"rule":"repeated","type":"uint32","id":3},"declineSrcUserIds":{"rule":"repeated","type":"uint32","id":4}}},"C_McwWatchDeleteWatcher":{"fields":{"warId":{"type":"uint32","id":1},"watcherUserIds":{"rule":"repeated","type":"uint32","id":2}}},"S_McwWatchDeleteWatcher":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"watcherUserIds":{"rule":"repeated","type":"uint32","id":3}}},"C_McwWatchGetUnwatchedWarInfos":{"fields":{}},"S_McwWatchGetUnwatchedWarInfos":{"fields":{"errorCode":{"type":"uint32","id":1},"infos":{"rule":"repeated","type":"McwWatchInfo","id":2}}},"C_McwWatchGetRequestedWarInfos":{"fields":{}},"S_McwWatchGetRequestedWarInfos":{"fields":{"errorCode":{"type":"uint32","id":1},"infos":{"rule":"repeated","type":"McwWatchInfo","id":2}}},"C_McwWatchGetWatchedWarInfos":{"fields":{}},"S_McwWatchGetWatchedWarInfos":{"fields":{"errorCode":{"type":"uint32","id":1},"infos":{"rule":"repeated","type":"McwWatchInfo","id":2}}},"C_McwWatchGetOngoingWarInfos":{"fields":{}},"S_McwWatchGetOngoingWarInfos":{"fields":{"errorCode":{"type":"uint32","id":1},"infos":{"rule":"repeated","type":"McwWatchInfo","id":2}}},"C_McwWatchContinueWar":{"fields":{"warId":{"type":"uint32","id":1}}},"S_McwWatchContinueWar":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"war":{"type":"SerializedWar","id":3}}},"C_McwPlayerSyncWar":{"fields":{"warId":{"type":"uint32","id":1},"nextActionId":{"type":"uint32","id":2},"requestType":{"type":"uint32","id":3}}},"S_McwPlayerSyncWar":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"nextActionId":{"type":"uint32","id":3},"war":{"type":"SerializedWar","id":4},"status":{"type":"uint32","id":5},"requestType":{"type":"uint32","id":6}}},"C_McwPlayerBeginTurn":{"fields":{"warId":{"type":"uint32","id":1},"actionId":{"type":"uint32","id":2}}},"S_McwPlayerBeginTurn":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"actionContainer":{"type":"WarActionContainer","id":3}}},"C_McwPlayerEndTurn":{"fields":{"warId":{"type":"uint32","id":1},"actionId":{"type":"uint32","id":2}}},"S_McwPlayerEndTurn":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"actionContainer":{"type":"WarActionContainer","id":3}}},"C_McwPlayerSurrender":{"fields":{"warId":{"type":"uint32","id":1},"actionId":{"type":"uint32","id":2},"isBoot":{"type":"bool","id":3}}},"S_McwPlayerSurrender":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"actionContainer":{"type":"WarActionContainer","id":3}}},"C_McwPlayerProduceUnit":{"fields":{"warId":{"type":"uint32","id":1},"actionId":{"type":"uint32","id":2},"gridIndex":{"type":"GridIndex","id":3},"unitType":{"type":"uint32","id":4}}},"S_McwPlayerProduceUnit":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"actionContainer":{"type":"WarActionContainer","id":3}}},"C_McwPlayerDeleteUnit":{"fields":{"warId":{"type":"uint32","id":1},"actionId":{"type":"uint32","id":2},"gridIndex":{"type":"GridIndex","id":3}}},"S_McwPlayerDeleteUnit":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"actionContainer":{"type":"WarActionContainer","id":3}}},"C_McwPlayerVoteForDraw":{"fields":{"warId":{"type":"uint32","id":1},"actionId":{"type":"uint32","id":2},"isAgree":{"type":"bool","id":3}}},"S_McwPlayerVoteForDraw":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"actionContainer":{"type":"WarActionContainer","id":3}}},"C_McwUnitWait":{"fields":{"warId":{"type":"uint32","id":1},"actionId":{"type":"uint32","id":2},"path":{"rule":"repeated","type":"GridIndex","id":3},"launchUnitId":{"type":"uint32","id":4}}},"S_McwUnitWait":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"actionContainer":{"type":"WarActionContainer","id":3}}},"C_McwUnitBeLoaded":{"fields":{"warId":{"type":"uint32","id":1},"actionId":{"type":"uint32","id":2},"path":{"rule":"repeated","type":"GridIndex","id":3},"launchUnitId":{"type":"uint32","id":4}}},"S_McwUnitBeLoaded":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"actionContainer":{"type":"WarActionContainer","id":3}}},"C_McwUnitCaptureTile":{"fields":{"warId":{"type":"uint32","id":1},"actionId":{"type":"uint32","id":2},"path":{"rule":"repeated","type":"GridIndex","id":3},"launchUnitId":{"type":"uint32","id":4}}},"S_McwUnitCaptureTile":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"actionContainer":{"type":"WarActionContainer","id":3}}},"C_McwUnitAttack":{"fields":{"warId":{"type":"uint32","id":1},"actionId":{"type":"uint32","id":2},"path":{"rule":"repeated","type":"GridIndex","id":3},"launchUnitId":{"type":"uint32","id":4},"targetGridIndex":{"type":"GridIndex","id":5}}},"S_McwUnitAttack":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"actionContainer":{"type":"WarActionContainer","id":3}}},"C_McwUnitDrop":{"fields":{"warId":{"type":"uint32","id":1},"actionId":{"type":"uint32","id":2},"path":{"rule":"repeated","type":"GridIndex","id":3},"launchUnitId":{"type":"uint32","id":4},"dropDestinations":{"rule":"repeated","type":"DropDestination","id":5}}},"S_McwUnitDrop":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"actionContainer":{"type":"WarActionContainer","id":3}}},"C_McwUnitBuildTile":{"fields":{"warId":{"type":"uint32","id":1},"actionId":{"type":"uint32","id":2},"path":{"rule":"repeated","type":"GridIndex","id":3},"launchUnitId":{"type":"uint32","id":4}}},"S_McwUnitBuildTile":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"actionContainer":{"type":"WarActionContainer","id":3}}},"C_McwUnitDive":{"fields":{"warId":{"type":"uint32","id":1},"actionId":{"type":"uint32","id":2},"path":{"rule":"repeated","type":"GridIndex","id":3},"launchUnitId":{"type":"uint32","id":4}}},"S_McwUnitDive":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"actionContainer":{"type":"WarActionContainer","id":3}}},"C_McwUnitSurface":{"fields":{"warId":{"type":"uint32","id":1},"actionId":{"type":"uint32","id":2},"path":{"rule":"repeated","type":"GridIndex","id":3},"launchUnitId":{"type":"uint32","id":4}}},"S_McwUnitSurface":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"actionContainer":{"type":"WarActionContainer","id":3}}},"C_McwUnitJoin":{"fields":{"warId":{"type":"uint32","id":1},"actionId":{"type":"uint32","id":2},"path":{"rule":"repeated","type":"GridIndex","id":3},"launchUnitId":{"type":"uint32","id":4}}},"S_McwUnitJoin":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"actionContainer":{"type":"WarActionContainer","id":3}}},"C_McwUnitLaunchFlare":{"fields":{"warId":{"type":"uint32","id":1},"actionId":{"type":"uint32","id":2},"path":{"rule":"repeated","type":"GridIndex","id":3},"launchUnitId":{"type":"uint32","id":4},"targetGridIndex":{"type":"GridIndex","id":5}}},"S_McwUnitLaunchFlare":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"actionContainer":{"type":"WarActionContainer","id":3}}},"C_McwUnitLaunchSilo":{"fields":{"warId":{"type":"uint32","id":1},"actionId":{"type":"uint32","id":2},"path":{"rule":"repeated","type":"GridIndex","id":3},"launchUnitId":{"type":"uint32","id":4},"targetGridIndex":{"type":"GridIndex","id":5}}},"S_McwUnitLaunchSilo":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"actionContainer":{"type":"WarActionContainer","id":3}}},"C_McwUnitProduceUnit":{"fields":{"warId":{"type":"uint32","id":1},"actionId":{"type":"uint32","id":2},"path":{"rule":"repeated","type":"GridIndex","id":3},"launchUnitId":{"type":"uint32","id":4}}},"S_McwUnitProduceUnit":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"actionContainer":{"type":"WarActionContainer","id":3}}},"C_McwUnitSupply":{"fields":{"warId":{"type":"uint32","id":1},"actionId":{"type":"uint32","id":2},"path":{"rule":"repeated","type":"GridIndex","id":3},"launchUnitId":{"type":"uint32","id":4}}},"S_McwUnitSupply":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"actionContainer":{"type":"WarActionContainer","id":3}}},"C_McwUnitLoadCo":{"fields":{"warId":{"type":"uint32","id":1},"actionId":{"type":"uint32","id":2},"path":{"rule":"repeated","type":"GridIndex","id":3},"launchUnitId":{"type":"uint32","id":4}}},"S_McwUnitLoadCo":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"actionContainer":{"type":"WarActionContainer","id":3}}},"C_McwUnitUseCoSkill":{"fields":{"warId":{"type":"uint32","id":1},"actionId":{"type":"uint32","id":2},"path":{"rule":"repeated","type":"GridIndex","id":3},"launchUnitId":{"type":"uint32","id":4},"skillType":{"type":"uint32","id":5}}},"S_McwUnitUseCoSkill":{"fields":{"errorCode":{"type":"uint32","id":1},"warId":{"type":"uint32","id":2},"actionContainer":{"type":"WarActionContainer","id":3}}},"C_ScrCreateWar":{"fields":{"mapFileName":{"type":"string","id":1},"saveSlotIndex":{"type":"uint32","id":2},"configVersion":{"type":"string","id":3},"playerInfoList":{"rule":"repeated","type":"WarPlayerInfo","id":4},"hasFog":{"type":"uint32","id":20},"initialFund":{"type":"uint32","id":22},"incomeModifier":{"type":"uint32","id":23},"initialEnergy":{"type":"uint32","id":24},"energyGrowthModifier":{"type":"uint32","id":25},"moveRangeModifier":{"type":"int32","id":26},"attackPowerModifier":{"type":"int32","id":27},"visionRangeModifier":{"type":"int32","id":28},"luckLowerLimit":{"type":"int32","id":30},"luckUpperLimit":{"type":"int32","id":31}}},"S_ScrCreateWar":{"fields":{"errorCode":{"type":"uint32","id":1},"warData":{"type":"SerializedWar","id":2}}},"C_ScrGetSaveSlotInfoList":{"fields":{}},"S_ScrGetSaveSlotInfoList":{"fields":{"errorCode":{"type":"uint32","id":1},"infoList":{"rule":"repeated","type":"SaveSlotInfo","id":2}}},"C_ScrContinueWar":{"fields":{"slotIndex":{"type":"uint32","id":1}}},"S_ScrContinueWar":{"fields":{"errorCode":{"type":"uint32","id":1},"slotIndex":{"type":"uint32","id":2},"encodedWar":{"type":"bytes","id":3}}},"C_ScrSaveWar":{"fields":{"slotIndex":{"type":"uint32","id":1},"warData":{"type":"SerializedWar","id":2}}},"S_ScrSaveWar":{"fields":{"errorCode":{"type":"uint32","id":1},"slotIndex":{"type":"uint32","id":2}}},"C_ScrCreateCustomWar":{"fields":{"warData":{"type":"SerializedWar","id":1}}},"S_ScrCreateCustomWar":{"fields":{"errorCode":{"type":"uint32","id":1},"warData":{"type":"SerializedWar","id":2}}},"RPCC_SayHello":{"fields":{"name":{"type":"string","id":1}}},"RPCS_SayHello":{"fields":{"message":{"type":"string","id":1}}},"ReplayValidator":{"methods":{"sayHello":{"requestType":"RPCC_SayHello","responseType":"RPCS_SayHello"}}}}} \ No newline at end of file diff --git a/resource/default.thm.json b/resource/default.thm.json index a6e720ea0..a610de7a4 100644 --- a/resource/default.thm.json +++ b/resource/default.thm.json @@ -34,6 +34,7 @@ "resource/skins/mapEditor/MeWarMenuPanel.exml", "resource/skins/mapEditor/MeWarPanel.exml", "resource/skins/mapEditor/MeWarRulePanel.exml", + "resource/skins/mapManagement/MmAcceptMapPanel.exml", "resource/skins/mapManagement/MmAvailabilityChangePanel.exml", "resource/skins/mapManagement/MmAvailabilityListPanel.exml", "resource/skins/mapManagement/MmAvailabilitySearchPanel.exml", diff --git a/resource/skins/mapManagement/MmAcceptMapPanel.exml b/resource/skins/mapManagement/MmAcceptMapPanel.exml new file mode 100644 index 000000000..e8e868d18 --- /dev/null +++ b/resource/skins/mapManagement/MmAcceptMapPanel.exml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/modules/baseWar/model/BwFogMap.ts b/src/modules/baseWar/model/BwFogMap.ts index 6806ab855..a266bdbb3 100644 --- a/src/modules/baseWar/model/BwFogMap.ts +++ b/src/modules/baseWar/model/BwFogMap.ts @@ -139,6 +139,34 @@ namespace TinyWars.BaseWar { return this._mapsFromPaths.get(playerIndex)![gridIndex.x][gridIndex.y]; } } + public getVisibilityMapFromPathsForTeam(teamIndex: number): Visibility[][] { + return this.getVisibilityMapFromPathsForTeams(new Set([teamIndex])); + } + public getVisibilityMapFromPathsForTeams(teamIndexes: Set): Visibility[][] { + const { width, height } = this.getMapSize(); + const resultMap = Helpers.createEmptyMap(width, height, Visibility.OutsideVision); + if (!this.checkHasFogCurrently()) { + resultMap.forEach(column => column.fill(Visibility.TrueVision)); + } else { + const mapFromPaths = this._mapsFromPaths; + const playerIndexes = this._getWar().getPlayerManager().getPlayerIndexesInTeams(teamIndexes); + for (let x = 0; x < width; ++x) { + for (let y = 0; y < height; ++y) { + for (const playerIndex of playerIndexes) { + resultMap[x][y] = Math.max( + resultMap[x][y], + mapFromPaths.get(playerIndex)[x][y] || Visibility.OutsideVision + ); + } + } + } + } + return resultMap; + } + public getVisibilityMapFromPathsForUser(userId: number): Visibility[][] { + return this.getVisibilityMapFromPathsForTeams(this._getWar().getWatcherTeamIndexes(userId)); + } + public getVisibilityFromTilesForPlayer(gridIndex: GridIndex, playerIndex: number): Visibility { if (!this.checkHasFogCurrently()) { return Visibility.TrueVision; @@ -161,6 +189,42 @@ namespace TinyWars.BaseWar { } } } + public getVisibilityMapFromTilesForTeam(teamIndex: number): Visibility[][] { + return this.getVisibilityMapFromTilesForTeams(new Set([teamIndex])); + } + public getVisibilityMapFromTilesForTeams(teamIndexes: Set): Visibility[][] { + const mapSize = this.getMapSize(); + const { width, height } = mapSize; + const resultMap = Helpers.createEmptyMap(width, height, Visibility.OutsideVision); + if (!this.checkHasFogCurrently()) { + resultMap.forEach(column => column.fill(Visibility.TrueVision)); + } else { + const tileMap = this._getWar().getTileMap(); + for (let x = 0; x < width; ++x) { + for (let y = 0; y < height; ++y) { + const tileGridIndex : GridIndex = { x, y }; + const tile = tileMap.getTile(tileGridIndex); + if (teamIndexes.has(tile.getTeamIndex())) { + resultMap[x][y] = Visibility.TrueVision; + } + + const visionRange = tile.getVisionRangeForTeamIndexes(teamIndexes); + if (visionRange != null) { + for (const g of GridIndexHelpers.getGridsWithinDistance(tileGridIndex, 0, visionRange, mapSize)) { + if (resultMap[g.x][g.y] === Visibility.OutsideVision) { + resultMap[g.x][g.y] = Visibility.InsideVision; + } + } + } + } + } + } + return resultMap; + } + public getVisibilityMapFromTilesForUser(userId: number): Visibility[][] { + return this.getVisibilityMapFromTilesForTeams(this._getWar().getWatcherTeamIndexes(userId)); + } + public getVisibilityFromUnitsForPlayer(gridIndex: GridIndex, playerIndex: number): Visibility { if (!this.checkHasFogCurrently()) { return Visibility.TrueVision; @@ -192,6 +256,48 @@ namespace TinyWars.BaseWar { return isInside ? Visibility.InsideVision : Visibility.OutsideVision; } } + public getVisibilityMapFromUnitsForTeam(teamIndex: number): Visibility[][] { + return this.getVisibilityMapFromUnitsForTeams(new Set([teamIndex])); + } + public getVisibilityMapFromUnitsForTeams(teamIndexes: Set): Visibility[][] { + const mapSize = this.getMapSize(); + const { width, height } = mapSize; + const resultMap = Helpers.createEmptyMap(width, height, Visibility.OutsideVision); + if (!this.checkHasFogCurrently()) { + resultMap.forEach(column => column.fill(Visibility.TrueVision)); + } else { + const unitMap = this._getWar().getUnitMap(); + for (let x = 0; x < width; ++x) { + for (let y = 0; y < height; ++y) { + const unitGridIndex : GridIndex = { x, y }; + const unit = unitMap.getUnitOnMap(unitGridIndex); + if (unit) { + const visionRange = unit.getVisionRangeForTeamIndexes(teamIndexes, unitGridIndex); + if (visionRange != null) { + for (const g of GridIndexHelpers.getGridsWithinDistance(unitGridIndex, 0, 1, mapSize)) { + resultMap[g.x][g.y] = Visibility.TrueVision; + } + + const isTrueVision = unit.checkIsTrueVision(); + for (const g of GridIndexHelpers.getGridsWithinDistance(unitGridIndex, 2, visionRange, mapSize)) { + if (isTrueVision) { + resultMap[g.x][g.y] = Visibility.TrueVision; + } else { + if (resultMap[g.x][g.y] === Visibility.OutsideVision) { + resultMap[g.x][g.y] = Visibility.InsideVision; + } + } + } + } + } + } + } + } + return resultMap; + } + public getVisibilityMapFromUnitsForUser(userId: number): Visibility[][] { + return this.getVisibilityMapFromUnitsForTeams(this._getWar().getWatcherTeamIndexes(userId)); + } } function createEmptyMaps(mapSize: MapSize, maxPlayerIndex: number): Map { diff --git a/src/modules/baseWar/model/BwTile.ts b/src/modules/baseWar/model/BwTile.ts index f85627d06..e112974c8 100644 --- a/src/modules/baseWar/model/BwTile.ts +++ b/src/modules/baseWar/model/BwTile.ts @@ -406,6 +406,13 @@ namespace TinyWars.BaseWar { return Math.max(0, this.getCfgVisionRange() + this._getWar().getSettingsVisionRangeModifier()); } } + public getVisionRangeForTeamIndexes(teamIndexes: Set): number | null { + if ((!this.checkIsVisionEnabledForAllPlayers()) && (!teamIndexes.has(this.getTeamIndex()))) { + return null; + } else { + return Math.max(0, this.getCfgVisionRange() + this._getWar().getSettingsVisionRangeModifier()); + } + } //////////////////////////////////////////////////////////////////////////////// // Functions for global attack/defense bonus. diff --git a/src/modules/baseWar/model/BwUnit.ts b/src/modules/baseWar/model/BwUnit.ts index ed4e1073b..e2c085789 100644 --- a/src/modules/baseWar/model/BwUnit.ts +++ b/src/modules/baseWar/model/BwUnit.ts @@ -958,6 +958,17 @@ namespace TinyWars.BaseWar { ); } } + public getVisionRangeForTeamIndexes(teamIndexes: Set, gridIndex: GridIndex): number | undefined { + let vision = null; + for (const playerIndex of this.getWar().getPlayerManager().getPlayerIndexesInTeams(teamIndexes)) { + const v = this.getVisionRangeForPlayer(playerIndex, gridIndex); + if ((vision == null) || (v > vision)) { + vision = v; + } + } + return vision; + } + public checkIsTrueVision(): boolean { const version = this.getWar()!.getConfigVersion(); const unitType = this.getType(); diff --git a/src/modules/mapEditor/model/MeModel.ts b/src/modules/mapEditor/model/MeModel.ts index 60cfbc361..094d30cf8 100644 --- a/src/modules/mapEditor/model/MeModel.ts +++ b/src/modules/mapEditor/model/MeModel.ts @@ -16,9 +16,9 @@ namespace TinyWars.MapEditor.MeModel { const slotIndex = data.slotIndex; MAP_DICT.set(slotIndex, { slotIndex, - reviewStatus: data.reviewStatus, - mapRawData : data.mapRawData, - rejectReason: data.rejectReason, + reviewStatus : data.reviewStatus, + mapRawData : data.mapRawData, + reviewComment : data.reviewComment, }); } for (let i = 0; i < ConfigManager.COMMON_CONSTANTS.MapEditorSlotMaxCount; ++i) { diff --git a/src/modules/mapEditor/view/MeMapListPanel.ts b/src/modules/mapEditor/view/MeMapListPanel.ts index 11e9feffa..fd48a0db1 100644 --- a/src/modules/mapEditor/view/MeMapListPanel.ts +++ b/src/modules/mapEditor/view/MeMapListPanel.ts @@ -209,18 +209,28 @@ namespace TinyWars.MapEditor { } private _onTouchTapBtnNext(e: egret.TouchEvent): void { - const data = this.data as DataForMapRenderer; - const mapData = data.mapData; - if (mapData.reviewStatus !== Types.MapReviewStatus.Rejected) { - Utility.FlowManager.gotoMapEditor(mapData.mapRawData as Types.MapRawData, mapData.slotIndex, false); - } else { + const data = this.data as DataForMapRenderer; + const mapData = data.mapData; + const reviewStatus = mapData.reviewStatus; + + if (reviewStatus === Types.MapReviewStatus.Rejected) { Common.AlertPanel.show({ title : Lang.getText(Lang.Type.B0305), - content : mapData.rejectReason || Lang.getText(Lang.Type.B0001), + content : mapData.reviewComment || Lang.getText(Lang.Type.B0001), + callback: () => { + Utility.FlowManager.gotoMapEditor(mapData.mapRawData as Types.MapRawData, mapData.slotIndex, false); + }, + }); + } else if (reviewStatus === Types.MapReviewStatus.Accepted) { + Common.AlertPanel.show({ + title : Lang.getText(Lang.Type.B0326), + content : mapData.reviewComment || Lang.getText(Lang.Type.B0001), callback: () => { Utility.FlowManager.gotoMapEditor(mapData.mapRawData as Types.MapRawData, mapData.slotIndex, false); }, }); + } else { + Utility.FlowManager.gotoMapEditor(mapData.mapRawData as Types.MapRawData, mapData.slotIndex, false); } } } diff --git a/src/modules/mapEditor/view/MeWarMenuPanel.ts b/src/modules/mapEditor/view/MeWarMenuPanel.ts index 785c67dd3..2ffddc50b 100644 --- a/src/modules/mapEditor/view/MeWarMenuPanel.ts +++ b/src/modules/mapEditor/view/MeWarMenuPanel.ts @@ -547,14 +547,7 @@ namespace TinyWars.MapEditor { return { name : Lang.getText(Lang.Type.B0296), callback: () => { - Common.ConfirmPanel.show({ - title : Lang.getText(Lang.Type.B0088), - content : Lang.getText(Lang.Type.A0090), - callback: () => { - const war = this._war; - WarMap.WarMapProxy.reqReviewMap(war.getDesignerUserId(), war.getSlotIndex(), war.getModifiedTime(), true, null); - }, - }); + MapManagement.MmAcceptMapPanel.show(); }, }; } diff --git a/src/modules/mapManagement/view/MmAcceptMapPanel.ts b/src/modules/mapManagement/view/MmAcceptMapPanel.ts new file mode 100644 index 000000000..6f7438a2c --- /dev/null +++ b/src/modules/mapManagement/view/MmAcceptMapPanel.ts @@ -0,0 +1,62 @@ + +namespace TinyWars.MapManagement { + import Lang = Utility.Lang; + + export class MmAcceptMapPanel extends GameUi.UiPanel { + protected readonly _LAYER_TYPE = Utility.Types.LayerType.Hud3; + protected readonly _IS_EXCLUSIVE = true; + + private static _instance: MmAcceptMapPanel; + + private _labelTitle : GameUi.UiLabel; + private _labelTips : GameUi.UiLabel; + private _inputReason : GameUi.UiTextInput; + private _btnCancel : GameUi.UiButton; + private _btnConfirm : GameUi.UiButton; + + public static show(): void { + if (!MmAcceptMapPanel._instance) { + MmAcceptMapPanel._instance = new MmAcceptMapPanel(); + } + MmAcceptMapPanel._instance.open(); + } + + public static hide(): void { + if (MmAcceptMapPanel._instance) { + MmAcceptMapPanel._instance.close(); + } + } + + public constructor() { + super(); + + this.skinName = "resource/skins/mapManagement/MmAcceptMapPanel.exml"; + this._setAutoAdjustHeightEnabled(); + this._setTouchMaskEnabled(); + } + + protected _onFirstOpened(): void { + this._uiListeners = [ + { ui: this._btnCancel, callback: this._onTouchedBtnCancel, }, + { ui: this._btnConfirm, callback: this._onTouchedBtnConfirm, }, + ]; + } + + protected _onOpened(): void { + this._btnConfirm.label = Lang.getText(Lang.Type.B0026); + this._btnCancel.label = Lang.getText(Lang.Type.B0154); + this._labelTitle.text = Lang.getText(Lang.Type.B0296); + this._labelTips.text = Lang.getText(Lang.Type.A0105); + } + + private _onTouchedBtnCancel(e: egret.TouchEvent): void { + MmAcceptMapPanel.hide(); + } + + private _onTouchedBtnConfirm(e: egret.TouchEvent): void { + const war = MapEditor.MeManager.getWar(); + WarMap.WarMapProxy.reqReviewMap(war.getDesignerUserId(), war.getSlotIndex(), war.getModifiedTime(), true, this._inputReason.text); + this.close(); + } + } +} diff --git a/src/modules/multiCustomWar/model/McwFogMap.ts b/src/modules/multiCustomWar/model/McwFogMap.ts index 95acfb66d..fd99dd6f4 100644 --- a/src/modules/multiCustomWar/model/McwFogMap.ts +++ b/src/modules/multiCustomWar/model/McwFogMap.ts @@ -34,9 +34,9 @@ namespace TinyWars.MultiCustomWar { public startRunning(war: McwWar): void { super.startRunning(war); - const teamIndexes = war.getWatcherTeamIndexes(User.UserModel.getSelfUserId()); + const visibleTiles = VisibilityHelpers.getAllTilesVisibleToUser(war, User.UserModel.getSelfUserId()); war.getTileMap().forEachTile(tile => { - if (!VisibilityHelpers.checkIsTileVisibleToTeams(war, tile.getGridIndex(), teamIndexes)) { + if (!visibleTiles.has(tile)) { tile.setFogEnabled(); } }); diff --git a/src/modules/multiCustomWar/model/McwHelpers.ts b/src/modules/multiCustomWar/model/McwHelpers.ts index 34204f96a..cf5ae4471 100644 --- a/src/modules/multiCustomWar/model/McwHelpers.ts +++ b/src/modules/multiCustomWar/model/McwHelpers.ts @@ -93,11 +93,11 @@ namespace TinyWars.MultiCustomWar.McwHelpers { } export function updateTilesAndUnitsOnVisibilityChanged(war: McwWar): void { - const userId = User.UserModel.getSelfUserId(); - const tileMap = war.getTileMap(); + const userId = User.UserModel.getSelfUserId(); + const visibleTiles = VisibilityHelpers.getAllTilesVisibleToUser(war, userId); + const tileMap = war.getTileMap(); tileMap.forEachTile(tile => { - const gridIndex = tile.getGridIndex(); - if (VisibilityHelpers.checkIsTileVisibleToUser(war, gridIndex, userId)) { + if (visibleTiles.has(tile)) { if (tile.getIsFogEnabled()) { tile.setFogDisabled(); } @@ -109,19 +109,12 @@ namespace TinyWars.MultiCustomWar.McwHelpers { tile.updateView(); }); + const visibleUnitsOnMap = VisibilityHelpers.getAllUnitsOnMapVisibleToUser(war, userId); war.getUnitMap().forEachUnitOnMap(unit => { - const gridIndex = unit.getGridIndex(); - if (VisibilityHelpers.checkIsUnitOnMapVisibleToUser({ - war, - gridIndex, - unitType : unit.getType(), - isDiving : unit.getIsDiving(), - unitPlayerIndex : unit.getPlayerIndex(), - observerUserId : userId, - })) { + if (visibleUnitsOnMap.has(unit)) { unit.setViewVisible(true); } else { - DestructionHelpers.removeUnitOnMap(war, gridIndex); + DestructionHelpers.removeUnitOnMap(war, unit.getGridIndex()); } }); DestructionHelpers.removeInvisibleLoadedUnits(war, userId); diff --git a/src/modules/multiCustomWar/model/McwModel.ts b/src/modules/multiCustomWar/model/McwModel.ts index 3a98ddfd5..efa461b8a 100644 --- a/src/modules/multiCustomWar/model/McwModel.ts +++ b/src/modules/multiCustomWar/model/McwModel.ts @@ -821,7 +821,16 @@ namespace TinyWars.MultiCustomWar.McwModel { return new Promise(resolve => { focusUnit.moveViewAlongPath(pathNodes, focusUnit.getIsDiving(), path.isBlocked, () => { - if (action.isDropBlocked) { + if ((action.isDropBlocked) && + (VisibilityHelpers.checkIsUnitOnMapVisibleToUser({ + war, + gridIndex : endingGridIndex, + unitType : focusUnit.getType(), + isDiving : focusUnit.getIsDiving(), + unitPlayerIndex : focusUnit.getPlayerIndex(), + observerUserId : User.UserModel.getSelfUserId(), + })) + ) { war.getGridVisionEffect().showEffectBlock(endingGridIndex); } focusUnit.updateView(); @@ -838,7 +847,7 @@ namespace TinyWars.MultiCustomWar.McwModel { r(); } ); - })) + })); } Promise.all(promises).then(() => { McwHelpers.updateTilesAndUnitsOnVisibilityChanged(war); diff --git a/src/modules/multiCustomWar/model/McwTurnManager.ts b/src/modules/multiCustomWar/model/McwTurnManager.ts index b3499be75..eaa576e18 100644 --- a/src/modules/multiCustomWar/model/McwTurnManager.ts +++ b/src/modules/multiCustomWar/model/McwTurnManager.ts @@ -51,29 +51,23 @@ namespace TinyWars.MultiCustomWar { // The other functions. //////////////////////////////////////////////////////////////////////////////////////////////////// private _resetFogForWatcher(): void { - const war = this._getWar() as McwWar; - const userId = User.UserModel.getSelfUserId(); + const war = this._getWar() as McwWar; + const userId = User.UserModel.getSelfUserId(); + const visibleUnitsOnMap = VisibilityHelpers.getAllUnitsOnMapVisibleToUser(war, userId); war.getUnitMap().forEachUnitOnMap(unit => { - const gridIndex = unit.getGridIndex(); - if (!VisibilityHelpers.checkIsUnitOnMapVisibleToUser({ - war, - gridIndex, - unitType : unit.getType(), - isDiving : unit.getIsDiving(), - unitPlayerIndex : unit.getPlayerIndex(), - observerUserId : userId, - })) { - DestructionHelpers.removeUnitOnMap(war, gridIndex); + if (!visibleUnitsOnMap.has(unit)) { + DestructionHelpers.removeUnitOnMap(war, unit.getGridIndex()); } }); DestructionHelpers.removeInvisibleLoadedUnits(war, userId); - const tileMap = war.getTileMap(); + const tileMap = war.getTileMap(); + const visibleTiles = VisibilityHelpers.getAllTilesVisibleToUser(war, userId); tileMap.forEachTile(tile => { - if (!VisibilityHelpers.checkIsTileVisibleToUser(war, tile.getGridIndex(), userId)) { - tile.setFogEnabled(); - } else { + if (visibleTiles.has(tile)) { tile.setFogDisabled(); + } else { + tile.setFogEnabled(); } tile.updateView(); }); diff --git a/src/modules/multiCustomWar/model/McwUnitMap.ts b/src/modules/multiCustomWar/model/McwUnitMap.ts index 0b30c9186..48b85e4b1 100644 --- a/src/modules/multiCustomWar/model/McwUnitMap.ts +++ b/src/modules/multiCustomWar/model/McwUnitMap.ts @@ -12,20 +12,14 @@ namespace TinyWars.MultiCustomWar { } public serializeForSimulation(): Types.SerializedUnitMap { - const war = this.getWar(); - const userId = User.UserModel.getSelfUserId(); - const units : Types.SerializedUnit[] = []; - const teamIndexes = war.getWatcherTeamIndexes(userId); + const war = this.getWar(); + const userId = User.UserModel.getSelfUserId(); + const units : Types.SerializedUnit[] = []; + const teamIndexes = war.getWatcherTeamIndexes(userId); + const visibleUnitsOnMap = VisibilityHelpers.getAllUnitsOnMapVisibleToUser(war, userId); this.forEachUnitOnMap((unit: McwUnit) => { - if (VisibilityHelpers.checkIsUnitOnMapVisibleToUser({ - war, - gridIndex : unit.getGridIndex(), - unitType : unit.getType(), - isDiving : unit.getIsDiving(), - unitPlayerIndex : unit.getPlayerIndex(), - observerUserId : userId, - })) { + if (visibleUnitsOnMap.has(unit)) { units.push(unit.serializeForSimulation()); if (teamIndexes.has(unit.getTeamIndex())) { diff --git a/src/modules/multiCustomWar/view/McwUnitView.ts b/src/modules/multiCustomWar/view/McwUnitView.ts index 9b0c708dc..8677a7145 100644 --- a/src/modules/multiCustomWar/view/McwUnitView.ts +++ b/src/modules/multiCustomWar/view/McwUnitView.ts @@ -79,10 +79,22 @@ namespace TinyWars.MultiCustomWar { tween.to(GridIndexHelpers.createPointByGridIndex(gridIndex), 200); } + const endingGridIndex = path[path.length - 1]; if (!aiming) { tween.call(() => { this._setImgUnitFlippedX(false); - (isBlocked) && (war.getGridVisionEffect().showEffectBlock(path[path.length - 1])); + if ((isBlocked) && + (VisibilityHelpers.checkIsUnitOnMapVisibleToUser({ + war, + unitType, + isDiving, + gridIndex : endingGridIndex, + unitPlayerIndex : playerIndex, + observerUserId : userId, + })) + ) { + war.getGridVisionEffect().showEffectBlock(endingGridIndex); + } (callback) && (callback()); }); @@ -100,7 +112,18 @@ namespace TinyWars.MultiCustomWar { cursor.setIsMovableByTouches(true); cursor.updateView(); this._setImgUnitFlippedX(false); - (isBlocked) && (war.getGridVisionEffect().showEffectBlock(path[path.length - 1])); + if ((isBlocked) && + (VisibilityHelpers.checkIsUnitOnMapVisibleToUser({ + war, + unitType, + isDiving, + gridIndex : endingGridIndex, + unitPlayerIndex : playerIndex, + observerUserId : userId, + })) + ) { + war.getGridVisionEffect().showEffectBlock(endingGridIndex); + } (callback) && (callback()); }); diff --git a/src/modules/multiCustomWar/view/McwWarMenuPanel.ts b/src/modules/multiCustomWar/view/McwWarMenuPanel.ts index 187c5fb0d..2090402b8 100644 --- a/src/modules/multiCustomWar/view/McwWarMenuPanel.ts +++ b/src/modules/multiCustomWar/view/McwWarMenuPanel.ts @@ -200,7 +200,7 @@ namespace TinyWars.MultiCustomWar { this._labelMapName.text = await WarMapModel.getMapNameInLanguage(mapFileName) || "----"; this._labelMapDesigner.text = await WarMapModel.getMapDesigner(mapFileName) || "----"; this._labelWarId.text = `${war.getWarId()}`; - this._labelTurnIndex.text = `${war.getTurnManager().getTurnIndex()}`; + this._labelTurnIndex.text = `${war.getTurnManager().getTurnIndex() + 1}`; this._labelActionId.text = `${war.getNextActionId() - 1}`; this._labelIncomeModifier.text = `${war.getSettingsIncomeModifier()}%`; this._labelEnergyGrowthModifier.text = `${war.getSettingsEnergyGrowthModifier()}%`; diff --git a/src/modules/replay/model/ReplayFogMap.ts b/src/modules/replay/model/ReplayFogMap.ts index 8dd8c29d1..4906a6d92 100644 --- a/src/modules/replay/model/ReplayFogMap.ts +++ b/src/modules/replay/model/ReplayFogMap.ts @@ -9,12 +9,12 @@ namespace TinyWars.Replay { public startRunning(war: ReplayWar): void { super.startRunning(war); - const teamIndex = war.getPlayerInTurn().getTeamIndex(); + const visibleTiles = VisibilityHelpers.getAllTilesVisibleToTeam(war, war.getPlayerInTurn().getTeamIndex()); war.getTileMap().forEachTile(tile => { - if (!VisibilityHelpers.checkIsTileVisibleToTeam(war, tile.getGridIndex(), teamIndex)) { - tile.setFogEnabled(); - } else { + if (visibleTiles.has(tile)) { tile.setFogDisabled(); + } else { + tile.setFogEnabled(); } }); } diff --git a/src/modules/replay/model/ReplayHelpers.ts b/src/modules/replay/model/ReplayHelpers.ts index 0e8bedc84..26468db12 100644 --- a/src/modules/replay/model/ReplayHelpers.ts +++ b/src/modules/replay/model/ReplayHelpers.ts @@ -92,12 +92,10 @@ namespace TinyWars.Replay.ReplayHelpers { } export function updateTilesAndUnitsOnVisibilityChanged(war: ReplayWar): void { - const teamIndexInTurn = war.getPlayerInTurn().getTeamIndex(); - - const tileMap = war.getTileMap(); + const tileMap = war.getTileMap(); + const visibleTiles = VisibilityHelpers.getAllTilesVisibleToTeam(war, war.getPlayerInTurn().getTeamIndex()); tileMap.forEachTile(tile => { - const gridIndex = tile.getGridIndex(); - if (VisibilityHelpers.checkIsTileVisibleToTeam(war, gridIndex, teamIndexInTurn)) { + if (visibleTiles.has(tile)) { if (tile.getIsFogEnabled()) { tile.setFogDisabled(); } diff --git a/src/modules/replay/model/ReplayModel.ts b/src/modules/replay/model/ReplayModel.ts index 1df009737..938d94721 100644 --- a/src/modules/replay/model/ReplayModel.ts +++ b/src/modules/replay/model/ReplayModel.ts @@ -147,7 +147,7 @@ namespace TinyWars.Replay.ReplayModel { if (war.getNextActionId() >= war.getTotalActionsCount()) { war.setIsAutoReplay(false); - FloatText.show(`${Lang.getText(Lang.Type.B0093)} ${Lang.getText(Lang.Type.B0191)}: ${war.getTurnManager().getTurnIndex()}`); + FloatText.show(`${Lang.getText(Lang.Type.B0093)} ${Lang.getText(Lang.Type.B0191)}: ${war.getTurnManager().getTurnIndex() + 1}`); } war.setIsExecutingAction(false); @@ -173,7 +173,7 @@ namespace TinyWars.Replay.ReplayModel { async function _executeMcwPlayerBeginTurn(war: ReplayWar, data: WarActionContainer): Promise { const actionPlanner = war.getActionPlanner(); actionPlanner.setStateExecutingAction(); - FloatText.show(`${war.getPlayerInTurn().getNickname()} ${Lang.getText(Lang.Type.B0094)} (${war.getNextActionId()} / ${war.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${war.getTurnManager().getTurnIndex()})`); + FloatText.show(`${war.getPlayerInTurn().getNickname()} ${Lang.getText(Lang.Type.B0094)} (${war.getNextActionId()} / ${war.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${war.getTurnManager().getTurnIndex() + 1})`); await war.getTurnManager().endPhaseWaitBeginTurn(data); actionPlanner.setStateIdle(); @@ -182,7 +182,7 @@ namespace TinyWars.Replay.ReplayModel { async function _executeMcwPlayerDeleteUnit(war: ReplayWar, data: WarActionContainer): Promise { const actionPlanner = war.getActionPlanner(); actionPlanner.setStateExecutingAction(); - FloatText.show(`${Lang.getText(Lang.Type.B0081)} (${war.getNextActionId()} / ${war.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${war.getTurnManager().getTurnIndex()})`); + FloatText.show(`${Lang.getText(Lang.Type.B0081)} (${war.getNextActionId()} / ${war.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${war.getTurnManager().getTurnIndex() + 1})`); const action = data.WarActionPlayerDeleteUnit; const gridIndex = action.gridIndex as GridIndex; @@ -200,7 +200,7 @@ namespace TinyWars.Replay.ReplayModel { async function _executeMcwPlayerEndTurn(war: ReplayWar, data: WarActionContainer): Promise { const actionPlanner = war.getActionPlanner(); actionPlanner.setStateExecutingAction(); - FloatText.show(`${Lang.getText(Lang.Type.B0036)} (${war.getNextActionId()} / ${war.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${war.getTurnManager().getTurnIndex()})`); + FloatText.show(`${Lang.getText(Lang.Type.B0036)} (${war.getNextActionId()} / ${war.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${war.getTurnManager().getTurnIndex() + 1})`); await war.getTurnManager().endPhaseMain(); actionPlanner.setStateIdle(); @@ -209,7 +209,7 @@ namespace TinyWars.Replay.ReplayModel { async function _executeMcwPlayerProduceUnit(war: ReplayWar, data: WarActionContainer): Promise { const actionPlanner = war.getActionPlanner(); actionPlanner.setStateExecutingAction(); - FloatText.show(`${Lang.getText(Lang.Type.B0095)} ${Lang.getUnitName(data.WarActionPlayerProduceUnit.unitType)} (${war.getNextActionId()} / ${war.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${war.getTurnManager().getTurnIndex()})`); + FloatText.show(`${Lang.getText(Lang.Type.B0095)} ${Lang.getUnitName(data.WarActionPlayerProduceUnit.unitType)} (${war.getNextActionId()} / ${war.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${war.getTurnManager().getTurnIndex() + 1})`); const action = data.WarActionPlayerProduceUnit; @@ -245,7 +245,7 @@ namespace TinyWars.Replay.ReplayModel { async function _executeMcwPlayerSurrender(war: ReplayWar, data: WarActionContainer): Promise { const actionPlanner = war.getActionPlanner(); actionPlanner.setStateExecutingAction(); - FloatText.show(`${war.getPlayerInTurn().getNickname()} ${Lang.getText(Lang.Type.B0055)} (${war.getNextActionId()} / ${war.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${war.getTurnManager().getTurnIndex()})`); + FloatText.show(`${war.getPlayerInTurn().getNickname()} ${Lang.getText(Lang.Type.B0055)} (${war.getNextActionId()} / ${war.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${war.getTurnManager().getTurnIndex() + 1})`); const player = war.getPlayerInTurn(); DestructionHelpers.destroyPlayerForce(war, player.getPlayerIndex(), true); @@ -259,7 +259,7 @@ namespace TinyWars.Replay.ReplayModel { actionPlanner.setStateExecutingAction(); FloatText.show( `${war.getPlayerInTurn().getNickname()} ${data.WarActionPlayerVoteForDraw.isAgree ? Lang.getText(Lang.Type.B0096) : Lang.getText(Lang.Type.B0085)}` + - `(${war.getNextActionId()} / ${war.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${war.getTurnManager().getTurnIndex()})` + `(${war.getNextActionId()} / ${war.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${war.getTurnManager().getTurnIndex() + 1})` ); const playerInTurn = war.getPlayerInTurn(); @@ -283,7 +283,7 @@ namespace TinyWars.Replay.ReplayModel { async function _executeMcwUnitAttack(war: ReplayWar, data: WarActionContainer): Promise { const actionPlanner = war.getActionPlanner(); actionPlanner.setStateExecutingAction(); - FloatText.show(`${Lang.getText(Lang.Type.B0097)} (${war.getNextActionId()} / ${war.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${war.getTurnManager().getTurnIndex()})`); + FloatText.show(`${Lang.getText(Lang.Type.B0097)} (${war.getNextActionId()} / ${war.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${war.getTurnManager().getTurnIndex() + 1})`); const action = data.WarActionUnitAttack; @@ -456,7 +456,7 @@ namespace TinyWars.Replay.ReplayModel { async function _executeMcwUnitBeLoaded(war: ReplayWar, data: WarActionContainer): Promise { const actionPlanner = war.getActionPlanner(); actionPlanner.setStateExecutingAction(); - FloatText.show(`${Lang.getText(Lang.Type.B0098)} (${war.getNextActionId()} / ${war.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${war.getTurnManager().getTurnIndex()})`); + FloatText.show(`${Lang.getText(Lang.Type.B0098)} (${war.getNextActionId()} / ${war.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${war.getTurnManager().getTurnIndex() + 1})`); const action = data.WarActionUnitBeLoaded; @@ -485,7 +485,7 @@ namespace TinyWars.Replay.ReplayModel { async function _executeMcwUnitBuildTile(war: ReplayWar, data: WarActionContainer): Promise { const actionPlanner = war.getActionPlanner(); actionPlanner.setStateExecutingAction(); - FloatText.show(`${Lang.getText(Lang.Type.B0099)} (${war.getNextActionId()} / ${war.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${war.getTurnManager().getTurnIndex()})`); + FloatText.show(`${Lang.getText(Lang.Type.B0099)} (${war.getNextActionId()} / ${war.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${war.getTurnManager().getTurnIndex() + 1})`); const action = data.WarActionUnitBuildTile; @@ -528,7 +528,7 @@ namespace TinyWars.Replay.ReplayModel { async function _executeMcwUnitCaptureTile(war: ReplayWar, data: WarActionContainer): Promise { const actionPlanner = war.getActionPlanner(); actionPlanner.setStateExecutingAction(); - FloatText.show(`${Lang.getText(Lang.Type.B0100)} (${war.getNextActionId()} / ${war.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${war.getTurnManager().getTurnIndex()})`); + FloatText.show(`${Lang.getText(Lang.Type.B0100)} (${war.getNextActionId()} / ${war.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${war.getTurnManager().getTurnIndex() + 1})`); const action = data.WarActionUnitCaptureTile; @@ -596,7 +596,7 @@ namespace TinyWars.Replay.ReplayModel { async function _executeMcwUnitDive(war: ReplayWar, data: WarActionContainer): Promise { const actionPlanner = war.getActionPlanner(); actionPlanner.setStateExecutingAction(); - FloatText.show(`${Lang.getText(Lang.Type.B0101)} (${war.getNextActionId()} / ${war.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${war.getTurnManager().getTurnIndex()})`); + FloatText.show(`${Lang.getText(Lang.Type.B0101)} (${war.getNextActionId()} / ${war.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${war.getTurnManager().getTurnIndex() + 1})`); const action = data.WarActionUnitDive; @@ -626,7 +626,7 @@ namespace TinyWars.Replay.ReplayModel { async function _executeMcwUnitDrop(war: ReplayWar, data: WarActionContainer): Promise { const actionPlanner = war.getActionPlanner(); actionPlanner.setStateExecutingAction(); - FloatText.show(`${Lang.getText(Lang.Type.B0102)} (${war.getNextActionId()} / ${war.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${war.getTurnManager().getTurnIndex()})`); + FloatText.show(`${Lang.getText(Lang.Type.B0102)} (${war.getNextActionId()} / ${war.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${war.getTurnManager().getTurnIndex() + 1})`); const action = data.WarActionUnitDrop; @@ -688,7 +688,7 @@ namespace TinyWars.Replay.ReplayModel { async function _executeMcwUnitJoin(war: ReplayWar, data: WarActionContainer): Promise { const actionPlanner = war.getActionPlanner(); actionPlanner.setStateExecutingAction(); - FloatText.show(`${Lang.getText(Lang.Type.B0103)} (${war.getNextActionId()} / ${war.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${war.getTurnManager().getTurnIndex()})`); + FloatText.show(`${Lang.getText(Lang.Type.B0103)} (${war.getNextActionId()} / ${war.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${war.getTurnManager().getTurnIndex() + 1})`); const action = data.WarActionUnitJoin; @@ -771,7 +771,7 @@ namespace TinyWars.Replay.ReplayModel { async function _executeMcwUnitLaunchFlare(war: ReplayWar, data: WarActionContainer): Promise { const actionPlanner = war.getActionPlanner(); actionPlanner.setStateExecutingAction(); - FloatText.show(`${Lang.getText(Lang.Type.B0104)} (${war.getNextActionId()} / ${war.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${war.getTurnManager().getTurnIndex()})`); + FloatText.show(`${Lang.getText(Lang.Type.B0104)} (${war.getNextActionId()} / ${war.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${war.getTurnManager().getTurnIndex() + 1})`); const action = data.WarActionUnitLaunchFlare; @@ -810,7 +810,7 @@ namespace TinyWars.Replay.ReplayModel { async function _executeMcwUnitLaunchSilo(war: ReplayWar, data: WarActionContainer): Promise { const actionPlanner = war.getActionPlanner(); actionPlanner.setStateExecutingAction(); - FloatText.show(`${Lang.getText(Lang.Type.B0105)} (${war.getNextActionId()} / ${war.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${war.getTurnManager().getTurnIndex()})`); + FloatText.show(`${Lang.getText(Lang.Type.B0105)} (${war.getNextActionId()} / ${war.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${war.getTurnManager().getTurnIndex() + 1})`); const action = data.WarActionUnitLaunchSilo; @@ -870,7 +870,7 @@ namespace TinyWars.Replay.ReplayModel { async function _executeMcwUnitLoadCo(war: ReplayWar, data: WarActionContainer): Promise { const actionPlanner = war.getActionPlanner(); actionPlanner.setStateExecutingAction(); - FloatText.show(`${Lang.getText(Lang.Type.B0139)} (${war.getNextActionId()} / ${war.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${war.getTurnManager().getTurnIndex()})`); + FloatText.show(`${Lang.getText(Lang.Type.B0139)} (${war.getNextActionId()} / ${war.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${war.getTurnManager().getTurnIndex() + 1})`); const action = data.WarActionUnitLoadCo; @@ -906,7 +906,7 @@ namespace TinyWars.Replay.ReplayModel { async function _executeMcwUnitProduceUnit(war: ReplayWar, data: WarActionContainer): Promise { const actionPlanner = war.getActionPlanner(); actionPlanner.setStateExecutingAction(); - FloatText.show(`${Lang.getText(Lang.Type.B0106)} (${war.getNextActionId()} / ${war.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${war.getTurnManager().getTurnIndex()})`); + FloatText.show(`${Lang.getText(Lang.Type.B0106)} (${war.getNextActionId()} / ${war.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${war.getTurnManager().getTurnIndex() + 1})`); const action = data.WarActionUnitProduceUnit; @@ -962,7 +962,7 @@ namespace TinyWars.Replay.ReplayModel { async function _executeMcwUnitSupply(war: ReplayWar, data: WarActionContainer): Promise { const actionPlanner = war.getActionPlanner(); actionPlanner.setStateExecutingAction(); - FloatText.show(`${Lang.getText(Lang.Type.B0107)} (${war.getNextActionId()} / ${war.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${war.getTurnManager().getTurnIndex()})`); + FloatText.show(`${Lang.getText(Lang.Type.B0107)} (${war.getNextActionId()} / ${war.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${war.getTurnManager().getTurnIndex() + 1})`); const action = data.WarActionUnitSupply; @@ -1022,7 +1022,7 @@ namespace TinyWars.Replay.ReplayModel { async function _executeMcwUnitSurface(war: ReplayWar, data: WarActionContainer): Promise { const actionPlanner = war.getActionPlanner(); actionPlanner.setStateExecutingAction(); - FloatText.show(`${Lang.getText(Lang.Type.B0108)} (${war.getNextActionId()} / ${war.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${war.getTurnManager().getTurnIndex()})`); + FloatText.show(`${Lang.getText(Lang.Type.B0108)} (${war.getNextActionId()} / ${war.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${war.getTurnManager().getTurnIndex() + 1})`); const action = data.WarActionUnitSurface; @@ -1052,7 +1052,7 @@ namespace TinyWars.Replay.ReplayModel { async function _executeMcwUnitUseCoSkill(war: ReplayWar, data: WarActionContainer): Promise { const actionPlanner = war.getActionPlanner(); actionPlanner.setStateExecutingAction(); - FloatText.show(`${Lang.getText(Lang.Type.B0142)} (${war.getNextActionId()} / ${war.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${war.getTurnManager().getTurnIndex()})`); + FloatText.show(`${Lang.getText(Lang.Type.B0142)} (${war.getNextActionId()} / ${war.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${war.getTurnManager().getTurnIndex() + 1})`); const action = data.WarActionUnitUseCoSkill; @@ -1120,7 +1120,7 @@ namespace TinyWars.Replay.ReplayModel { async function _executeMcwUnitWait(war: ReplayWar, data: WarActionContainer): Promise { const actionPlanner = war.getActionPlanner(); actionPlanner.setStateExecutingAction(); - FloatText.show(`${Lang.getText(Lang.Type.B0109)} (${war.getNextActionId()} / ${war.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${war.getTurnManager().getTurnIndex()})`); + FloatText.show(`${Lang.getText(Lang.Type.B0109)} (${war.getNextActionId()} / ${war.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${war.getTurnManager().getTurnIndex() + 1})`); const action = data.WarActionUnitWait; diff --git a/src/modules/replay/model/ReplayTurnManager.ts b/src/modules/replay/model/ReplayTurnManager.ts index e27424425..cbe0df587 100644 --- a/src/modules/replay/model/ReplayTurnManager.ts +++ b/src/modules/replay/model/ReplayTurnManager.ts @@ -45,13 +45,14 @@ namespace TinyWars.Replay { } private _resetFogForPlayerInTurn(): void { - const war = this._getWar(); - const teamIndex = war.getPlayerInTurn().getTeamIndex(); + const war = this._getWar(); + const visibleTiles = VisibilityHelpers.getAllTilesVisibleToTeam(war, war.getPlayerInTurn().getTeamIndex()); + war.getTileMap().forEachTile(tile => { - if (!VisibilityHelpers.checkIsTileVisibleToTeam(war, tile.getGridIndex(), teamIndex)) { - tile.setFogEnabled(); - } else { + if (visibleTiles.has(tile)) { tile.setFogDisabled(); + } else { + tile.setFogEnabled(); } tile.updateView(); }); diff --git a/src/modules/replay/model/ReplayWar.ts b/src/modules/replay/model/ReplayWar.ts index 2d8d780a5..51d144375 100644 --- a/src/modules/replay/model/ReplayWar.ts +++ b/src/modules/replay/model/ReplayWar.ts @@ -148,7 +148,7 @@ namespace TinyWars.Replay { await this._loadCheckPoint(checkPointId); this.startRunning().startRunningView(); - FloatText.show(`${Lang.getText(Lang.Type.A0045)} (${this.getNextActionId()} / ${this.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${this.getTurnManager().getTurnIndex()})`); + FloatText.show(`${Lang.getText(Lang.Type.A0045)} (${this.getNextActionId()} / ${this.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${this.getTurnManager().getTurnIndex() + 1})`); } else { this.setIsAutoReplay(false); @@ -165,7 +165,7 @@ namespace TinyWars.Replay { this.stopRunning(); await this._loadCheckPoint(checkPointId); this.startRunning().startRunningView(); - FloatText.show(`${Lang.getText(Lang.Type.A0045)} (${this.getNextActionId()} / ${this.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${this.getTurnManager().getTurnIndex()})`); + FloatText.show(`${Lang.getText(Lang.Type.A0045)} (${this.getNextActionId()} / ${this.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${this.getTurnManager().getTurnIndex() + 1})`); } } public checkIsInBeginning(): boolean { @@ -176,7 +176,7 @@ namespace TinyWars.Replay { this.stopRunning(); await this._loadCheckPoint(this.getCheckPointId(this.getNextActionId()) - 1); - FloatText.show(`${Lang.getText(Lang.Type.A0045)} (${this.getNextActionId()} / ${this.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${this.getTurnManager().getTurnIndex()})`); + FloatText.show(`${Lang.getText(Lang.Type.A0045)} (${this.getNextActionId()} / ${this.getTotalActionsCount()} ${Lang.getText(Lang.Type.B0191)}: ${this.getTurnManager().getTurnIndex() + 1})`); this.startRunning().startRunningView(); } private async _loadCheckPoint(checkPointId: number): Promise { diff --git a/src/modules/replay/view/ReplayWarMenuPanel.ts b/src/modules/replay/view/ReplayWarMenuPanel.ts index acd055587..7fd089b85 100644 --- a/src/modules/replay/view/ReplayWarMenuPanel.ts +++ b/src/modules/replay/view/ReplayWarMenuPanel.ts @@ -196,7 +196,7 @@ namespace TinyWars.Replay { this._labelMapName.text = await WarMapModel.getMapNameInLanguage(mapFileName) || "----"; this._labelMapDesigner.text = await WarMapModel.getMapDesigner(mapFileName) || "----"; this._labelWarId.text = `${war.getWarId()}`; - this._labelTurnIndex.text = `${war.getTurnManager().getTurnIndex()}`; + this._labelTurnIndex.text = `${war.getTurnManager().getTurnIndex() + 1}`; this._labelActionId.text = `${war.getNextActionId() - 1}`; this._labelIncomeModifier.text = `${war.getSettingsIncomeModifier()}%`; this._labelEnergyGrowthModifier.text = `${war.getSettingsEnergyGrowthModifier()}%`; diff --git a/src/modules/singleCustomWar/model/ScwFogMap.ts b/src/modules/singleCustomWar/model/ScwFogMap.ts index f7e61a1ea..1bb325d2a 100644 --- a/src/modules/singleCustomWar/model/ScwFogMap.ts +++ b/src/modules/singleCustomWar/model/ScwFogMap.ts @@ -28,9 +28,12 @@ namespace TinyWars.SingleCustomWar { public startRunning(war: ScwWar): void { super.startRunning(war); - const teamIndexes = (war.getPlayerManager() as ScwPlayerManager).getWatcherTeamIndexesForScw(); + const visibleTiles = VisibilityHelpers.getAllTilesVisibleToTeams( + war, + (war.getPlayerManager() as ScwPlayerManager).getWatcherTeamIndexesForScw() + ); war.getTileMap().forEachTile(tile => { - if (!VisibilityHelpers.checkIsTileVisibleToTeams(war, tile.getGridIndex(), teamIndexes)) { + if (!visibleTiles.has(tile)) { tile.setFogEnabled(); } }); diff --git a/src/modules/singleCustomWar/model/ScwHelpers.ts b/src/modules/singleCustomWar/model/ScwHelpers.ts index 4768552c2..7ea88f635 100644 --- a/src/modules/singleCustomWar/model/ScwHelpers.ts +++ b/src/modules/singleCustomWar/model/ScwHelpers.ts @@ -94,28 +94,19 @@ namespace TinyWars.SingleCustomWar.ScwHelpers { } export function updateTilesAndUnitsOnVisibilityChanged(war: ScwWar): void { - const teamIndexes = (war.getPlayerManager() as ScwPlayerManager).getWatcherTeamIndexesForScw(); + const teamIndexes = (war.getPlayerManager() as ScwPlayerManager).getWatcherTeamIndexesForScw(); + const visibleUnits = VisibilityHelpers.getAllUnitsOnMapVisibleToTeams(war, teamIndexes); war.getUnitMap().forEachUnitOnMap(unit => { - if (!VisibilityHelpers.checkIsUnitOnMapVisibleToTeams( - war, - unit.getGridIndex(), - unit.getType(), - unit.getIsDiving(), - unit.getPlayerIndex(), - teamIndexes - )) { - unit.setViewVisible(false); - } else { - unit.setViewVisible(true); - } + unit.setViewVisible(visibleUnits.has(unit)); }); - const tileMap = war.getTileMap(); + const tileMap = war.getTileMap(); + const visibleTiles = VisibilityHelpers.getAllTilesVisibleToTeams(war, teamIndexes); tileMap.forEachTile(tile => { - if (!VisibilityHelpers.checkIsTileVisibleToTeams(war, tile.getGridIndex(), teamIndexes)) { - tile.setFogEnabled(); - } else { + if (visibleTiles.has(tile)) { tile.setFogDisabled(); + } else { + tile.setFogEnabled(); } tile.updateView(); }); diff --git a/src/modules/singleCustomWar/view/ScwUnitMapView.ts b/src/modules/singleCustomWar/view/ScwUnitMapView.ts index 17160dbef..ffa9cf21f 100644 --- a/src/modules/singleCustomWar/view/ScwUnitMapView.ts +++ b/src/modules/singleCustomWar/view/ScwUnitMapView.ts @@ -1,24 +1,17 @@ namespace TinyWars.SingleCustomWar { import VisibilityHelpers = Utility.VisibilityHelpers; + export class ScwUnitMapView extends BaseWar.BwUnitMapView { protected _resetVisibleForAllUnitsOnMap(): void { const unitMap = this._getUnitMap(); const war = unitMap.getWar(); - const teamIndexes = (war.getPlayerManager() as ScwPlayerManager).getWatcherTeamIndexesForScw(); + const visibleUnits = VisibilityHelpers.getAllUnitsOnMapVisibleToTeams( + war, + (war.getPlayerManager() as ScwPlayerManager).getWatcherTeamIndexesForScw() + ); unitMap.forEachUnitOnMap(unit => { - if (!VisibilityHelpers.checkIsUnitOnMapVisibleToTeams( - war, - unit.getGridIndex(), - unit.getType(), - unit.getIsDiving(), - unit.getPlayerIndex(), - teamIndexes - )) { - unit.setViewVisible(false); - } else { - unit.setViewVisible(true); - } + unit.setViewVisible(visibleUnits.has(unit)); }); } } diff --git a/src/modules/singleCustomWar/view/ScwWarMenuPanel.ts b/src/modules/singleCustomWar/view/ScwWarMenuPanel.ts index afe91d496..f67e4f335 100644 --- a/src/modules/singleCustomWar/view/ScwWarMenuPanel.ts +++ b/src/modules/singleCustomWar/view/ScwWarMenuPanel.ts @@ -211,7 +211,7 @@ namespace TinyWars.SingleCustomWar { this._labelMapName.text = await WarMapModel.getMapNameInLanguage(mapFileName) || "----"; this._labelMapDesigner.text = await WarMapModel.getMapDesigner(mapFileName) || "----"; this._labelWarId.text = `${war.getWarId()}`; - this._labelTurnIndex.text = `${war.getTurnManager().getTurnIndex()}`; + this._labelTurnIndex.text = `${war.getTurnManager().getTurnIndex() + 1}`; this._labelActionId.text = `${war.getNextActionId() - 1}`; this._labelIncomeModifier.text = `${war.getSettingsIncomeModifier()}%`; this._labelEnergyGrowthModifier.text = `${war.getSettingsEnergyGrowthModifier()}%`; diff --git a/src/modules/warMap/model/WarMapProxy.ts b/src/modules/warMap/model/WarMapProxy.ts index a20430a55..5156926eb 100644 --- a/src/modules/warMap/model/WarMapProxy.ts +++ b/src/modules/warMap/model/WarMapProxy.ts @@ -143,14 +143,20 @@ namespace TinyWars.WarMap.WarMapProxy { } } - export function reqReviewMap(designerUserId: number, slotIndex: number, modifiedTime: number, isAccept: boolean, rejectReason: string | null): void { + export function reqReviewMap( + designerUserId : number, + slotIndex : number, + modifiedTime : number, + isAccept : boolean, + reviewComment : string | null + ) : void { NetManager.send({ C_MmReviewMap: { designerUserId, slotIndex, modifiedTime, isAccept, - rejectReason, + reviewComment, }, }); } diff --git a/src/utility/Lang.ts b/src/utility/Lang.ts index 2be673fae..48221d1b2 100644 --- a/src/utility/Lang.ts +++ b/src/utility/Lang.ts @@ -538,6 +538,10 @@ namespace TinyWars.Utility.Lang { `模拟战已成功创建。您可以通过单人模式进入该战局。`, `The simulation war is created successfully.`, ], + [Type.A0105]: [ + `请输入您对此地图的评价以及改进建议,可留空`, + `Please leave your comment here if any.`, + ], //////////////////////////////////////////////////////////////////////////////////////////////////// // Short strings. @@ -1830,6 +1834,10 @@ namespace TinyWars.Utility.Lang { `模拟战`, `Simulation`, ], + [Type.B0326]: [ + `评审意见`, + `Comments`, + ], //////////////////////////////////////////////////////////////////////////////////////////////////// [Type.B1000]: [ @@ -2472,6 +2480,8 @@ namespace TinyWars.Utility.Lang { ``, `QQ群: 368142455`, `Discord: https://discord.gg/jdtRpY9`, + ``, + `GitHub: https://github.com/Babygogogo/TinyWarsClient`, ].join("\n"), [ `Thank you for playing Tiny Wars!`, @@ -2479,6 +2489,8 @@ namespace TinyWars.Utility.Lang { ``, `Discord: https://discord.gg/jdtRpY9`, `QQ group: 368142455`, + ``, + `GitHub: https://github.com/Babygogogo/TinyWarsClient`, ].join("\n"), ], }; diff --git a/src/utility/ProtoTypes.ts b/src/utility/ProtoTypes.ts index 77d8a71c7..9e019c36b 100644 --- a/src/utility/ProtoTypes.ts +++ b/src/utility/ProtoTypes.ts @@ -2382,6 +2382,9 @@ export declare interface IMapEditorData { /** MapEditorData rejectReason */ rejectReason?: (string|null); + + /** MapEditorData reviewComment */ + reviewComment?: (string|null); } /** Represents a MapEditorData. */ @@ -2408,6 +2411,9 @@ export declare class MapEditorData implements IMapEditorData { /** MapEditorData rejectReason. */ public rejectReason: string; + /** MapEditorData reviewComment. */ + public reviewComment: string; + /** * Creates a new MapEditorData instance using the specified properties. * @param [properties] Properties to set @@ -12730,8 +12736,8 @@ export declare interface IC_MmReviewMap { /** C_MmReviewMap isAccept */ isAccept?: (boolean|null); - /** C_MmReviewMap rejectReason */ - rejectReason?: (string|null); + /** C_MmReviewMap reviewComment */ + reviewComment?: (string|null); } /** Represents a C_MmReviewMap. */ @@ -12755,8 +12761,8 @@ export declare class C_MmReviewMap implements IC_MmReviewMap { /** C_MmReviewMap isAccept. */ public isAccept: boolean; - /** C_MmReviewMap rejectReason. */ - public rejectReason: string; + /** C_MmReviewMap reviewComment. */ + public reviewComment: string; /** * Creates a new C_MmReviewMap instance using the specified properties. diff --git a/src/utility/VisibilityHelpers.ts b/src/utility/VisibilityHelpers.ts index 7ba080e46..f1e61ff83 100644 --- a/src/utility/VisibilityHelpers.ts +++ b/src/utility/VisibilityHelpers.ts @@ -7,10 +7,6 @@ namespace TinyWars.Utility.VisibilityHelpers { import GridIndex = Types.GridIndex; import Visibility = Types.Visibility; - type Discoveries = { - tiles: Set, - units: Set, - } type ParamsForCheckIsUnitOnMapVisibleToTeam = { war : BwWar; gridIndex : GridIndex; @@ -113,6 +109,82 @@ namespace TinyWars.Utility.VisibilityHelpers { return false; } + export function getAllUnitsOnMapVisibleToTeams(war: BwWar, teamIndexes: Set): Set { + const fogMap = war.getFogMap(); + const visibilityFromPaths = fogMap.getVisibilityMapFromPathsForTeams(teamIndexes); + const visibilityFromTiles = fogMap.getVisibilityMapFromTilesForTeams(teamIndexes); + const visibilityFromUnits = fogMap.getVisibilityMapFromUnitsForTeams(teamIndexes); + const unitMap = war.getUnitMap(); + const tileMap = war.getTileMap(); + const units = new Set(); + + unitMap.forEachUnitOnMap(unit => { + const gridIndex = unit.getGridIndex(); + const tile = tileMap.getTile(gridIndex); + if ((teamIndexes.has(unit.getTeamIndex())) || + (_checkHasUnitWithTeamIndexesOnAdjacentGrids(unitMap, gridIndex, teamIndexes)) || + (teamIndexes.has(tile.getTeamIndex())) + ) { + units.add(unit); + } else { + if (unit.getIsDiving()) { + // Do nothing. + } else { + const { x, y } = gridIndex; + const visibility = Math.max( + visibilityFromPaths[x][y], + visibilityFromTiles[x][y], + visibilityFromUnits[x][y], + ); + if ((visibility === Visibility.TrueVision) || + ((visibility === Visibility.InsideVision) && (!tile.checkCanHideUnit(unit.getType()))) + ) { + units.add(unit); + } + } + } + }); + return units; + } + export function getAllUnitsOnMapVisibleToUser(war: BwWar, userId: number): Set { + const fogMap = war.getFogMap(); + const visibilityFromPaths = fogMap.getVisibilityMapFromPathsForUser(userId); + const visibilityFromTiles = fogMap.getVisibilityMapFromTilesForUser(userId); + const visibilityFromUnits = fogMap.getVisibilityMapFromUnitsForUser(userId); + const observerTeamIndexes = war.getWatcherTeamIndexes(userId); + const unitMap = war.getUnitMap(); + const tileMap = war.getTileMap(); + const units = new Set(); + + unitMap.forEachUnitOnMap(unit => { + const gridIndex = unit.getGridIndex(); + const tile = tileMap.getTile(gridIndex); + if ((observerTeamIndexes.has(unit.getTeamIndex())) || + (_checkHasUnitWithTeamIndexesOnAdjacentGrids(unitMap, gridIndex, observerTeamIndexes)) || + (observerTeamIndexes.has(tile.getTeamIndex())) + ) { + units.add(unit); + } else { + if (unit.getIsDiving()) { + // Do nothing. + } else { + const { x, y } = gridIndex; + const visibility = Math.max( + visibilityFromPaths[x][y], + visibilityFromTiles[x][y], + visibilityFromUnits[x][y], + ); + if ((visibility === Visibility.TrueVision) || + ((visibility === Visibility.InsideVision) && (!tile.checkCanHideUnit(unit.getType()))) + ) { + units.add(unit); + } + } + } + }); + return units; + } + export function checkIsTileVisibleToTeam(war: BwWar, gridIndex: GridIndex, observerTeamIndex: number): boolean { return checkIsTileVisibleToTeams(war, gridIndex, new Set([observerTeamIndex])); } @@ -172,157 +244,110 @@ namespace TinyWars.Utility.VisibilityHelpers { return false; } - export function getDiscoveriesByPath(war: BwWar, path: GridIndex[], movingUnit: BwUnit, isUnitDestroyed: boolean): Discoveries { - const tileMap = war.getTileMap(); + export function getAllTilesVisibleToTeam(war: BwWar, teamIndex: number): Set { + const fogMap = war.getFogMap(); + const visibilityFromPaths = fogMap.getVisibilityMapFromPathsForTeam(teamIndex); + const visibilityFromTiles = fogMap.getVisibilityMapFromTilesForTeam(teamIndex); + const visibilityFromUnits = fogMap.getVisibilityMapFromUnitsForTeam(teamIndex); + const observerTeamIndexes = new Set([teamIndex]); const unitMap = war.getUnitMap(); - const observerTeamIndex = movingUnit.getTeamIndex()!; - const visibilityMap = _createVisibilityMapFromPath(war, path, movingUnit); - const discoveredTiles = new Set(); - const discoveredUnits = new Set(); - const destination = path[path.length - 1]; - const { width: mapWidth, height: mapHeight } = tileMap.getMapSize(); - - for (let x = 0; x < mapWidth; ++x) { - for (let y = 0; y < mapHeight; ++y) { - const visibility = visibilityMap[x][y]; - if ((visibility != null) && (visibility > 0)) { - const gridIndex = { x: x, y: y } as GridIndex; - - const tile = tileMap.getTile(gridIndex); - if (((visibility === 2) || (!tile.checkIsUnitHider())) && - (!checkIsTileVisibleToTeam(war, gridIndex, observerTeamIndex)) - ) { - discoveredTiles.add(tile); - } - - const unit = unitMap.getUnitOnMap(gridIndex); - if (unit) { - if (unit.getIsDiving()) { - if ((!isUnitDestroyed) && - (GridIndexHelpers.checkIsAdjacent(gridIndex, destination)) && - (!checkIsUnitOnMapVisibleToTeam({ - war, - gridIndex, - unitType : unit.getType(), - isDiving : true, - unitPlayerIndex : unit.getPlayerIndex(), - observerTeamIndex, - })) - ) { - discoveredUnits.add(unit); - } - } else { - if (((visibility === 2) || (!_checkIsUnitHiddenByTileToTeam(war, unit, observerTeamIndex))) && - (!checkIsUnitOnMapVisibleToTeam({ - war, - gridIndex, - unitType : unit.getType(), - isDiving : false, - unitPlayerIndex : unit.getPlayerIndex(), - observerTeamIndex, - })) - ) { - discoveredUnits.add(unit); - } - } - } + const tileMap = war.getTileMap(); + const tiles = new Set(); + const hasFog = fogMap.checkHasFogCurrently(); + + tileMap.forEachTile(tile => { + const gridIndex = tile.getGridIndex(); + if ((!hasFog) || + (observerTeamIndexes.has(tile.getTeamIndex())) || + (_checkHasUnitWithTeamIndexesOnGrid(unitMap, gridIndex, observerTeamIndexes)) || + (_checkHasUnitWithTeamIndexesOnAdjacentGrids(unitMap, gridIndex, observerTeamIndexes)) + ) { + tiles.add(tile); + } else { + const { x, y } = gridIndex; + const visibility = Math.max( + visibilityFromPaths[x][y], + visibilityFromTiles[x][y], + visibilityFromUnits[x][y], + ); + if ((visibility === Visibility.TrueVision) || + ((visibility === Visibility.InsideVision) && (!tile.checkIsUnitHider())) + ) { + tiles.add(tile); } } - } - - return { tiles: discoveredTiles, units: discoveredUnits }; - } - - export function getDiscoveriesByBuild(war: BwWar, gridIndex: GridIndex, builder: BwUnit): Discoveries { - const vision = _getVisionForBuiltTile(war, gridIndex, builder); - if (vision == null) { - return { tiles: new Set(), units: new Set() }; - } else { - return _getDiscoversByGettingBuilding(war, gridIndex, vision, builder.getPlayerIndex()); - } - } - - export function getDiscoveriesByCapture(war: BwWar, gridIndex: GridIndex, observerPlayerIndex: number): Discoveries { - const vision = _getVisionForCapturedTile(war, gridIndex, observerPlayerIndex); - if (vision == null) { - return { tiles: new Set(), units: new Set() }; - } else { - return _getDiscoversByGettingBuilding(war, gridIndex, vision, observerPlayerIndex); - } + }); + return tiles; } - - export function getDiscoveriesByFlare(war: BwWar, origin: GridIndex, radius: number, observerPlayerIndex: number): Discoveries { - const tileMap = war.getTileMap(); - const unitMap = war.getUnitMap(); - const discoveredTiles = new Set(); - const discoveredUnits = new Set(); - const observerTeamIndex = war.getPlayerManager().getTeamIndex(observerPlayerIndex); - for (const gridIndex of GridIndexHelpers.getGridsWithinDistance(origin, 0, radius, tileMap.getMapSize())) { - const tile = tileMap.getTile(gridIndex); - if (!checkIsTileVisibleToTeam(war, gridIndex, observerTeamIndex)) { - discoveredTiles.add(tile); - } - - const unit = unitMap.getUnitOnMap(gridIndex); - if ((unit) && - (!unit.getIsDiving()) && - (!checkIsUnitOnMapVisibleToTeam({ - war, - gridIndex, - unitType : unit.getType(), - isDiving : unit.getIsDiving(), - unitPlayerIndex : unit.getPlayerIndex(), - observerTeamIndex, - })) + export function getAllTilesVisibleToTeams(war: BwWar, teamIndexes: Set): Set { + const fogMap = war.getFogMap(); + const visibilityFromPaths = fogMap.getVisibilityMapFromPathsForTeams(teamIndexes); + const visibilityFromTiles = fogMap.getVisibilityMapFromTilesForTeams(teamIndexes); + const visibilityFromUnits = fogMap.getVisibilityMapFromUnitsForTeams(teamIndexes); + const unitMap = war.getUnitMap(); + const tileMap = war.getTileMap(); + const tiles = new Set(); + const hasFog = fogMap.checkHasFogCurrently(); + + tileMap.forEachTile(tile => { + const gridIndex = tile.getGridIndex(); + if ((!hasFog) || + (teamIndexes.has(tile.getTeamIndex())) || + (_checkHasUnitWithTeamIndexesOnGrid(unitMap, gridIndex, teamIndexes)) || + (_checkHasUnitWithTeamIndexesOnAdjacentGrids(unitMap, gridIndex, teamIndexes)) ) { - discoveredUnits.add(unit); + tiles.add(tile); + } else { + const { x, y } = gridIndex; + const visibility = Math.max( + visibilityFromPaths[x][y], + visibilityFromTiles[x][y], + visibilityFromUnits[x][y], + ); + if ((visibility === Visibility.TrueVision) || + ((visibility === Visibility.InsideVision) && (!tile.checkIsUnitHider())) + ) { + tiles.add(tile); + } } - } - - return { tiles: discoveredTiles, units: discoveredUnits }; + }); + return tiles; } - - export function getDiscoveriesByPlayerProduceUnit(war: BwWar, producerGridIndex: GridIndex, unitType: Types.UnitType): Discoveries { - // TODO: take skills into account. - const tileMap = war.getTileMap(); - const unitMap = war.getUnitMap(); - const producerTile = tileMap.getTile(producerGridIndex); - const producerTileType = producerTile.getType(); - const playerIndex = producerTile.getPlayerIndex(); - const observerTeamIndex = war.getPlayerManager().getTeamIndex(playerIndex); - const configVersion = war.getConfigVersion(); - const visionBonusCfg = ConfigManager.getVisionBonusCfg(configVersion, unitType); - const visionRange = ConfigManager.getUnitTemplateCfg(configVersion, unitType).visionRange - + (visionBonusCfg && visionBonusCfg[producerTileType] ? visionBonusCfg[producerTileType].visionBonus || 0 : 0); - - const discoveredTiles = new Set(); - const discoveredUnits = new Set(); - for (const gridIndex of GridIndexHelpers.getGridsWithinDistance(producerGridIndex, 1, visionRange, tileMap.getMapSize())) { - const distance = GridIndexHelpers.getDistance(gridIndex, producerGridIndex); - const tile = tileMap.getTile(gridIndex); - if ((!checkIsTileVisibleToTeam(war, gridIndex, observerTeamIndex)) && - ((distance === 1) || (!tile.checkIsUnitHider())) - ) { - discoveredTiles.add(tile); - } - - const unit = unitMap.getUnitOnMap(gridIndex); - if ((unit) && - (!checkIsUnitOnMapVisibleToTeam({ - war, - gridIndex, - isDiving : unit.getIsDiving(), - unitType : unit.getType(), - unitPlayerIndex : unit.getPlayerIndex(), - observerTeamIndex, - })) && - ((distance === 1) || ((!tile.checkCanHideUnit(unit.getType())) && (!unit.getIsDiving()))) + export function getAllTilesVisibleToUser(war: BwWar, userId: number): Set { + const fogMap = war.getFogMap(); + const visibilityFromPaths = fogMap.getVisibilityMapFromPathsForUser(userId); + const visibilityFromTiles = fogMap.getVisibilityMapFromTilesForUser(userId); + const visibilityFromUnits = fogMap.getVisibilityMapFromUnitsForUser(userId); + const observerTeamIndexes = war.getWatcherTeamIndexes(userId); + const unitMap = war.getUnitMap(); + const tileMap = war.getTileMap(); + const tiles = new Set(); + const hasFog = fogMap.checkHasFogCurrently(); + + tileMap.forEachTile(tile => { + const gridIndex = tile.getGridIndex(); + if ((!hasFog) || + (observerTeamIndexes.has(tile.getTeamIndex())) || + (_checkHasUnitWithTeamIndexesOnGrid(unitMap, gridIndex, observerTeamIndexes)) || + (_checkHasUnitWithTeamIndexesOnAdjacentGrids(unitMap, gridIndex, observerTeamIndexes)) || + (observerTeamIndexes.has(tile.getTeamIndex())) ) { - discoveredUnits.add(unit); + tiles.add(tile); + } else { + const { x, y } = gridIndex; + const visibility = Math.max( + visibilityFromPaths[x][y], + visibilityFromTiles[x][y], + visibilityFromUnits[x][y], + ); + if ((visibility === Visibility.TrueVision) || + ((visibility === Visibility.InsideVision) && (!tile.checkIsUnitHider())) + ) { + tiles.add(tile); + } } - } - - return { tiles: discoveredTiles, units: discoveredUnits }; + }); + return tiles; } function _checkHasUnitWithTeamIndexesOnAdjacentGrids(unitMap: BwUnitMap, origin: GridIndex, teamIndexes: Set): boolean { @@ -339,87 +364,4 @@ namespace TinyWars.Utility.VisibilityHelpers { const unit = unitMap.getUnitOnMap(gridIndex); return (unit != null) && (teamIndexes.has(unit.getTeamIndex()!)); } - - function _createVisibilityMapFromPath(war: BwWar, path: GridIndex[], unit: BwUnit): Visibility[][] { - const playerIndex = unit.getPlayerIndex(); - const mapSize = war.getTileMap().getMapSize(); - const visibilityMap = Helpers.createEmptyMap(mapSize.width, mapSize.height, Visibility.OutsideVision); - const isTrueVision = unit.checkIsTrueVision(); - - for (const node of path) { - const visionRange = unit.getVisionRangeForPlayer(playerIndex, node); - for (const grid of GridIndexHelpers.getGridsWithinDistance(node, 0, 1, mapSize)) { - visibilityMap[grid.x][grid.y] = Visibility.TrueVision; - } - - if (visionRange) { - for (const grid of GridIndexHelpers.getGridsWithinDistance(node, 2, visionRange, mapSize)) { - if (isTrueVision) { - visibilityMap[grid.x][grid.y] = Visibility.TrueVision; - } else { - if (visibilityMap[grid.x][grid.y] === Visibility.OutsideVision) { - visibilityMap[grid.x][grid.y] = Visibility.InsideVision; - } - } - } - } - } - - return visibilityMap; - } - - function _checkIsUnitHiddenByTileToTeam(war: BwWar, unit: BwUnit, teamIndex: number): boolean { - const tile = war.getTileMap().getTile(unit.getGridIndex()); - return (tile.getTeamIndex() !== teamIndex) && (tile.checkCanHideUnit(unit.getType())); - } - - function _getDiscoversByGettingBuilding(war: BwWar, origin: GridIndex, vision: number, observerPlayerIndex: number): Discoveries { - // TODO: take commander skills into account. - const tileMap = war.getTileMap(); - const unitMap = war.getUnitMap(); - const discoveredTiles = new Set(); - const discoveredUnits = new Set(); - const observerTeamIndex = war.getPlayerManager().getTeamIndex(observerPlayerIndex); - for (const gridIndex of GridIndexHelpers.getGridsWithinDistance(origin, 0, vision, tileMap.getMapSize())) { - const tile = tileMap.getTile(gridIndex); - if (((!tile.checkIsUnitHider()) || (GridIndexHelpers.checkIsEqual(gridIndex, origin))) && - (!checkIsTileVisibleToTeam(war, gridIndex, observerTeamIndex))) { - discoveredTiles.add(tile); - } - - const unit = unitMap.getUnitOnMap(gridIndex); - if (unit) { - const unitType = unit.getType(); - if ((!tile.checkCanHideUnit(unitType)) && - (!unit.getIsDiving()) && - (!checkIsUnitOnMapVisibleToTeam({ - war, - gridIndex, - unitType, - isDiving : unit.getIsDiving(), - unitPlayerIndex : unit.getPlayerIndex(), - observerTeamIndex, - })) - ) { - discoveredUnits.add(unit); - } - } - } - - return { tiles: discoveredTiles, units: discoveredUnits }; - } - - function _getVisionForBuiltTile(war: BwWar, gridIndex: GridIndex, builder: BwUnit): number | undefined | null { - // TODO: take commander skills into account. - const newTileType = builder.getBuildTargetTileType(war.getTileMap().getTile(gridIndex).getType())!; - const cfg = newTileType != null ? ConfigManager.getTileTemplateCfgByType(war.getConfigVersion(), newTileType) : undefined; - return cfg ? cfg.visionRange : undefined; - } - - function _getVisionForCapturedTile(war: BwWar, gridIndex: GridIndex, observerPlayerIndex: number): number | undefined | null { - const oldTileType = war.getTileMap().getTile(gridIndex).getType(); - const newTileType = oldTileType === Types.TileType.Headquarters ? Types.TileType.City : oldTileType; - const cfg = ConfigManager.getTileTemplateCfgByType(war.getConfigVersion(), newTileType); - return cfg ? cfg.visionRange : undefined; - } }