MonsterController.java

1
package g0803.bindingofshiba.controller.game;
2
3
import g0803.bindingofshiba.App;
4
import g0803.bindingofshiba.Constants;
5
import g0803.bindingofshiba.controller.Controller;
6
import g0803.bindingofshiba.events.IEventManager;
7
import g0803.bindingofshiba.events.Observer;
8
import g0803.bindingofshiba.events.game.*;
9
import g0803.bindingofshiba.math.Vec2D;
10
import g0803.bindingofshiba.model.game.Game;
11
import g0803.bindingofshiba.model.game.elements.Monster;
12
13
public class MonsterController extends Controller<Game> implements Observer {
14
15
    public MonsterController(Game model, IEventManager eventManager) {
16
        super(model, eventManager);
17 1 1. <init> : removed call to g0803/bindingofshiba/events/IEventManager::addObserver → KILLED
        eventManager.addObserver(this);
18
    }
19
20
    private Vec2D getNextMonsterAcceleration(Monster monster) {
21
        Vec2D playerPosition = getModel().getPlayer().getPosition();
22
        Vec2D seekVector = playerPosition.subtract(monster.getPosition());
23
        Vec2D direction = seekVector.normalize();
24
25 2 1. getNextMonsterAcceleration : changed conditional boundary → SURVIVED
2. getNextMonsterAcceleration : negated conditional → KILLED
        if (seekVector.getLengthSquared() < 225) direction = direction.scale(-1);
26
27
        Vec2D force = direction.scale(4);
28
        Vec2D drag = monster.getVelocity().scale(0.25);
29
30 1 1. getNextMonsterAcceleration : replaced return value with null for g0803/bindingofshiba/controller/game/MonsterController::getNextMonsterAcceleration → KILLED
        return force.subtract(drag);
31
    }
32
33
    @Override
34
    public void tick(App app, double dt) {
35
        for (Monster monster : getModel().getCurrentRoom().getMonsters()) {
36 1 1. tick : removed call to g0803/bindingofshiba/model/game/elements/Monster::move → KILLED
            monster.move(dt);
37 1 1. tick : removed call to g0803/bindingofshiba/model/game/elements/Monster::setAcceleration → KILLED
            monster.setAcceleration(getNextMonsterAcceleration(monster));
38
        }
39
    }
40
41
    @Override
42
    public void onMonsterCollisionWithMonster(MonsterCollisionWithMonsterEvent event) {
43
        Monster monster = event.getFirstMonster();
44
        Monster other = event.getSecondMonster();
45
        double dt = event.getTickTime();
46
47
        Vec2D monsterVelocity = monster.getNextVelocity(dt);
48
        Vec2D otherVelocity = other.getNextVelocity(dt);
49
50
        Vec2D tangent = other.getNextPosition(dt).subtract(monster.getNextPosition(dt)).normalize();
51
        Vec2D normal = tangent.rotate(Math.PI / 2);
52
53
        double monsterTangent = monsterVelocity.scalarProduct(tangent);
54
        double monsterNormal = monsterVelocity.scalarProduct(normal);
55
        double otherTangent = otherVelocity.scalarProduct(tangent);
56
        double otherNormal = otherVelocity.scalarProduct(normal);
57
58
        Vec2D monsterResultingNormal = normal.scale(monsterNormal);
59 1 1. onMonsterCollisionWithMonster : Replaced double multiplication with division → SURVIVED
        Vec2D monsterResultingTangent =
60
                tangent.scale(otherTangent * Constants.MONSTER_COLLISION_ELASTICITY);
61
        Vec2D otherResultingNormal = normal.scale(otherNormal);
62 1 1. onMonsterCollisionWithMonster : Replaced double multiplication with division → SURVIVED
        Vec2D otherResultingTangent =
63
                tangent.scale(monsterTangent * Constants.MONSTER_COLLISION_ELASTICITY);
64
65 1 1. onMonsterCollisionWithMonster : removed call to g0803/bindingofshiba/model/game/elements/Monster::setVelocity → KILLED
        monster.setVelocity(monsterResultingNormal.add(monsterResultingTangent));
66 1 1. onMonsterCollisionWithMonster : removed call to g0803/bindingofshiba/model/game/elements/Monster::setVelocity → KILLED
        other.setVelocity(otherResultingNormal.add(otherResultingTangent));
67
    }
68
69
    @Override
70
    public void onPlayerCollisionWithMonster(PlayerCollisionWithMonsterEvent event) {
71
        Monster monster = event.getMonster();
72 1 1. onPlayerCollisionWithMonster : removed call to g0803/bindingofshiba/model/game/elements/Monster::setAcceleration → KILLED
        monster.setAcceleration(Vec2D.zero());
73 1 1. onPlayerCollisionWithMonster : removed call to g0803/bindingofshiba/model/game/elements/Monster::setVelocity → KILLED
        monster.setVelocity(Vec2D.zero());
74
    }
75
76
    @Override
77
    public void onMonsterCollisionWithObstacle(MonsterCollisionWithObstacleEvent event) {
78
        Monster monster = event.getMonster();
79 1 1. onMonsterCollisionWithObstacle : removed call to g0803/bindingofshiba/model/game/elements/Monster::setAcceleration → KILLED
        monster.setAcceleration(Vec2D.zero());
80 1 1. onMonsterCollisionWithObstacle : removed call to g0803/bindingofshiba/model/game/elements/Monster::setVelocity → KILLED
        monster.setVelocity(Vec2D.zero());
81
    }
82
83
    @Override
84
    public void onMonsterCollisionWithWalls(MonsterCollisionWithWallsEvent event) {
85
        Monster monster = event.getMonster();
86 1 1. onMonsterCollisionWithWalls : removed call to g0803/bindingofshiba/model/game/elements/Monster::setAcceleration → KILLED
        monster.setAcceleration(Vec2D.zero());
87 1 1. onMonsterCollisionWithWalls : removed call to g0803/bindingofshiba/model/game/elements/Monster::setVelocity → KILLED
        monster.setVelocity(Vec2D.zero());
88
    }
89
90
    @Override
91
    public void onProjectileCollisionWithMonster(ProjectileCollisionWithMonsterEvent event) {
92
        Monster monster = event.getMonster();
93
94
        double startingHp = monster.getHp();
95 1 1. onProjectileCollisionWithMonster : removed call to g0803/bindingofshiba/model/game/elements/Monster::decreaseHpByAmount → KILLED
        monster.decreaseHpByAmount(event.getProjectile().getDamage());
96
        double endingHp = monster.getHp();
97
98 1 1. onProjectileCollisionWithMonster : negated conditional → KILLED
        if (startingHp != endingHp) {
99
            MonsterDamagedEvent newEvent =
100
                    new MonsterDamagedEvent(
101
                            event.getTickTime(),
102
                            event.getApp(),
103
                            monster,
104 1 1. onProjectileCollisionWithMonster : Replaced double subtraction with addition → KILLED
                            getModel().getCurrentRoom(),
105
                            startingHp - endingHp);
106
107 1 1. onProjectileCollisionWithMonster : removed call to g0803/bindingofshiba/events/IEventManager::dispatchEvent → KILLED
            getEventManager().dispatchEvent(newEvent);
108
        }
109
    }
110
}

