public override void Load(Stream fs, CharacterDocument document, CharacterHandler handler) { var page = document.Pages [0]; var br = new BinaryReader(fs); var fontID = br.ReadString(); if (string.IsNullOrEmpty(fontID)) { page.Font = new BitFont(fs, BitFont.StandardCodePage); } else { page.Font = document.Info.GetFonts().SelectMany(r => r.Fonts).FirstOrDefault(r => r.ID == fontID); } var palSize = br.ReadInt16(); var canvas = page.Canvas; var pal = page.Palette; pal.Load(br, palSize, 0); ResizeCanvasWidth(fs, document, canvas); var p = Load(fs, canvas, pal); ResizeCanvasHeight(document, canvas, p.Y + 1); }
protected override int?GetWidth(Stream stream, CharacterDocument document, object state) { if (document.Sauce != null) { var charType = document.Sauce.TypeInfo as Sauce.Types.Character.DataTypeInfo; if (charType != null && charType.IsValidSize) { return(charType.Width); } } if (stream != null && stream.CanSeek) { var last = stream.Position; int max = document.Size.Width; var reader = new StreamReader(stream); string line; while ((line = reader.ReadLine()) != null) { if (line.Contains("\x1b[")) { stream.Position = last; return(base.GetWidth(stream, document, state)); } max = Math.Max(max, line.Length); } stream.Position = last; return(max); } return(base.GetWidth(stream, document, state)); }
/// <summary> /// Converts a CharacterRecord to a prototypical CharacterDocument for character import. /// </summary> /// <returns>CharacterDocument derived from CharacterRecord data.</returns> public CharacterDocument ToCharacterDocument() { CharacterDocument doc = new CharacterDocument(); Dictionary <int, RaceTemplate> raceDict = RaceTemplate.GetRaceDictionary(); doc.raceTemplate = raceDict[(int)parsedData.race + 1]; doc.gender = parsedData.gender; doc.career = parsedData.career; doc.name = parsedData.characterName; doc.faceIndex = parsedData.faceIndex; doc.workingStats = parsedData.currentStats; doc.workingSkills = parsedData.skills; doc.reflexes = parsedData.reflexes; doc.currentHealth = parsedData.currentHealth; doc.maxHealth = parsedData.maxHealth; doc.currentSpellPoints = parsedData.currentSpellPoints; doc.reputationCommoners = parsedData.reputationCommoners; doc.reputationMerchants = parsedData.reputationMerchants; doc.reputationNobility = parsedData.reputationNobility; doc.reputationScholars = parsedData.reputationScholars; doc.reputationUnderworld = parsedData.reputationUnderworld; doc.currentFatigue = parsedData.currentFatigue; doc.skillUses = parsedData.skillUses; doc.startingLevelUpSkillSum = parsedData.startingLevelUpSkillSum; doc.minMetalToHit = parsedData.minMetalToHit; doc.armorValues = parsedData.armorValues; doc.lastTimePlayerBoughtTraining = parsedData.lastTimePlayerBoughtTraining; doc.timeForThievesGuildLetter = parsedData.timeForThievesGuildLetter; doc.timeForDarkBrotherhoodLetter = parsedData.timeForDarkBrotherhoodLetter; doc.darkBrotherhoodRequirementTally = parsedData.darkBrotherhoodRequirementTally; doc.thievesGuildRequirementTally = parsedData.thievesGuildRequirementTally; doc.biographyReactionMod = parsedData.biographyReactionMod; return(doc); }
protected override void FillSauce(Sauce.SauceInfo sauce, CharacterDocument document) { base.FillSauce(sauce, document); sauce.ByteFileType = (byte)Sauce.Types.Character.CharacterFileType.Ansi; FillSauceSize(sauce, document); FillFlags(sauce, document); }
public override void Load(Stream fs, CharacterDocument document, CharacterHandler handler) { var page = document.Pages[0]; document.ICEColours = true; var br = new BinaryReader(fs); Canvas canvas = page.Canvas; Point p; ResizeCanvasWidth(fs, document, canvas); br.ReadByte(); // read version byte (unused) var id = Encoding.ASCII.GetString(br.ReadBytes(8)); // read signature ID if (id != TundraID) { throw new Exception("Not a valid tundra24 file"); } var pal = new Palette(); pal.FindAddColour(Colors.Black); page.Palette = pal; p = Load(fs, canvas, pal); ResizeCanvasHeight(document, canvas, p.Y + 1); }
public override void Save(Stream stream, CharacterDocument document) { var bw = new BinaryWriter(stream); var page = document.Pages[0]; var canvas = page.Canvas; int lasty = canvas.FindEndY(CanvasElement.Default); var xbh = new XBinHeader { Width = (ushort)canvas.Size.Width, Height = (ushort)(lasty + 1), Compress = EnableCompression, NonBlink = document.ICEColours }; if (page.Palette.Count == 16 && page.Palette != Palette.GetDosPalette()) { xbh.Palette = true; } xbh.Font = true; if (xbh.Font) { xbh.FontSize = (byte)page.Font.Size.Height; xbh.Font512 |= page.Font.NumChars > 256; } xbh.Write(bw); if (xbh.Palette) { page.Palette.Save(bw, 2); } if (xbh.Font) { page.Font.Save(bw); } if (xbh.Compress) { for (int y = 0; y <= lasty; y++) { WriteCompressedRow(canvas, y, bw); } } else { for (int y = 0; y <= lasty; y++) { for (int x = 0; x < canvas.Width; x++) { var ce = canvas[x, y]; bw.Write((byte)ce.Character); bw.Write((byte)ce.Attribute); } } } bw.Flush(); }
/// <summary> /// Assigns player entity settings from a character document. /// </summary> public void AssignCharacter(CharacterDocument character, int level = 1, int maxHealth = 0) { if (character == null) { SetEntityDefaults(); return; } this.level = level; this.gender = character.gender; this.raceTemplate = character.raceTemplate; this.career = character.career; this.name = character.name; this.faceIndex = character.faceIndex; this.stats = character.workingStats; this.skills = character.workingSkills; this.reflexes = character.reflexes; if (maxHealth <= 0) { this.maxHealth = FormulaHelper.RollMaxHealth(level, stats.Endurance, career.HitPointsPerLevelOrMonsterLevel); } else { this.maxHealth = maxHealth; } FillVitalSigns(); DaggerfallUnity.LogMessage("Assigned character " + this.name, true); }
public void Load(Ansi ansi, Stream fs, CharacterDocument document, CharacterHandler handler) { AnimateView = document.AnimateView; Page page = document.Pages[0]; ansi.ResizeCanvasWidth(fs, document, page.Canvas); Load(fs, page.Canvas, page.Palette, (sender, args) => document.OnWait(args)); if (iceColours != null) { document.ICEColours = iceColours.Value; } while (page.Palette.Count < 16) { page.Palette.Add(Colors.Black); } if (!document.EditMode && document.FileName != null && string.Equals(Path.GetExtension(document.FileName), ".diz", StringComparison.OrdinalIgnoreCase)) { var endX = page.Canvas.FindEndX(CanvasElement.Default); page.Canvas.ResizeCanvas(new Size(endX + 1, page.Canvas.Height), false, true); } if (lastLineHasData) { ptCur.Y += 1; } if (!AnimateView) { ansi.ResizeCanvasHeight(document, page.Canvas, ptCur.Y); } }
public void Reroll(DFCareer dfClass) { // Assign base stats from class template DaggerfallStats rolledStats = CharacterDocument.GetClassBaseStats(dfClass); // Roll bonus value for each base stat // Using maxBonusRoll + 1 as Unity's Random.Range(int,int) is exclusive // of maximum value and we want to be inclusive of maximum value rolledStats.Strength += UnityEngine.Random.Range(minBonusRoll, maxBonusRoll + 1); rolledStats.Intelligence += UnityEngine.Random.Range(minBonusRoll, maxBonusRoll + 1); rolledStats.Willpower += UnityEngine.Random.Range(minBonusRoll, maxBonusRoll + 1); rolledStats.Agility += UnityEngine.Random.Range(minBonusRoll, maxBonusRoll + 1); rolledStats.Endurance += UnityEngine.Random.Range(minBonusRoll, maxBonusRoll + 1); rolledStats.Personality += UnityEngine.Random.Range(minBonusRoll, maxBonusRoll + 1); rolledStats.Speed += UnityEngine.Random.Range(minBonusRoll, maxBonusRoll + 1); rolledStats.Luck += UnityEngine.Random.Range(minBonusRoll, maxBonusRoll + 1); // Roll bonus pool for player to distribute // Using maxBonusPool + 1 for inclusive range as above int bonusPool = UnityEngine.Random.Range(minBonusPool, maxBonusPool + 1); // Apply stats to control SetStats(rolledStats, rolledStats, bonusPool); UpdateStatLabels(); // Play "rolling dice" sound DaggerfallUI.Instance.PlayOneShot(SoundClips.DiceRoll); }
public void Attach(DummySession parent, CharacterDocument doc) { _parent = parent; if (!_viewer.IsDisposed) { _viewer.SetContent(doc); } }
public override void Load(Stream stream, CharacterDocument doc, CharacterHandler handler) { var loader = new Loader { Format = this }; loader.Load(stream, doc, handler); }
public override void FillSauce(Sauce.SauceInfo sauce, CharacterDocument document) { base.FillSauce(sauce, document); sauce.ByteFileType = (byte)Sauce.Types.Character.CharacterFileType.TundraDraw; FillSauceSize(sauce, document); document.ICEColours = true; // tundra always has ice colors on FillFlags(sauce, document); }
public override void Load(Stream fs, CharacterDocument doc, CharacterHandler handler) { Page page = doc.Pages [0]; BinaryReader br = new BinaryReader(fs); Canvas canvas = page.Canvas; Rectangle rClip = new Rectangle(0, 0, canvas.Width, canvas.Height); ResizeCanvasWidth(fs, doc, canvas); Point p = rClip.Location; try { br.ReadByte(); // read version byte (unused) Palette pal = new Palette(); pal.Load(br, 64, 0); /* * TextWriter tw = new StreamWriter("c:\\blah.txt"); * for (int i=0; i<pal.Size; i++) * tw.WriteLine("{0}, {1}, {2}", pal[i].R, pal[i].G, pal[i].B); * tw.Close(); */ page.Palette = Palette.FromEGA(pal); page.Font = new BitFont(256, 8, 16, BitFont.StandardCodePage); page.Font.Load(br); WaitEventArgs args = new WaitEventArgs(); while (true) { p.X = rClip.Left; for (int x = 0; x < 80; x++) { byte ch = br.ReadByte(); byte attr = br.ReadByte(); doc.OnWait(args); if (args.Exit) { break; } if (p.X <= rClip.InnerRight) { canvas [p.X - rClip.Left, p.Y] = new CanvasElement(ch, attr); } p.X++; } p.Y++; if (p.Y > rClip.InnerBottom) { break; } } } catch (EndOfStreamException) { } ResizeCanvasHeight(doc, canvas, p.Y + 1); }
protected override int?GetWidth(Stream stream, CharacterDocument document, object state = null) { var header = state as IdfHeader; if (header != null) { return(header.Bounds.Width); } return(base.GetWidth(stream, document, state)); }
private static void TestCharacterDocument() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); CharacterDocument doc = CharacterDocument.LoadForTest(HOMEDIR + "Executable\\characterdocumenttest1.txt"); CharacterDocumentViewerContainer f = new CharacterDocumentViewerContainer(doc); Application.Run(f); }
void SummaryWindow_OnClose() { if (!createCharSummaryWindow.Cancelled) { characterDocument = createCharSummaryWindow.GetUpdatedCharacterDocument(); StartNewGame(); } else { SetSelectReflexesWindow(); } }
public override void Save(Stream stream, CharacterDocument document) { var doc = document; if (doc != null) { var page = doc.Pages [0]; var args = new SaveArgs(page.Canvas, page.Palette, stream); args.iCEColours = document.ICEColours; args.Save(); } }
public override void Load(Stream fs, CharacterDocument doc, CharacterHandler handler) { Page page = doc.Pages[0]; BinaryReader br = new BinaryReader(fs); Canvas canvas = page.Canvas; ResizeCanvasWidth(fs, doc, canvas); Rectangle rClip = new Rectangle(0, 0, canvas.Width, canvas.Height); Point p = rClip.Location; try { //page.Palette = Palette.GetDefaultPalette (); //page.Font = BitFont.GetStandard8x16 (); CanvasElement ce = new CanvasElement(32, 7); p = rClip.Location; WaitEventArgs args = new WaitEventArgs(); while (true) { doc.OnWait(args); if (args.Exit) { break; } ce.Character = br.ReadByte(); ce.Attribute = br.ReadByte(); if (p.X < canvas.Size.Width && p.Y < canvas.Size.Height) { canvas[p] = ce; } p.X++; if (p.X > rClip.InnerRight) { p.X = rClip.Left; p.Y++; if (p.Y > rClip.InnerBottom) { canvas.ShiftUp(); p.Y = rClip.InnerBottom; } } } } catch (EndOfStreamException) { } ResizeCanvasHeight(doc, canvas, p.Y + 1); }
public DummySession() { _caption = String.Format("dummy {0}", _count); //_document = CharacterDocument.SingleLine(String.Format("document {0}", _count)); _document = new CharacterDocument(); _document.LoadForTest(@"C:\P4\doc\test\characterdocument.txt"); _count++; _document.SetOwner(this); _icon = null; _document.Caption = _caption; }
public override UIHandleResult OnMouseDown(MouseEventArgs args) { if (args.Button != MouseButtons.Left || !_viewer.EnabledEx) { return(UIHandleResult.Pass); } //テキスト選択ではないのでちょっと柄悪いが。UserControl->Controlの置き換えに伴う if (!_viewer.Focused) { _viewer.Focus(); } CharacterDocument document = _viewer.CharacterDocument; lock (document) { int col, row; _viewer.MousePosToTextPos(args.X, args.Y, out col, out row); int target_id = _viewer.GetTopLine().ID + row; TextSelection sel = _viewer.TextSelection; if (sel.State == SelectionState.Fixed) { sel.Clear(); //変なところでMouseDownしたとしてもClearだけはする } if (target_id <= document.LastLineNumber) { //if(InFreeSelectionMode) ExitFreeSelectionMode(); //if(InAutoSelectionMode) ExitAutoSelectionMode(); RangeType rt; //Debug.WriteLine(String.Format("MouseDown {0} {1}", sel.State, sel.PivotType)); //同じ場所でポチポチと押すとChar->Word->Line->Charとモード変化する if (sel.StartX != args.X || sel.StartY != args.Y) { rt = RangeType.Char; } else { rt = sel.PivotType == RangeType.Char ? RangeType.Word : sel.PivotType == RangeType.Word ? RangeType.Line : RangeType.Char; } //マウスを動かしていなくても、MouseDownとともにMouseMoveが来てしまうようだ GLine tl = document.FindLine(target_id); sel.StartSelection(tl, col, rt, args.X, args.Y); } } _viewer.Invalidate(); //NOTE 選択状態に変化のあった行のみ更新すればなおよし return(UIHandleResult.Capture); }
public CharacterDocumentViewerContainer(CharacterDocument doc) { _viewer = new CharacterDocumentViewer(); _viewer.SetContent(doc, GEnv.DefaultRenderProfile); _viewer.Dock = DockStyle.Fill; _caretTimer = new System.Windows.Forms.Timer(); _caretTimer.Interval = Win32.GetCaretBlinkTime(); _caretTimer.Tick += new EventHandler(this.OnCaretTimer); _caretTimer.Start(); this.Controls.Add(_viewer); this.Size = new Size(300, 300); }
/// <summary> /// Assigns player entity settings from a character document. /// </summary> public void AssignCharacter(CharacterDocument character, int level = 1, int maxHealth = 0, bool fillVitals = true) { if (character == null) { SetEntityDefaults(); return; } this.level = level; this.gender = character.gender; this.raceTemplate = character.raceTemplate; this.career = character.career; this.name = character.name; this.faceIndex = character.faceIndex; this.stats = character.workingStats; this.skills = character.workingSkills; this.reflexes = character.reflexes; this.maxHealth = character.maxHealth; this.currentHealth = character.currentHealth; this.currentMagicka = character.currentSpellPoints; this.currentFatigue = character.currentFatigue; this.skillUses = character.skillUses; this.startingLevelUpSkillSum = character.startingLevelUpSkillSum; this.ArmorValues = character.armorValues; SetCurrentLevelUpSkillSum(); if (startingLevelUpSkillSum <= 0) // new character { startingLevelUpSkillSum = currentLevelUpSkillSum; } if (maxHealth <= 0) { this.maxHealth = FormulaHelper.RollMaxHealth(level, career.HitPointsPerLevel); } else { this.maxHealth = maxHealth; } if (fillVitals) { FillVitalSigns(); } timeOfLastSkillIncreaseCheck = DaggerfallUnity.Instance.WorldTime.Now.ToClassicDaggerfallTime(); DaggerfallUnity.LogMessage("Assigned character " + this.name, true); }
static void AssignSkillSpellbook(PlayerEntity playerEntity, CharacterDocument characterDocument) { Debug.Log("Starting Spells: Assigning Based on Skills"); // Skill based items AssignSkillSpells(playerEntity, playerEntity.Career.PrimarySkill1, true); AssignSkillSpells(playerEntity, playerEntity.Career.PrimarySkill2, true); AssignSkillSpells(playerEntity, playerEntity.Career.PrimarySkill3, true); AssignSkillSpells(playerEntity, playerEntity.Career.MajorSkill1); AssignSkillSpells(playerEntity, playerEntity.Career.MajorSkill2); AssignSkillSpells(playerEntity, playerEntity.Career.MajorSkill3); Debug.Log("Starting Spells: Assigning Finished"); }
protected override int?GetWidth(Stream stream, CharacterDocument document, object state) { if (!fpBinaryWidth.Enabled) { return(BinaryWidth); } else if (document.Sauce != null && document.Sauce.ByteFileType > 1) { return(document.Sauce.ByteFileType * 2); } else { return(null); } }
public void Load(Stream stream, CharacterDocument doc, Handler handler) { Page page = doc.Pages [0]; br = new BinaryReader(stream); canvas = page.Canvas; Format.ResizeCanvasWidth(stream, doc, canvas); rClip = new Rectangle(canvas.Size); p = rClip.Location; attr = CanvasElement.Default.Attribute; try { while (true) { var b = br.ReadByte(); if (b == 1) { ReadCtrlA(); if (ended) { break; } } else if (b == 13) { // do nothing? p.X = rClip.Left; } else if (b == 10) { // LF(+CR?) IncrementY(); p.X = rClip.Left; } else { canvas [p] = new CanvasElement(b, attr); IncrementX(); } } } catch (EndOfStreamException) { } Format.ResizeCanvasHeight(doc, canvas, p.Y + 1); }
/// <summary> /// Converts a CharacterRecord to a prototypical CharacterDocument for character import. /// </summary> /// <param name="stripLycanthropyType">Lycanthropy type to remove, if previously read.</param> /// <returns>CharacterDocument derived from CharacterRecord data.</returns> public CharacterDocument ToCharacterDocument(LycanthropyTypes stripLycanthropyType = LycanthropyTypes.None) { CharacterDocument doc = new CharacterDocument(); Dictionary <int, RaceTemplate> raceDict = RaceTemplate.GetRaceDictionary(); // Strip back classic changes for vampire or lycanthrope as this is handled by effect system in DFU // If player is not transformed then this will simply return parsedData.race + 1 Races classicTransformedRace; Races liveRace = StripTransformedRace(out classicTransformedRace, stripLycanthropyType); doc.raceTemplate = raceDict[(int)liveRace]; doc.gender = parsedData.gender; doc.career = parsedData.career; doc.name = parsedData.characterName; doc.faceIndex = parsedData.faceIndex; doc.workingStats = parsedData.currentStats; doc.workingSkills = parsedData.skills; doc.reflexes = parsedData.reflexes; doc.currentHealth = parsedData.currentHealth; doc.maxHealth = parsedData.baseHealth; doc.currentSpellPoints = parsedData.currentSpellPoints; doc.reputationCommoners = parsedData.reputationCommoners; doc.reputationMerchants = parsedData.reputationMerchants; doc.reputationNobility = parsedData.reputationNobility; doc.reputationScholars = parsedData.reputationScholars; doc.reputationUnderworld = parsedData.reputationUnderworld; doc.currentFatigue = parsedData.currentFatigue; doc.skillUses = parsedData.skillUses; doc.skillsRaisedThisLevel1 = parsedData.skillsRaisedThisLevel1; doc.skillsRaisedThisLevel2 = parsedData.skillsRaisedThisLevel2; doc.startingLevelUpSkillSum = parsedData.startingLevelUpSkillSum; doc.minMetalToHit = parsedData.minMetalToHit; doc.armorValues = parsedData.armorValues; doc.timeToBecomeVampireOrWerebeast = parsedData.timeToBecomeVampireOrWerebeast; doc.hasStartedInitialVampireQuest = parsedData.hasStartedInitialVampireQuest; doc.lastTimeVampireNeedToKillSatiated = parsedData.lastTimeVampireNeedToKillSatiated; doc.lastTimePlayerAteOrDrankAtTavern = parsedData.lastTimePlayerAteOrDrankAtTavern; doc.lastTimePlayerBoughtTraining = parsedData.lastTimePlayerBoughtTraining; doc.timeForThievesGuildLetter = parsedData.timeForThievesGuildLetter; doc.timeForDarkBrotherhoodLetter = parsedData.timeForDarkBrotherhoodLetter; doc.vampireClan = parsedData.vampireClan; doc.darkBrotherhoodRequirementTally = parsedData.darkBrotherhoodRequirementTally; doc.thievesGuildRequirementTally = parsedData.thievesGuildRequirementTally; doc.biographyReactionMod = parsedData.biographyReactionMod; doc.classicTransformedRace = classicTransformedRace; return(doc); }
protected void Save(Stream stream, CharacterDocument document, bool asTundra) { var bw = new BinaryWriter(stream); if (asTundra) { bw.Write((byte)24); bw.Write(Encoding.ASCII.GetBytes(TundraID)); } var page = document.Pages[0]; var canvas = page.Canvas; var pal = page.Palette; Save(stream, canvas, pal); }
/// <summary> /// Converts a CharacterRecord to a prototypical CharacterDocument for character import. /// </summary> /// <returns>CharacterDocument derived from CharacterRecord data.</returns> public CharacterDocument ToCharacterDocument() { CharacterDocument doc = new CharacterDocument(); Dictionary <int, RaceTemplate> raceDict = RaceTemplate.GetRaceDictionary(); doc.raceTemplate = raceDict[(int)parsedData.race + 1]; doc.gender = parsedData.gender; doc.career = parsedData.career; doc.name = parsedData.characterName; doc.faceIndex = parsedData.faceIndex; doc.workingStats = parsedData.currentStats; doc.workingSkills = parsedData.skills; doc.reflexes = parsedData.reflexes; return(doc); }
public override void Save(Stream stream, CharacterDocument document) { Page page = document.Pages[0]; var canvas = page.Canvas; int maxY = page.Canvas.FindEndY(new CanvasElement(32, 7)); for (int y = 0; y <= maxY; y++) { for (int x = 0; x < canvas.Size.Width; x++) { var elem = canvas[x, y]; stream.WriteByte(elem.Character); stream.WriteByte((byte)elem.Attribute); } } }
void SetCharacterSheet(CharacterDocument characterDocument) { this.characterDocument = characterDocument; this.textBox.Text = characterDocument.name; this.statsRollout.StartingStats = characterDocument.startingStats; this.statsRollout.WorkingStats = characterDocument.workingStats; this.statsRollout.BonusPool = 0; this.skillsRollout.SetClassSkills(characterDocument.career); this.skillsRollout.StartingSkills = characterDocument.startingSkills; this.skillsRollout.WorkingSkills = characterDocument.workingSkills; this.skillsRollout.PrimarySkillBonusPoints = 0; this.skillsRollout.MajorSkillBonusPoints = 0; this.skillsRollout.MinorSkillBonusPoints = 0; this.facePicker.FaceIndex = characterDocument.faceIndex; this.facePicker.SetFaceTextures(characterDocument.raceTemplate, characterDocument.gender); this.reflexPicker.PlayerReflexes = characterDocument.reflexes; }