Пример #1
0
        public static AreaData Load(StringReader sr, string fileName)
        {
            var name = sr.ReadString();

            Content.log.Info(name);
            var newData = new AreaData
            {
                Name      = name,
                Age       = 15,
                NPlayer   = 0,
                AreaFlags = AreaFlags.Loading,
                Security  = 3,
                Builders  = "None",
                Vnums     = new Range <Vnum>(0, 0),
                FileName  = fileName
            };

            AddArea(newData);

            return(newData);
        }
Пример #2
0
        public static void LoadFromArea(StringReader sr, AreaData area)
        {
            while (true)
            {
                if (area == null)
                {
                    throw new Exception("Load_mobiles: no #AREA seen yet.");
                }

                var letter = sr.ReadLetter();

                if (letter != '#')
                {
                    throw new Exception("# not found");
                }

                var vnum = sr.ReadVnum();
                if (vnum == Vnum.None)
                {
                    break;
                }

                MobileDef existing;
                if (TryGetMobileDef(vnum, out existing))
                {
                    throw new Exception($"Load_mobiles: vnum {vnum} duplicated.");
                }

                var md = new MobileDef();
                md.Vnum             = vnum;
                md.Area             = area;
                md.PlayerName       = sr.ReadString();
                md.ShortDescription = sr.ReadString();
                // TODO ToUpper first char
                md.LongDescription = sr.ReadString();
                // TODO ToUpper first char
                md.Description = sr.ReadString();
                md.Act         = ((MobActs)sr.ReadNumber()) | MobActs.IsNpc;
                md.AffectedBy  = sr.ReadNumber();
                md.Alignment   = sr.ReadNumber();
                letter         = sr.ReadLetter();
                md.Level       = Content.Random.Fuzzy(sr.ReadNumber());

                // Old unused stuff for imps who want to use the old-style stats-in-files method.
                md.HitRoll   = sr.ReadNumber();
                md.AC        = sr.ReadNumber();
                md.HitNoDice = sr.ReadNumber();

                sr.ReadLetter(); // d
                md.HitSizeDice = sr.ReadNumber();

                sr.ReadLetter(); // +
                md.HitPlus   = sr.ReadNumber();
                md.DamNoDice = sr.ReadNumber();

                sr.ReadLetter(); // d
                md.DamSizeDice = sr.ReadNumber();

                sr.ReadLetter(); // +
                md.DamPlus = sr.ReadNumber();
                md.Gold    = sr.ReadNumber();

                sr.ReadNumber(); // xp
                sr.ReadNumber(); // position
                sr.ReadNumber(); // startpos

                // Done with unused shit
                md.Sex = (Gender)sr.ReadNumber();
                if (letter != 'S')
                {
                    throw new Exception($"Load_mobiles: vnum {vnum} non-S.");
                }


                // TODO ??????

                lock (mobiles)
                {
                    mobiles.Add(md);
                }
                //iHash = vnum % MAX_KEY_HASH;
                //pMobIndex->next = mob_index_hash[iHash];
                //mob_index_hash[iHash] = pMobIndex;
                //top_mob_index++;
                //top_vnum_mob = top_vnum_mob < vnum ? vnum : top_vnum_mob;  /* OLC */
                //assign_area_vnum(vnum);                                  /* OLC */

                //kill_table[URANGE(0, pMobIndex->level, MAX_LEVEL - 1)].number++;
            }
        }
Пример #3
0
        public static void NewLoadFromArea(StringReader sr, AreaData area)
        {
            if (area == null)
            {
                throw new Exception($"Load_resets: no #AREA seen yet.");
            }

            while (true)
            {
                var letter = sr.ReadLetter();
                if (letter != '#')
                {
                    throw new Exception("Load_rooms: # not found.");
                }

                var vnum = sr.ReadVnum();
                if (vnum == Vnum.None)
                {
                    break;
                }

                RoomDef existing;
                if (TryGetRoomDef(vnum, out existing))
                {
                    throw new Exception($"Load_rooms: vnum {vnum} duplicated.");
                }

                var rd = new RoomDef
                {
                    Area = area,
                    Vnum = vnum
                };

                rd.Name        = sr.ReadString();
                rd.Description = sr.ReadString();
                sr.ReadNumber(); // Area number
                rd.RoomFlags  = sr.ReadNumber();
                rd.SectorType = sr.ReadShort();

                while (true)
                {
                    letter = sr.ReadLetter();

                    if (letter == 'S' || letter == 's')
                    {
                        break;
                    }

                    switch (letter)
                    {
                    case 'D':
                        var door = sr.ReadNumber();
                        if (door < 0 || door > 5)
                        {
                            throw new Exception($"Fread_rooms: vnum {vnum} has bad door number.");
                        }

                        var exit = new ExitData();
                        exit.Description = sr.ReadString();
                        exit.Keyword     = sr.ReadString();
                        var locks = sr.ReadNumber();
                        exit.ExitInfo  = locks;
                        exit.RSFlags   = (ExitFlags)locks;
                        exit.Key       = sr.ReadVnum();
                        exit.Vnum      = sr.ReadVnum();
                        rd.Exits[door] = exit;
                        break;

                    case 'E':
                        var ed = new ExtraDescrData();
                        ed.Keyword     = sr.ReadString();
                        ed.Description = sr.ReadString();
                        rd.ExtraDescr.Add(ed);
                        break;

                    case 'T':
                        var rt = new RoomTextData();
                        rt.Input    = sr.ReadString();
                        rt.Output   = sr.ReadString();
                        rt.CHOutput = sr.ReadString();
                        rt.Name     = sr.ReadString();
                        rt.Type     = sr.ReadNumber();
                        rt.Power    = sr.ReadNumber();
                        rt.Mob      = sr.ReadNumber();

                        rd.RoomText.Add(rt);
                        break;

                    default:
                        throw new Exception($"Load_rooms: vnum {vnum} has flag not 'DES'.");
                    }
                }

                // TODO ?????????????????????

                //iHash = vnum % MAX_KEY_HASH;
                //pRoomIndex->next = room_index_hash[iHash];
                //room_index_hash[iHash] = pRoomIndex;
                //top_room++;
                //top_vnum_room = top_vnum_room < vnum ? vnum : top_vnum_room;
                //assign_area_vnum(vnum);
            }
        }
