VedVid / RAWIG

RAWIG (Roguelike Architecture, Written In Go) is ready to modify and expand roguelike architecture.
BSD 2-Clause "Simplified" License
16 stars 3 forks source link

Remove code duplication in HandleAI #98

Open VedVid opened 5 years ago

VedVid commented 5 years ago

For example, now it is:

        case RangedDumbAI:
            if c.Equipment[SlotWeaponPrimary] != nil {
                // Use primary ranged weapon.
                if c.DistanceTo(cs[0].X, cs[0].Y) >= FOVLength-1 {
                    // TODO:
                    // For now, every ranged skill has range equal to FOVLength-1
                    // but it should change in future.
                    c.MoveTowards(b, cs[0].X, cs[0].Y, ai)
                } else {
                    // DumbAI will not check if target is valid
                    vec, err := NewVector(c.X, c.Y, cs[0].X, cs[0].Y)
                    if err != nil {
                        fmt.Println(err)
                    }
                    _ = ComputeVector(vec)
                    _, _, target, _ := ValidateVector(vec, b, cs, o)
                    if target != nil {
                        c.AttackTarget(target)
                    }
                }
    } else if c.Equipment[SlotWeaponSecondary] != nil {
        // Use secondary ranged weapon.
                if c.DistanceTo(cs[0].X, cs[0].Y) >= FOVLength-1 {
                    // TODO:
                    // For now, every ranged skill has range equal to FOVLength-1
                    // but it should change in future.
                    c.MoveTowards(b, cs[0].X, cs[0].Y, ai)
                } else {
                    // DumbAI will not check if target is valid
                    vec, err := NewVector(c.X, c.Y, cs[0].X, cs[0].Y)
                    if err != nil {
                        fmt.Println(err)
                    }
                    _ = ComputeVector(vec)
                    _, _, target, _ := ValidateVector(vec, b, cs, o)
                    if target != nil {
                        c.AttackTarget(target)
                    }
                }
            } else {
                // Use melee attack.
                if c.AITriggered == true {
                    if c.DistanceTo(cs[0].X, cs[0].Y) > 1 {
                        c.MoveTowards(b, cs[0].X, cs[0].Y, ai)
                    } else {
                        c.AttackTarget(cs[0])
                    }
                } else {
                    dx := RandRange(-1, 1)
                    dy := RandRange(-1, 1)
                    c.Move(dx, dy, b)
                }
            }

it could looks like that:

    if primaryWeapon != nil {  
        UsePrimaryWeapon(Creature)  
    } else if secondaryWeapon != nil {  
        UseSecondaryWeapon(Creature)  
    } else {  
        UseMeleeWeapon(Creature)
    }