コード例 #1
0
ファイル: Engine.cs プロジェクト: mockingbirdnest/HP
        public void WriteToDataset(CardDataset cds, CardPart part)
        {
            if (part == CardPart.Program)
            {
                CardDataset.EngineRow er;
                CardDataset.FlagRow   fr;

                for (int i = 0; i < cds.Engine.Count; i++)
                {
                    cds.Engine.RemoveEngineRow(cds.Engine [i]);
                }
                er           = cds.Engine.NewEngineRow();
                er.AngleUnit = unit.ToString();
                er.FlagCount = flags.Length;
                er.CardRow   = cds.Card [0];
                cds.Engine.AddEngineRow(er);
                for (int i = 0; i < flags.Length; i++)
                {
                    fr           = cds.Flag.NewFlagRow();
                    fr.Id        = i;
                    fr.Value     = flags [i];
                    fr.EngineRow = er;
                    cds.Flag.AddFlagRow(fr);
                }
            }
        }
コード例 #2
0
        public void WriteToDataset(CardDataset cds, CardPart part)
        {
            if (part == CardPart.Data)
            {
                CardDataset.MemoryRow   mr;
                CardDataset.RegisterRow rr;

                for (int i = 0; i < cds.Memory.Count; i++)
                {
                    cds.Memory.RemoveMemoryRow(cds.Memory [i]);
                }
                mr = cds.Memory.NewMemoryRow();
                mr.RegisterCount = registers.Length;
                mr.CardRow       = cds.Card [0];
                cds.Memory.AddMemoryRow(mr);
                for (int i = 0; i < registers.Length; i++)
                {
                    rr    = cds.Register.NewRegisterRow();
                    rr.Id = i;
                    // rr.Value = ...; // Not used anymore!
                    registers [i].WriteToRow(rr);
                    rr.MemoryRow = mr;
                    cds.Register.AddRegisterRow(rr);
                }
            }
        }
コード例 #3
0
        static public void Read(Stream stream, Reader reader)
        {
            CardDataset cds = new CardDataset();

            cds.ReadXml(stream);
            CheckVersion(cds);
            ReadFromDataset(cds, reader);
        }
コード例 #4
0
ファイル: Program.cs プロジェクト: mockingbirdnest/HP
        public void WriteToDataset(CardDataset cds, CardPart part)
        {
            if (part == CardPart.Program)
            {
                // Note that we write 1-based step numbers, in case someone wants to look at the
                // generated XML.
                CardDataset.ArgumentRow    ar;
                CardDataset.InstructionRow ir;
                CardDataset.LabelRow       lr;
                CardDataset.ProgramRow     pr;
                CardDataset.StepRow        sr;

                for (int i = 0; i < cds.Program.Count; i++)
                {
                    cds.Program.RemoveProgramRow(cds.Program [i]);
                }
                pr = cds.Program.NewProgramRow();
                pr.InstructionCount = instructions.Length;
                pr.LabelCount       = labels.Length;
                pr.CardRow          = cds.Card [0];
                cds.Program.AddProgramRow(pr);
                for (int i = 0; i < instructions.Length; i++)
                {
                    ir               = cds.Instruction.NewInstructionRow();
                    ir.Step          = i + 1;
                    ir.Instruction   = instructions [i].Symbol.Name;
                    ir.ArgumentCount = instructions [i].Arguments.Length;
                    ir.ProgramRow    = pr;
                    cds.Instruction.AddInstructionRow(ir);
                    for (int j = 0; j < instructions [i].Arguments.Length; j++)
                    {
                        Argument argument = instructions [i].Arguments [j];

                        ar    = cds.Argument.NewArgumentRow();
                        ar.Id = j;
                        argument.WriteToArgumentRow(ar);
                        ar.InstructionRow = ir;
                        cds.Argument.AddArgumentRow(ar);
                    }
                }
                for (int i = 0; i < labels.Length; i++)
                {
                    lr            = cds.Label.NewLabelRow();
                    lr.Id         = i;
                    lr.StepCount  = labels [i].Count;
                    lr.ProgramRow = pr;
                    cds.Label.AddLabelRow(lr);
                    for (int j = 0; j < labels [i].Count; j++)
                    {
                        sr          = cds.Step.NewStepRow();
                        sr.Step     = (int)labels [i] [j] + 1;
                        sr.LabelRow = lr;
                        cds.Step.AddStepRow(sr);
                    }
                }
            }
        }
