Beispiel #1
0
        public virtual RetCode PushDatabase()
        {
            RetCode rc;

            rc = RetCode.Success;

            if (DbStackTop + 1 >= Databases.Length)
            {
                rc = RetCode.IsFull;

                goto Cleanup;
            }

            Databases[++DbStackTop] = ClassMappings.CreateInstance <IDatabase>();

Cleanup:

            return(rc);
        }
Beispiel #2
0
        public virtual void InitSystem()
        {
            if (!ClassMappings.IgnoreMutex)
            {
                ClassMappings.Mutex.CreateAndWaitOne();
            }

            Engine = ClassMappings.CreateInstance <IEngine>();

            RevealContentArtifacts = new List <IArtifact>();

            RevealContentLocations = new List <long>();

            EnableRevealContentOverrides = true;

            Databases = new IDatabase[Constants.NumDatabases];

            DbStackTop = -1;

            PushDatabase();

            CFGDB = ClassMappings.CreateInstance <IRecordDb <IConfig> >();

            FSDB = ClassMappings.CreateInstance <IRecordDb <IFileset> >();

            CHRDB = ClassMappings.CreateInstance <IRecordDb <ICharacter> >();

            MODDB = ClassMappings.CreateInstance <IRecordDb <IModule> >();

            RDB = ClassMappings.CreateInstance <IRecordDb <IRoom> >();

            ADB = ClassMappings.CreateInstance <IRecordDb <IArtifact> >();

            EDB = ClassMappings.CreateInstance <IRecordDb <IEffect> >();

            MDB = ClassMappings.CreateInstance <IRecordDb <IMonster> >();

            HDB = ClassMappings.CreateInstance <IRecordDb <IHint> >();

            GSDB = ClassMappings.CreateInstance <IRecordDb <IGameState> >();
        }
Beispiel #3
0
 public void SetupStartMethod(Reflection.Emit.Interfaces.IMethodBuilder Method, Type BaseType)
 {
     Method.SetCurrentMethod();
     if (ClassMappings.ContainsKey(BaseType) &&
         Method.Name.StartsWith("set_"))
     {
         foreach (IMapping Mapping in ClassMappings[BaseType])
         {
             string    PropertyName = Method.Name.Replace("set_", "");
             IProperty Property     = Mapping.Properties.Find(x => x.Name == PropertyName);
             if (Property != null)
             {
                 Utilities.Reflection.Emit.FieldBuilder Field = Fields.Find(x => x.Name == Property.DerivedFieldName);
                 if (Field != null)
                 {
                     Field.Assign(Method.Parameters[1]);
                 }
                 return;
             }
         }
     }
 }
Beispiel #4
0
 /// <summary>
 /// Sets up the fields needed to store the data for lazy loading
 /// </summary>
 /// <param name="TypeBuilder"></param>
 private void SetupFields(Reflection.Emit.TypeBuilder TypeBuilder)
 {
     if (ClassMappings.ContainsKey(TypeBuilder.BaseClass))
     {
         foreach (IMapping Mapping in ClassMappings[TypeBuilder.BaseClass])
         {
             foreach (IProperty Property in Mapping.Properties)
             {
                 if (Property is IManyToOne || Property is IMap)
                 {
                     if (Fields.FirstOrDefault(x => x.Name == Property.DerivedFieldName) == null)
                     {
                         Fields.Add(TypeBuilder.CreateField(Property.DerivedFieldName, Property.Type));
                         Fields.Add(TypeBuilder.CreateField(Property.DerivedFieldName + "_Loaded", typeof(bool)));
                     }
                 }
                 else if (Property is IIEnumerableManyToOne || Property is IManyToMany)
                 {
                     if (Fields.FirstOrDefault(x => x.Name == Property.DerivedFieldName) == null)
                     {
                         Fields.Add(TypeBuilder.CreateField(Property.DerivedFieldName, typeof(IEnumerable <>).MakeGenericType(Property.Type)));
                         Fields.Add(TypeBuilder.CreateField(Property.DerivedFieldName + "_Loaded", typeof(bool)));
                     }
                 }
                 else if (Property is IListManyToOne || Property is IListManyToMany)
                 {
                     if (Fields.FirstOrDefault(x => x.Name == Property.DerivedFieldName) == null)
                     {
                         Fields.Add(TypeBuilder.CreateField(Property.DerivedFieldName, typeof(List <>).MakeGenericType(Property.Type)));
                         Fields.Add(TypeBuilder.CreateField(Property.DerivedFieldName + "_Loaded", typeof(bool)));
                     }
                 }
             }
         }
     }
 }
