Ejemplo n.º 1
0
        public void RefreshEnemy()
        {
            if (!Memory.Room.IsLoaded)
            {
                for (int i = 0; i < Memory.Enemy.Length; i++)
                {
                    Memory.Enemy[i].Clear();
                }
                return;
            }

            IntPtr pointer = new IntPtr(Pointers.Enemy.ToInt64());

            int entryOffset = Memory.Version.Console == ConsoleEnumeration.PS3 ? 0x0578 :
                              Memory.Version.Console == ConsoleEnumeration.PS2 ? 0x0580 : 0x0570;
            int slotOffset   = Memory.Version.Console == ConsoleEnumeration.GC ? 0x038C : 0x039C;
            int damageOffset = Memory.Version.Console == ConsoleEnumeration.GC ? 0x0564 : 0x0574;
            int healthOffset = Memory.Version.Console == ConsoleEnumeration.GC ? 0x040C : 0x041C;
            int modelOffset  = Memory.Version.Console == ConsoleEnumeration.PS3 ? 0x0088 : 0x008B;

            int index = 0;
            int count = _process.ReadValue <int>(Pointers.EnemyCount, Emulator.IsBigEndian);

            for (int i = 0; i < count; ++i)
            {
                EnemyEnumeration type = GetEnemyType(_process.ReadValue <short>(IntPtr.Add(pointer, 0x0004), Emulator.IsBigEndian));

                if (type != EnemyEnumeration.Unknown)
                {
                    EnemyEntry entry = Memory.Enemy[index];

                    entry.Type = type;
                    entry.Room = Memory.Room;

                    entry.Slot      = _process.ReadValue <int>(IntPtr.Add(pointer, slotOffset), Emulator.IsBigEndian);
                    entry.Damage    = _process.ReadValue <int>(IntPtr.Add(pointer, damageOffset), Emulator.IsBigEndian);
                    entry.CurrentHP = _process.ReadValue <int>(IntPtr.Add(pointer, healthOffset), Emulator.IsBigEndian);

                    // Not sure what to call these values. They are useful to help determine enemy life status.
                    entry.Action = _process.ReadValue <byte>(IntPtr.Add(pointer, 0x000C));
                    entry.Status = _process.ReadValue <byte>(IntPtr.Add(pointer, 0x000F));
                    entry.Model  = _process.ReadValue <byte>(IntPtr.Add(pointer, modelOffset));

                    switch (entry.Type)
                    {
                    case EnemyEnumeration.Tenticle:
                        entry.MaximumHP = 160;
                        entry.IsAlive   = entry.Active && entry.CurrentHP >= 0 && entry.Model == 0 && entry.Room.Id != 0x091E;
                        break;

                    case EnemyEnumeration.GlupWorm:
                        entry.MaximumHP = 300;
                        entry.IsAlive   = entry.Active && entry.Status > 0;
                        break;

                    case EnemyEnumeration.AnatomistZombie:
                        entry.MaximumHP = 200;
                        entry.IsAlive   = entry.Active && entry.Status > 0;
                        break;

                    case EnemyEnumeration.Tyrant:
                        entry.MaximumHP = entry.Room.Id == 0x0501 ? 700 : 500;
                        entry.IsAlive   = entry.Active && entry.CurrentHP >= 0;
                        break;

                    case EnemyEnumeration.Nosferatu:
                        entry.MaximumHP = 600;
                        entry.IsAlive   = entry.Active && entry.Model == 0;
                        break;

                    case EnemyEnumeration.AlbinoidAdult:
                    case EnemyEnumeration.MutatedSteve:
                        entry.MaximumHP = 250;
                        entry.IsAlive   = entry.Active && entry.Model == 0;
                        break;

                    case EnemyEnumeration.GiantBlackWidow:
                        entry.MaximumHP = 250;
                        entry.IsAlive   = entry.Active && entry.Status > 0;
                        break;

                    case EnemyEnumeration.AlexiaAshford:
                        entry.MaximumHP = 300;
                        entry.IsAlive   = entry.Active && entry.Room.Id != 0x091E;
                        break;

                    case EnemyEnumeration.AlexiaAshfordB:
                        entry.MaximumHP = 700;
                        entry.IsAlive   = entry.Active;
                        break;

                    case EnemyEnumeration.AlexiaAshfordC:
                        entry.MaximumHP = 400;
                        entry.IsAlive   = !Memory.Enemy[0].IsAlive;
                        break;

                    case EnemyEnumeration.AlexiaBaby:
                        entry.IsAlive = Memory.Enemy[0].IsAlive;
                        break;

                    case EnemyEnumeration.Hunter:
                        entry.IsAlive = entry.Active && entry.Model == 0;
                        break;

                    default:
                        entry.IsAlive = entry.Active && entry.Status > 0;
                        break;
                    }

                    entry.IsEmpty = false;

                    entry.SendUpdateEntryEvent();

                    if (++index >= Memory.Enemy.Length)
                    {
                        break;
                    }
                }

                pointer = IntPtr.Add(pointer, entryOffset);
            }

            for (int i = index; i < Memory.Enemy.Length; i++)
            {
                Memory.Enemy[i].Clear();
            }
        }