コード例 #5
0
ファイル: Program.cs プロジェクト: mockingbirdnest/HP
        public void MergeFromDataset(CardDataset cds, Reader reader)
        {
            CardDataset.ArgumentRow []    ars;
            CardDataset.CardRow           cr;
            CardDataset.InstructionRow [] irs;
            CardDataset.ProgramRow        pr;
            CardDataset.ProgramRow []     prs;
            bool sourceProgramIsEmpty;

            cr  = cds.Card [0];
            prs = cr.GetProgramRows();
            if (prs.Length > 0)
            {
                pr  = prs [0];
                irs = pr.GetInstructionRows();

                // A source program that only contains R/S is considered empty.  No merge takes
                // place in this case.
                sourceProgramIsEmpty = true;
                foreach (CardDataset.InstructionRow ir in irs)
                {
                    if (reader.ToSymbol(ir.Instruction).Id != (int)SymbolConstants.SYMBOL_R_S)
                    {
                        sourceProgramIsEmpty = false;
                        break;
                    }
                }

                if (!sourceProgramIsEmpty)
                {
                    foreach (CardDataset.InstructionRow ir in irs)
                    {
                        Argument [] arguments = new Argument [ir.ArgumentCount];

                        if (next == instructions.Length - 1)
                        {
                            break;
                        }
                        ars = ir.GetArgumentRows();
                        foreach (CardDataset.ArgumentRow ar in ars)
                        {
                            Argument argument;
                            argument          = (Argument)Argument.ReadFromArgumentRow(ar);
                            arguments [ar.Id] = argument;
                        }

                        // We have to go through instruction insertion to make sure that the label
                        // table is properly updated.
                        Insert(new Instruction(reader,
                                               reader.ToSymbol(ir.Instruction),
                                               arguments));
                    }
                    isEmpty = false;
                }
            }
        }
コード例 #6
0
ファイル: Program.cs プロジェクト: mockingbirdnest/HP
        public void ReadFromDataset(CardDataset cds, Reader reader)
        {
            // Beware, the XML file uses 1-based step numbers, but we must go back to 0-based
            // numbers internally.
            CardDataset.ArgumentRow []    ars;
            CardDataset.CardRow           cr;
            CardDataset.InstructionRow [] irs;
            CardDataset.LabelRow []       lrs;
            CardDataset.ProgramRow        pr;
            CardDataset.ProgramRow []     prs;
            CardDataset.StepRow []        srs;

            cr      = cds.Card [0];
            prs     = cr.GetProgramRows();
            isEmpty = true;
            if (prs.Length > 0)
            {
                pr           = prs [0];
                instructions = new Instruction [pr.InstructionCount];
                irs          = pr.GetInstructionRows();
                foreach (CardDataset.InstructionRow ir in irs)
                {
                    Argument [] arguments = new Argument [ir.ArgumentCount];

                    if (reader.ToSymbol(ir.Instruction).Id != (int)SymbolConstants.SYMBOL_R_S)
                    {
                        isEmpty = false;
                    }
                    ars = ir.GetArgumentRows();
                    foreach (CardDataset.ArgumentRow ar in ars)
                    {
                        Argument argument;
                        argument          = (Argument)Argument.ReadFromArgumentRow(ar);
                        arguments [ar.Id] = argument;
                    }
                    instructions [ir.Step - 1] =
                        new Instruction(reader, reader.ToSymbol(ir.Instruction), arguments);
                }
                labels = new ArrayList [pr.LabelCount];
                lrs    = pr.GetLabelRows();
                foreach (CardDataset.LabelRow lr in lrs)
                {
                    labels [lr.Id] = new ArrayList();
                    srs            = lr.GetStepRows();
                    foreach (CardDataset.StepRow sr in srs)
                    {
                        labels [lr.Id].Add(sr.Step - 1);
                    }

                    // Should already be sorted, but just to be safe...
                    labels [lr.Id].Sort();
                }
            }
        }
コード例 #7
0
            public void ReadFromDataset(CardDataset cds, Reader reader)
            {
                CardDataset.CardRow       cr;
                CardDataset.DisplayRow    dr;
                CardDataset.DisplayRow [] drs;

                cr  = cds.Card [0];
                drs = cr.GetDisplayRows();
                if (drs.Length > 0)
                {
                    dr     = drs [0];
                    Digits = dr.Digits;
                    Format = (DisplayFormat)Enum.Parse(typeof(DisplayFormat), dr.Format);
                }
            }