Beispiel #5
0
 public virtual T CreateInstance <T>(Action <T> initialize = null) where T : class
 {
     return(ClassMappings.CreateInstance(initialize));
 }
Beispiel #6
0
 public virtual void HandleException(Exception ex, string stackTraceFile, string errorMessage)
 {
     ClassMappings.HandleException(ex, stackTraceFile, errorMessage);
 }
 public virtual RetCode PushRulesetVersion(long rulesetVersion)
 {
     return(ClassMappings.PushRulesetVersion(rulesetVersion));
 }
 public FluorineClassMappingApplicationContext()
 {
     ClassMappings = new ClassMappings();
 }
Beispiel #9
0
 public virtual bool IsRulesetVersion(params long[] versions)
 {
     return(ClassMappings.IsRulesetVersion(versions));
 }
Beispiel #10
0
        public virtual void Main(string[] args)
        {
            IConfig config;
            bool    nlFlag;
            RetCode rc;
            long    i;

            try
            {
                nlFlag = true;

                rc = RetCode.Success;

                PushConstants(ConstantsType);

                PushClassMappings(ClassMappingsType);

                ClassMappings.EnableStdio = EnableStdio;

                ClassMappings.LoadPortabilityClassMappings = LoadPortabilityClassMappings;

                // resolve portability class mappings

                ClassMappings.ResolvePortabilityClassMappings();

                // process command line args

                ClassMappings.ProcessArgv(args);

                // load plugin class mappings

                rc = ClassMappings.LoadPluginClassMappings();

                if (rc != RetCode.Success)
                {
                    nlFlag = false;

                    goto Cleanup;
                }

                try
                {
                    PushGlobals(GlobalsType);

                    // initialize system

                    Globals.InitSystem();

                    Globals.LineWrapUserInput = LineWrapUserInput;

                    // disable resolution of uid macros

                    gOut.ResolveUidMacros = false;

                    // disable extraneous newline suppression

                    gOut.SuppressNewLines = false;

                    // make the cursor disappear

                    gOut.CursorVisible = false;

                    // initialize Config record

                    Globals.Config.Uid = 1;

                    Globals.Config.ShowDesc = true;

                    Globals.Config.GenerateUids = true;

                    Globals.Config.FieldDesc = FieldDesc.Full;

                    Globals.Config.WordWrapMargin = Constants.RightMargin;

                    // change window title bar and size

                    gOut.SetWindowTitle(ProgramName);

                    try
                    {
                        gOut.SetWindowSize(Math.Min(Constants.WindowWidth, gOut.GetLargestWindowWidth()),
                                           Math.Min(Math.Max(Constants.WindowHeight, gOut.GetWindowHeight()), (long)(gOut.GetLargestWindowHeight() * 0.95)));

                        gOut.SetBufferSize(Constants.BufferWidth, Constants.BufferHeight);
                    }
                    catch (Exception)
                    {
                        // do nothing
                    }

                    // make announcements

                    gOut.Write("{0}Eamon CS Main Hall ({1}) {2}", Environment.NewLine, ProgramName, Constants.ProgVersion);

                    gOut.Write("{0}Copyright (c) 2014+ by Michael R. Penner.  All rights reserved.", Environment.NewLine);

                    gOut.Print("This GNU GPL'd free software has ABSOLUTELY NO WARRANTY.");

                    // copy and store command line args

                    Globals.Argv = new string[args.Length];

                    for (i = 0; i < args.Length; i++)
                    {
                        Globals.Argv[i] = Globals.CloneInstance(args[i]);
                    }

                    // process command line args

                    gEngine.MhProcessArgv(false, ref nlFlag);

                    // assign default work directory, if necessary

                    if (Globals.WorkDir.Length == 0)
                    {
                        Globals.WorkDir = Constants.DefaultWorkDir;
                    }

                    // initialize Config record

                    Globals.Config.MhFilesetFileName = "ADVENTURES.XML";

                    Globals.Config.MhCharacterFileName = "CHARACTERS.XML";

                    Globals.Config.MhEffectFileName = "SNAPPY.XML";

                    if (Globals.WorkDir.Length > 0)
                    {
                        // if working directory does not exist

                        if (!Globals.Directory.Exists(Globals.WorkDir))
                        {
                            gOut.Print("{0}", Globals.LineSep);

                            gOut.Print("The working directory [{0}] does not exist.", Globals.WorkDir);

                            gOut.Write("{0}Would you like to create it (Y/N) [N]: ", Environment.NewLine);

                            Globals.Buf.Clear();

                            rc = Globals.In.ReadField(Globals.Buf, Constants.BufSize02, null, ' ', '\0', true, "N", gEngine.ModifyCharToUpper, gEngine.IsCharYOrN, gEngine.IsCharYOrN);

                            Debug.Assert(gEngine.IsSuccess(rc));

                            Globals.Thread.Sleep(150);

                            if (Globals.Buf[0] != 'Y')
                            {
                                nlFlag = false;

                                goto Cleanup;
                            }

                            // create working directory

                            Globals.Directory.CreateDirectory(Globals.WorkDir);
                        }

                        // change to working directory

                        Globals.Directory.SetCurrentDirectory(Globals.WorkDir);
                    }

                    // load the config textfile

                    if (Globals.ConfigFileName.Length > 0)
                    {
                        gOut.Print("{0}", Globals.LineSep);

                        rc = Globals.Database.LoadConfigs(Globals.ConfigFileName);

                        if (gEngine.IsFailure(rc))
                        {
                            Globals.Error.Write("Error: LoadConfigs function call failed");

                            goto Cleanup;
                        }

                        config = gEngine.GetConfig();

                        if (config != null)
                        {
                            if (config.MhFilesetFileName.Length == 0)
                            {
                                config.MhFilesetFileName = Globals.Config.MhFilesetFileName;

                                Globals.ConfigsModified = true;
                            }

                            if (config.MhCharacterFileName.Length == 0)
                            {
                                config.MhCharacterFileName = Globals.Config.MhCharacterFileName;

                                Globals.ConfigsModified = true;
                            }

                            if (config.MhEffectFileName.Length == 0)
                            {
                                config.MhEffectFileName = Globals.Config.MhEffectFileName;

                                Globals.ConfigsModified = true;
                            }
                        }
                        else
                        {
                            Globals.Config.Uid = Globals.Database.GetConfigUid();

                            Globals.Config.IsUidRecycled = true;

                            rc = Globals.Database.AddConfig(Globals.Config);

                            if (gEngine.IsFailure(rc))
                            {
                                // PrintError

                                goto Cleanup;
                            }

                            Globals.ConfigsModified = true;

                            config = Globals.Config;
                        }

                        Globals.Config = config;

                        gOut.WriteLine();
                    }

                    nlFlag = false;

                    // process command line args

                    gEngine.MhProcessArgv(true, ref nlFlag);

                    if (nlFlag)
                    {
                        gOut.WriteLine();
                    }

                    nlFlag = true;

                    gOut.Print("{0}", Globals.LineSep);

                    rc = Globals.Database.LoadFilesets(Globals.Config.MhFilesetFileName);

                    if (gEngine.IsFailure(rc))
                    {
                        Globals.Error.Write("Error: LoadFilesets function call failed");

                        goto Cleanup;
                    }

                    rc = Globals.Database.LoadCharacters(Globals.Config.MhCharacterFileName);

                    if (gEngine.IsFailure(rc))
                    {
                        Globals.Error.Write("Error: LoadCharacters function call failed");

                        goto Cleanup;
                    }

                    rc = Globals.Database.LoadEffects(Globals.Config.MhEffectFileName);

                    if (gEngine.IsFailure(rc))
                    {
                        Globals.Error.Write("Error: LoadEffects function call failed");

                        goto Cleanup;
                    }

                    gOut.WriteLine();

                    // auto load character if necessary

                    if (Globals.CharacterName.Length > 0 && !string.Equals(Globals.CharacterName, "NONE", StringComparison.OrdinalIgnoreCase))
                    {
                        Globals.Character = Globals.Database.CharacterTable.Records.FirstOrDefault(c => string.Equals(c.Name, Globals.CharacterName, StringComparison.OrdinalIgnoreCase));

                        if (Globals.Character == null || Globals.Character.Uid <= 0 || Globals.Character.Status != Status.Alive)
                        {
                            Globals.CharacterName = "";

                            Globals.Character = null;
                        }
                    }

                    // create appropriate menu

                    if (Globals.Character != null)
                    {
                        Globals.Menu = Globals.CreateInstance <IMainHallMenu>();
                    }
                    else
                    {
                        Globals.Menu = Globals.CreateInstance <IOuterChamberMenu>();
                    }

                    // call appropriate menu

                    Globals.Menu.Execute();

                    var saveTextFiles = (Globals.ConfigFileName.Length > 0 && Globals.ConfigsModified) || Globals.FilesetsModified || Globals.CharactersModified || Globals.EffectsModified;

                    // save textfiles, if any modifications were made

                    if (saveTextFiles)
                    {
                        gOut.Print("{0}", Globals.LineSep);

                        // save the textfiles

                        if (Globals.EffectsModified)
                        {
                            rc = Globals.Database.SaveEffects(Globals.Config.MhEffectFileName);

                            if (gEngine.IsFailure(rc))
                            {
                                Globals.Error.Write("Error: SaveEffects function call failed");

                                rc = RetCode.Success;

                                // goto Cleanup omitted
                            }
                        }

                        if (Globals.CharactersModified)
                        {
                            rc = Globals.Database.SaveCharacters(Globals.Config.MhCharacterFileName);

                            if (gEngine.IsFailure(rc))
                            {
                                Globals.Error.Write("Error: SaveCharacters function call failed");

                                rc = RetCode.Success;

                                // goto Cleanup omitted
                            }
                        }

                        if (Globals.FilesetsModified)
                        {
                            rc = Globals.Database.SaveFilesets(Globals.Config.MhFilesetFileName);

                            if (gEngine.IsFailure(rc))
                            {
                                Globals.Error.Write("Error: SaveFilesets function call failed");

                                rc = RetCode.Success;

                                // goto Cleanup omitted
                            }
                        }

                        if (Globals.ConfigFileName.Length > 0 && Globals.ConfigsModified)
                        {
                            rc = Globals.Database.SaveConfigs(Globals.ConfigFileName);

                            if (gEngine.IsFailure(rc))
                            {
                                Globals.Error.Write("Error: SaveConfigs function call failed");

                                rc = RetCode.Success;

                                // goto Cleanup omitted
                            }
                        }

                        gOut.WriteLine();
                    }

                    // send character on adventure if necessary

                    if (Globals.GoOnAdventure)
                    {
                        Debug.Assert(Globals.Character != null);

                        Debug.Assert(Globals.Fileset != null);

                        gOut.Print("{0}", Globals.LineSep);

                        Globals.TransferProtocol.SendCharacterOnAdventure(Globals.Fileset.WorkDir, Globals.FilePrefix, Globals.Fileset.PluginFileName);
                    }
                    else if (saveTextFiles)
                    {
                        Globals.Thread.Sleep(150);
                    }

                    nlFlag = false;
                }
                catch (Exception)
                {
                    throw;
                }
                finally
                {
                    // de-initialize system

                    Globals.DeinitSystem();

                    PopGlobals();
                }

Cleanup:

                if (nlFlag)
                {
                    if (rc == RetCode.Success)
                    {
                        ClassMappings.Out.WriteLine();
                    }
                    else
                    {
                        ClassMappings.Error.WriteLine();
                    }

                    nlFlag = false;
                }

                if (rc != RetCode.Success)
                {
                    ClassMappings.Error.WriteLine("{0}{1}", Environment.NewLine, new string('-', (int)Constants.RightMargin));

                    ClassMappings.Error.Write("{0}Press any key to continue: ", Environment.NewLine);

                    ClassMappings.In.ReadKey(true);

                    ClassMappings.Error.WriteLine();

                    ClassMappings.Thread.Sleep(150);
                }

                return;
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                PopClassMappings();

                PopConstants();
            }
        }
