public static Rectangle?GetVR(WzImage image) { Rectangle?result = null; if (image["info"]["VRLeft"] != null) { WzImageProperty info = image["info"]; int left = InfoTool.GetInt(info["VRLeft"]); int right = InfoTool.GetInt(info["VRRight"]); int top = InfoTool.GetInt(info["VRTop"]); int bottom = InfoTool.GetInt(info["VRBottom"]); result = new Rectangle(left, top, right - left, bottom - top); } return(result); }
public MapInfo(WzImage image, string strMapName, string strStreetName, string strCategoryName) { this.image = image; int?startHour; int?endHour; this.strMapName = strMapName; this.strStreetName = strStreetName; this.strCategoryName = strCategoryName; WzFile file = (WzFile)image.WzFileParent; string loggerSuffix = ", map " + image.Name + ((file != null) ? (" of version " + Enum.GetName(typeof(WzMapleVersion), file.MapleVersion) + ", v" + file.Version.ToString()) : ""); foreach (WzImageProperty prop in image["info"].WzProperties) { switch (prop.Name) { case "bgm": bgm = InfoTool.GetString(prop); break; case "cloud": cloud = InfoTool.GetBool(prop); break; case "swim": swim = InfoTool.GetBool(prop); break; case "forcedReturn": forcedReturn = InfoTool.GetInt(prop); break; case "hideMinimap": hideMinimap = InfoTool.GetBool(prop); break; case "mapDesc": mapDesc = InfoTool.GetString(prop); break; case "mapName": mapName = InfoTool.GetString(prop); break; case "mapMark": mapMark = InfoTool.GetString(prop); break; case "mobRate": mobRate = InfoTool.GetFloat(prop); break; case "moveLimit": moveLimit = InfoTool.GetInt(prop); break; case "returnMap": returnMap = InfoTool.GetInt(prop); break; case "town": town = InfoTool.GetBool(prop); break; case "version": version = InfoTool.GetInt(prop); break; case "fieldLimit": int fl = InfoTool.GetInt(prop); if (fl >= (int)Math.Pow(2, 23)) { ErrorLogger.Log(ErrorLevel.IncorrectStructure, "Invalid fieldlimit " + fl.ToString() + loggerSuffix); fl = fl & ((int)Math.Pow(2, 23) - 1); } fieldLimit = (FieldLimit)fl; break; case "VRTop": case "VRBottom": case "VRLeft": case "VRRight": break; case "link": //link = InfoTool.GetInt(prop); break; case "timeLimit": timeLimit = InfoTool.GetInt(prop); break; case "lvLimit": lvLimit = InfoTool.GetInt(prop); break; case "onFirstUserEnter": onFirstUserEnter = InfoTool.GetString(prop); break; case "onUserEnter": onUserEnter = InfoTool.GetString(prop); break; case "fly": fly = InfoTool.GetBool(prop); break; case "noMapCmd": noMapCmd = InfoTool.GetBool(prop); break; case "partyOnly": partyOnly = InfoTool.GetBool(prop); break; case "fieldType": int ft = InfoTool.GetInt(prop); if (!Enum.IsDefined(typeof(FieldType), ft)) { ErrorLogger.Log(ErrorLevel.IncorrectStructure, "Invalid fieldType " + ft.ToString() + loggerSuffix); ft = 0; } fieldType = (FieldType)ft; break; case "miniMapOnOff": miniMapOnOff = InfoTool.GetBool(prop); break; case "reactorShuffle": reactorShuffle = InfoTool.GetBool(prop); break; case "reactorShuffleName": reactorShuffleName = InfoTool.GetString(prop); break; case "personalShop": personalShop = InfoTool.GetBool(prop); break; case "entrustedShop": entrustedShop = InfoTool.GetBool(prop); break; case "effect": effect = InfoTool.GetString(prop); break; case "lvForceMove": lvForceMove = InfoTool.GetInt(prop); break; case "timeMob": startHour = InfoTool.GetOptionalInt(prop["startHour"]); endHour = InfoTool.GetOptionalInt(prop["endHour"]); int? id = InfoTool.GetOptionalInt(prop["id"]); string message = InfoTool.GetOptionalString(prop["message"]); if (id == null || message == null || (startHour == null ^ endHour == null)) { ErrorLogger.Log(ErrorLevel.IncorrectStructure, "timeMob" + loggerSuffix); } else { timeMob = new TimeMob((int?)startHour, (int?)endHour, (int)id, message); } break; case "help": help = InfoTool.GetString(prop); break; case "snow": snow = InfoTool.GetBool(prop); break; case "rain": rain = InfoTool.GetBool(prop); break; case "dropExpire": dropExpire = InfoTool.GetInt(prop); break; case "decHP": decHP = InfoTool.GetInt(prop); break; case "decInterval": decInterval = InfoTool.GetInt(prop); break; case "autoLieDetector": startHour = InfoTool.GetOptionalInt(prop["startHour"]); endHour = InfoTool.GetOptionalInt(prop["endHour"]); int?interval = InfoTool.GetOptionalInt(prop["interval"]); int?propInt = InfoTool.GetOptionalInt(prop["prop"]); if (startHour == null || endHour == null || interval == null || propInt == null) { ErrorLogger.Log(ErrorLevel.IncorrectStructure, "autoLieDetector" + loggerSuffix); } else { autoLieDetector = new AutoLieDetector((int)startHour, (int)endHour, (int)interval, (int)propInt); } break; case "expeditionOnly": expeditionOnly = InfoTool.GetBool(prop); break; case "fs": fs = InfoTool.GetFloat(prop); break; case "protectItem": protectItem = InfoTool.GetInt(prop); break; case "createMobInterval": createMobInterval = InfoTool.GetInt(prop); break; case "fixedMobCapacity": fixedMobCapacity = InfoTool.GetInt(prop); break; case "streetName": streetName = InfoTool.GetString(prop); break; case "noRegenMap": noRegenMap = InfoTool.GetBool(prop); break; case "allowedItem": allowedItem = new List <int>(); if (prop.WzProperties != null && prop.WzProperties.Count > 0) { foreach (WzImageProperty item in prop.WzProperties) { allowedItem.Add(item.GetInt()); } } break; case "recovery": recovery = InfoTool.GetFloat(prop); break; case "blockPBossChange": blockPBossChange = InfoTool.GetBool(prop); break; case "everlast": everlast = InfoTool.GetBool(prop); break; case "damageCheckFree": damageCheckFree = InfoTool.GetBool(prop); break; case "dropRate": dropRate = InfoTool.GetFloat(prop); break; case "scrollDisable": scrollDisable = InfoTool.GetBool(prop); break; case "needSkillForFly": needSkillForFly = InfoTool.GetBool(prop); break; case "zakum2Hack": zakum2Hack = InfoTool.GetBool(prop); break; case "allMoveCheck": allMoveCheck = InfoTool.GetBool(prop); break; case "VRLimit": VRLimit = InfoTool.GetBool(prop); break; case "consumeItemCoolTime": consumeItemCoolTime = InfoTool.GetBool(prop); break; default: ErrorLogger.Log(ErrorLevel.MissingFeature, "Unknown Prop: " + prop.Name + loggerSuffix); additionalProps.Add(prop.DeepClone()); break; } } }
/// <summary> /// Constructor /// </summary> /// <param name="image"></param> /// <param name="strMapName"></param> /// <param name="strStreetName"></param> /// <param name="strCategoryName"></param> public MapInfo(WzImage image, string strMapName, string strStreetName, string strCategoryName) { this.image = image; int?startHour; int?endHour; this.strMapName = strMapName; this.strStreetName = strStreetName; this.strCategoryName = strCategoryName; WzFile file = (WzFile)image.WzFileParent; string loggerSuffix = ", map " + image.Name + ((file != null) ? (" of version " + Enum.GetName(typeof(WzMapleVersion), file.MapleVersion) + ", v" + file.Version.ToString()) : ""); foreach (WzImageProperty prop in image["info"].WzProperties) { switch (prop.Name) { case "bgm": bgm = InfoTool.GetString(prop); break; case "cloud": cloud = InfoTool.GetBool(prop); break; case "swim": swim = InfoTool.GetBool(prop); break; case "forcedReturn": forcedReturn = InfoTool.GetInt(prop); break; case "hideMinimap": hideMinimap = InfoTool.GetBool(prop); break; case "mapDesc": mapDesc = InfoTool.GetString(prop); break; case "mapName": mapName = InfoTool.GetString(prop); break; case "mapMark": mapMark = InfoTool.GetString(prop); break; case "mobRate": mobRate = InfoTool.GetFloat(prop); break; case "moveLimit": moveLimit = InfoTool.GetInt(prop); break; case "returnMap": returnMap = InfoTool.GetInt(prop); break; case "town": town = InfoTool.GetBool(prop); break; case "version": version = InfoTool.GetInt(prop); break; case "fieldLimit": long fl = InfoTool.GetLong(prop); fieldLimit = fl; break; case "VRTop": VRTop = InfoTool.GetOptionalInt(prop, 0); break; case "VRBottom": VRBottom = InfoTool.GetOptionalInt(prop, 0); break; case "VRLeft": VRLeft = InfoTool.GetOptionalInt(prop, 0); break; case "VRRight": VRRight = InfoTool.GetOptionalInt(prop, 0); break; case "link": //link = InfoTool.GetInt(prop); break; case "timeLimit": timeLimit = InfoTool.GetInt(prop); break; case "lvLimit": lvLimit = InfoTool.GetInt(prop); break; case "onFirstUserEnter": onFirstUserEnter = InfoTool.GetString(prop); break; case "onUserEnter": onUserEnter = InfoTool.GetString(prop); break; case "fly": fly = InfoTool.GetBool(prop); break; case "noMapCmd": noMapCmd = InfoTool.GetBool(prop); break; case "partyOnly": partyOnly = InfoTool.GetBool(prop); break; case "fieldType": int ft = InfoTool.GetInt(prop); if (!Enum.IsDefined(typeof(FieldType), ft)) { ErrorLogger.Log(ErrorLevel.IncorrectStructure, "Invalid fieldType " + ft.ToString() + loggerSuffix); ft = 0; } fieldType = (FieldType)ft; break; case "miniMapOnOff": miniMapOnOff = InfoTool.GetBool(prop); break; case "reactorShuffle": reactorShuffle = InfoTool.GetBool(prop); break; case "reactorShuffleName": reactorShuffleName = InfoTool.GetString(prop); break; case "personalShop": personalShop = InfoTool.GetBool(prop); break; case "entrustedShop": entrustedShop = InfoTool.GetBool(prop); break; case "effect": effect = InfoTool.GetString(prop); break; case "lvForceMove": lvForceMove = InfoTool.GetInt(prop); break; case "timeMob": startHour = InfoTool.GetOptionalInt(prop["startHour"]); endHour = InfoTool.GetOptionalInt(prop["endHour"]); int? id = InfoTool.GetOptionalInt(prop["id"]); string message = InfoTool.GetOptionalString(prop["message"]); if (id == null || message == null || (startHour == null ^ endHour == null)) { ErrorLogger.Log(ErrorLevel.IncorrectStructure, "timeMob" + loggerSuffix); } else { timeMob = new TimeMob((int?)startHour, (int?)endHour, (int)id, message); } break; case "help": help = InfoTool.GetString(prop); break; case "snow": snow = InfoTool.GetBool(prop); break; case "rain": rain = InfoTool.GetBool(prop); break; case "dropExpire": dropExpire = InfoTool.GetInt(prop); break; case "decHP": decHP = InfoTool.GetInt(prop); break; case "decInterval": decInterval = InfoTool.GetInt(prop); break; case "autoLieDetector": startHour = InfoTool.GetOptionalInt(prop["startHour"]); endHour = InfoTool.GetOptionalInt(prop["endHour"]); int?interval = InfoTool.GetOptionalInt(prop["interval"]); int?propInt = InfoTool.GetOptionalInt(prop["prop"]); if (startHour == null || endHour == null || interval == null || propInt == null) { ErrorLogger.Log(ErrorLevel.IncorrectStructure, "autoLieDetector" + loggerSuffix); } else { autoLieDetector = new AutoLieDetector((int)startHour, (int)endHour, (int)interval, (int)propInt); } break; case "expeditionOnly": expeditionOnly = InfoTool.GetBool(prop); break; case "fs": fs = InfoTool.GetFloat(prop); break; case "protectItem": protectItem = InfoTool.GetInt(prop); break; case "createMobInterval": createMobInterval = InfoTool.GetInt(prop); break; case "fixedMobCapacity": fixedMobCapacity = InfoTool.GetInt(prop); break; case "streetName": streetName = InfoTool.GetString(prop); break; case "noRegenMap": noRegenMap = InfoTool.GetBool(prop); break; case "allowedItem": allowedItem = new List <int>(); if (prop.WzProperties != null && prop.WzProperties.Count > 0) { foreach (WzImageProperty item in prop.WzProperties) { allowedItem.Add(item.GetInt()); } } break; case "recovery": recovery = InfoTool.GetFloat(prop); break; case "blockPBossChange": blockPBossChange = InfoTool.GetBool(prop); break; case "everlast": everlast = InfoTool.GetBool(prop); break; case "damageCheckFree": damageCheckFree = InfoTool.GetBool(prop); break; case "dropRate": dropRate = InfoTool.GetFloat(prop); break; case "scrollDisable": scrollDisable = InfoTool.GetBool(prop); break; case "needSkillForFly": needSkillForFly = InfoTool.GetBool(prop); break; case "zakum2Hack": zakum2Hack = InfoTool.GetBool(prop); break; case "allMoveCheck": allMoveCheck = InfoTool.GetBool(prop); break; case "VRLimit": VRLimit = InfoTool.GetBool(prop); break; case "consumeItemCoolTime": consumeItemCoolTime = InfoTool.GetBool(prop); break; case "zeroSideOnly": zeroSideOnly = InfoTool.GetBool(prop); break; case "mirror_Bottom": mirror_Bottom = InfoTool.GetBool(prop); break; case "AmbientBGM": case "AmbientBGMv": case "areaCtrl": case "onlyUseSkill": case "limitUseShop": case "limitUseTrunk": case "freeFallingVX": case "midAirAccelVX": case "midAirDecelVX": case "jumpSpeedR": case "jumpAccUpKey": case "jumpAccDownKey": case "jumpApplyVX": case "dashSkill": case "speedMaxOver": case "speedMaxOver ": // with a space, stupid nexon case "isSpecialMoveCheck": case "forceSpeed": case "forceJump": case "forceUseIndie": case "vanishPet": case "vanishAndroid": case "vanishDragon": case "limitUI": case "largeSplit": case "qrLimit": case "noChair": case "fieldScript": case "standAlone": case "partyStandAlone": case "HobbangKing": case "quarterView": case "MRLeft": case "MRTop": case "MRRight": case "MRBottom": case "limitSpeedAndJump": case "directionInfo": case "LBSide": case "LBTop": case "LBBottom": case "bgmSub": case "fieldLimit2": case "fieldLimit_tw": case "particle": case "qrLimitJob": case "individualMobPool": case "barrier": case "remoteEffect": case "isFixDec": case "decHPr": case "isDecView": case "forceFadeInTime": case "forceFadeOutTime": case "qrLimitState": case "qrLimitState2": case "difficulty": case "alarm": case "bossMobID": case "reviveCurField": case "ReviveCurFieldOfNoTransfer": case "ReviveCurFieldOfNoTransferPoint": case "limitUserEffectField": case "nofollowCharacter": case "functionObjInfo": case "quest": case "ridingMove": case "ridingField": case "noLanding": case "noCancelSkill": case "defaultAvatarDir": case "footStepSound": case "taggedObjRegenInfo": case "offSoulAbsorption": case "canPartyStatChangeIgnoreParty": case "canPartyStatChangeIgnoreParty ": // with a space case "forceReturnOnDead": case "zoomOutField": case "EscortMinTime": case "deathCount": case "onEnterResetFifthSkill": case "potionLimit": case "lifeCount": case "respawnCooltimeField": case "scale": case "skills": case "noResurection": case "incInterval": case "incMPr": case "bonusExpPerUserHPRate": case "barrierArc": case "noBackOverlapped": case "partyBonusR": case "specialSound": case "inFieldsetForcedReturn": case "chaser": case "chaserEndTime": case "chaserEffect": case "cagePotal": case "cageLT": case "cageRB": case "chaserHoldTime": case "phase": case "boss": case "actionBarIdx": case "shadowzone": case "towerChairEnable": case "DiceMasterUpIndex": case "DiceMasterDownIndex": case "ChangeName": case "entrustedFishing": case "forcedScreenMode": case "isHideUI": case "resetRidingField": case "PL_Gunman": case "noHekatonEffect": case "mode": case "skill": case "MR": case "ratemob": case "bonusStageNoChangeBack": case "questAmbience": case "blockScriptItem": case "remoteTranslucenceView": case "rewardContentName": case "specialDeadAction": case "FriendsStoryBossDelay": case "soulFieldType": case "cameraMoveY": case "subType": case "playTime": case "noEvent": case "forParty": case "whiteOut": case "UserInvisible": case "OnFirstUserEnter": // the same as onFirstUserEnter case "teamPortal": case "typingGame": case "lt": case "rb": case "fieldAttackObj": case "timeLeft": case "timeLeft_d": case "eventSummon": case "rankCheckMob": case "questCheckMob": case "bindSkillLimit": case "NoMobCapacityLimit": case "userTimer": case "eventChairIndex": case "onlyEventChair": case "waitReviveTime": case "RidingTop": case "temporarySkill": case "largeSplt": case "blockTakeOffItem": case "PartyOnly": case "climb": case "bulletConsume": case "gaugeDelay": case "individualPet": case "level": case "hungryMuto": case "property": // map 921172300.img case "spiritSavior": case "standAlonePermitUpgrade": // 993059600.img case "limitHeadAlarmField": // 993180000.img { WzImageProperty cloneProperty = prop.DeepClone(); //cloneProperty.Parent = prop.Parent; unsupportedInfoProperties.Add(cloneProperty); break; } default: ErrorLogger.Log(ErrorLevel.MissingFeature, string.Format("[MapInfo] Unknown field info/ property: '{0}'. {1}. Please fix it at MapInfo.cs", prop.Name, loggerSuffix)); additionalProps.Add(prop.DeepClone()); break; } } }
public MapInfo(WzImage image, string strMapName, string strStreetName) { int?startHour; int?endHour; this.strMapName = strMapName; this.strStreetName = strStreetName; foreach (IWzImageProperty prop in image["info"].WzProperties) { switch (prop.Name) { case "bgm": bgm = InfoTool.GetString(prop); break; case "cloud": cloud = InfoTool.GetBool(prop); break; case "swim": swim = InfoTool.GetBool(prop); break; case "forcedReturn": forcedReturn = InfoTool.GetInt(prop); break; case "hideMinimap": hideMinimap = InfoTool.GetBool(prop); break; case "mapDesc": mapDesc = InfoTool.GetString(prop); break; case "mapMark": MapMark = InfoTool.GetString(prop); break; case "mobRate": mobRate = InfoTool.GetFloat(prop); break; case "moveLimit": moveLimit = InfoTool.GetInt(prop); break; case "returnMap": returnMap = InfoTool.GetInt(prop); break; case "town": town = InfoTool.GetBool(prop); break; case "version": version = InfoTool.GetInt(prop); break; case "fieldLimit": int fl = InfoTool.GetInt(prop); if (fl >= (int)Math.Pow(2, 23)) { fl = fl & ((int)Math.Pow(2, 23) - 1); } fieldLimit = (FieldLimit)fl; break; case "VRTop": case "VRBottom": case "VRLeft": case "VRRight": break; case "link": //link = InfoTool.GetInt(prop); break; case "timeLimit": timeLimit = InfoTool.GetInt(prop); break; case "lvLimit": lvLimit = InfoTool.GetInt(prop); break; case "onFirstUserEnter": onFirstUserEnter = InfoTool.GetString(prop); break; case "onUserEnter": onUserEnter = InfoTool.GetString(prop); break; case "fly": fly = InfoTool.GetBool(prop); break; case "noMapCmd": noMapCmd = InfoTool.GetBool(prop); break; case "partyOnly": partyOnly = InfoTool.GetBool(prop); break; case "fieldType": int ft = InfoTool.GetInt(prop); if (!Enum.IsDefined(typeof(FieldType), ft)) { ft = 0; } fieldType = (FieldType)ft; break; case "miniMapOnOff": miniMapOnOff = InfoTool.GetBool(prop); break; case "reactorShuffle": reactorShuffle = InfoTool.GetBool(prop); break; case "reactorShuffleName": reactorShuffleName = InfoTool.GetString(prop); break; case "personalShop": personalShop = InfoTool.GetBool(prop); break; case "entrustedShop": entrustedShop = InfoTool.GetBool(prop); break; case "effect": effect = InfoTool.GetString(prop); break; case "lvForceMove": lvForceMove = InfoTool.GetInt(prop); break; case "timeMob": startHour = InfoTool.GetOptionalInt(prop["startHour"]); endHour = InfoTool.GetOptionalInt(prop["endHour"]); int? id = InfoTool.GetOptionalInt(prop["id"]); string message = InfoTool.GetOptionalString(prop["message"]); if (id == null || message == null || (startHour == null ^ endHour == null)) { //System.Windows.Forms.MessageBox.Show("Warning", "Warning - incorrect timeMob structure in map data. Skipped and error log was saved."); WzFile file = (WzFile)image.WzFileParent; if (file != null) { ErrorLogger.Log(ErrorLevel.IncorrectStructure, "timeMob, map " + image.Name + " of version " + Enum.GetName(typeof(WzMapleVersion), file.MapleVersion) + ", v" + file.Version.ToString()); } } else { timeMob = new TimeMob((int?)startHour, (int?)endHour, (int)id, message); } break; case "help": help = InfoTool.GetString(prop); break; case "snow": snow = InfoTool.GetBool(prop); break; case "rain": rain = InfoTool.GetBool(prop); break; case "dropExpire": dropExpire = InfoTool.GetInt(prop); break; case "decHP": decHP = InfoTool.GetInt(prop); break; case "decInterval": decInterval = InfoTool.GetInt(prop); break; case "autoLieDetector": startHour = InfoTool.GetOptionalInt(prop["startHour"]); endHour = InfoTool.GetOptionalInt(prop["endHour"]); int?interval = InfoTool.GetOptionalInt(prop["interval"]); int?propInt = InfoTool.GetOptionalInt(prop["prop"]); if (startHour == null || endHour == null || interval == null || propInt == null) { //System.Windows.Forms.MessageBox.Show("Warning", "Warning - incorrect autoLieDetector structure in map data. Skipped and error log was saved."); WzFile file = (WzFile)image.WzFileParent; if (file != null) { ErrorLogger.Log(ErrorLevel.IncorrectStructure, "autoLieDetector, map " + image.Name + " of version " + Enum.GetName(typeof(WzMapleVersion), file.MapleVersion) + ", v" + file.Version.ToString()); } } else { autoLieDetector = new AutoLieDetector((int)startHour, (int)endHour, (int)interval, (int)propInt); } break; case "expeditionOnly": expeditionOnly = InfoTool.GetBool(prop); break; case "fs": fs = InfoTool.GetFloat(prop); break; case "protectItem": protectItem = InfoTool.GetInt(prop); break; case "createMobInterval": createMobInterval = InfoTool.GetInt(prop); break; case "fixedMobCapacity": fixedMobCapacity = InfoTool.GetInt(prop); break; case "streetName": streetName = InfoTool.GetString(prop); break; case "noRegenMap": noRegenMap = InfoTool.GetBool(prop); break; case "allowedItems": allowedItems = new List <int>(); if (prop.WzProperties != null && prop.WzProperties.Count > 0) { foreach (IWzImageProperty item in prop.WzProperties) { allowedItems.Add((int)item); } } break; case "recovery": recovery = InfoTool.GetFloat(prop); break; case "blockPBossChange": blockPBossChange = InfoTool.GetBool(prop); break; case "everlast": everlast = InfoTool.GetBool(prop); break; case "damageCheckFree": damageCheckFree = InfoTool.GetBool(prop); break; case "dropRate": dropRate = InfoTool.GetFloat(prop); break; case "scrollDisable": scrollDisable = InfoTool.GetBool(prop); break; case "needSkillForFly": needSkillForFly = InfoTool.GetBool(prop); break; case "zakum2Hack": zakum2Hack = InfoTool.GetBool(prop); break; case "allMoveCheck": allMoveCheck = InfoTool.GetBool(prop); break; case "VRLimit": VRLimit = InfoTool.GetBool(prop); break; case "consumeItemCoolTime": consumeItemCoolTime = InfoTool.GetBool(prop); break; default: additionalProps.Add(prop); break; } } if (image["info"]["VRLeft"] != null) { IWzImageProperty info = image["info"]; int left = InfoTool.GetInt(info["VRLeft"]); int right = InfoTool.GetInt(info["VRRight"]); int top = InfoTool.GetInt(info["VRTop"]); int bottom = InfoTool.GetInt(info["VRBottom"]); VR = new Rectangle(left, top, right - left, bottom - top); } }