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;
- }
}