Beispiel #11
0
        public static void Main(string[] args)
        {
            RetCode rc;

            try
            {
                rc = RetCode.Success;

                WorkDir = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);

                PushConstants();

                PushClassMappings();

                ClassMappings.LoadPortabilityClassMappings = LoadPortabilityClassMappings;

                ClassMappings.ResolvePortabilityClassMappings();

                if (args == null || args.Length < 2 || !args[0].Equals("-pfn", StringComparison.OrdinalIgnoreCase))
                {
                    rc = RetCode.InvalidArg;

                    ClassMappings.Error.WriteLine("{0}Usage: dotnet EamonPM.WindowsUnix.dll -pfn PluginFileName [PluginArgs]", Environment.NewLine);

                    goto Cleanup;
                }

                try
                {
                    while (true)
                    {
                        if (args == null || args.Length < 2 || !args[0].Equals("-pfn", StringComparison.OrdinalIgnoreCase))
                        {
                            goto Cleanup;
                        }

                        var systemBinDir = string.Format("{0}System{0}Bin", Path.DirectorySeparatorChar);

                        var currWorkDir = Directory.GetCurrentDirectory();

                        // if current working directory invalid, bail out

                        if (!currWorkDir.EndsWith(systemBinDir) || currWorkDir.Length <= systemBinDir.Length || !Directory.Exists(Constants.AdventuresDir.Replace('\\', Path.DirectorySeparatorChar)))
                        {
                            rc = RetCode.Failure;

                            ClassMappings.Error.WriteLine("{0}Usage: to run Eamon CS change your working directory to System{1}Bin", Environment.NewLine, Path.DirectorySeparatorChar);

                            goto Cleanup;
                        }

                        ExecutePlugin(args);

                        args = NextArgs;

                        NextArgs = null;
                    }
                }
                catch (Exception ex)
                {
                    rc = RetCode.Failure;

                    ClassMappings.HandleException
                    (
                        ex,
                        Constants.StackTraceFile,
                        string.Format("{0}Error: Caught fatal exception; terminating program", Environment.NewLine)
                    );

                    goto Cleanup;
                }

Cleanup:

                if (rc != RetCode.Success)
                {
                    ClassMappings.Error.WriteLine("{0}{1}", Environment.NewLine, new string('-', (int)Constants.RightMargin));

                    ClassMappings.Error.Write("{0}Press any key to continue: ", Environment.NewLine);

                    ClassMappings.In.ReadKey(true);

                    ClassMappings.Error.WriteLine();

                    ClassMappings.Thread.Sleep(150);
                }

                ClassMappings.Out.CursorVisible = true;
            }
            catch (Exception)
            {
                rc = RetCode.Failure;

                // do nothing
            }
            finally
            {
                PopClassMappings();

                PopConstants();
            }

            Environment.Exit(rc == RetCode.Success ? 0 : -1);
        }
 public virtual RetCode GetRvStackSize(ref long rvStackSize)
 {
     return(ClassMappings.GetRvStackSize(ref rvStackSize));
 }
 public virtual RetCode GetRvStackTop(ref long rvStackTop)
 {
     return(ClassMappings.GetRvStackTop(ref rvStackTop));
 }
 public virtual RetCode ClearRvStack()
 {
     return(ClassMappings.ClearRvStack());
 }
 public virtual RetCode PopRulesetVersion()
 {
     return(ClassMappings.PopRulesetVersion());
 }
