Ejemplo n.º 1
0
    public void AddMemory(GameObject LeTarget)
    {
        //Create a new memory record
        MemoryRecord record = new MemoryRecord();

        if (LeTarget.tag == "Player")
        {
            record = new MemoryRecord(DateTime.Now, LeTarget.transform.position, true, LeTarget.GetComponent <Player_Gun>().currentHP, LeTarget.GetComponent <Player_Gun>().currentAmmo);
        }
        else
        {
            record = new MemoryRecord(DateTime.Now, LeTarget.transform.position, true, LeTarget.GetComponent <Agent>().isDead);
        }


        //Check if there already is a previous memory record for this target
        if (MemoryMap.ContainsKey(LeTarget))
        {
            //Overwrite the previous record instead of adding a new one
            MemoryMap[LeTarget] = record;
        }
        else
        {
            //Otherwise add the new record
            MemoryMap.Add(LeTarget, record);
        }
    }
Ejemplo n.º 2
0
    /// <summary>
    /// 清楚目标的方法
    /// </summary>
    public void ClearTarget()
    {
        //同时也清除这个目标对应的记忆
        if (this.owner.Raven_TargetSelectionSystem.isHaveTarget())
        {
            this.owner.SensoryComponent.RemoveMemeory(currentTarget.TargetID);
        }

        currentTarget = null;
    }
Ejemplo n.º 3
0
    public void addMemory(GameObject target)
    {
        MemoryRecord mRecord = new MemoryRecord(DateTime.Now, target.transform.position, true);

        if (MemoryMap.ContainsKey(target))
        {
            MemoryMap[target] = mRecord;
        }
        else
        {
            MemoryMap.Add(target, mRecord);
        }
    }
Ejemplo n.º 4
0
    /// <summary>
    /// 目标选择组件的消息处理函数
    /// </summary>
    public bool OnMessage(Msg msg)
    {
        switch ((EntityMsgType)msg.Op)
        {
        case EntityMsgType.HasBeenKilled:
            //正中红心
            if (currentTarget != null && msg.SenderID == currentTarget.TargetID)
            {
                currentTarget = null;
            }
            return(true);
        }

        return(false);
    }
Ejemplo n.º 5
0
        /// <summary>
        /// Shows some of the scanner results.
        /// </summary>
        public void ShowScannerResults(Scanner scanner)
        {
            Contract.Requires(scanner != null);

            SetResultCount(scanner.TotalResultCount);

            resultMemoryRecordList.SetRecords(
                scanner.GetResults()
                .Take(MaxVisibleResults)
                .OrderBy(r => r.Address, IntPtrComparer.Instance)
                .Select(r =>
            {
                var record = new MemoryRecord(r);
                record.ResolveAddress(Program.RemoteProcess);
                return(record);
            })
                );
        }
Ejemplo n.º 6
0
    /// <summary>
    /// 获取一个最近被感知的实体
    /// </summary>
    /// <returns></returns>
    public MemoryRecord GetClostEntityLastSense()
    {
        float time = float.PositiveInfinity;

        MemoryRecord target   = null;
        int          targetID = -1;

        foreach (var m in this.sensoryMemory.Memorys.Values)
        {
            if (time > m.TimeLastSensed)
            {
                time     = m.TimeLastSensed;
                target   = m;
                targetID = m.TargetID;
            }
        }

        return(target);
    }
Ejemplo n.º 7
0
    /// <summary>
    /// 获取一个视野范围内最近的一个目标
    /// </summary>
    /// <returns></returns>
    public MemoryRecord GetClostEntityInFOV()
    {
        float        sqrtDist = distance;
        MemoryRecord target   = null;
        int          targetID = -1;

        foreach (var m in sensoryMemory.Memorys.Values)
        {
            float sdist = (this.owner.Pos - m.LastSensedPosition).sqrMagnitude;

            if (sqrtDist > sdist)
            {
                targetID = m.TargetID;
                target   = m;
                sqrtDist = sdist;
            }
        }

        return(target);
    }
Ejemplo n.º 8
0
    /// <summary>
    /// 更新目标选择系统的状态
    /// </summary>
    public void Update(float detalTime)
    {
        //每次更新目标是什么
        //目标的选择规则
        //1.目标要么是在攻击距离内的AI
        //2.目标要么是在视野范围内的AI
        //3.目标要么是最近被感知到的AI

        if ((currentTarget = ravenSensoryComponent.GetClostCanShootEntityInMemory()) != null)
        {
            //Debug.Log("选中了一个可以攻击的目标");
        }
        else if ((currentTarget = ravenSensoryComponent.GetClostEntityInFOV()) != null)
        {
            //Debug.Log("选中了一个在视野范围内的目标");
        }
        else if ((currentTarget = ravenSensoryComponent.GetClostEntityLastSense()) != null)
        {
            //Debug.Log("选中了一个在视野中最近被感知到的目标");
        }
    }
