/// <summary> /// Read text from data, removing 0x00 padding. /// </summary> /// <param name="index"></param> /// <param name="maxLength"></param> /// <returns></returns> public string GetPaddedUtf8String(int index, int maxLength) { var bytes = Data.Skip(index).TakeWhile((i, c) => i != 0 && c <= maxLength).ToArray(); //var reader = new Text.PNAReader(bytes, false, true); //return reader.Text; return(NameLoader.LoadName(bytes)); }
private Game(Map[] maps, Rules configRules, IList <Civilization> civilizations, Options options, string[] gamePaths, DifficultyType difficulty, IPlayer localPlayer) { Script = new ScriptEngine(localPlayer.UI, this, gamePaths); _options = options; _maps = maps; _rules = configRules; TurnNumber = 0; _difficultyLevel = difficulty; AllCivilizations.AddRange(civilizations); CityNames = NameLoader.LoadCityNames(gamePaths); Players = civilizations.Select(c => { var player = c.PlayerType switch { PlayerType.AI => new AIPlayer(_difficultyLevel), PlayerType.Local => localPlayer, PlayerType.Remote => throw new NotSupportedException("Network play not implemented"), PlayerType.Barbarians => //TODO: create seperate barbarian player new AIPlayer(_difficultyLevel), _ => throw new ArgumentOutOfRangeException(nameof(c.PlayerType), c.PlayerType, null) }; return(player.SetCiv(c)); }).ToArray(); TerrainImprovements = TerrainImprovementFunctions.GetStandardImprovements(Rules); Script.RunScript("tile_improvements.lua"); Script.RunScript("improvements.lua"); Script.RunScript("advances.lua"); AllCivilizations.ForEach((civ) => { OnCivEvent?.Invoke(this, new CivEventArgs(CivEventType.Created, civ)); }); this.SetupTech(); Power.CalculatePowerRatings(this); }
/// <summary> /// Write text to data, padding to max length with 0x00 /// </summary> /// <param name="index">byte index in data to start name</param> /// <param name="maxLength">Max length of the text <strong>excluding</strong> the required 0x00 terminator</param> /// <param name="value">name to write</param> public void SetPaddedUtf8String(int index, int maxLength, string value) { if (value.Length > maxLength) { value = value.Substring(0, maxLength); } byte[] output; while (true) { //var writer = new Text.PNAWriter(value, false, true); //output = writer.Data; output = NameLoader.SaveName(value); if (output.Length <= maxLength) { break; } value = value.Substring(0, value.Length - 1); } byte[] final = new byte[maxLength + 1]; // ensure padding section is overwritten and required 0x00 terminator exists. output.CopyTo(final, 0); final.CopyTo(Data, index); }
public byte[] SaveName(string name) { return(NameLoader.SaveName(name)); }
public string LoadName(byte[] nameData) { return(NameLoader.LoadName(nameData)); }