Precise, Fast and Reverse key modifiers
This commit is contained in:
1 parent
db371ef07a
commit
946059650f
3 files changed
+54
-17
No files matched your search
+7
-1
@@ -66,15 +66,21 @@ export const DEATH_SPECS = [
|
|||||||
];
|
];
|
||||||
|
|
||||||
export const MAX_WIND = 25;
|
export const MAX_WIND = 25;
|
||||||
|
export const DEFAULT_KEYPRESS_DELAY = 150;
|
||||||
|
|
||||||
export const PLAYER_MAX_ENERGY = 100;
|
export const PLAYER_MAX_ENERGY = 100;
|
||||||
export const PLAYER_ENERGY_POWER_MULTIPLIER = 10;
|
export const PLAYER_ENERGY_POWER_MULTIPLIER = 10;
|
||||||
export const PLAYER_INITIAL_POWER = 300;
|
export const PLAYER_INITIAL_POWER = 300;
|
||||||
export const PLAYER_FALL_DAMAGE_HEIGHT = 50;
|
export const PLAYER_FALL_DAMAGE_HEIGHT = 50;
|
||||||
export const PLAYER_FALL_DAMAGE_FACTOR = 3;
|
export const PLAYER_FALL_DAMAGE_FACTOR = 3;
|
||||||
export const PLAYER_WEAPON_CHANGE_DELAY = 150;
|
|
||||||
export const PLAYER_EXPLOSION_PARTICLE_POWER = 500;
|
export const PLAYER_EXPLOSION_PARTICLE_POWER = 500;
|
||||||
export const PLAYER_TANK_BOUNDING_RADIUS = 3;
|
export const PLAYER_TANK_BOUNDING_RADIUS = 3;
|
||||||
|
export const PLAYER_ANGLE_INCREMENT = 1;
|
||||||
|
export const PLAYER_ANGLE_FAST_INCREMENT = 3;
|
||||||
|
export const PLAYER_POWER_INCREMENT = 1;
|
||||||
|
export const PLAYER_POWER_FAST_INCREMENT = 10;
|
||||||
|
export const PLAYER_ANGLE_TICK_SOUND_INTERVAL = 2;
|
||||||
|
export const PLAYER_POWER_TICK_SOUND_INTERVAL = 2;
|
||||||
|
|
||||||
export const PROJECTILE_POWER_REDUCTION_FACTOR = 10;
|
export const PROJECTILE_POWER_REDUCTION_FACTOR = 10;
|
||||||
export const PROJECTILE_WIND_REDUCTION_FACTOR = 10;
|
export const PROJECTILE_WIND_REDUCTION_FACTOR = 10;
|
||||||
|
|||||||
@@ -1,5 +1,19 @@
|
|||||||
|
import {DEFAULT_KEYPRESS_DELAY} from './constants.js';
|
||||||
|
|
||||||
const input = {};
|
const input = {};
|
||||||
|
let lastKeypressTime = 0;
|
||||||
|
|
||||||
document.addEventListener('keydown', (e) => {input[e.key] = true; e.preventDefault()});
|
document.addEventListener('keydown', (e) => {input[e.key] = true; e.preventDefault()});
|
||||||
document.addEventListener('keyup', (e) => {input[e.key] = false; e.preventDefault()});
|
document.addEventListener('keyup', (e) => {input[e.key] = false; e.preventDefault()});
|
||||||
export function key(key) {return input[key]}
|
|
||||||
|
export function key(key) {
|
||||||
|
return input[key]
|
||||||
|
}
|
||||||
|
|
||||||
|
export function afterKeyDelay(amount=DEFAULT_KEYPRESS_DELAY) {
|
||||||
|
const now = Date.now();
|
||||||
|
if (now - lastKeypressTime >= amount) {
|
||||||
|
lastKeypressTime = now;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
import {H, PROJECTILE_MAX_SOUND_FREQUENCY, MAX_WIND, PROJECTILE_MIN_SOUND_FREQUENCY, PLAYER_COLORS, PLAYER_INITIAL_POWER, PROJECTILE_POWER_REDUCTION_FACTOR, W, Z, PROJECTILE_ITERATIONS_PER_FRAME, PROJECTILE_ITERATION_PROGRESS, PLAYER_MAX_ENERGY, PLAYER_ENERGY_POWER_MULTIPLIER, PLAYER_FALL_DAMAGE_FACTOR, PLAYER_FALL_DAMAGE_HEIGHT, PLAYER_WEAPON_CHANGE_DELAY, PARTICLE_AMOUNT, PROJECTILE_WIND_REDUCTION_FACTOR, PARTICLE_POWER_REDUCTION_FACTOR, PARTICLE_WIND_REDUCTION_FACTOR, PARTICLE_MIN_POWER_FACTOR, PARTICLE_MAX_POWER_FACTOR, PARTICLE_MIN_LIFETIME, PARTICLE_TIME_FACTOR, PLAYER_EXPLOSION_PARTICLE_POWER, EXPLOSION_SHAKE_REDUCTION_FACTOR, MAX_EXPLOSION_SHAKE_FACTOR, TRAJECTORY_FADE_SPEED, PARTICLE_FADE_AMOUNT, TRAJECTORY_FLOAT_SPEED, PLAYER_TANK_BOUNDING_RADIUS, PLAYER_STARTING_WEAPONS, WEAPON_TYPES, DEATH_SPECS} from './constants.js';
|
import {H, PROJECTILE_MAX_SOUND_FREQUENCY, MAX_WIND, PROJECTILE_MIN_SOUND_FREQUENCY, PLAYER_COLORS, PLAYER_INITIAL_POWER, PROJECTILE_POWER_REDUCTION_FACTOR, W, Z, PROJECTILE_ITERATIONS_PER_FRAME, PROJECTILE_ITERATION_PROGRESS, PLAYER_MAX_ENERGY, PLAYER_ENERGY_POWER_MULTIPLIER, PLAYER_FALL_DAMAGE_FACTOR, PLAYER_FALL_DAMAGE_HEIGHT, PARTICLE_AMOUNT, PROJECTILE_WIND_REDUCTION_FACTOR, PARTICLE_POWER_REDUCTION_FACTOR, PARTICLE_WIND_REDUCTION_FACTOR, PARTICLE_MIN_POWER_FACTOR, PARTICLE_MAX_POWER_FACTOR, PARTICLE_MIN_LIFETIME, PARTICLE_TIME_FACTOR, PLAYER_EXPLOSION_PARTICLE_POWER, EXPLOSION_SHAKE_REDUCTION_FACTOR, MAX_EXPLOSION_SHAKE_FACTOR, TRAJECTORY_FADE_SPEED, PARTICLE_FADE_AMOUNT, TRAJECTORY_FLOAT_SPEED, PLAYER_TANK_BOUNDING_RADIUS, PLAYER_STARTING_WEAPONS, WEAPON_TYPES, DEATH_SPECS, PLAYER_ANGLE_INCREMENT, PLAYER_POWER_FAST_INCREMENT, PLAYER_POWER_INCREMENT, PLAYER_ANGLE_TICK_SOUND_INTERVAL, PLAYER_POWER_TICK_SOUND_INTERVAL, PLAYER_ANGLE_FAST_INCREMENT} from './constants.js';
|
||||||
import {createCanvas, drawLine, drawRect, drawText, loop, plot, drawLineVirtual} from './gfx.js';
|
import {createCanvas, drawLine, drawRect, drawText, loop, plot, drawLineVirtual} from './gfx.js';
|
||||||
import {key} from './input.js';
|
import {key, afterKeyDelay} from './input.js';
|
||||||
import {clamp, deg2rad, parable, randomInt, vec, wrap, random, within} from './math.js';
|
import {clamp, deg2rad, parable, randomInt, vec, wrap, random, within} from './math.js';
|
||||||
import {createSky} from './sky.js';
|
import {createSky} from './sky.js';
|
||||||
import {audio, createOsc, playTickSound} from './sound.js';
|
import {audio, createOsc, playTickSound} from './sound.js';
|
||||||
@@ -10,17 +10,16 @@ import {sample} from './utils.js';
|
|||||||
import {AI_TYPES} from './ai.js';
|
import {AI_TYPES} from './ai.js';
|
||||||
|
|
||||||
|
|
||||||
let idle = false;
|
|
||||||
let state = 'start-game';
|
let state = 'start-game';
|
||||||
const players = [];
|
const players = [];
|
||||||
let currentPlayer = 0;
|
let currentPlayer = 0;
|
||||||
let projectile = null;
|
let projectile = null;
|
||||||
let explosion = null;
|
let explosion = null;
|
||||||
let wind = 0;
|
let wind = 0;
|
||||||
let lastWeaponChangeTime = 0;
|
|
||||||
let particles = [];
|
let particles = [];
|
||||||
let screenShake = 0;
|
let screenShake = 0;
|
||||||
let trajectories = [];
|
let trajectories = [];
|
||||||
|
let idle = false;
|
||||||
|
|
||||||
// Init layers
|
// Init layers
|
||||||
const sky = createSky(W, H);
|
const sky = createSky(W, H);
|
||||||
@@ -73,6 +72,9 @@ function update() {
|
|||||||
const player = players[currentPlayer];
|
const player = players[currentPlayer];
|
||||||
const {x, y, a, p, energy} = player;
|
const {x, y, a, p, energy} = player;
|
||||||
const maxPower = energy * PLAYER_ENERGY_POWER_MULTIPLIER;
|
const maxPower = energy * PLAYER_ENERGY_POWER_MULTIPLIER;
|
||||||
|
const isPrecise = key('Alt');
|
||||||
|
const isFast = key('Shift');
|
||||||
|
const isReverse = key('Shift');
|
||||||
let shoot;
|
let shoot;
|
||||||
|
|
||||||
if (player.ai) {
|
if (player.ai) {
|
||||||
@@ -84,24 +86,39 @@ function update() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
else if (key('ArrowLeft')) {
|
else if (key('ArrowLeft')) {
|
||||||
player.a = wrap(0, a -1, 180);
|
if (isPrecise && !afterKeyDelay()) return;
|
||||||
if (a % 2 === 0) playTickSound();
|
let incr = isFast ? PLAYER_ANGLE_FAST_INCREMENT : PLAYER_ANGLE_INCREMENT;
|
||||||
|
player.a = wrap(0, a -incr, 180);
|
||||||
|
if (isPrecise || isFast || a % PLAYER_ANGLE_TICK_SOUND_INTERVAL === 0) playTickSound();
|
||||||
|
|
||||||
} else if (key('ArrowRight')) {
|
} else if (key('ArrowRight')) {
|
||||||
player.a = wrap(0, a +1, 180);
|
if (isPrecise && !afterKeyDelay()) return;
|
||||||
if (a % 2 === 0) playTickSound();
|
let incr = isFast ? PLAYER_ANGLE_FAST_INCREMENT : PLAYER_ANGLE_INCREMENT;
|
||||||
|
player.a = wrap(0, a +incr, 180);
|
||||||
|
if (isPrecise || isFast || a % PLAYER_ANGLE_TICK_SOUND_INTERVAL === 0) playTickSound();
|
||||||
|
|
||||||
} else if (key('ArrowUp')) {
|
} else if (key('ArrowUp')) {
|
||||||
player.p = clamp(0, p +2, maxPower);
|
if (isPrecise && !afterKeyDelay()) return;
|
||||||
if (p < maxPower && p % 4 === 0) playTickSound();
|
let incr = isFast ? PLAYER_POWER_FAST_INCREMENT : PLAYER_POWER_INCREMENT;
|
||||||
|
player.p = clamp(0, p +incr, maxPower);
|
||||||
|
if (p < maxPower && (isPrecise || isFast || p % PLAYER_POWER_TICK_SOUND_INTERVAL === 0)) playTickSound();
|
||||||
|
|
||||||
} else if (key('ArrowDown')) {
|
} else if (key('ArrowDown')) {
|
||||||
player.p = clamp(0, p -2, maxPower);
|
if (isPrecise && !afterKeyDelay()) return;
|
||||||
if (p > 0 && p % 4 === 0) playTickSound();
|
let incr = isFast ? PLAYER_POWER_FAST_INCREMENT : PLAYER_POWER_INCREMENT;
|
||||||
|
player.p = clamp(0, p -incr, maxPower);
|
||||||
|
if (p > 0 && (isPrecise || isFast || p % PLAYER_POWER_TICK_SOUND_INTERVAL === 0)) playTickSound();
|
||||||
|
|
||||||
} else if (key('Tab')) {
|
} else if (key('Tab')) {
|
||||||
if (Date.now() - lastWeaponChangeTime < PLAYER_WEAPON_CHANGE_DELAY) return;
|
if (!afterKeyDelay()) return;
|
||||||
player.currentWeapon = wrap(0, player.currentWeapon+1, player.weapons.length);
|
const dir = isReverse ? -1 : 1;
|
||||||
lastWeaponChangeTime = Date.now();
|
player.currentWeapon = wrap(0, player.currentWeapon+dir, player.weapons.length);
|
||||||
playTickSound();
|
playTickSound();
|
||||||
|
|
||||||
} else if (key(' ')) {
|
} else if (key(' ')) {
|
||||||
|
if (!afterKeyDelay()) return;
|
||||||
shoot = {a, p};
|
shoot = {a, p};
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
idle = true;
|
idle = true;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user