Пример #4
0
        public static void LoadFromArea(StringReader sr, AreaData area)
        {
            if (area == null)
            {
                throw new Exception("Load_objects: no #AREA seen yet.");
            }

            while (true)
            {
                var letter = sr.ReadLetter();
                if (letter != '#')
                {
                    throw new Exception("Load_objects: # not found.");
                }

                var vnum = sr.ReadVnum();
                if (vnum == Vnum.None)
                {
                    break;
                }

                ObjectDef existing;
                if (!TryGetObjectData(vnum, out existing))
                {
                    throw new Exception($"Load_objects: vnum % {vnum} duplicated.");
                }

                var od = new ObjectDef
                {
                    Vnum = vnum,
                    Area = area
                };

                od.Name = sr.ReadString();
                // TODO upper first char
                od.ShortDescription = sr.ReadString();
                // TODO upper first char
                od.Description = sr.ReadString();
                sr.ReadString(); // Action description

                od.ItemType   = (ItemType)sr.ReadShort();
                od.ExtraFlags = (ExtraFlags)sr.ReadNumber();
                od.WearFlags  = sr.ReadNumber();

                switch (od.ItemType)
                {
                case ItemType.Wand:
                case ItemType.Staff:
                    od.Value[0] = sr.ReadNumber();
                    od.Value[1] = sr.ReadNumber();
                    od.Value[2] = sr.ReadNumber();
                    od.Value[3] = SkillType.Lookup(sr.ReadWord());
                    break;

                case ItemType.Potion:
                case ItemType.Pill:
                case ItemType.Scroll:
                    od.Value[0] = sr.ReadNumber();
                    od.Value[1] = SkillType.Lookup(sr.ReadWord());
                    od.Value[2] = SkillType.Lookup(sr.ReadWord());
                    od.Value[3] = SkillType.Lookup(sr.ReadWord());
                    break;

                default:
                    od.Value[0] = sr.ReadNumber();
                    od.Value[1] = sr.ReadNumber();
                    od.Value[2] = sr.ReadNumber();
                    od.Value[3] = sr.ReadNumber();
                    break;
                }

                od.Weight = sr.ReadShort();
                od.Cost   = sr.ReadNumber();

                sr.ReadNumber(); // Cost per day

                //if (od.ItemType == ItemType.Potion)
                //{
                //    od.ExtraFlags |= ExtraFlags.NoDrop;
                //}

                while (true)
                {
                    bool done = false;
                    switch (sr.PeekLetter())
                    {
                    case 'A':
                        sr.ReadLetter();
                        var aff = new AffectData
                        {
                            Type     = -1,
                            Duration = -1
                        };
                        aff.Location = sr.ReadShort();
                        aff.Modifier = sr.ReadShort();
                        od.Affected.Add(aff);
                        // top_affect++;
                        break;

                    case 'E':
                        sr.ReadLetter();
                        var ed = new ExtraDescrData();
                        ed.Keyword     = sr.ReadString();
                        ed.Description = sr.ReadString();
                        od.ExtraDescr.Add(ed);
                        //top_ed++;
                        break;

                    case 'Q':
                        sr.ReadLetter();
                        od.CHPowerOn      = sr.ReadString();
                        od.CHPowerOff     = sr.ReadString();
                        od.CHPowerUse     = sr.ReadString();
                        od.VictimPowerOn  = sr.ReadString();
                        od.VictimPowerOff = sr.ReadString();
                        od.VictimPowerUse = sr.ReadString();
                        od.SpecType       = sr.ReadNumber();
                        od.SpecPower      = sr.ReadNumber();
                        break;

                    default:
                        done = true;
                        break;
                    }
                    if (done)
                    {
                        break;
                    }
                }

                // ?????
                switch (od.ItemType)
                {
                case ItemType.Pill:
                case ItemType.Potion:
                case ItemType.Scroll:
                case ItemType.Staff:
                case ItemType.Wand:
                    break;
                }

                switch (od.Vnum)
                {
                case (Vnum)3375:
                    // CHAOS = true;
                    break;

                case (Vnum)29515:
                    // VISOR = true;
                    break;

                case (Vnum)29512:
                    // DARKNESS = true;
                    break;

                case (Vnum)29505:
                    // SPEED = true;
                    break;

                case (Vnum)29518:
                    // BRACELET = true;
                    break;

                case (Vnum)29504:
                    // TORC = true;
                    break;

                case (Vnum)29514:
                    // ARMOUR = true;
                    break;

                case (Vnum)29516:
                    // CLAWS = true;
                    break;

                case (Vnum)29555:
                    // ITEMAFFMANTIS = true;
                    break;

                case (Vnum)2654:
                    // ITEMAFFENTROPY = true;
                    break;

                case (Vnum)29598:
                    // ITEMAFFENTROPY = true;
                    break;
                }


                // TODO ???????

                //iHash = vnum % MAX_KEY_HASH;
                //pObjIndex->next = obj_index_hash[iHash];
                //obj_index_hash[iHash] = pObjIndex;
                //top_obj_index++;
                //top_vnum_obj = top_vnum_obj < vnum ? vnum : top_vnum_obj;  /* OLC */
                //assign_area_vnum(vnum);                                  /* OLC */
            }
        }