コード例 #8
0
            public void WriteToDataset(CardDataset cds, CardPart part)
            {
                if (part == CardPart.Program)
                {
                    CardDataset.DisplayRow dr;

                    for (int i = 0; i < cds.Display.Count; i++)
                    {
                        cds.Display.RemoveDisplayRow(cds.Display [i]);
                    }
                    dr         = cds.Display.NewDisplayRow();
                    dr.Digits  = digits;
                    dr.Format  = format.ToString();
                    dr.CardRow = cds.Card [0];
                    cds.Display.AddDisplayRow(dr);
                }
            }
コード例 #9
0
        public void ReadFromDataset(CardDataset cds, Reader reader)
        {
            CardDataset.CardRow        cr;
            CardDataset.MemoryRow      mr;
            CardDataset.MemoryRow []   mrs;
            CardDataset.RegisterRow [] rrs;

            cr  = cds.Card [0];
            mrs = cr.GetMemoryRows();
            if (mrs.Length > 0)
            {
                mr        = mrs [0];
                registers = new Number [mr.RegisterCount];
                rrs       = mr.GetRegisterRows();
                foreach (CardDataset.RegisterRow rr in rrs)
                {
                    registers [rr.Id] = Number.ReadFromRow(rr);
                }
            }
        }
コード例 #10
0
        public void MergeFromDataset(CardDataset cds, Reader reader)
        {
            CardDataset.CardRow        cr;
            CardDataset.MemoryRow      mr;
            CardDataset.MemoryRow []   mrs;
            CardDataset.RegisterRow [] rrs;
            bool sourceMemoryIsEmpty;

            cr  = cds.Card [0];
            mrs = cr.GetMemoryRows();
            if (mrs.Length > 0)
            {
                mr  = mrs [0];
                rrs = mr.GetRegisterRows();

                // A source card that only constains zeros is considered empty.  No merge takes
                // place in this case.
                sourceMemoryIsEmpty = true;
                foreach (CardDataset.RegisterRow rr in rrs)
                {
                    if (rr.Value != 0.0)
                    {
                        sourceMemoryIsEmpty = false;
                        break;
                    }
                }

                if (!sourceMemoryIsEmpty)
                {
                    int last = (int)Number.Floor(Number.Abs(this [LetterRegister.I]));

                    foreach (CardDataset.RegisterRow rr in rrs)
                    {
                        if (rr.Id <= last)
                        {
                            registers [rr.Id] = Number.ReadFromRow(rr);
                        }
                    }
                }
            }
        }
コード例 #11
0
ファイル: Engine.cs プロジェクト: mockingbirdnest/HP
        public void ReadFromDataset(CardDataset cds, Reader reader)
        {
            CardDataset.CardRow      cr;
            CardDataset.EngineRow    er;
            CardDataset.EngineRow [] ers;
            CardDataset.FlagRow []   frs;

            cr  = cds.Card [0];
            ers = cr.GetEngineRows();
            if (ers.Length > 0)
            {
                er    = ers [0];
                unit  = (AngleUnit)Enum.Parse(typeof(AngleUnit), er.AngleUnit);
                flags = new bool [er.FlagCount];
                frs   = er.GetFlagRows();
                foreach (CardDataset.FlagRow fr in frs)
                {
                    flags [fr.Id] = fr.Value;
                }
            }
        }
コード例 #12
0
        static public void Write(Stream stream, CardPart part)
        {
            CardDataset cds = new CardDataset();

            if (stream.Length > 0)
            {
                cds.ReadXml(stream);
                CheckVersion(cds);
            }
            else
            {
                CardDataset.CardRow cr;

                cr         = cds.Card.NewCardRow();
                cr.Version = Version;
                cds.Card.AddCardRow(cr);
            }
            WriteToDataset(cds, part);
            stream.SetLength(0);
            cds.WriteXml(stream);
        }