Ejemplo n.º 9
0
    /// <summary>
    /// 上传一个听觉的数据
    /// </summary>
    public void UpdateViewRecord(GameObject target)
    {
        MemoryRecord r;

        if ((r = viewRecords.Find(x => x.target == target)) == null)    //没找到旧的记录
        {
            r = new MemoryRecord
            {
                firstTime = Time.time,
                lastTime  = Time.time,
                lastPos   = target.transform.position,
                target    = target
            };
            viewRecords.Add(r);
        }
        //找到旧记录
        else
        {
            r.lastPos  = target.transform.position;
            r.lastTime = Time.time;
        }
    }
Ejemplo n.º 10
0
        /// <summary>
        /// Attaches the debugger to find what interacts with the selected record.
        /// </summary>
        /// <exception cref="ArgumentOutOfRangeException">Thrown when one or more arguments are outside the required range.</exception>
        /// <param name="record">The record.</param>
        /// <param name="writeOnly">True to search only for write access.</param>
        private static void FindWhatInteractsWithSelectedRecord(MemoryRecord record, bool writeOnly)
        {
            int size;

            switch (record.ValueType)
            {
            case ScanValueType.Byte:
                size = 1;
                break;

            case ScanValueType.Short:
                size = 2;
                break;

            case ScanValueType.Integer:
            case ScanValueType.Float:
                size = 4;
                break;

            case ScanValueType.Long:
            case ScanValueType.Double:
                size = 8;
                break;

            case ScanValueType.ArrayOfBytes:
                size = record.ValueLength;
                break;

            case ScanValueType.String:
                size = record.ValueLength;
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            LinkedWindowFeatures.FindWhatInteractsWithAddress(record.RealAddress, size, writeOnly);
        }
Ejemplo n.º 11
0
    /// <summary>
    /// 添加一个记录
    /// </summary>
    public void AddMemoryRecord(RavenEntity entity, MemoryRecord record)
    {
        if (Memorys.ContainsKey(entity.ID))
        {
            //如果记忆中已经有这个记录了
            var memory = Memorys[entity.ID];
            memory.TimeLastSensed     = record.TimeLastSensed;
            memory.LastSensedPosition = record.LastSensedPosition;
            memory.TimeLastVisible    = record.TimeLastVisible;
            memory.IsShootable        = record.IsShootable;
            memory.IsWithinFov        = record.IsWithinFov;
            //Debug.Log("记忆中已经有这个记录了");
        }
        else
        {
            record.TimeBecameVisible = record.TimeLastVisible;
            record.TimeBecomeSense   = record.TimeLastSensed;

            Memorys.Add(entity.ID, record);

            //Debug.Log("记忆中没有这个记录已经进行添加,当前的记忆有"+Memorys.Values.Count);
        }
    }
Ejemplo n.º 12
0
    /// <summary>
    /// 进行视觉检测
    /// </summary>
    protected void SightDetection()
    {
        foreach (var entity in EntityManager.Instance.EntityContainer.Values)
        {
            if (entity.ID != this.owner.ID)
            {
                var e = (RavenEntity)entity;
                if (isInSight(e))
                {
                    MemoryRecord record = new MemoryRecord();

                    record.IsWithinFov        = true;
                    record.LastSensedPosition = e.Pos;
                    record.TimeLastSensed     = Time.time;
                    record.TimeLastVisible    = Time.time;
                    record.TargetID           = e.ID;



                    if (this.isCanAttack(e))
                    {
                        //这个目标是可以进行射击的
                        //Debug.LogError(this.owner.gameObject.name+"检测到一个可以进行设计的目标");
                        record.IsShootable = true;
                    }
                    else
                    {
                        record.IsShootable = false;
                    }

                    //构建一个MemroyRecord
                    this.sensoryMemory.AddMemoryRecord(e, record);
                }
            }
        }
    }
Ejemplo n.º 13
0
    /// <summary>
    /// 从记忆中获取被感知的最近的AI
    /// </summary>
    /// <returns></returns>
    public int GetCloseEntityInMemory(ref Vector2 pos)
    {
        MemoryRecord record   = null;
        float        sqrtDist = float.PositiveInfinity;

        foreach (var r in this.sensoryMemory.Memorys.Values)
        {
            float sdist = (r.LastSensedPosition - this.owner.Pos).sqrMagnitude;

            if (sqrtDist > sdist)
            {
                record   = r;
                sqrtDist = sdist;
            }
        }

        if (record != null)
        {
            pos = record.LastSensedPosition;
            return(record.TargetID);
        }

        return(-1);
    }
Ejemplo n.º 14
0
    void OnTriggerStay2D(Collider2D other)
    {
        if (other.gameObject == owner)
            return;

        Vector3 toTarget = other.transform.position - owner.transform.position;
        float angle = Vector3.Angle(owner.transform.right, toTarget);

        if (angle <= fov/2.0f)
        {

            if (memory.ContainsKey(other.gameObject))
            {
                memory[other.gameObject].timeLastSeen = Time.time;
                memory[other.gameObject].lastKnownPosition = other.gameObject.transform.position;
            }
            else
            {
                MemoryRecord record = new MemoryRecord(other.transform.position, Time.time);
                memory.Add(other.gameObject, record);
            }
        }
    }
Ejemplo n.º 15
0
        public void MemoryRecordTest5()
        {
            MemoryRecord record = new MemoryRecord(0, "0000100000000101", "805", 2);

            Assert.IsFalse(record.isComplex);
        }
Ejemplo n.º 16
0
 private void memorySearchResultControl_ResultDoubleClick(object sender, MemoryRecord record)
 {
     addressListMemoryRecordList.Records.Add(record);
 }
Ejemplo n.º 17
0
        public IEnumerable <MemoryRecord> Load(string filePath, ILogger logger)
        {
            using (var fs = new FileStream(filePath, FileMode.Open))
            {
                using (var archive = new ZipArchive(fs, ZipArchiveMode.Read))
                {
                    var dataEntry = archive.GetEntry(DataFileName);
                    if (dataEntry == null)
                    {
                        throw new FormatException();
                    }
                    using (var entryStream = dataEntry.Open())
                    {
                        var document = XDocument.Load(entryStream);
                        if (document.Root == null)
                        {
                            logger.Log(LogLevel.Error, "File has not the correct format.");
                            yield break;
                        }

                        //var version = document.Root.Attribute(XmlVersionAttribute)?.Value;
                        var platform = document.Root.Attribute(XmlPlatformAttribute)?.Value;
                        if (platform != Constants.Platform)
                        {
                            logger.Log(LogLevel.Warning, $"The platform of the file ({platform}) doesn't match the program platform ({Constants.Platform}).");
                        }

                        foreach (var element in document.Root.Elements(XmlRecordElement))
                        {
                            var valueTypeStr = element.Attribute(XmlValueTypeAttribute)?.Value ?? string.Empty;

                            if (!Enum.TryParse <ScanValueType>(valueTypeStr, out var valueType))
                            {
                                logger?.Log(LogLevel.Warning, $"Unknown value type: {valueTypeStr}");
                                continue;
                            }

                            var description = element.Attribute(XmlDescriptionAttribute)?.Value ?? string.Empty;

                            var addressStr = element.Attribute(XmlAddressAttribute)?.Value ?? string.Empty;
                            var moduleName = element.Attribute(XmlModuleAttribute)?.Value ?? string.Empty;

                            long.TryParse(addressStr, NumberStyles.HexNumber, null, out var address);

                            var record = new MemoryRecord
                            {
                                Description     = description,
                                AddressOrOffset = (IntPtr)address,
                                ValueType       = valueType
                            };

                            if (!string.IsNullOrEmpty(moduleName))
                            {
                                record.ModuleName = moduleName;
                            }

                            if (valueType == ScanValueType.ArrayOfBytes || valueType == ScanValueType.String)
                            {
                                var lengthStr = element.Attribute(XmlValueLengthAttribute)?.Value ?? string.Empty;
                                int.TryParse(lengthStr, NumberStyles.Integer, null, out var valueLength);

                                record.ValueLength = Math.Max(1, valueLength);

                                if (valueType == ScanValueType.String)
                                {
                                    switch (element.Attribute(XmlEncodingAttribute)?.Value ?? string.Empty)
                                    {
                                    default:
                                    case "UTF8":
                                        record.Encoding = Encoding.UTF8;
                                        break;

                                    case "UTF16":
                                        record.Encoding = Encoding.Unicode;
                                        break;

                                    case "UTF32":
                                        record.Encoding = Encoding.UTF32;
                                        break;
                                    }
                                }
                            }

                            yield return(record);
                        }
                    }
                }
            }
        }
Ejemplo n.º 18
0
        public void MemoryRecordTest4()
        {
            MemoryRecord record = new MemoryRecord(0, "0010100001001101", "284D", 2);

            Assert.IsTrue(record.DA.Equals("01001101") && record.OP.Equals("00101") && record.XSI.Equals("000"));
        }
Ejemplo n.º 19
0
        public IEnumerable <MemoryRecord> Load(string filePath, ILogger logger)
        {
            using (var stream = File.OpenRead(filePath))
            {
                var document = XDocument.Load(stream);
                if (document.Root != null)
                {
                    var version = document.Root.Attribute(XmlVersionElement)?.Value;
                    if (string.Compare(version, Version26, StringComparison.Ordinal) >= 0)
                    {
                        var entries = document.Root.Element(XmlEntriesElement);
                        if (entries != null)
                        {
                            foreach (var entry in entries.Elements(XmlEntryElement))
                            {
                                var description = entry.Element(XmlDescriptionElement)?.Value.Trim() ?? string.Empty;
                                if (description == "\"No description\"")
                                {
                                    description = string.Empty;
                                }
                                var variableTypeStr = entry.Element(XmlValueTypeElement)?.Value.Trim() ?? string.Empty;
                                var valueType       = Parse(variableTypeStr, logger);

                                var record = new MemoryRecord
                                {
                                    Description = description,
                                    ValueType   = valueType
                                };

                                var addressStr   = entry.Element(XmlAddressElement)?.Value.Trim() ?? string.Empty;
                                var addressParts = addressStr.Split('+');
                                if (addressParts.Length == 2)
                                {
                                    long.TryParse(addressParts[1], NumberStyles.HexNumber, null, out var value);
                                    record.AddressOrOffset = (IntPtr)value;

                                    record.ModuleName = addressParts[0].Trim();
                                }
                                else
                                {
                                    long.TryParse(addressStr, NumberStyles.HexNumber, null, out var value);
                                    record.AddressOrOffset = (IntPtr)value;
                                }

                                if (valueType == ScanValueType.ArrayOfBytes || valueType == ScanValueType.String)
                                {
                                    var lengthStr = entry.Element(XmlLengthElement)?.Value ?? string.Empty;
                                    int.TryParse(lengthStr, NumberStyles.Integer, null, out var valueLength);

                                    record.ValueLength = Math.Max(1, valueLength);

                                    if (valueType == ScanValueType.String)
                                    {
                                        var isUnicode = (entry.Element(XmlUnicodeElement)?.Value ?? string.Empty) == "1";

                                        if (isUnicode)
                                        {
                                            record.Encoding = Encoding.Unicode;
                                        }
                                        else
                                        {
                                            record.Encoding = Encoding.UTF8;
                                        }
                                    }
                                }

                                yield return(record);
                            }
                        }
                    }
                }
            }
        }
Ejemplo n.º 20
0
        public IEnumerable <MemoryRecord> Load(string filePath, ILogger logger)
        {
            var document = XDocument.Load(filePath);

            if (document.Root != null)
            {
                var version = document.Root.Element(XmlVersionElement)?.Value;
                if (string.Compare(version, Version3, StringComparison.Ordinal) >= 0)
                {
                    var entries = document.Root.Element(XmlEntriesElement);
                    if (entries != null)
                    {
                        foreach (var entry in entries.Elements(XmlItemElement))
                        {
                            var description  = entry.Element(XmlDescriptionElement)?.Value.Trim() ?? string.Empty;
                            var valueTypeStr = entry.Element(XmlValueTypeElement)?.Attribute(XmlValueAttribute)?.Value.Trim() ?? string.Empty;
                            var addressStr   = entry.Element(XmlAddressElement)?.Attribute(XmlValueAttribute)?.Value.Trim() ?? string.Empty;
                            var moduleName   = entry.Element(XmlModuleNameElement)?.Value.Trim() ?? string.Empty;

                            long.TryParse(addressStr, NumberStyles.Number, null, out var value);
                            var valueType = Parse(valueTypeStr, logger);

                            var record = new MemoryRecord
                            {
                                AddressOrOffset = (IntPtr)value,
                                Description     = description,
                                ValueType       = valueType
                            };

                            if ((entry.Element(XmlIsRelativeElement)?.Attribute(XmlValueAttribute)?.Value.Trim() ?? string.Empty) == "1" && !string.IsNullOrEmpty(moduleName))
                            {
                                record.ModuleName = moduleName;
                            }

                            if (valueType == ScanValueType.ArrayOfBytes || valueType == ScanValueType.String)
                            {
                                var lengthStr = (entry.Element(XmlSizeElement)?.Attribute(XmlValueAttribute)?.Value.Trim() ?? string.Empty);
                                int.TryParse(lengthStr, NumberStyles.Integer, null, out var valueLength);

                                record.ValueLength = Math.Max(1, valueLength);

                                if (valueType == ScanValueType.String)
                                {
                                    switch (valueTypeStr)
                                    {
                                    default:
                                    case "8":
                                        record.Encoding = Encoding.UTF8;
                                        break;

                                    case "9":
                                        record.Encoding = Encoding.Unicode;
                                        break;
                                    }
                                }
                            }

                            yield return(record);
                        }
                    }
                }
            }
        }
Ejemplo n.º 21
0
        public void MemoryRecordTest3()
        {
            MemoryRecord record = new MemoryRecord(5, "0000000000000001", "0", 3);

            Assert.IsTrue(record.isComplex && record.N.Equals("0000001"));
        }