Mutations

17

1.1
Location : <init>
Killed by : g0803.bindingofshiba.controller.game.MonsterControllerTest.[engine:junit-jupiter]/[class:g0803.bindingofshiba.controller.game.MonsterControllerTest]/[method:collisionWithWall()]
removed call to g0803/bindingofshiba/events/IEventManager::addObserver → KILLED

25

1.1
Location : getNextMonsterAcceleration
Killed by : none
changed conditional boundary → SURVIVED

2.2
Location : getNextMonsterAcceleration
Killed by : g0803.bindingofshiba.controller.game.MonsterControllerTest.[engine:junit-jupiter]/[class:g0803.bindingofshiba.controller.game.MonsterControllerTest]/[method:movesTowardsPlayerIfFarAway()]
negated conditional → KILLED

30

1.1
Location : getNextMonsterAcceleration
Killed by : g0803.bindingofshiba.controller.game.MonsterControllerTest.[engine:junit-jupiter]/[class:g0803.bindingofshiba.controller.game.MonsterControllerTest]/[method:movesTowardsPlayerIfFarAway()]
replaced return value with null for g0803/bindingofshiba/controller/game/MonsterController::getNextMonsterAcceleration → KILLED

36

1.1
Location : tick
Killed by : g0803.bindingofshiba.controller.game.MonsterControllerTest.[engine:junit-jupiter]/[class:g0803.bindingofshiba.controller.game.MonsterControllerTest]/[method:movesAwayFromPlayerIfNearby()]
removed call to g0803/bindingofshiba/model/game/elements/Monster::move → KILLED

37

1.1
Location : tick
Killed by : g0803.bindingofshiba.controller.game.MonsterControllerTest.[engine:junit-jupiter]/[class:g0803.bindingofshiba.controller.game.MonsterControllerTest]/[method:movesTowardsPlayerIfFarAway()]
removed call to g0803/bindingofshiba/model/game/elements/Monster::setAcceleration → KILLED

59

1.1
Location : onMonsterCollisionWithMonster
Killed by : none
Replaced double multiplication with division → SURVIVED

62

