51 lines
1.2 KiB
Dart
51 lines
1.2 KiB
Dart
enum WeaponState { idle, firing }
|
|
|
|
enum WeaponType { knife, pistol, machineGun, chainGun }
|
|
|
|
abstract class Weapon {
|
|
final WeaponType type;
|
|
final int idleSprite;
|
|
final List<int> fireFrames;
|
|
final int damage;
|
|
final int msPerFrame;
|
|
|
|
WeaponState state = WeaponState.idle;
|
|
int frameIndex = 0;
|
|
int lastFrameTime = 0;
|
|
|
|
Weapon({
|
|
required this.type,
|
|
required this.idleSprite,
|
|
required this.fireFrames,
|
|
required this.damage,
|
|
this.msPerFrame = 100,
|
|
});
|
|
|
|
int get currentSprite =>
|
|
state == WeaponState.idle ? idleSprite : fireFrames[frameIndex];
|
|
|
|
/// Core firing logic. Returns true if a bullet was spent.
|
|
bool fire(int currentTime, {required int currentAmmo}) {
|
|
if (state == WeaponState.idle && currentAmmo > 0) {
|
|
state = WeaponState.firing;
|
|
frameIndex = 0;
|
|
lastFrameTime = currentTime;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
void update(int currentTime) {
|
|
if (state == WeaponState.firing) {
|
|
if (currentTime - lastFrameTime > msPerFrame) {
|
|
frameIndex++;
|
|
lastFrameTime = currentTime;
|
|
if (frameIndex >= fireFrames.length) {
|
|
state = WeaponState.idle;
|
|
frameIndex = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|