Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using ConsoleLib.Console;
- using Lat = XRL.World.Capabilities.Laterality;
- using System.Collections.Generic;
- using System.Text;
- using System;
- using XRL.Language;
- using XRL.UI;
- using XRL.World.Parts;
- namespace XRL.World
- {
- [Serializable]
- public class BodyPart
- {
- public string Type = null;
- public string VariantType = null;
- public string Description = null;
- public string Name = null;
- public string SupportsDependent = null;
- public string DependsOn = null;
- public string RequiresType = null;
- public string PreventRegenerationBecause = null;
- public int Category = BodyPartCategory.ANIMAL;
- public int Laterality = Lat.NONE;
- public int RequiresLaterality = Lat.ANY;
- public int Mobility = 0;
- public bool Primary = false;
- public bool Native = false;
- public bool Integral = false;
- public bool Mortal = false;
- public bool Abstract = false;
- public bool Extrinsic = false;
- public bool Plural = false;
- public Body ParentBody = null;
- public GameObject DefaultBehavior = null;
- public int Position = -1;
- public static int IDPreloadSequence = -1;
- public int _ID = 0;
- public int ID
- {
- get
- {
- if (_ID == 0)
- {
- if (XRL.Core.XRLCore.Core.Game != null)
- {
- _ID = XRL.Core.XRLCore.Core.Game.GetIntGameState("nextId", 1);
- XRL.Core.XRLCore.Core.Game.SetIntGameState("nextId", _ID + 1);
- }
- else
- {
- _ID = IDPreloadSequence--;
- }
- }
- return _ID;
- }
- set
- {
- _ID = value;
- }
- }
- public bool idMatch(int testID)
- {
- return _ID == testID;
- }
- public bool HasID()
- {
- return _ID != 0;
- }
- private BodyPart()
- {
- }
- public BodyPart(Body _ParentBody) : this()
- {
- ParentBody = _ParentBody;
- }
- public BodyPart(BodyPartType Base, Body _ParentBody) : this(_ParentBody)
- {
- Base.ApplyTo(this);
- }
- public BodyPart(string Base, Body _ParentBody) : this(BodyPartType.Require(Base), _ParentBody)
- {
- }
- public BodyPart(string Base, int _Laterality, Body _ParentBody) : this(Base, _ParentBody)
- {
- ChangeLaterality(_Laterality);
- }
- public BodyPart(string _Type, string _Description, string _Name, Body _ParentBody) : this(_ParentBody)
- {
- Type = _Type;
- Description = (_Description == null) ? Type : _Description;
- Name = (_Name == null) ? Description.ToLower() : _Name;
- }
- public BodyPart(BodyPartType Base, int _Laterality, Body _ParentBody, string _DefaultBehavior = null, string _SupportsDependent = null, string _DependsOn = null, string _RequiresType = null, int? _Category = null, int? _RequiresLaterality = null, int? _Mobility = null, bool? _Mortal = null, bool? _Integral = null, bool? _Abstract = null, bool? _Extrinsic = null, bool? _Plural = null) : this(Base, _ParentBody)
- {
- ChangeLaterality(_Laterality);
- if (_DefaultBehavior != null) DefaultBehavior = GameObjectFactory.Factory.CreateObject(_DefaultBehavior, -9999);
- if (_SupportsDependent != null) SupportsDependent = _SupportsDependent;
- if (_DependsOn != null) DependsOn = _DependsOn;
- if (_RequiresType != null) RequiresType = _RequiresType;
- if (_Category != null) Category = (int) _Category;
- if (_RequiresLaterality != null) RequiresLaterality = (int) _RequiresLaterality;
- if (_Mobility != null) Mobility = (int) _Mobility;
- if (_Integral != null) Integral = (bool) _Integral;
- if (_Mortal != null) Mortal = (bool) _Mortal;
- if (_Abstract != null) Abstract = (bool) _Abstract;
- if (_Extrinsic != null) Extrinsic = (bool) _Extrinsic;
- if (_Plural != null) Plural = (bool) _Plural;
- }
- public BodyPart(string Base, int _Laterality, Body _ParentBody, string _DefaultBehavior = null, string _SupportsDependent = null, string _DependsOn = null, string _RequiresType = null, int? _Category = null, int? _RequiresLaterality = null, int? _Mobility = null, bool? _Mortal = null, bool? _Integral = null, bool? _Abstract = null, bool? _Extrinsic = null, bool? _Plural = null) : this(Base, _Laterality, _ParentBody)
- {
- if (_DefaultBehavior != null) DefaultBehavior = GameObjectFactory.Factory.CreateObject(_DefaultBehavior, -9999);
- if (_SupportsDependent != null) SupportsDependent = _SupportsDependent;
- if (_DependsOn != null) DependsOn = _DependsOn;
- if (_RequiresType != null) RequiresType = _RequiresType;
- if (_Category != null) Category = (int) _Category;
- if (_RequiresLaterality != null) RequiresLaterality = (int) _RequiresLaterality;
- if (_Mobility != null) Mobility = (int) _Mobility;
- if (_Integral != null) Integral = (bool) _Integral;
- if (_Mortal != null) Mortal = (bool) _Mortal;
- if (_Abstract != null) Abstract = (bool) _Abstract;
- if (_Extrinsic != null) Extrinsic = (bool) _Extrinsic;
- if (_Plural != null) Plural = (bool) _Plural;
- }
- public GameObject _Cybernetics = null;
- public GameObject Cybernetics
- {
- get
- {
- return _Cybernetics;
- }
- }
- public GameObject _Equipped = null;
- public GameObject Equipped
- {
- get
- {
- return _Equipped;
- }
- }
- public List<BodyPart> Parts = new List<BodyPart>(13);
- public BodyPartType TypeModel()
- {
- return BodyPartType.Require(Type);
- }
- public BodyPartType VariantTypeModel()
- {
- return BodyPartType.Require(VariantType ?? Type);
- }
- public BodyPart ChangeLaterality(int NewLaterality)
- {
- Laterality = NewLaterality;
- BodyPartType UseType = VariantTypeModel();
- Description = Lat.WithLateralityAdjective(UseType.Description, Laterality, Capitalized: true);
- Name = Lat.WithLateralityAdjective(UseType.Name, Laterality, Capitalized: false);
- RequiresLaterality = UseType.RequiresLateralityFor(Laterality);
- return this;
- }
- public bool IsLateralityConsistent(BodyPartType UseType = null)
- {
- if (UseType == null) UseType = VariantTypeModel();
- if (Description != Lat.WithLateralityAdjective(UseType.Description, Laterality, Capitalized: true)) return false;
- if (Name != Lat.WithLateralityAdjective(UseType.Name, Laterality, Capitalized: false)) return false;
- if (RequiresLaterality != UseType.RequiresLateralityFor(Laterality)) return false;
- return true;
- }
- public bool IsLateralitySafeToChange(int ExpectLaterality = Lat.NONE, Body BackupParentBody = null, BodyPart ChildPart = null)
- {
- if (Laterality != ExpectLaterality) return false;
- BodyPartType UseType = VariantTypeModel();
- if (!IsLateralityConsistent(UseType)) return false;
- if (ChildPart != null)
- {
- if (!IsParentPartOf(ChildPart, BackupParentBody, EvenIfDismembered: true)) return false;
- if (!ChildPart.IsLateralitySafeToChange(ExpectLaterality, BackupParentBody)) return false;
- }
- return true;
- }
- public BodyPart GetParentPart()
- {
- return ParentBody.FindParentPartOf(this);
- }
- public BodyPart FindParentPartOf(BodyPart FindPart)
- {
- if (Parts != null)
- {
- if (Parts.Contains(FindPart)) return this;
- foreach (BodyPart Part in Parts)
- {
- BodyPart FoundPart = Part.FindParentPartOf(FindPart);
- if (FoundPart != null) return FoundPart;
- }
- }
- return null;
- }
- public bool IsParentPartOf(BodyPart FindPart)
- {
- return Parts != null && Parts.Contains(FindPart);
- }
- public bool IsParentPartOf(BodyPart FindPart, Body BackupParentBody, bool EvenIfDismembered)
- {
- if (IsParentPartOf(FindPart)) return true;
- Body UseParentBody = (ParentBody != null) ? ParentBody : BackupParentBody;
- if (UseParentBody != null && UseParentBody.ValidateDismemberedParentPart(this, FindPart)) return true;
- return false;
- }
- public bool IsAncestorPartOf(BodyPart FindPart)
- {
- if (Parts != null)
- {
- if (Parts.Contains(FindPart)) return true;
- foreach (BodyPart Part in Parts) if (Part.IsAncestorPartOf(FindPart)) return true;
- }
- return false;
- }
- public BodyPart FindEquippedItem(GameObject GO)
- {
- if (Equipped == GO) return this;
- foreach (BodyPart Part in Parts)
- {
- BodyPart FoundPart = Part.FindEquippedItem(GO);
- if (FoundPart != null) return FoundPart;
- }
- return null;
- }
- public BodyPart FindEquippedItem(string Blueprint)
- {
- if (Equipped != null && Equipped.Blueprint == Blueprint) return this;
- foreach (BodyPart Part in Parts)
- {
- BodyPart FoundPart = Part.FindEquippedItem(Blueprint);
- if (FoundPart != null) return FoundPart;
- }
- return null;
- }
- public bool HasEquippedItem(GameObject GO)
- {
- if (Equipped == GO) return true;
- foreach (BodyPart Part in Parts) if (Part.HasEquippedItem(GO)) return true;
- return false;
- }
- public bool HasEquippedItem(string Blueprint)
- {
- if (Equipped != null && Equipped.Blueprint == Blueprint) return true;
- foreach (BodyPart Part in Parts) if (Part.HasEquippedItem(Blueprint)) return true;
- return false;
- }
- public bool IsItemEquippedOnLimbType(GameObject GO, string FindType)
- {
- if (Equipped == GO && Type == FindType) return true;
- foreach (BodyPart Part in Parts) if (Part.IsItemEquippedOnLimbType(GO, FindType)) return true;
- return false;
- }
- public BodyPart FindCybernetics(GameObject GO)
- {
- if (Cybernetics == GO) return this;
- foreach (BodyPart Part in Parts)
- {
- BodyPart FoundPart = Part.FindCybernetics(GO);
- if (FoundPart != null) return FoundPart;
- }
- return null;
- }
- public bool IsItemImplantedInLimbType(GameObject GO, string FindType)
- {
- if (Cybernetics == GO && Type == FindType) return true;
- foreach (BodyPart Part in Parts) if (Part.IsItemImplantedInLimbType(GO, FindType)) return true;
- return false;
- }
- public GameObject Unimplant(bool MoveToInventory = true)
- {
- GameObject obj = _Cybernetics;
- if (obj != null)
- {
- obj.FireEvent(Event.New("Unimplanted", "Object", ParentBody.ParentObject, "BodyPart", this));
- if (_Equipped == obj)
- {
- _Equipped = null;
- }
- if (MoveToInventory)
- {
- Inventory pInventory = ParentBody.ParentObject.GetPart<Inventory>();
- if (pInventory != null) pInventory.AddObject(obj);
- }
- _Cybernetics = null;
- }
- return obj;
- }
- public GameObject Dismember()
- {
- if (ParentBody == null) return null;
- return ParentBody.Dismember(this);
- }
- public void Implant(GameObject Cybernetic)
- {
- if (_Cybernetics != null) Unimplant();
- _Cybernetics = Cybernetic;
- if (Cybernetic.HasTag("CyberneticsUsesEqSlot"))
- {
- if( _Equipped != null ) TryUnequip();
- Equip(Cybernetic, true);
- }
- _Cybernetics.FireEvent(Event.New("Implanted", "Object", ParentBody.ParentObject, "BodyPart", this));
- }
- public bool Equip(GameObject Item, bool bSilent = false)
- {
- Event eCommandEquipObject = Event.New("CommandEquipObject");
- eCommandEquipObject.bSilent = bSilent;
- eCommandEquipObject.AddParameter("Object", Item);
- eCommandEquipObject.AddParameter("BodyPart", this);
- return ParentBody.ParentObject.FireEvent(eCommandEquipObject);
- }
- public bool DoEquip(GameObject GO, bool bSilent = false)
- {
- if (ParentBody == null) throw new Exception("cannot equip without parent body");
- ParentBody.WeightCache = -1;
- string SlotsSpec = GO.pPhysics.UsesSlots;
- if (!string.IsNullOrEmpty(SlotsSpec))
- {
- List<string> SlotList = new List<string>(SlotsSpec.Split(','));
- SlotList.Remove(this.Type);
- foreach (string Slot in SlotList)
- {
- int nHave = ParentBody.GetUnequippedPartCountExcept(Slot, this);
- int nNeed = 0;
- foreach (string CountSlot in SlotList) if (CountSlot == Slot) nNeed++;
- if (nNeed > nHave)
- {
- if (!bSilent && ParentBody.ParentObject.IsPlayer())
- {
- if (nNeed == nHave + 1)
- {
- Popup.Show("You need another free " + Slot + " to equip that!");
- }
- else
- {
- Popup.Show("You need another " + Grammar.Cardinal(nNeed - nHave) + " free " + Grammar.Pluralize(Slot) + " to equip that!");
- }
- }
- return false;
- }
- }
- foreach (string Slot in SlotList)
- {
- foreach (BodyPart P in ParentBody.GetPart(Slot))
- {
- if (P != this && P.Equipped == null)
- {
- P._Equipped = GO;
- GO.pPhysics.Equipped = ParentBody.ParentObject;
- break;
- }
- }
- }
- }
- else
- if (GO.pPhysics.bUsesTwoSlots && (ParentBody.ParentObject.GetIntProperty("HugeHands", 0) <= 0 || !GO.FireEvent("AllowHugeHands")))
- {
- List<BodyPart> OtherSlots = ParentBody.GetPart(Type);
- if (OtherSlots.CleanContains(this)) OtherSlots.Remove(this);
- List<BodyPart> FreeSlots = new List<BodyPart>(4);
- foreach (BodyPart P in OtherSlots)
- {
- if (P.Equipped == null) FreeSlots.Add(P);
- }
- if (ParentBody.IsPlayer())
- {
- if (FreeSlots.Count > 0)
- {
- FreeSlots[0]._Equipped = GO;
- }
- else
- {
- if (!bSilent && ParentBody.ParentObject.IsPlayer())
- {
- Popup.Show("You need another free " + Type + " to equip that!");
- }
- return false;
- }
- }
- else
- {
- if (FreeSlots.Count > 0)
- {
- if (ParentBody != null) ParentBody.WeightCache = -1;
- FreeSlots[0]._Equipped = GO;
- }
- else
- if (FreeSlots.Count == 0)
- {
- return false;
- }
- }
- }
- if (ParentBody != null) ParentBody.WeightCache = -1;
- _Equipped = GO;
- return true;
- }
- private void ClearEquipped()
- {
- if (ParentBody != null) ParentBody.WeightCache = -1;
- _Equipped = null;
- }
- public bool TryUnequip(bool Silent = false, bool SemiForced = false)
- {
- Event E = Event.New("CommandUnequipObject", "BodyPart", this);
- if (SemiForced) E.SetParameter("SemiForced", 1);
- if (Silent) E.SetSilent(true);
- return ParentBody.ParentObject.FireEvent(E);
- }
- public bool ForceUnequip(bool Silent = false)
- {
- Event E = Event.New("CommandForceUnequipObject", "BodyPart", this);
- if (Silent) E.SetSilent(true);
- return ParentBody.ParentObject.FireEvent(E);
- }
- public void Unequip()
- {
- if (Equipped == null) return;
- foreach (BodyPart Part in (ParentBody == null) ? GetParts() : ParentBody.GetParts())
- {
- if (Part != this && Part.Equipped == Equipped)
- {
- Part.ClearEquipped();
- }
- }
- ClearEquipped();
- }
- public BodyPart DeepCopy(GameObject Parent, Body NewBody)
- {
- BodyPart Copy = new BodyPart();
- Copy.Type = Type;
- Copy.VariantType = VariantType;
- Copy.Description = Description;
- Copy.Name = Name;
- Copy.SupportsDependent = SupportsDependent;
- Copy.DependsOn = DependsOn;
- Copy.RequiresType = RequiresType;
- Copy.PreventRegenerationBecause = PreventRegenerationBecause;
- Copy.Category = Category;
- Copy.Laterality = Laterality;
- Copy.RequiresLaterality = RequiresLaterality;
- Copy.Mobility = Mobility;
- Copy.Primary = Primary;
- Copy.Native = Native;
- Copy.Integral = Integral;
- Copy.Mortal = Mortal;
- Copy.Abstract = Abstract;
- Copy.Extrinsic = Extrinsic;
- Copy.Plural = Plural;
- Copy.Position = Position;
- Copy._ID = _ID;
- Copy.ParentBody = NewBody;
- if (DefaultBehavior != null)
- {
- GameObject oCopy = DefaultBehavior.DeepCopy();
- Parent.DeepCopyInventoryObjectMap.Add(DefaultBehavior, oCopy);
- oCopy.pPhysics._Equipped = Parent;
- Copy.DefaultBehavior = oCopy;
- }
- if (Equipped != null)
- {
- if( !Parent.DeepCopyInventoryObjectMap.ContainsKey( Equipped ) )
- {
- GameObject oCopy = Equipped.DeepCopy();
- Parent.DeepCopyInventoryObjectMap.Add(Equipped, oCopy);
- Body.DeepCopyEquipMap.Add(oCopy, Copy);
- //Physics pPhysics = oCopy.GetPart("Physics") as Physics;
- //pPhysics._Equipped = Parent;
- }
- }
- foreach (BodyPart Part in Parts)
- {
- if (!Part.Extrinsic)
- {
- Copy.AddPart(Part.DeepCopy(Parent, NewBody));
- }
- }
- return Copy;
- }
- public void Save(SerializationWriter Writer)
- {
- Writer.Write(Type);
- Writer.Write(VariantType);
- Writer.Write(Description);
- Writer.Write(Name);
- Writer.Write(SupportsDependent);
- Writer.Write(DependsOn);
- Writer.Write(RequiresType);
- Writer.Write(PreventRegenerationBecause);
- Writer.Write(Category);
- Writer.Write(Laterality);
- Writer.Write(RequiresLaterality);
- Writer.Write(Mobility);
- Writer.Write(Primary);
- Writer.Write(Native);
- Writer.Write(Integral);
- Writer.Write(Mortal);
- Writer.Write(Abstract);
- Writer.Write(Extrinsic);
- Writer.Write(Plural);
- Writer.Write(Position);
- Writer.Write(_ID);
- Writer.WriteGameObject(DefaultBehavior);
- Writer.WriteGameObject(_Equipped);
- Writer.WriteGameObject(_Cybernetics);
- if (Parts == null)
- {
- Writer.Write(-1);
- }
- else
- {
- Writer.Write(Parts.Count);
- foreach (BodyPart Part in Parts) Part.Save(Writer);
- }
- }
- public static BodyPart Load(SerializationReader Reader, Body ParentBody)
- {
- BodyPart NewPart = new BodyPart();
- NewPart.Type = Reader.ReadString();
- NewPart.VariantType = Reader.ReadString();
- NewPart.Description = Reader.ReadString();
- NewPart.Name = Reader.ReadString();
- NewPart.SupportsDependent = Reader.ReadString();
- NewPart.DependsOn = Reader.ReadString();
- NewPart.RequiresType = Reader.ReadString();
- NewPart.PreventRegenerationBecause = Reader.ReadString();
- NewPart.Category = Reader.ReadInt32();
- NewPart.Laterality = Reader.ReadInt32();
- NewPart.RequiresLaterality = Reader.ReadInt32();
- NewPart.Mobility = Reader.ReadInt32();
- NewPart.Primary = Reader.ReadBoolean();
- NewPart.Native = Reader.ReadBoolean();
- NewPart.Integral = Reader.ReadBoolean();
- NewPart.Mortal = Reader.ReadBoolean();
- NewPart.Abstract = Reader.ReadBoolean();
- NewPart.Extrinsic = Reader.ReadBoolean();
- NewPart.Plural = Reader.ReadBoolean();
- NewPart.Position = Reader.ReadInt32();
- NewPart._ID = Reader.ReadInt32();
- NewPart.DefaultBehavior = Reader.ReadGameObject();
- NewPart._Equipped = Reader.ReadGameObject();
- NewPart._Cybernetics = Reader.ReadGameObject();
- NewPart.ParentBody = ParentBody;
- int nCount = Reader.ReadInt32();
- if (nCount == -1) NewPart.Parts = null;
- for (int x = 0; x < nCount; x++)
- {
- NewPart.Parts.Add(Load(Reader,ParentBody));
- }
- return NewPart;
- }
- public int GetWeight()
- {
- int Return = 0;
- if (Equipped != null && Equipped.pPhysics != null && IsFirstSlotForEquipped())
- {
- Cybernetics2BaseItem Implant = Equipped.GetPart<Cybernetics2BaseItem>();
- if (Implant != null)
- {
- if (Implant.ImplantedOn == null) Return += Equipped.pPhysics.Weight;
- }
- else
- {
- Return += Equipped.pPhysics.Weight;
- }
- }
- if (Parts != null)
- {
- foreach (BodyPart Part in Parts)
- {
- if (Part != null) Return += Part.GetWeight();
- }
- }
- return Return;
- }
- public void Clear()
- {
- DefaultBehavior = null;
- ClearEquipped();
- if (Parts != null)
- {
- for( int x=0;x<Parts.Count;x++ )
- {
- BodyPart Part = Parts[x];
- if( Part != null ) Part.Clear();
- }
- }
- Parts = null;
- }
- public void StripAllEquipment(List<GameObject> Return)
- {
- if (Equipped != null)
- {
- Return.Add(Equipped);
- Equipped.FireEvent("Unequipped");
- Unequip();
- }
- if (Parts != null)
- {
- foreach (BodyPart Part in Parts)
- {
- Part.StripAllEquipment(Return);
- }
- }
- }
- public void GetPrimaryHandEquippedObjects(List<GameObject> Return)
- {
- if (Primary && Type == "Hand" && Equipped != null) Return.Add(Equipped);
- if (Parts != null)
- {
- for (int x = 0; x < Parts.Count; x++)
- {
- BodyPart Part = Parts[x];
- if (Part != null) Part.GetPrimaryHandEquippedObjects(Return);
- }
- }
- }
- public void GetPrimaryEquippedObjects(List<GameObject> Return)
- {
- if (Primary && Equipped != null) Return.Add(Equipped);
- if (Primary && DefaultBehavior != null && Equipped == null ) Return.Add(DefaultBehavior);
- if (Parts != null)
- {
- for( int x=0;x<Parts.Count;x++ )
- {
- BodyPart Part = Parts[x];
- if( Part != null ) Part.GetPrimaryEquippedObjects(Return);
- }
- }
- }
- public int GetEquippedObjectCount()
- {
- int Count = 0;
- if (Equipped != null && IsFirstSlotForEquipped()) Count++;
- if (Parts != null)
- {
- foreach (BodyPart Part in Parts) if (Part != null) Count += Part.GetEquippedObjectCount();
- }
- return Count;
- }
- public int GetEquippedObjectCount(Predicate<GameObject> pFilter)
- {
- int Count = 0;
- if (Equipped != null && pFilter(Equipped) && IsFirstSlotForEquipped()) Count++;
- if (Parts != null)
- {
- foreach (BodyPart Part in Parts) if (Part != null) Count += Part.GetEquippedObjectCount(pFilter);
- }
- return Count;
- }
- public void GetEquippedObjects(List<GameObject> Return)
- {
- if (Equipped != null && !Return.Contains(Equipped)) Return.Add(Equipped);
- if (Parts != null)
- {
- foreach (BodyPart Part in Parts)
- {
- if (Part != null) Part.GetEquippedObjects(Return);
- }
- }
- }
- public void GetEquippedObjects(List<GameObject> Return, Predicate<GameObject> pFilter)
- {
- if (Equipped != null && !Return.Contains(Equipped) && pFilter(Equipped)) Return.Add(Equipped);
- if (Parts != null)
- {
- foreach (BodyPart Part in Parts)
- {
- if (Part != null) Part.GetEquippedObjects(Return, pFilter);
- }
- }
- }
- public void ForeachEquippedObject(Action<GameObject> aProc)
- {
- if (Equipped != null && IsFirstSlotForEquipped()) aProc(Equipped);
- if (Parts != null)
- {
- for (int i = 0, j = Parts.Count; i < j; i++)
- {
- BodyPart Part = Parts[i];
- if (Part != null) Part.ForeachEquippedObject(aProc);
- if (Parts.Count < j)
- {
- int diff = j - Parts.Count;
- i -= diff;
- j -= diff;
- }
- }
- }
- }
- public int GetInstalledCyberneticsCount()
- {
- int Count = 0;
- if (Cybernetics != null && ParentBody.FindCybernetics(Cybernetics) == this) Count++;
- if (Parts != null)
- {
- foreach (BodyPart Part in Parts) if (Part != null) Count += Part.GetInstalledCyberneticsCount();
- }
- return Count;
- }
- public int GetInstalledCyberneticsCount(Predicate<GameObject> pFilter)
- {
- int Count = 0;
- if (Cybernetics != null && pFilter(Cybernetics) && ParentBody.FindCybernetics(Cybernetics) == this) Count++;
- if (Parts != null)
- {
- foreach (BodyPart Part in Parts) if (Part != null) Count += Part.GetInstalledCyberneticsCount(pFilter);
- }
- return Count;
- }
- public void GetInstalledCybernetics(List<GameObject> Return)
- {
- if (Cybernetics != null && !Return.Contains(Cybernetics)) Return.Add(Cybernetics);
- if (Parts != null)
- {
- foreach (BodyPart Part in Parts)
- {
- if (Part != null) Part.GetInstalledCybernetics(Return);
- }
- }
- }
- public void GetInstalledCybernetics(List<GameObject> Return, Predicate<GameObject> pFilter)
- {
- if (Cybernetics != null && !Return.Contains(Cybernetics) && pFilter(Cybernetics)) Return.Add(Cybernetics);
- if (Parts != null)
- {
- foreach (BodyPart Part in Parts)
- {
- if (Part != null) Part.GetInstalledCybernetics(Return, pFilter);
- }
- }
- }
- public bool AnyInstalledCybernetics()
- {
- if (Cybernetics != null) return true;
- if (Parts != null)
- {
- foreach (BodyPart Part in Parts) if (Part != null && Part.AnyInstalledCybernetics()) return true;
- }
- return false;
- }
- public bool AnyInstalledCybernetics(Predicate<GameObject> pFilter)
- {
- if (Cybernetics != null && pFilter(Cybernetics)) return true;
- if (Parts != null)
- {
- foreach (BodyPart Part in Parts) if (Part != null && Part.AnyInstalledCybernetics(pFilter)) return true;
- }
- return false;
- }
- public void ForeachInstalledCybernetics(Action<GameObject> aProc)
- {
- if (Cybernetics != null && ParentBody.FindCybernetics(Cybernetics) == this) aProc(Cybernetics);
- if (Parts != null)
- {
- for (int i = 0, j = Parts.Count; i < j; i++)
- {
- BodyPart Part = Parts[i];
- if (Part != null) Part.ForeachInstalledCybernetics(aProc);
- if (Parts.Count < j)
- {
- int diff = j - Parts.Count;
- i -= diff;
- j -= diff;
- }
- }
- }
- }
- public bool Render( RenderEvent E )
- {
- if( Equipped != null ) Equipped.Render( E );
- for( int x = 0;x<Parts.Count;x++ )
- {
- Parts[x].Render( E );
- }
- return true;
- }
- public bool BeforeRender( Event E )
- {
- if( Equipped != null ) Equipped.BeforeRender( E );
- if (Cybernetics != null) Cybernetics.BeforeRender(E);
- if (Parts != null)
- {
- for (int x = 0; x < Parts.Count; x++)
- {
- if (Parts[x] != null) Parts[x].BeforeRender(E);
- }
- }
- return true;
- }
- public virtual bool AnyRegisteredEvent(string ID)
- {
- if (ID == "QuerySlotList") return true;
- if (Equipped != null && Equipped.HasRegisteredEvent(ID)) return true;
- if (Cybernetics != null && Cybernetics.HasRegisteredEvent(ID)) return true;
- if (DefaultBehavior != null && DefaultBehavior.HasRegisteredEvent(ID)) return true;
- if (Parts != null)
- {
- foreach (BodyPart Part in Parts)
- {
- if (ID != "BeforeRenderWhileEquipped" || ID != "BeforeRenderLateWhileEquipped" || Part.Type != "Thrown Weapon")
- {
- if (Part.AnyRegisteredEvent(ID)) return true;
- }
- }
- }
- return false;
- }
- public virtual bool FireEvent(Event E)
- {
- if (E.ID == "QuerySlotList")
- {
- if (Equipped != null && !Equipped.FireEvent("CanBeUnequipped"))
- {
- }
- else
- if (Cybernetics != null && Cybernetics.HasTag("CyberneticsUsesEqSlot") && !Cybernetics.FireEvent("CanBeUnequipped"))
- {
- }
- else
- {
- GameObject GO = E.GetGameObjectParameter("Object");
- List<BodyPart> List = E.GetParameter("SlotList") as List<BodyPart>;
- List<GameObject> Return = new List<GameObject>(1);
- Event eQueryEquippableList = Event.New("QueryEquippableList");
- eQueryEquippableList.AddParameter("EquippingObject", GO);
- eQueryEquippableList.AddParameter("SlotType", Type);
- eQueryEquippableList.AddParameter("EquippableList", Return);
- GO.FireEvent(eQueryEquippableList);
- if (Return.Count > 0) List.Add(this);
- }
- if (Parts != null) foreach (BodyPart p in Parts) if (!p.FireEvent(E)) return false;
- return true;
- }
- bool bSuccess = true;
- if (Equipped != null && IsFirstSlotForEquipped())
- {
- if (!Equipped.FireEvent(E)) bSuccess = false;
- if (E.ID == "EndTurn" && Equipped != null) Equipped.CleanEffects();
- }
- if (!bSuccess) return false;
- if (Cybernetics != null && ParentBody.FindCybernetics(Cybernetics) == this)
- {
- if (!Cybernetics.FireEvent(E)) bSuccess = false;
- if (E.ID == "EndTurn" && Cybernetics != null) Cybernetics.CleanEffects();
- }
- if (!bSuccess) return false;
- if (DefaultBehavior != null)
- {
- if (!DefaultBehavior.FireEvent(E)) bSuccess = false;
- if (E.ID == "EndTurn") DefaultBehavior.CleanEffects();
- }
- if (!bSuccess) return false;
- if (Parts != null)
- {
- foreach (BodyPart Part in Parts)
- {
- if (E.ID != "BeforeRenderWhileEquipped" || Part.Type != "Thrown Weapon")
- {
- if (!Part.FireEvent(E)) bSuccess = false;
- }
- }
- if (!bSuccess) return false;
- }
- return bSuccess;
- }
- public override string ToString()
- {
- StringBuilder SB = new StringBuilder();
- SB.Append(Name + ": &C");
- if (Equipped == null && DefaultBehavior == null)
- {
- SB.Append("&K-&y");
- }
- else
- if (Equipped == null)
- {
- SB.Append("&K" + DefaultBehavior.ShortDisplayName);
- }
- else
- {
- SB.Append(Equipped.ShortDisplayName);
- }
- if (Primary) SB.Append(" &G*Primary&y");
- return SB.ToString();
- }
- public void UnequipPartAndChildren(bool Silent = false, Cell Where = null)
- {
- if (Equipped != null && !Equipped.IsNatural())
- {
- if (ParentBody != null)
- {
- GameObject HeldObject = Equipped;
- try
- {
- Event eCommandForceUnequipObject = Event.New("CommandForceUnequipObject", "BodyPart", this, "NoTake", 1);
- if (Silent) eCommandForceUnequipObject.SetSilent(true);
- ParentBody.ParentObject.FireEvent(eCommandForceUnequipObject);
- }
- catch (Exception ex)
- {
- MetricsManager.LogException("UnequipPartAndChildren unequip", ex);
- }
- try
- {
- if (Where == null) Where = ParentBody.ParentObject.GetDropCell();
- if (Where == null)
- {
- HeldObject.RemoveFromContext();
- HeldObject.Obliterate();
- }
- else
- {
- if (ParentBody.ParentObject.FireEvent(Event.New("CommandDropObject", "Object", HeldObject, "Forced", 1, "Where", Where)))
- {
- if (!Silent && HeldObject.CurrentCell == Where && HeldObject.IsVisible())
- {
- if (HeldObject.HasProperName) Messages.MessageQueue.AddPlayerMessage(HeldObject.The + HeldObject.DisplayName + " &y" + HeldObject.GetVerb("fall", false) + " to the ground.");
- else if (ParentBody.ParentObject.IsPlayer()) Messages.MessageQueue.AddPlayerMessage("Your " + HeldObject.DisplayName + " &y" + HeldObject.GetVerb("fall", false) + " to the ground.");
- else Messages.MessageQueue.AddPlayerMessage(Grammar.MakePossessive(ParentBody.ParentObject.The + ParentBody.ParentObject.DisplayName) + " " + HeldObject.DisplayName + " &y" + HeldObject.GetVerb("fall", false) + " to the ground.");
- }
- }
- }
- }
- catch (Exception ex)
- {
- MetricsManager.LogException("UnequipPartAndChildren drop", ex);
- }
- }
- }
- else
- {
- if( Equipped != null && ParentBody.ParentObject != null )
- {
- Equipped.FireEvent(Event.New("Unequipped", "UnequippingObject", ParentBody.ParentObject));
- }
- Unequip();
- }
- if (Parts != null) foreach (BodyPart P in Parts) P.UnequipPartAndChildren(Silent);
- }
- public void ToString(StringBuilder SB)
- {
- SB.Append(ToString());
- SB.Append("\n");
- if (Parts != null)
- {
- foreach (BodyPart p in Parts)
- {
- p.ToString(SB);
- }
- }
- }
- public bool RemovePart(BodyPart Part, bool DoUpdate = true)
- {
- if (Parts == null) return false;
- if (Parts.Contains(Part))
- {
- Part.UnequipPartAndChildren();
- Parts.Remove(Part);
- if (DoUpdate && ParentBody != null)
- {
- ParentBody.UpdateBodyParts();
- ParentBody.RecalculateTypeArmor(Part.Type);
- }
- return true;
- }
- else
- {
- foreach (BodyPart subPart in Parts)
- {
- if (subPart.RemovePart(Part, DoUpdate)) return true;
- }
- return false;
- }
- }
- public bool RemovePartByID(int removeID, bool DoUpdate = true)
- {
- BodyPart Part = GetPartByID(removeID);
- if (Part == null) return false;
- return RemovePart(Part, DoUpdate);
- }
- private bool PositionOccupied(int Position, BodyPart ExceptPart = null)
- {
- if (Parts != null) foreach (BodyPart Part in Parts) if (Part.Position == Position && Part != ExceptPart) return true;
- if (ParentBody != null && ParentBody.DismemberedPartHasPosition(this, Position, ExceptPart)) return true;
- return false;
- }
- private void AssignPosition(BodyPart Part, int Position)
- {
- if (PositionOccupied(Position, ExceptPart: Part))
- {
- foreach (BodyPart OtherPart in Parts)
- {
- if (OtherPart.Position >= Position) OtherPart.Position++;
- }
- if (ParentBody != null) ParentBody.CheckDismemberedPartRenumberingOnPositionAssignment(this, Position, Part);
- }
- Part.Position = Position;
- }
- private int NextPosition(BodyPart ExceptPart = null)
- {
- int Result = (ParentBody != null) ? ParentBody.GetLastDismemberedPartPosition(this, ExceptPart) : -1;
- if (Parts != null) foreach (BodyPart Part in Parts) if (Part.Position > Result && Part != ExceptPart) Result = Part.Position;
- return Result + 1;
- }
- private int FindIndexForPosition(int Position)
- {
- if (Parts != null) for (int i = 0; i < Parts.Count; i++) if (Parts[i].Position >= Position) return i;
- return -1;
- }
- public BodyPart AddPart(BodyPart NewPart, int Position = -1, bool DoUpdate = true)
- {
- if (Parts == null) return null;
- if (Parts.IndexOf(NewPart) != -1) throw new Exception("part for add already attached");
- if (Position == -1)
- {
- Position = NextPosition(NewPart);
- }
- else
- {
- while (Position > 0 && !PositionOccupied(Position - 1, ExceptPart: NewPart))
- {
- Position--;
- }
- }
- int Index = FindIndexForPosition(Position);
- if (Index == -1)
- {
- Parts.Add(NewPart);
- }
- else
- {
- Parts.Insert(Index, NewPart);
- }
- AssignPosition(NewPart, Position);
- if (ParentBody != null)
- {
- NewPart.ParentBody = ParentBody;
- if (DoUpdate)
- {
- ParentBody.UpdateBodyParts();
- ParentBody.RecalculateTypeArmor(NewPart.Type);
- }
- }
- return NewPart;
- }
- public BodyPart AddPart(BodyPart NewPart, string InsertAfter)
- {
- int Position = LastPartTypePosition(InsertAfter);
- if (Position != -1) Position++;
- return AddPart(NewPart, Position);
- }
- public BodyPart AddPart(BodyPart NewPart, string InsertAfter, string OrInsertBefore)
- {
- if (OrInsertBefore == null) return AddPart(NewPart, InsertAfter);
- int Position = LastPartTypePosition(InsertAfter);
- if (Position == -1)
- {
- Position = FirstPartTypePosition(OrInsertBefore);
- }
- else
- {
- Position++;
- }
- return AddPart(NewPart, Position);
- }
- public BodyPart AddPart(BodyPart NewPart, string InsertAfter, string[] OrInsertBefore)
- {
- if (OrInsertBefore == null) return AddPart(NewPart, InsertAfter);
- int Position = LastPartTypePosition(InsertAfter);
- if (Position == -1)
- {
- foreach (string Type in OrInsertBefore)
- {
- Position = FirstPartTypePosition(Type);
- if (Position != -1) break;
- }
- }
- else
- {
- Position++;
- }
- return AddPart(NewPart, Position);
- }
- public BodyPart AddPart(BodyPartType Base, int Laterality = Lat.NONE, string DefaultBehavior = null, string SupportsDependent = null, string DependsOn = null, string RequiresType = null, int? Category = null, int? RequiresLaterality = null, int? Mobility = null, bool? Integral = null, bool? Mortal = null, bool? Abstract = null, bool? Extrinsic = null, bool? Plural = null)
- {
- return AddPart(new BodyPart(Base, Laterality, ParentBody, DefaultBehavior, SupportsDependent, DependsOn, RequiresType, Category, RequiresLaterality, Mobility, Integral, Mortal, Abstract, Extrinsic, Plural));
- }
- public BodyPart AddPart(string Base, int Laterality = Lat.NONE, string DefaultBehavior = null, string SupportsDependent = null, string DependsOn = null, string RequiresType = null, int? Category = null, int? RequiresLaterality = null, int? Mobility = null, bool? Integral = null, bool? Mortal = null, bool? Abstract = null, bool? Extrinsic = null, bool? Plural = null)
- {
- return AddPart(new BodyPart(Base, Laterality, ParentBody, DefaultBehavior, SupportsDependent, DependsOn, RequiresType, Category, RequiresLaterality, Mobility, Integral, Mortal, Abstract, Extrinsic, Plural));
- }
- public BodyPart AddPartAt(BodyPartType Base, int Laterality = Lat.NONE, string DefaultBehavior = null, string SupportsDependent = null, string DependsOn = null, string RequiresType = null, int? Category = null, int? RequiresLaterality = null, int? Mobility = null, bool? Integral = null, bool? Mortal = null, bool? Abstract = null, bool? Extrinsic = null, bool? Plural = null, string InsertAfter = null, string OrInsertBefore = null)
- {
- return AddPart(new BodyPart(Base, Laterality, ParentBody, DefaultBehavior, SupportsDependent, DependsOn, RequiresType, Category, RequiresLaterality, Mobility, Integral, Mortal, Abstract, Extrinsic, Plural), InsertAfter, OrInsertBefore);
- }
- public BodyPart AddPartAt(string Base, int Laterality = Lat.NONE, string DefaultBehavior = null, string SupportsDependent = null, string DependsOn = null, string RequiresType = null, int? Category = null, int? RequiresLaterality = null, int? Mobility = null, bool? Integral = null, bool? Mortal = null, bool? Abstract = null, bool? Extrinsic = null, bool? Plural = null, string InsertAfter = null, string OrInsertBefore = null)
- {
- return AddPart(new BodyPart(Base, Laterality, ParentBody, DefaultBehavior, SupportsDependent, DependsOn, RequiresType, Category, RequiresLaterality, Mobility, Integral, Mortal, Abstract, Extrinsic, Plural), InsertAfter, OrInsertBefore);
- }
- public BodyPart AddPartAt(BodyPartType Base, int Laterality = Lat.NONE, string DefaultBehavior = null, string SupportsDependent = null, string DependsOn = null, string RequiresType = null, int? Category = null, int? RequiresLaterality = null, int? Mobility = null, bool? Integral = null, bool? Mortal = null, bool? Abstract = null, bool? Extrinsic = null, bool? Plural = null, string InsertAfter = null, string[] OrInsertBefore = null)
- {
- return AddPart(new BodyPart(Base, Laterality, ParentBody, DefaultBehavior, SupportsDependent, DependsOn, RequiresType, Category, RequiresLaterality, Mobility, Integral, Mortal, Abstract, Extrinsic, Plural), InsertAfter, OrInsertBefore);
- }
- public BodyPart AddPartAt(string Base, int Laterality = Lat.NONE, string DefaultBehavior = null, string SupportsDependent = null, string DependsOn = null, string RequiresType = null, int? Category = null, int? RequiresLaterality = null, int? Mobility = null, bool? Integral = null, bool? Mortal = null, bool? Abstract = null, bool? Extrinsic = null, bool? Plural = null, string InsertAfter = null, string[] OrInsertBefore = null)
- {
- return AddPart(new BodyPart(Base, Laterality, ParentBody, DefaultBehavior, SupportsDependent, DependsOn, RequiresType, Category, RequiresLaterality, Mobility, Integral, Mortal, Abstract, Extrinsic, Plural), InsertAfter, OrInsertBefore);
- }
- public BodyPart AddPartAt(BodyPart InsertAfter, BodyPartType Base, int Laterality = Lat.NONE, string DefaultBehavior = null, string SupportsDependent = null, string DependsOn = null, string RequiresType = null, int? Category = null, int? RequiresLaterality = null, int? Mobility = null, bool? Integral = null, bool? Mortal = null, bool? Abstract = null, bool? Extrinsic = null, bool? Plural = null)
- {
- return AddPart(new BodyPart(Base, Laterality, ParentBody, DefaultBehavior, SupportsDependent, DependsOn, RequiresType, Category, RequiresLaterality, Mobility, Integral, Mortal, Abstract, Extrinsic, Plural), InsertAfter.Position + 1);
- }
- public BodyPart AddPartAt(BodyPart InsertAfter, string Base, int Laterality = Lat.NONE, string DefaultBehavior = null, string SupportsDependent = null, string DependsOn = null, string RequiresType = null, int? Category = null, int? RequiresLaterality = null, int? Mobility = null, bool? Integral = null, bool? Mortal = null, bool? Abstract = null, bool? Extrinsic = null, bool? Plural = null)
- {
- return AddPart(new BodyPart(Base, Laterality, ParentBody, DefaultBehavior, SupportsDependent, DependsOn, RequiresType, Category, RequiresLaterality, Mobility, Integral, Mortal, Abstract, Extrinsic, Plural), InsertAfter.Position + 1);
- }
- public int FirstPartTypePosition(string Type, BodyPart ExceptPart = null)
- {
- int Result = -1;
- if (Parts != null)
- {
- foreach (BodyPart Part in Parts)
- {
- if (Part.Type == Type && Part != ExceptPart)
- {
- Result = Part.Position;
- break;
- }
- }
- }
- if (ParentBody != null)
- {
- int DismemberedPosition = ParentBody.GetFirstDismemberedPartTypePosition(this, Type, ExceptPart);
- if (DismemberedPosition != -1 && (Result == -1 || DismemberedPosition < Result)) Result = DismemberedPosition;
- }
- return Result;
- }
- public int LastPartTypePosition(string Type, BodyPart ExceptPart = null)
- {
- int Result = -1;
- if (Parts != null)
- {
- for (int i = Parts.Count - 1; i >= 0; i--)
- {
- if (Parts[i].Type == Type && Parts[i] != ExceptPart)
- {
- Result = Parts[i].Position;
- break;
- }
- }
- }
- if (ParentBody != null)
- {
- int DismemberedPosition = ParentBody.GetLastDismemberedPartTypePosition(this, Type, ExceptPart);
- if (DismemberedPosition > Result) Result = DismemberedPosition;
- }
- return Result;
- }
- public BodyPart GetPart(Predicate<BodyPart> pFilter)
- {
- if (pFilter(this)) return this;
- if (Parts != null)
- {
- foreach (BodyPart Part in Parts)
- {
- if (Part != null)
- {
- BodyPart Find = Part.GetPart(pFilter);
- if (Find != null) return Find;
- }
- }
- }
- return null;
- }
- public bool AnyPart(Predicate<BodyPart> pFilter)
- {
- if (pFilter(this)) return true;
- if (Parts != null)
- {
- foreach (BodyPart Part in Parts)
- {
- if (Part != null && Part.AnyPart(pFilter)) return true;
- }
- }
- return false;
- }
- public void ForeachPart(Action<BodyPart> aProc)
- {
- try
- {
- aProc(this);
- for (int i = 0, j = Parts.Count; i < j; i++)
- {
- BodyPart Part = Parts[i];
- if( Part != null )
- {
- Part.ForeachPart( aProc );
- }
- if (Parts.Count < j)
- {
- int diff = j - Parts.Count;
- i -= diff;
- j -= diff;
- }
- }
- }
- catch
- {
- UnityEngine.Debug.LogWarning("Collection was modified during ForeachPart");
- }
- }
- public bool ForeachPart(Predicate<BodyPart> pProc)
- {
- try
- {
- if( !pProc(this)) return false;
- for (int i = 0, j = Parts.Count; i < j; i++)
- {
- BodyPart Part = Parts[i];
- if (Part != null)
- {
- if (!Part.ForeachPart(pProc)) return false;
- }
- if (Parts.Count < j)
- {
- int diff = j - Parts.Count;
- i -= diff;
- j -= diff;
- }
- }
- }
- catch
- {
- UnityEngine.Debug.LogWarning("Collection was modified during ForeachPart");
- }
- return true;
- }
- public int GetPartCount()
- {
- int Result = 1;
- if (Parts != null) foreach (BodyPart p in Parts) if (p != null) Result += p.GetPartCount();
- return Result;
- }
- public int GetPartCount(string RequiredType)
- {
- int Result = 0;
- if (Type == RequiredType) Result++;
- if (Parts != null)
- {
- foreach (BodyPart p in Parts)
- {
- Result += p.GetPartCount(RequiredType);
- }
- }
- return Result;
- }
- public int GetPartCount(Predicate<BodyPart> pFilter)
- {
- int Result = 0;
- if (pFilter(this)) Result++;
- if (Parts != null) foreach (BodyPart p in Parts) if (p != null) Result += p.GetPartCount(pFilter);
- return Result;
- }
- public int GetPartNameCount(string FindName)
- {
- int Result = 0;
- if (Name == FindName) Result++;
- if (Parts != null)
- {
- foreach (BodyPart p in Parts)
- {
- Result += p.GetPartNameCount(FindName);
- }
- }
- return Result;
- }
- public int GetPartDescriptionCount(string FindDescription)
- {
- int Result = 0;
- if (Description == FindDescription) Result++;
- if (Parts != null)
- {
- foreach (BodyPart p in Parts)
- {
- Result += p.GetPartDescriptionCount(FindDescription);
- }
- }
- return Result;
- }
- public bool AnyCategoryParts(int FindCategory)
- {
- if (FindCategory == Category) return true;
- if (Parts != null) foreach (BodyPart p in Parts) if (p != null && p.AnyCategoryParts(FindCategory)) return true;
- return false;
- }
- public int GetCategoryPartCount(int FindCategory)
- {
- int Result = (FindCategory == Category) ? 1 : 0;
- if (Parts != null) foreach (BodyPart p in Parts) if (p != null) Result += p.GetCategoryPartCount(FindCategory);
- return Result;
- }
- public int GetCategoryPartCount(int FindCategory, string FindType)
- {
- int Result = 0;
- if (FindCategory == Category && FindType == Type) Result++;
- if (Parts != null)
- {
- foreach (BodyPart p in Parts)
- {
- Result += p.GetCategoryPartCount(FindCategory, FindType);
- }
- }
- return Result;
- }
- public int GetCategoryPartCount(int FindCategory, Predicate<BodyPart> pFilter)
- {
- int Result = 0;
- if (FindCategory == Category && pFilter(this)) Result++;
- if (Parts != null) foreach (BodyPart p in Parts) if (p != null) Result += p.GetCategoryPartCount(FindCategory, pFilter);
- return Result;
- }
- public int GetNativePartCount()
- {
- int Result = Native ? 1 : 0;
- if (Parts != null) foreach (BodyPart p in Parts) if (p != null) Result += p.GetNativePartCount();
- return Result;
- }
- public int GetNativePartCount(string RequiredType)
- {
- int Result = 0;
- if (Type == RequiredType && Native) Result++;
- if (Parts != null)
- {
- foreach (BodyPart p in Parts)
- {
- Result += p.GetNativePartCount(RequiredType);
- }
- }
- return Result;
- }
- public int GetNativePartCount(Predicate<BodyPart> pFilter)
- {
- int Result = 0;
- if (Native && pFilter(this)) Result++;
- if (Parts != null) foreach (BodyPart p in Parts) if (p != null) Result += p.GetNativePartCount(pFilter);
- return Result;
- }
- public int GetAddedPartCount()
- {
- int Result = Native ? 0 : 1;
- if (Parts != null) foreach (BodyPart p in Parts) if (p != null) Result += p.GetAddedPartCount();
- return Result;
- }
- public int GetAddedPartCount(string RequiredType)
- {
- int Result = 0;
- if (Type == RequiredType && !Native) Result++;
- if (Parts != null)
- {
- foreach (BodyPart p in Parts)
- {
- Result += p.GetAddedPartCount(RequiredType);
- }
- }
- return Result;
- }
- public int GetAddedPartCount(Predicate<BodyPart> pFilter)
- {
- int Result = 0;
- if (!Native && pFilter(this)) Result++;
- if (Parts != null) foreach (BodyPart p in Parts) if (p != null) Result += p.GetAddedPartCount(pFilter);
- return Result;
- }
- public int GetMortalPartCount()
- {
- int Result = Mortal ? 1 : 0;
- if (Parts != null) foreach (BodyPart p in Parts) if (p != null) Result += p.GetMortalPartCount();
- return Result;
- }
- public int GetMortalPartCount(string RequiredType)
- {
- int Result = 0;
- if (Type == RequiredType && Mortal) Result++;
- if (Parts != null)
- {
- foreach (BodyPart p in Parts)
- {
- Result += p.GetMortalPartCount(RequiredType);
- }
- }
- return Result;
- }
- public int GetMortalPartCount(Predicate<BodyPart> pFilter)
- {
- int Result = 0;
- if (Mortal && pFilter(this)) Result++;
- if (Parts != null) foreach (BodyPart p in Parts) if (p != null) Result += p.GetMortalPartCount(pFilter);
- return Result;
- }
- public bool AnyMortalParts()
- {
- if (Mortal) return true;
- if (Parts != null) foreach (BodyPart p in Parts) if (p != null && p.AnyMortalParts()) return true;
- return false;
- }
- public bool IsEquippedOnCategory(GameObject FindObj, int FindCategory)
- {
- if (FindObj == Equipped && FindCategory == Category) return true;
- if (Parts != null) foreach (BodyPart p in Parts) if (p != null && p.IsEquippedOnCategory(FindObj, FindCategory)) return true;
- return false;
- }
- public bool IsImplantedInCategory(GameObject FindObj, int FindCategory)
- {
- if (FindObj == Cybernetics && FindCategory == Category) return true;
- if (Parts != null) foreach (BodyPart p in Parts) if (p != null && p.IsImplantedInCategory(FindObj, FindCategory)) return true;
- return false;
- }
- public int GetTotalMobility()
- {
- int Result = Mobility;
- if (Parts != null) foreach (BodyPart p in Parts) if (p != null) Result += p.GetTotalMobility();
- return Result;
- }
- public void MarkAllNative()
- {
- Native = true;
- if (Parts != null) foreach (BodyPart p in Parts) if (p != null) p.MarkAllNative();
- }
- public void CategorizeAll(int ApplyCategory)
- {
- Category = ApplyCategory;
- if (Parts != null) foreach (BodyPart p in Parts) if (p != null) p.CategorizeAll(ApplyCategory);
- }
- public void CategorizeAllExcept(int ApplyCategory, int SkipCategory)
- {
- if (Category != SkipCategory) Category = ApplyCategory;
- if (Parts != null) foreach (BodyPart p in Parts) if (p != null) p.CategorizeAllExcept(ApplyCategory, SkipCategory);
- }
- public List<BodyPart> GetParts()
- {
- List<BodyPart> Return = new List<BodyPart>(GetPartCount());
- Return.Add(this);
- if (Parts != null) foreach (BodyPart p in Parts) p.GetParts(Return);
- return Return;
- }
- public void GetParts(List<BodyPart> Return)
- {
- Return.Add(this);
- if (Parts != null) foreach (BodyPart p in Parts) p.GetParts(Return);
- }
- public void GetPartsEquippedOn(GameObject obj, List<BodyPart> Result)
- {
- if (Equipped == obj) Result.Add(this);
- if (Parts != null) foreach (BodyPart p in Parts) p.GetPartsEquippedOn(obj, Result);
- }
- public List<BodyPart> GetPartsEquippedOn(GameObject obj)
- {
- List<BodyPart> Result = new List<BodyPart>(GetPartCountEquippedOn(obj));
- GetPartsEquippedOn(obj, Result);
- return Result;
- }
- public int GetPartCountEquippedOn(GameObject obj)
- {
- int Result = 0;
- if (Equipped == obj) Result++;
- if (Parts != null) foreach (BodyPart p in Parts) Result += p.GetPartCountEquippedOn(obj);
- return Result;
- }
- public List<BodyPart> GetUnequippedPart(string RequiredType, List<BodyPart> Return)
- {
- if (Type == RequiredType && Equipped == null) Return.Add(this);
- if (Parts != null) foreach (BodyPart p in Parts) p.GetUnequippedPart(RequiredType, Return);
- return Return;
- }
- public int GetUnequippedPartCount(string RequiredType)
- {
- int result = 0;
- if (Type == RequiredType && Equipped == null) result++;
- if (Parts != null) foreach (BodyPart p in Parts) result += p.GetUnequippedPartCount(RequiredType);
- return result;
- }
- public int GetUnequippedPartCountExcept(string RequiredType, BodyPart ExceptPart)
- {
- int result = 0;
- if (Type == RequiredType && Equipped == null && ExceptPart != this) result++;
- if (Parts != null) foreach (BodyPart p in Parts) result += p.GetUnequippedPartCountExcept(RequiredType, ExceptPart);
- return result;
- }
- public List<BodyPart> GetPart(string RequiredType, List<BodyPart> Return)
- {
- if (Type == RequiredType) Return.Add(this);
- if (Parts != null) foreach (BodyPart p in Parts) p.GetPart(RequiredType, Return);
- return Return;
- }
- public BodyPart GetFirstPart(string RequiredType)
- {
- if (Type == RequiredType) return this;
- if (Parts != null)
- {
- foreach (BodyPart p in Parts)
- {
- BodyPart Part = p.GetFirstPart(RequiredType);
- if (Part != null) return Part;
- }
- }
- return null;
- }
- public BodyPart GetFirstPart(string RequiredType, int RequiredLaterality)
- {
- if (RequiredLaterality == Lat.ANY) return GetFirstPart(RequiredType);
- if (Type == RequiredType)
- {
- if (RequiredLaterality == Lat.NONE)
- {
- if (Laterality == Lat.NONE) return this;
- }
- else
- {
- if ((Laterality & RequiredLaterality) == RequiredLaterality) return this;
- }
- }
- if (Parts != null)
- {
- foreach (BodyPart p in Parts)
- {
- BodyPart Part = p.GetFirstPart(RequiredType, RequiredLaterality);
- if (Part != null) return Part;
- }
- }
- return null;
- }
- public BodyPart GetFirstAttachedPart(string RequiredType)
- {
- if (Parts != null)
- {
- foreach (BodyPart Part in Parts)
- {
- if (Part.Type == RequiredType) return Part;
- }
- }
- return null;
- }
- public BodyPart GetFirstAttachedPart(string RequiredType, Body BackupParentBody, bool EvenIfDismembered)
- {
- BodyPart Result = GetFirstAttachedPart(RequiredType);
- if (EvenIfDismembered)
- {
- Body UseParentBody = (ParentBody != null) ? ParentBody : BackupParentBody;
- if (UseParentBody != null)
- {
- BodyPart Dismembered = UseParentBody.GetFirstDismemberedPartByType(this, RequiredType);
- if (Dismembered != null && (Result == null || Dismembered.Position < Result.Position)) Result = Dismembered;
- }
- }
- return Result;
- }
- public BodyPart GetFirstAttachedPart(string RequiredType, int RequiredLaterality)
- {
- if (RequiredLaterality == Lat.ANY) return GetFirstAttachedPart(RequiredType);
- if (Parts != null)
- {
- if (RequiredLaterality == Lat.NONE)
- {
- foreach (BodyPart Part in Parts)
- {
- if (Part.Type == RequiredType && Part.Laterality == Lat.NONE) return Part;
- }
- }
- else
- {
- foreach (BodyPart Part in Parts)
- {
- if (Part.Type == RequiredType && (Part.Laterality & RequiredLaterality) == RequiredLaterality) return Part;
- }
- }
- }
- return null;
- }
- public BodyPart GetFirstAttachedPart(string RequiredType, int RequiredLaterality, Body BackupParentBody, bool EvenIfDismembered)
- {
- BodyPart Result = GetFirstAttachedPart(RequiredType, RequiredLaterality);
- if (EvenIfDismembered)
- {
- Body UseParentBody = (ParentBody != null) ? ParentBody : BackupParentBody;
- if (UseParentBody != null)
- {
- BodyPart Dismembered = UseParentBody.GetFirstDismemberedPartByTypeAndLaterality(this, RequiredType, RequiredLaterality);
- if (Dismembered != null && (Result == null || Dismembered.Position < Result.Position)) Result = Dismembered;
- }
- }
- return Result;
- }
- public BodyPart GetPartByName(string RequiredPart)
- {
- if (Name == RequiredPart) return this;
- if (Parts != null)
- {
- foreach (BodyPart p in Parts)
- {
- BodyPart Part = p.GetPartByName(RequiredPart);
- if (Part != null) return Part;
- }
- }
- return null;
- }
- public BodyPart GetPartByNameStartsWith(string RequiredPart)
- {
- if (Name != null && Name.StartsWith(RequiredPart)) return this;
- if (Parts != null)
- {
- foreach (BodyPart p in Parts)
- {
- BodyPart Part = p.GetPartByNameStartsWith(RequiredPart);
- if (Part != null) return Part;
- }
- }
- return null;
- }
- public BodyPart GetPartByDescription(string RequiredPart)
- {
- if (Description == RequiredPart) return this;
- if (Parts != null)
- {
- foreach (BodyPart p in Parts)
- {
- BodyPart Part = p.GetPartByDescription(RequiredPart);
- if (Part != null) return Part;
- }
- }
- return null;
- }
- public BodyPart GetPartByDescriptionStartsWith(string RequiredPart)
- {
- if (Description != null && Description.StartsWith(RequiredPart)) return this;
- if (Parts != null)
- {
- foreach (BodyPart p in Parts)
- {
- BodyPart Part = p.GetPartByDescriptionStartsWith(RequiredPart);
- if (Part != null) return Part;
- }
- }
- return null;
- }
- public BodyPart GetPartByID(int findID)
- {
- if (idMatch(findID)) return this;
- if (Parts != null)
- {
- foreach (BodyPart p in Parts)
- {
- BodyPart Part = p.GetPartByID(findID);
- if (Part != null) return Part;
- }
- }
- return null;
- }
- public BodyPart GetPartBySupportsDependent(string findSupportsDependent)
- {
- if (SupportsDependent == findSupportsDependent) return this;
- if (Parts != null)
- {
- foreach (BodyPart p in Parts)
- {
- BodyPart Part = p.GetPartBySupportsDependent(findSupportsDependent);
- if (Part != null) return Part;
- }
- }
- return null;
- }
- protected void GetNamePosition(BodyPart FindPart, ref int Found, ref bool Done)
- {
- if (FindPart == this)
- {
- Found++;
- Done = true;
- return;
- }
- if (FindPart.Name == Name) Found++;
- if (Parts != null)
- {
- foreach (BodyPart Part in Parts)
- {
- Part.GetNamePosition(FindPart, ref Found, ref Done);
- if (Done) break;
- }
- }
- }
- public int GetNamePosition()
- {
- int Found = 0;
- bool Done = false;
- if (ParentBody != null) ParentBody.GetBody().GetNamePosition(this, ref Found, ref Done);
- else GetNamePosition(this, ref Found, ref Done);
- return Found;
- }
- protected void GetDescriptionPosition(BodyPart FindPart, ref int Found, ref bool Done)
- {
- if (FindPart == this)
- {
- Found++;
- Done = true;
- return;
- }
- if (FindPart.Description == Description) Found++;
- if (Parts != null)
- {
- foreach (BodyPart Part in Parts)
- {
- Part.GetDescriptionPosition(FindPart, ref Found, ref Done);
- if (Done) break;
- }
- }
- }
- public int GetDescriptionPosition()
- {
- int Found = 0;
- bool Done = false;
- if (ParentBody != null) ParentBody.GetBody().GetDescriptionPosition(this, ref Found, ref Done);
- else GetDescriptionPosition(this, ref Found, ref Done);
- return Found;
- }
- public string GetCardinalName()
- {
- int pos = GetNamePosition();
- if (pos == 1) return Name;
- return
- Event.NewStringBuilder()
- .Append(Name)
- .Append(" (")
- .Append(pos)
- .Append(')')
- .ToString()
- ;
- }
- public string GetOrdinalName()
- {
- if (GetPartNameCount(Name) == 1) return Name;
- return
- Event.NewStringBuilder()
- .Append(Grammar.Ordinal(GetNamePosition()))
- .Append(' ')
- .Append(Name)
- .ToString()
- ;
- }
- public string GetCardinalDescription()
- {
- StringBuilder SB = Event.NewStringBuilder();
- if (!Abstract)
- {
- string Color = BodyPartCategory.GetColor(Category);
- if (Color != null) SB.Append('&').Append(Color);
- }
- SB.Append(Description);
- int pos = GetDescriptionPosition();
- if (pos != 1)
- {
- SB
- .Append(" (")
- .Append(pos)
- .Append(')')
- ;
- }
- return SB.ToString();
- }
- public string GetOrdinalDescription()
- {
- StringBuilder SB = Event.NewStringBuilder();
- if (!Abstract)
- {
- string Color = BodyPartCategory.GetColor(Category);
- if (Color != null) SB.Append('&').Append(Color);
- }
- int num = GetPartDescriptionCount(Description);
- if (num != 1) return Description;
- {
- int pos = GetDescriptionPosition();
- SB
- .Append(ColorUtility.CapitalizeExceptFormatting(Grammar.Ordinal(pos)))
- .Append(' ')
- ;
- }
- SB.Append(Description);
- return SB.ToString();
- }
- public bool IsConcretelyDependent()
- {
- return DependsOn != null;
- }
- public bool IsAbstractlyDependent()
- {
- return RequiresType != null;
- }
- public bool IsDependent()
- {
- return IsConcretelyDependent() || IsAbstractlyDependent();
- }
- public bool IsConcretelyUnsupported(Body UseParentBody = null)
- {
- if (DependsOn == null) return false;
- if (UseParentBody != null) return UseParentBody.GetPartBySupportsDependent(DependsOn) == null;
- else if (ParentBody != null) return ParentBody.GetPartBySupportsDependent(DependsOn) == null;
- else return GetPartBySupportsDependent(DependsOn) == null;
- }
- public bool IsAbstractlyUnsupported(Body UseParentBody = null)
- {
- if (RequiresType == null) return false;
- if (UseParentBody != null) return UseParentBody.GetFirstPart(RequiresType, RequiresLaterality) == null;
- else if (ParentBody != null) return ParentBody.GetFirstPart(RequiresType, RequiresLaterality) == null;
- else return GetFirstPart(RequiresType, RequiresLaterality) == null;
- }
- public bool IsUnsupported(Body UseParentBody = null)
- {
- return IsConcretelyUnsupported(UseParentBody) || IsAbstractlyUnsupported(UseParentBody);
- }
- public bool IsSeverable()
- {
- if (Abstract) return false;
- if (Integral) return false;
- if (IsDependent()) return false;
- return true;
- }
- public bool SeverRequiresDecapitate()
- {
- return Mortal;
- }
- public bool IsRegenerable()
- {
- return IsSeverable() && PreventRegenerationBecause == null;
- }
- public bool IsRecoverable(Body UseParentBody = null)
- {
- return IsDependent() && !IsUnsupported(UseParentBody);
- }
- public void FindUnsupportedParts(ref List<BodyPart> Result)
- {
- if (Parts != null) foreach (BodyPart Part in Parts) Part.FindUnsupportedParts(ref Result);
- if (IsUnsupported())
- {
- if (Result == null)
- {
- Result = new List<BodyPart>(1){ this };
- }
- else
- {
- Result.Add(this);
- }
- }
- }
- public List<BodyPart> FindUnsupportedParts()
- {
- List<BodyPart> Result = null;
- FindUnsupportedParts(ref Result);
- return Result;
- }
- public bool HasLaterality(int checkLaterality)
- {
- return (Laterality & checkLaterality) == checkLaterality;
- }
- public bool IsFirstSlotForEquipped()
- {
- if (Equipped == null) return false;
- if (ParentBody != null) return ParentBody.FindEquippedItem(Equipped) == this;
- // without a parent body, FindEquippedItem(Equipped) will always be 'this'
- return true;
- }
- public bool IsFirstSlotForCybernetics()
- {
- if (Cybernetics == null) return false;
- if (ParentBody != null) return ParentBody.FindCybernetics(Cybernetics) == this;
- // without a parent body, FindCybernetics(Cybernetics) will always be 'this'
- return true;
- }
- public void GetTypeArmorInfo(string ForType, ref GameObject First, ref int Count, ref int AV, ref int DV)
- {
- if (ForType == Type)
- {
- Count++;
- if (Equipped != null)
- {
- Armor pArmor = Equipped.GetPart<Armor>();
- if (pArmor != null && (pArmor.WornOn == Type || pArmor.WornOn == "*") && IsFirstSlotForEquipped())
- {
- if (First == null) First = Equipped;
- AV += pArmor.AV;
- DV += pArmor.DV;
- }
- }
- }
- if (Parts != null) foreach (BodyPart Part in Parts) Part.GetTypeArmorInfo(ForType, ref First, ref Count, ref AV, ref DV);
- }
- public void RecalculateArmor()
- {
- if (Equipped != null)
- {
- Armor pArmor = Equipped.GetPart<Armor>();
- if (pArmor != null && (pArmor.WornOn == Type || pArmor.WornOn == "*") && (pArmor.AV != 0 || pArmor.DV != 0) && IsFirstSlotForEquipped())
- {
- pArmor.RecalculateArmor();
- }
- }
- if (Parts != null) foreach (BodyPart Part in Parts) Part.RecalculateArmor();
- }
- public void RecalculateArmorExcept(GameObject obj)
- {
- if (Equipped != null && Equipped != obj)
- {
- Armor pArmor = Equipped.GetPart<Armor>();
- if (pArmor != null && (pArmor.WornOn == Type || pArmor.WornOn == "*") && (pArmor.AV != 0 || pArmor.DV != 0) && IsFirstSlotForEquipped())
- {
- pArmor.RecalculateArmor();
- }
- }
- if (Parts != null) foreach (BodyPart Part in Parts) Part.RecalculateArmor();
- }
- public void RecalculateTypeArmor(string ForType)
- {
- if (ForType == Type && Equipped != null)
- {
- Armor pArmor = Equipped.GetPart<Armor>();
- if (pArmor != null && (pArmor.WornOn == Type || pArmor.WornOn == "*") && (pArmor.AV != 0 || pArmor.DV != 0) && IsFirstSlotForEquipped())
- {
- pArmor.RecalculateArmor();
- }
- }
- if (Parts != null) foreach (BodyPart Part in Parts) Part.RecalculateTypeArmor(ForType);
- }
- public void RecalculateTypeArmorExcept(string ForType, GameObject obj)
- {
- if (ForType == Type && Equipped != null && Equipped != obj)
- {
- Armor pArmor = Equipped.GetPart<Armor>();
- if (pArmor != null && (pArmor.WornOn == Type || pArmor.WornOn == "*") && (pArmor.AV != 0 || pArmor.DV != 0) && IsFirstSlotForEquipped())
- {
- pArmor.RecalculateArmor();
- }
- }
- if (Parts != null) foreach (BodyPart Part in Parts) Part.RecalculateTypeArmor(ForType);
- }
- public void GetMissileWeapons(List<GameObject> List)
- {
- if (Equipped != null && !List.Contains(Equipped))
- {
- MissileWeapon pMW = Equipped.GetPart<MissileWeapon>();
- if (pMW != null && IsFirstSlotForEquipped() && Type == pMW.GetSlotType()) List.Add(Equipped);
- }
- if (Cybernetics != null && !List.Contains(Cybernetics))
- {
- MissileWeapon pMW = Cybernetics.GetPart<MissileWeapon>();
- if (pMW != null && IsFirstSlotForCybernetics() && Type == pMW.GetSlotType()) List.Add(Cybernetics);
- }
- if (Parts != null) foreach (BodyPart Part in Parts) Part.GetMissileWeapons(List);
- }
- public bool IsADefaultBehavior(GameObject obj)
- {
- if (obj == DefaultBehavior) return obj != null;
- if (Parts != null) foreach (BodyPart Part in Parts) if (Part.IsADefaultBehavior(obj)) return true;
- return false;
- }
- private static void GetCreatureFromSpec(string Blueprint, string Type, string Tag, string Base, Predicate<GameObjectBlueprint> Filter, ref GameObject Creature)
- {
- if (Blueprint != null)
- {
- Creature = GameObject.create(Blueprint);
- }
- else
- if (Tag != null && Base != null)
- {
- if (Filter == null)
- {
- Creature = Qud.API.EncountersAPI.GetACreature(BP => BP.HasPart("Body") && BP.HasTag(Tag) && BP.DescendsFrom(Base));
- }
- else
- {
- Creature = Qud.API.EncountersAPI.GetACreature(BP => BP.HasPart("Body") && BP.HasTag(Tag) && BP.DescendsFrom(Base) && Filter(BP));
- }
- }
- else
- if (Tag != null)
- {
- if (Filter == null)
- {
- Creature = Qud.API.EncountersAPI.GetACreature(BP => BP.HasPart("Body") && BP.HasTag(Tag));
- }
- else
- {
- Creature = Qud.API.EncountersAPI.GetACreature(BP => BP.HasPart("Body") && BP.HasTag(Tag) && Filter(BP));
- }
- }
- else
- if (Base != null)
- {
- if (Filter == null)
- {
- Creature = Qud.API.EncountersAPI.GetACreature(BP => BP.HasPart("Body") && BP.DescendsFrom(Base));
- }
- else
- {
- Creature = Qud.API.EncountersAPI.GetACreature(BP => BP.HasPart("Body") && BP.DescendsFrom(Base) && Filter(BP));
- }
- }
- else
- {
- if (Filter == null)
- {
- Creature = Qud.API.EncountersAPI.GetACreature(BP => BP.HasPart("Body"));
- }
- else
- {
- Creature = Qud.API.EncountersAPI.GetACreature(BP => BP.HasPart("Body") && Filter(BP));
- }
- }
- }
- [NonSerialized] private static List<BodyPart> SeverWork = new List<BodyPart>(8);
- public static GameObject MakeSeveredBodyPart(string Blueprint = null, string Type = null, string Tag = null, string Base = null, Predicate<GameObjectBlueprint> Filter = null, GameObject PutIn = null)
- {
- GameObject creature = null;
- int tries = 0;
- while (++tries < 10)
- {
- try
- {
- GetCreatureFromSpec(Blueprint, Type, Tag, Base, Filter, ref creature);
- if (creature == null) return null;
- Body pBody = creature.GetPart<Body>();
- BodyPart part;
- if (Type == null)
- {
- SeverWork.Clear();
- foreach (BodyPart p in pBody.GetParts()) if (p.IsSeverable()) SeverWork.Add(p);
- part = SeverWork.GetRandomElement();
- }
- else
- {
- part = pBody.GetFirstPart(Type);
- }
- if (part != null && part.IsSeverable())
- {
- GameObject obj = part.Dismember();
- if (obj != null)
- {
- if (PutIn != null) PutIn.FireEvent(Event.New("CommandTakeObject", "Object", obj).SetSilent(true));
- return obj;
- }
- }
- }
- finally
- {
- if (creature != null) creature.Obliterate();
- }
- if (Blueprint != null) return null;
- }
- return null;
- }
- public static void MakeSeveredBodyParts(int Number, string Blueprint = null, string Type = null, string Tag = null, string Base = null, Predicate<GameObjectBlueprint> Filter = null, GameObject PutIn = null, List<GameObject> Return = null)
- {
- GameObject creature = null;
- int origCount = 0;
- int tries = 0;
- int done = 0;
- while (++tries < 10)
- {
- start:
- GameObject prevCreature = creature;
- GetCreatureFromSpec(Blueprint, Type, Tag, Base, Filter, ref creature);
- if (creature == null)
- {
- break;
- }
- Body pBody = creature.GetPart<Body>();
- BodyPart part;
- if (Type == null)
- {
- SeverWork.Clear();
- foreach (BodyPart p in pBody.GetParts()) if (p.IsSeverable()) SeverWork.Add(p);
- part = SeverWork.GetRandomElement();
- if (creature == prevCreature)
- {
- if (origCount - SeverWork.Count >= Number / 2)
- {
- creature.Obliterate();
- creature = null;
- goto start;
- }
- }
- else
- {
- origCount = SeverWork.Count;
- }
- }
- else
- {
- part = pBody.GetFirstPart(Type);
- }
- try
- {
- if (part != null && part.IsSeverable())
- {
- GameObject obj = part.Dismember();
- if (obj != null)
- {
- if (PutIn != null) PutIn.FireEvent(Event.New("CommandTakeObject", "Object", obj).SetSilent(true));
- if (Return != null) Return.Add(obj);
- if (++done >= Number) break;
- goto start;
- }
- }
- }
- finally
- {
- if (Blueprint == null)
- {
- creature.Obliterate();
- creature = null;
- }
- }
- if (Blueprint != null) break;
- }
- if (creature != null) creature.Obliterate();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement