static CharData LoadCharData(StringReader sr, UserConnection conn) { var ch = new CharData(conn); while (true) { var word = sr.ReadWord(); switch (word) { // A ---------------- case "Act": ch.Act = sr.ReadNumber(); break; case "AffectedBy": ch.AffectedBy = sr.ReadNumber(); break; case "Alignment": ch.Alignment = sr.ReadNumber(); break; case "Armor": ch.Armor = sr.ReadNumber(); break; case "Avatarmessage": ch.PCData.AvatarMessage = sr.ReadString(); break; case "Awin": ch.PCData.Awins = sr.ReadNumber(); break; case "Alos": ch.PCData.Alosses = sr.ReadNumber(); break; case "Affect": case "AffectData": var aff = new AffectData(); if (word == "Affect") { aff.Type = sr.ReadShort(); } else { aff.Type = (short)SkillType.Lookup(sr.ReadWord()); } aff.Duration = sr.ReadShort(); aff.Modifier = sr.ReadShort(); aff.Location = sr.ReadShort(); aff.BitVector = sr.ReadNumber(); ch.Affected.Add(aff); // TODO add to affect_free break; case "AttrMod": ch.PCData.ModStr = sr.ReadShort(); ch.PCData.ModInt = sr.ReadShort(); ch.PCData.ModWis = sr.ReadShort(); ch.PCData.ModDex = sr.ReadShort(); ch.PCData.ModCon = sr.ReadShort(); break; case "AttrPerm": ch.PCData.PermStr = sr.ReadShort(); ch.PCData.PermInt = sr.ReadShort(); ch.PCData.PermWis = sr.ReadShort(); ch.PCData.PermDex = sr.ReadShort(); ch.PCData.PermCon = sr.ReadShort(); break; case "Alias": var ad = new AliasData(); ad.ShortN = sr.ReadString(); ad.LongN = sr.ReadString(); ch.PCData.Alias.Add(ad); // add to alias_free break; // B ---------------- case "Bamfin": ch.PCData.Bamfin = sr.ReadString(); break; case "Bamfout": ch.PCData.Bamfout = sr.ReadString(); break; case "Beast": ch.Beast = sr.ReadShort(); break; case "Bounty": ch.PCData.Bounty = sr.ReadNumber(); break; case "Breath1": sr.ReadNumber(); break; case "Breath2": sr.ReadNumber(); break; case "Breath3": sr.ReadNumber(); break; case "Breath4": sr.ReadNumber(); break; case "Breath5": sr.ReadNumber(); break; case "Boards": var numBoards = sr.ReadNumber(); for (int i = 0; i < numBoards; ++i) { var boardname = sr.ReadWord(); var lastNote = sr.ReadNumberAsDateTime(); var board = BoardData.Lookup(boardname); if (board == -1) { Content.log.Warn($"{ch.Name} had unknown board name: {boardname}. Skipped."); } else { ch.PCData.LastNote[i] = lastNote; } } break; // C ---------------- case "Clan": ch.Clan = sr.ReadString(); break; case "Class": ch.Class_ = sr.ReadNumber(); break; case "CurrentForm": ch.CurForm = sr.ReadShort(); break; case "Combat": ch.Cmbt = ReadArray(sr, _ => _.ReadShort(), 8); break; case "Chi": ch.Chi = ReadArray(sr, _ => _.ReadShort(), 2); break; case "Conception": ch.PCData.Conception = sr.ReadString(); break; case "Condition": ch.PCData.Condition = ReadArray(sr, _ => _.ReadShort(), 3); break; case "CPower": ch.Power = ReadArray(sr, _ => _.ReadNumber(), 44); break; case "Cparents": ch.PCData.CParents = sr.ReadString(); break; case "Cprompt": ch.CPrompt = sr.ReadString(); break; case "Createtime": ch.CreateTime = sr.ReadString(); break; // D ---------------- case "Damroll": ch.DamRoll = sr.ReadNumber(); break; case "Deaf": ch.Deaf = sr.ReadNumber(); break; case "Decapmessage": ch.PCData.DecapMessage = sr.ReadString(); break; case "Demonic": sr.ReadNumber(); break; case "Description": ch.Description = sr.ReadString(); break; case "DiscRese": ch.PCData.DiscResearch = sr.ReadNumber(); break; case "DiscPoin": ch.PCData.DiscPoints = sr.ReadNumber(); break; case "Dragonaff": sr.ReadNumber(); break; case "Dragonage": sr.ReadNumber(); break; case "Disc": for (int i = 0; i < 11; ++i) { sr.ReadNumber(); } break; case "Drowaff": sr.ReadNumber(); break; case "Drowpwr": sr.ReadNumber(); break; case "Drowmag": sr.ReadNumber(); break; // E ---------------- case "Email": sr.ReadString(); break; case "End": return(ch); case "Exhaustion": ch.PCData.Exhaustion = sr.ReadShort(); break; case "Exp": ch.Exp = sr.ReadNumber(); break; case "Explevel": ch.ExpLevel = sr.ReadNumber(); break; case "Expgained": ch.ExpGained = sr.ReadNumber(); break; case "Extra": ch.Extra = sr.ReadNumber(); break; // F ---------------- case "FakeCon": ch.PCData.FakeSkill = sr.ReadShort(); ch.PCData.FakeStance = sr.ReadShort(); ch.PCData.FakeHit = sr.ReadShort(); ch.PCData.FakeDam = sr.ReadShort(); ch.PCData.FakeAC = sr.ReadNumber(); ch.PCData.FakeHP = sr.ReadShort(); ch.PCData.FakeMana = sr.ReadShort(); ch.PCData.FakeMove = sr.ReadShort(); break; case "Focus": ch.Focus = ReadArray(sr, _ => _.ReadShort(), 2); break; case "Flag2": ch.Flag2 = sr.ReadNumber(); break; case "Flag3": ch.Flag3 = sr.ReadNumber(); break; case "Flag4": ch.Flag4 = sr.ReadNumber(); break; case "Form": ch.Form = sr.ReadNumber(); break; // G ---------------- case "Generation": ch.Generation = sr.ReadShort(); break; case "Gnosis": ch.Gnosis = new short[Garou.GMAXIMUM] { sr.ReadShort() }; break; case "Genes": ch.PCData.Genes = ReadArray(sr, _ => _.ReadNumber(), 10); break; case "Garou1": ch.Garou1 = sr.ReadNumber(); break; case "Garou2": ch.Garou2 = sr.ReadNumber(); break; case "Gifts": ch.Gifts = ReadArray(sr, _ => _.ReadNumber(), 21); break; case "Gold": ch.Gold = sr.ReadNumber(); break; // H ---------------- case "Hitroll": ch.HitRoll = sr.ReadNumber(); break; case "Home": ch.Home = sr.ReadNumber(); break; case "Hatch": sr.ReadNumber(); break; case "HpManaMove": ch.Hit = sr.ReadNumber(); ch.MaxHit = sr.ReadNumber(); ch.Mana = sr.ReadNumber(); ch.MaxMana = sr.ReadNumber(); ch.Move = sr.ReadNumber(); ch.MaxMove = sr.ReadNumber(); break; // I ---------------- case "Immune": ch.Immune = sr.ReadNumber(); break; case "Itemaffect": ch.ItemAffect = sr.ReadNumber(); break; // J ---------------- case "Jflags": ch.PCData.JFlags = sr.ReadNumber(); break; // K ---------------- case "Kingdom": ch.PCData.Kingdom = sr.ReadNumber(); break; // L ---------------- case "Language": ch.PCData.Language = ReadArray(sr, _ => _.ReadNumber(), 2); break; case "Lasthost": ch.LastHost = sr.ReadString(); break; case "Lastdecap1": ch.PCData.LastDecap[0] = sr.ReadString(); break; case "Lastdecap2": ch.PCData.LastDecap[1] = sr.ReadString(); break; case "Lasttime": ch.LastTime = sr.ReadString(); break; case "Level": ch.Level = sr.ReadNumber(); break; case "Levelexp": sr.ReadNumber(); break; case "Locationhp": ch.LocHP = ReadArray(sr, _ => _.ReadShort(), 7); break; case "Loginmessage": ch.PCData.LoginMessage = sr.ReadString(); break; case "Logoutmessage": ch.PCData.LogoutMessage = sr.ReadString(); break; case "LongDescr": ch.LongDescription = sr.ReadString(); break; case "Lord": ch.Lord = sr.ReadString(); break; // M ---------------- case "MageFlags": sr.ReadNumber(); break; case "Monkab": ch.MonkAb = ReadArray(sr, _ => _.ReadNumber(), 4); break; case "Meanparadox": ch.PCData.MeanParadoxCounter = sr.ReadShort(); break; case "Monkstuff": ch.MonkStuff = sr.ReadNumber(); break; case "Monkcrap": ch.MonkCrap = sr.ReadNumber(); break; case "Marriage": ch.PCData.Marriage = sr.ReadString(); break; case "Morph": ch.Morph = sr.ReadString(); break; // N ---------------- case "Newbits": ch.NewBits = sr.ReadNumber(); break; case "Name": sr.ReadToEOL(); break; // O ---------------- case "Objvnum": ch.PCData.ObjVNum = sr.ReadVnum(); break; case "ObjDesc": ch.ObjDesc = sr.ReadString(); break; // P ---------------- case "Paradox": ch.Paradox = ReadArray(sr, _ => _.ReadNumber(), 3); break; case "Parents": ch.PCData.Parents = sr.ReadString(); break; case "Password": ch.PCData.Pwd = sr.ReadString(); break; case "Played": ch.Played = sr.ReadNumber(); break; case "Polyaff": ch.PolyAff = sr.ReadNumber(); break; case "Power_Point": sr.ReadNumber(); break; case "Power": ch.PCData.Powers = ReadArray(sr, _ => _.ReadNumber(), 20); break; case "Poweraction": ch.PowerAction = sr.ReadString(); break; case "Powertype": ch.PowerType = sr.ReadString(); break; case "Position": ch.Position = sr.ReadNumber(); break; case "Practice": ch.Practice = sr.ReadNumber(); break; case "PkPdMkMd": ch.PKill = sr.ReadNumber(); ch.PDeath = sr.ReadNumber(); ch.MKill = sr.ReadNumber(); ch.MDeath = sr.ReadNumber(); break; case "Prompt": ch.Prompt = sr.ReadString(); break; // Q ---------------- case "Quest": ch.PCData.Quest = sr.ReadNumber(); break; case "Questsrun": ch.PCData.QuestsRun = sr.ReadNumber(); break; case "Queststotal": ch.PCData.QuestsTotal = sr.ReadNumber(); break; // R ---------------- case "Race": ch.PCData.Quest = sr.ReadNumber(); break; case "Rage": ch.Rage = sr.ReadShort(); break; case "Rank": ch.PCData.Rank = sr.ReadShort(); break; case "Relrank": ch.PCData.RelRank = sr.ReadShort(); break; case "Revision": ch.PCData.Revision = sr.ReadShort(); break; case "Runecount": ch.PCData.RuneCount = sr.ReadShort(); break; case "Room": RoomDef room; if (RoomDef.TryGetRoomDef(sr.ReadVnum(), out room)) { ch.InRoom = room; } break; case "Runes": ReadArray(sr, _ => _.ReadNumber(), 4); break; // S ---------------- case "Smite": sr.ReadString(); break; case "SavingThrow": ch.SavingThrow = sr.ReadNumber(); break; case "Switchname": ch.PCData.SwitchName = sr.ReadString(); break; case "SilTol": ch.SilTol = sr.ReadShort(); break; case "Souls": ch.PCData.Souls = sr.ReadShort(); break; case "Score": ch.PCData.Score = ReadArray(sr, _ => _.ReadNumber(), 6); break; case "Sex": ch.Sex = (Gender)sr.ReadShort(); break; case "ShortDescr": ch.ShortDescription = sr.ReadString(); break; case "Security": ch.PCData.Security = sr.ReadNumber(); break; case "Skill": var value = sr.ReadShort(); var sn = SkillType.Lookup(sr.ReadWord()); if (sn >= 0) { ch.PCData.Learned[sn] = value; } break; case "Specpower": ch.SpecPower = sr.ReadShort(); break; case "Spectype": ch.SpecType = sr.ReadShort(); break; case "Special": ch.Special = sr.ReadNumber(); break; case "Spells": ch.Spl = ReadArray(sr, _ => _.ReadShort(), 5); break; case "Stage": ch.PCData.Stage = ReadArray(sr, _ => _.ReadShort(), 3); break; case "Stance": for (int i = 0; i < 12; ++i) { ch.Stance[i] = sr.ReadNumber(); } break; case "Stance2": for (int i = 0; i < 12; ++i) { ch.Stance[i + 12] = sr.ReadNumber(); } break; case "StatAbility": ch.PCData.StatAbility = ReadArray(sr, _ => _.ReadShort(), 4); break; case "StatAmount": ch.PCData.StatAmount = ReadArray(sr, _ => _.ReadShort(), 4); break; case "StatDuration": ch.PCData.StatDuration = ReadArray(sr, _ => _.ReadShort(), 4); break; case "Stats": ch.PCData.Stats = ReadArray(sr, _ => _.ReadNumber(), 12); break; // T ---------------- case "Tiemessage": ch.PCData.TimeMessage = sr.ReadString(); break; case "Trust": ch.Trust = sr.ReadShort(); break; case "Title": var title = sr.ReadString().Trim(); ch.PCData.Title = " " + title; break; // U ---------------- case "Upgradelevel": ch.PCData.UpgradeLevel = sr.ReadShort(); break; // V ---------------- case "Vampaff": sr.ReadNumber(); break; case "Vampgen": sr.ReadNumber(); break; case "Vnum": var mdvnum = sr.ReadVnum(); MobileDef md; if (MobileDef.TryGetMobileDef(mdvnum, out md)) { ch.IndexData = md; } break; // W ---------------- case "Warps": ch.Warp = sr.ReadNumber(); break; case "WarpCount": ch.WarpCount = sr.ReadShort(); break; case "Weapons": ch.Wpn = ReadArray(sr, _ => _.ReadShort(), 13); break; case "Wimpy": ch.Wimpy = sr.ReadShort(); break; case "Wolf": sr.ReadShort(); break; case "Wolfform": sr.ReadNumber(); sr.ReadNumber(); break; // X ---------------- case "XHitroll": ch.XHitRoll = sr.ReadNumber(); break; case "XDamroll": ch.XDamRoll = sr.ReadNumber(); break; default: Content.log.Error($"no match.WORD: {word}"); sr.ReadToEOL(); break; } } }
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 */ } }