コード例 #13
0
        private async Task <bool> GetPackagedFile(string folderName, string fileName, UIElement rootFrame)
        {
            StorageFolder installFolder = Windows.ApplicationModel.Package.Current.InstalledLocation;
            StorageFile   file          = null;

            if (folderName != null)
            {
                StorageFolder subFolder = await installFolder.GetFolderAsync(folderName);

                file = await subFolder.GetFileAsync(fileName);
            }
            else
            {
                file = await installFolder.GetFileAsync(fileName);
            }

            //string text = await Windows.Storage.FileIO.ReadTextAsync(file);
            //datafile df = new datafile();
            //df = Newtonsoft.Json.JsonConvert.DeserializeObject<datafile>(text);



            XmlLoadSettings settings = new XmlLoadSettings()
            {
                ValidateOnParse = false
            };
            XmlDocument xmlDoc = await XmlDocument.LoadFromFileAsync(file, settings);

            foreach (IXmlNode xmlNode in xmlDoc.GetElementsByTagName("card"))
            {
                CardMini c = new CardMini();
                foreach (XmlAttribute xa in xmlNode.Attributes)
                {
                    if (xa.Value == null)
                    {
                        continue;                   //skip bad/blank entries
                    }
                    if (xa.Value == "")
                    {
                        continue;
                    }
                    switch (xa.Name.ToLower())
                    {
                    case "id":
                        c.Hero.EntryId = xa.Value;
                        break;

                    case "life":
                        c.Hero.Life = Convert.ToInt32(xa.Value);
                        break;

                    case "world":
                        c.Hero.World = xa.Value;
                        break;

                    case "set":
                        c.Hero.Set = xa.Value;
                        break;

                    case "collectornumber":
                        c.Hero.CollectorNumber = xa.Value;
                        break;

                    case "name":
                        c.Hero.Name = xa.Value;
                        break;

                    case "valkyrie":
                        c.Hero.Valkyrie = xa.Value;
                        break;

                    case "species":
                        c.Hero.Species = xa.Value;
                        break;

                    case "herotype":
                        c.Hero.HeroType = xa.Value;
                        break;

                    case "class":
                        c.Hero.ClassType = xa.Value;
                        break;

                    case "personality":
                        c.Hero.Personality = xa.Value;
                        break;

                    case "size":
                        c.Hero.Size = xa.Value;
                        break;

                    case "move":
                        c.Hero.Move = Convert.ToInt32(xa.Value);
                        break;

                    case "range":
                        c.Hero.Range = Convert.ToInt32(xa.Value);
                        break;

                    case "attack":
                        c.Hero.Attack = Convert.ToInt32(xa.Value);
                        break;

                    case "defense":
                        c.Hero.Defense = Convert.ToInt32(xa.Value);
                        break;

                    case "points":
                        c.Hero.Points = Convert.ToInt32(xa.Value);
                        break;

                    case "bmove":
                        c.Hero.BasicMove = Convert.ToInt32(xa.Value);
                        break;

                    case "brange":
                        c.Hero.BasicRange = Convert.ToInt32(xa.Value);
                        break;

                    case "battack":
                        c.Hero.BasicAttack = Convert.ToInt32(xa.Value);
                        break;

                    case "bdefense":
                        c.Hero.BasicDefense = Convert.ToInt32(xa.Value);
                        break;

                    case "armysize":
                        c.Hero.ArmySize = Convert.ToInt32(xa.Value);
                        break;
                    }
                }
                c.Hero.Image = string.Format("/Assets/Cards/{0}.png", c.Hero.EntryId);
                c.Hero.Thumb = string.Format("/Assets/Cards/_t/{0}.png", c.Hero.EntryId);
                //c.CardSource = ImageFromRelativePath(rootFrame, c.Hero.Thumb);
                c.CardName   = c.Hero.Name;
                c.CardPoints = string.Format("{0} PTS", c.Hero.Points);
                c.UpdateData();

                CardDataset.Add(c);
            }

            foreach (IXmlNode xmlNode in xmlDoc.GetElementsByTagName("glyph"))
            {
                GlyphControl g = new GlyphControl();
                foreach (XmlAttribute xa in xmlNode.Attributes)
                {
                    switch (xa.Name.ToLower())
                    {
                    case "id":
                        g.EntryId = xa.Value;
                        break;

                    case "description":
                        g.Description = xa.Value;
                        break;
                    }
                }
                g.ImageFileName = string.Format("/Assets/Glyphs/{0}.png", g.EntryId);
                //                g.GlyphSource = ImageFromRelativePath(rootFrame, g.ImageFileName);
                glyphdataset.Add(g);
            }
            GameSetting.DataLoaded = true;
            return(true);
        }