Beispiel #16
0
 public virtual T CloneInstance <T>(T source) where T : class
 {
     return(ClassMappings.CloneInstance(source));
 }
Beispiel #17
0
 public virtual bool CompareInstances <T>(T object1, T object2) where T : class
 {
     return(ClassMappings.CompareInstances(object1, object2));
 }
Beispiel #18
0
 public FluorineClassMappingApplicationContext()
 {
     ClassMappings = new ClassMappings();
 }
Beispiel #19
0
 public virtual string GetPrefixedFileName(string fileName)
 {
     return(ClassMappings.GetPrefixedFileName(fileName));
 }
Beispiel #20
0
 public string GetCustomClass(string type)
 {
     return(ClassMappings.GetCustomClass(type));
 }
Beispiel #21
0
        public virtual void Main(string[] args)
        {
            RetCode rc;

            try
            {
                _ddfnFlag = false;

                _nlFlag = true;

                rc = RetCode.Success;

                PushConstants(ConstantsType);

                PushClassMappings(ClassMappingsType);

                ClassMappings.EnableStdio = EnableStdio;

                ClassMappings.LoadPortabilityClassMappings = LoadPortabilityClassMappings;

                // resolve portability class mappings

                ClassMappings.ResolvePortabilityClassMappings();

                // process command line args

                ClassMappings.ProcessArgv(args);

                // load plugin class mappings

                rc = ClassMappings.LoadPluginClassMappings();

                if (rc != RetCode.Success)
                {
                    _nlFlag = false;

                    goto Cleanup;
                }

                try
                {
                    PushGlobals(GlobalsType);

                    // initialize system

                    Globals.InitSystem();

                    Globals.LineWrapUserInput = LineWrapUserInput;

                    // call appropriate program

                    rc = Globals.RunGameEditor ? DdMain(args) : RtMain(args);
                }
                catch (Exception)
                {
                    throw;
                }
                finally
                {
                    // de-initialize system

                    Globals.DeinitSystem();

                    PopGlobals();
                }

Cleanup:

                if (_nlFlag)
                {
                    if (rc == RetCode.Success)
                    {
                        ClassMappings.Out.WriteLine();
                    }
                    else
                    {
                        ClassMappings.Error.WriteLine();
                    }

                    _nlFlag = false;
                }

                if (!ClassMappings.DeleteGameStateFromMainHall && rc != RetCode.Success)
                {
                    ClassMappings.Error.WriteLine("{0}{1}", Environment.NewLine, new string('-', (int)Constants.RightMargin));

                    ClassMappings.Error.Write("{0}Press any key to continue: ", Environment.NewLine);

                    ClassMappings.In.ReadKey(true);

                    ClassMappings.Error.WriteLine();

                    ClassMappings.Thread.Sleep(150);
                }

                return;
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                PopClassMappings();

                PopConstants();
            }
        }
Beispiel #22
0
 public string GetMappedTypeName(string type)
 {
     return(ClassMappings.GetType(type));
 }