57 lines
1.4 KiB
Dart
57 lines
1.4 KiB
Dart
enum DoorState { closed, opening, open, closing }
|
|
|
|
class Door {
|
|
final int x;
|
|
final int y;
|
|
final int mapId; // To differentiate between regular doors and elevator doors
|
|
|
|
DoorState state = DoorState.closed;
|
|
double offset = 0.0;
|
|
int openTime = 0; // When did the door fully open?
|
|
|
|
// How long a door stays open before auto-closing
|
|
static const int openDurationMs = 3000;
|
|
|
|
Door({
|
|
required this.x,
|
|
required this.y,
|
|
required this.mapId,
|
|
});
|
|
|
|
// Returns true if the door state changed this frame (useful for playing sounds later)
|
|
bool update(int currentTimeMs) {
|
|
bool stateChanged = false;
|
|
|
|
if (state == DoorState.opening) {
|
|
offset += 0.02; // Slide speed
|
|
if (offset >= 1.0) {
|
|
offset = 1.0;
|
|
state = DoorState.open;
|
|
openTime = currentTimeMs;
|
|
stateChanged = true;
|
|
}
|
|
} else if (state == DoorState.open) {
|
|
if (currentTimeMs - openTime > openDurationMs) {
|
|
state = DoorState.closing;
|
|
stateChanged = true;
|
|
}
|
|
} else if (state == DoorState.closing) {
|
|
// Note: We don't check for entities blocking the door yet!
|
|
offset -= 0.02;
|
|
if (offset <= 0.0) {
|
|
offset = 0.0;
|
|
state = DoorState.closed;
|
|
stateChanged = true;
|
|
}
|
|
}
|
|
|
|
return stateChanged;
|
|
}
|
|
|
|
void interact() {
|
|
if (state == DoorState.closed || state == DoorState.closing) {
|
|
state = DoorState.opening;
|
|
}
|
|
}
|
|
}
|