1.1
Location : onMonsterCollisionWithMonster
Killed by : none
Replaced double multiplication with division → SURVIVED

65

1.1
Location : onMonsterCollisionWithMonster
Killed by : g0803.bindingofshiba.controller.game.MonsterControllerTest.[engine:junit-jupiter]/[class:g0803.bindingofshiba.controller.game.MonsterControllerTest]/[method:collisionWithMonster()]
removed call to g0803/bindingofshiba/model/game/elements/Monster::setVelocity → KILLED

66

1.1
Location : onMonsterCollisionWithMonster
Killed by : g0803.bindingofshiba.controller.game.MonsterControllerTest.[engine:junit-jupiter]/[class:g0803.bindingofshiba.controller.game.MonsterControllerTest]/[method:collisionWithMonster()]
removed call to g0803/bindingofshiba/model/game/elements/Monster::setVelocity → KILLED

72

1.1
Location : onPlayerCollisionWithMonster
Killed by : g0803.bindingofshiba.controller.game.MonsterControllerTest.[engine:junit-jupiter]/[class:g0803.bindingofshiba.controller.game.MonsterControllerTest]/[method:collisionWithPlayer()]
removed call to g0803/bindingofshiba/model/game/elements/Monster::setAcceleration → KILLED

73

1.1
Location : onPlayerCollisionWithMonster
Killed by : g0803.bindingofshiba.controller.game.MonsterControllerTest.[engine:junit-jupiter]/[class:g0803.bindingofshiba.controller.game.MonsterControllerTest]/[method:collisionWithPlayer()]
removed call to g0803/bindingofshiba/model/game/elements/Monster::setVelocity → KILLED

79

1.1
Location : onMonsterCollisionWithObstacle
Killed by : g0803.bindingofshiba.controller.game.MonsterControllerTest.[engine:junit-jupiter]/[class:g0803.bindingofshiba.controller.game.MonsterControllerTest]/[method:collisionWithObstacle()]
removed call to g0803/bindingofshiba/model/game/elements/Monster::setAcceleration → KILLED

80

1.1
Location : onMonsterCollisionWithObstacle
Killed by : g0803.bindingofshiba.controller.game.MonsterControllerTest.[engine:junit-jupiter]/[class:g0803.bindingofshiba.controller.game.MonsterControllerTest]/[method:collisionWithObstacle()]
removed call to g0803/bindingofshiba/model/game/elements/Monster::setVelocity → KILLED

86

1.1
Location : onMonsterCollisionWithWalls
Killed by : g0803.bindingofshiba.controller.game.MonsterControllerTest.[engine:junit-jupiter]/[class:g0803.bindingofshiba.controller.game.MonsterControllerTest]/[method:collisionWithWall()]
removed call to g0803/bindingofshiba/model/game/elements/Monster::setAcceleration → KILLED

87

1.1
Location : onMonsterCollisionWithWalls
Killed by : g0803.bindingofshiba.controller.game.MonsterControllerTest.[engine:junit-jupiter]/[class:g0803.bindingofshiba.controller.game.MonsterControllerTest]/[method:collisionWithWall()]
removed call to g0803/bindingofshiba/model/game/elements/Monster::setVelocity → KILLED

95

1.1
Location : onProjectileCollisionWithMonster
Killed by : g0803.bindingofshiba.controller.game.MonsterControllerTest.[engine:junit-jupiter]/[class:g0803.bindingofshiba.controller.game.MonsterControllerTest]/[method:onProjectileCollisionWithMonster()]
removed call to g0803/bindingofshiba/model/game/elements/Monster::decreaseHpByAmount → KILLED

98

1.1
Location : onProjectileCollisionWithMonster
Killed by : g0803.bindingofshiba.controller.game.MonsterControllerTest.[engine:junit-jupiter]/[class:g0803.bindingofshiba.controller.game.MonsterControllerTest]/[method:onProjectileCollisionWithMonster()]
negated conditional → KILLED

104

1.1
Location : onProjectileCollisionWithMonster
Killed by : g0803.bindingofshiba.controller.game.MonsterControllerTest.[engine:junit-jupiter]/[class:g0803.bindingofshiba.controller.game.MonsterControllerTest]/[method:onProjectileCollisionWithMonster()]
Replaced double subtraction with addition → KILLED

107

1.1
Location : onProjectileCollisionWithMonster
Killed by : g0803.bindingofshiba.controller.game.MonsterControllerTest.[engine:junit-jupiter]/[class:g0803.bindingofshiba.controller.game.MonsterControllerTest]/[method:onProjectileCollisionWithMonster()]
removed call to g0803/bindingofshiba/events/IEventManager::dispatchEvent → KILLED

Active mutators

Tests examined


Report generated by PIT 1.7.0