-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathloop.js
178 lines (128 loc) · 5.09 KB
/
loop.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
var looper = function(){
var looper = {
};
looper.loopInterval = 10;
looper.loopIntervalObject;
looper.currentTimeStamp = 7 * 60 * 60 * 1000;
looper.loopTimeStampDelta = 100;
looper.state;
looper.logic;
looper.waitingTimeSum = 0
looper.waitingPeopleCount = 0;
looper.initialize = function(initialState, logic) {
looper.state = initialState;
looper.logic = logic;
}
looper.setSpeedFactor = function(factor) {
looper.loopTimeStampDelta = looper.loopInterval * factor;
}
looper.startLooping = function() {
console.log("Starting looping");
looper.loopIntervalObject = window.setInterval(looper.loop, looper.loopInterval);
}
looper.stopLooping = function() {
console.log("Stopping looping");
window.clearInterval(looper.loopIntervalObject);
}
looper.loop = function() {
looper.state.timestamp = looper.currentTimeStamp;
looper.currentTimeStamp += looper.loopTimeStampDelta;
// reset timestamp
var day = 24 * 60 * 60 * 1000;
if (looper.currentTimeStam > day) {
looper.currentTimeStamp = 0 + (looper.currentTimeStam - day);
}
looper.processPeople();
looper.processElevators();
renderer.setLatestState(looper.state);
}
looper.getAverageWaitingTime = function() {
return looper.waitingTimeSum / looper.waitingPeopleCount;
}
looper.processPeople = function() {
for (var personIndex = 0; personIndex < looper.state.people.length; personIndex++) {
var person = looper.state.people[personIndex];
if (person.isWaitingForElevator) {
person.waitingTime += looper.loopTimeStampDelta
looper.waitingTimeSum += looper.loopTimeStampDelta
}
if (person.isInElevator) {
continue;
}
// check if person needs to get to work
if (person.shouldBeAtWork() && !person.isAtWorkLevel() && !person.isWaitingForElevator) {
console.log("Person " + person.id + " wants to get to work" + " - from " + person.currentLevel + " to " + person.workLevel);
if (person.currentLevel > person.workLevel) {
person.requestElevatorDown();
} else if (person.currentLevel < person.workLevel) {
person.requestElevatorUp();
}
continue;
}
// check if person needs to have a break
if (person.shouldHaveABreak() && !person.isAtBreakLevel() && !person.isWaitingForElevator) {
console.log("Person " + person.id + " wants have a break" + " - from " + person.currentLevel + " to " + person.breakLevel);
if (person.currentLevel > person.breakLevel) {
person.requestElevatorDown();
} else if (person.currentLevel < person.breakLevel) {
person.requestElevatorUp();
}
continue;
}
}
}
looper.processElevators = function() {
for (var elevatorIndex = 0; elevatorIndex < looper.state.elevators.length; elevatorIndex++) {
var elevator = looper.state.elevators[elevatorIndex];
if (elevator.isAtLevel()) {
if (elevator.shouldStop()) {
elevator.stop();
elevator.removeTargetLevel(elevator.getLevel().id);
var level = elevator.getLevel();
level.resetUp();
level.resetDown(); // TODO: remove only one!
//console.log("Elevator " + elevator.id + " stopped at level " + level.id);
// let people from level enter the elevator
for (var personIndex = 0; personIndex < level.people.length; personIndex++) {
if (!elevator.canAddPerson()) {
break;
}
var personId = level.people[personIndex];
var person = looper.state.people[personId];
if (!person.isWaitingForElevator) {
continue;
}
person.isInElevator = true;
person.isWaitingForElevator = false;
// add person and person's target level to elevator
elevator.addPerson(person);
elevator.addTargetLevel(person.getTargetLevel());
looper.waitingPeopleCount += 1;
// remove person from level
level.removePerson(person);
//console.log("Person " + person.id + " entered elevator " + elevator.id + " on level " + level.id + ", target: " + person.getTargetLevel());
}
// let people exit the elevator
for (var personIndex = 0; personIndex < elevator.people.length; personIndex++) {
var personId = elevator.people[personIndex];
var person = looper.state.people[personId];
if (level.id != person.getTargetLevel()) {
continue;
}
// update the current level
person.currentLevel = level.id;
person.isInElevator = false;
// remove person from elevator
elevator.removePerson(person);
personIndex--;
// add person to level
level.addPerson(person);
//console.log("Person " + person.id + " exited elevator " + elevator.id + " on level " + level.id);
}
}
}
elevator.move();
}
}
return looper;
}();