コード例 #14
0
        static private void CheckVersion(CardDataset cds)
        {
            CardDataset.CardRow           cr = cds.Card [0];
            CardDataset.ArgumentRow []    ars;
            CardDataset.InstructionRow [] irs;
            CardDataset.MemoryRow         mr;
            CardDataset.MemoryRow []      mrs;
            CardDataset.ProgramRow        pr;
            CardDataset.ProgramRow []     prs;
            CardDataset.RegisterRow       rr;
            CardDataset.RegisterRow []    rrs;

            if (cr.Version == Version)
            {
                return;
            }

            // We didn't support compatibility before version 1.4.
            if (cr.Version < 1.4F || cr.Version > Version)
            {
                // For some reason (read: compiler bug) we must compute text and caption separately,
                // we cannot just write one humongous statement.
                string text = Localization.FileHasVersionFormat(
                    cds.Card [0].Version.ToString(),
                    Version.ToString());
                string caption = Localization.IncompatibleVersion;

                MessageBox.Show(text, caption, MessageBoxButtons.OK, MessageBoxIcon.Error);
                throw new Error();
            }

            // Compatibility code to read older cards.
            if (cr.Version <= 1.4F)
            {
                // Version 1.4 used to have Text in instructions.
            }
            if (cr.Version <= 1.5F)
            {
                // Version 1.5 used to have GSB_F and LBL_F.
                prs = cr.GetProgramRows();
                if (prs.Length > 0)
                {
                    pr  = prs [0];
                    irs = pr.GetInstructionRows();
                    foreach (CardDataset.InstructionRow ir in irs)
                    {
                        if (ir.Instruction == "Gsb_f")
                        {
                            ir.Instruction = "Gsb";
                        }
                        else if (ir.Instruction == "Lbl_f")
                        {
                            ir.Instruction = "Lbl";
                        }
                    }
                }
            }
            if (cr.Version <= 1.6F)
            {
                // Version 1.6 used to have argument types starting with HP67_Class_Library.
                prs = cr.GetProgramRows();
                if (prs.Length > 0)
                {
                    pr  = prs [0];
                    irs = pr.GetInstructionRows();
                    foreach (CardDataset.InstructionRow ir in irs)
                    {
                        ars = ir.GetArgumentRows();
                        foreach (CardDataset.ArgumentRow ar in ars)
                        {
                            if (ar.Type.StartsWith("HP67_Class_Library."))
                            {
                                ar.Type =
                                    ar.Type.Replace
                                        ("HP67_Class_Library.", "Mockingbird.HP.Class_Library.");
                            }
                        }
                    }
                }
            }
            if (cr.Version <= 1.7F)
            {
                // Version 1.7 used to have RC_I and ST_I.
                prs = cr.GetProgramRows();
                if (prs.Length > 0)
                {
                    pr  = prs [0];
                    irs = pr.GetInstructionRows();
                    foreach (CardDataset.InstructionRow ir in irs)
                    {
                        bool mustPatch = false;

                        if (ir.Instruction == "Rc_I")
                        {
                            ir.Instruction = "Rcl";
                            mustPatch      = true;
                        }
                        else if (ir.Instruction == "St_I")
                        {
                            ir.Instruction = "Sto";
                            mustPatch      = true;
                        }
                        if (mustPatch)
                        {
                            CardDataset.ArgumentRow ar;

                            ir.ArgumentCount = 1;
                            ar                = cds.Argument.NewArgumentRow();
                            ar.Id             = 0;
                            ar.Type           = "Mockingbird.HP.Class_Library.Letter";
                            ar.Value          = "I";
                            ar.InstructionRow = ir;
                            cds.Argument.AddArgumentRow(ar);
                        }
                    }
                }
            }
            if (cr.Version <= 1.8F)
            {
                // Version 1.8 used to have the value of registers stored as double.  Note that the
                // Value column still exists so as to read old cards, but it is not used anymore.
                mrs = cr.GetMemoryRows();
                if (mrs.Length > 0)
                {
                    mr  = mrs [0];
                    rrs = mr.GetRegisterRows();
                    if (rrs.Length > 0)
                    {
                        // We need to split the Value because it might not be representable as a
                        // decimal.  However, it doesn't really matter how we do the split, because
                        // Number will renormalize it anyway.
                        double d;

                        rr          = rrs [0];
                        d           = rr.Value;
                        rr.Exponent = (sbyte)Math.Log10((double)Math.Abs(d));
                        rr.Mantissa = (decimal)(d * Math.Pow(10.0, -rr.Exponent));
                    }
                }
            }
            cds.Card [0].Version = Version;
        }