// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/* @const
* Add matching sprite definition and config to spriteDefinitionByType.
*/
export const GAME_TYPE = ['altgame'];
//******************************************************************************
/**
* Collision box object.
* @param {number} x X position.
* @param {number} y Y Position.
* @param {number} w Width.
* @param {number} h Height.
* @constructor
*/
export function CollisionBox(x, y, w, h) {
this.x = x;
this.y = y;
this.width = w;
this.height = h;
}
/**
* Obstacle definitions.
* minGap: minimum pixel space between obstacles.
* multipleSpeed: Speed at which multiples are allowed.
* speedOffset: speed faster / slower than the horizon.
* minSpeed: Minimum speed which the obstacle can make an appearance.
*
* @typedef {{
* type: string,
* width: number,
* height: number,
* yPos: number,
* multipleSpeed: number,
* minGap: number,
* minSpeed: number,
* collisionBoxes: Array<CollisionBox>,
* }}
*/
let ObstacleType;
/**
* T-Rex runner sprite definitions.
*/
export const spriteDefinitionByType = {
original: {
LDPI: {
BACKGROUND_EL: {x: 86, y: 2},
CACTUS_LARGE: {x: 332, y: 2},
CACTUS_SMALL: {x: 228, y: 2},
OBSTACLE_2: {x: 332, y: 2},
OBSTACLE: {x: 228, y: 2},
CLOUD: {x: 86, y: 2},
HORIZON: {x: 2, y: 54},
MOON: {x: 484, y: 2},
PTERODACTYL: {x: 134, y: 2},
RESTART: {x: 2, y: 68},
TEXT_SPRITE: {x: 655, y: 2},
TREX: {x: 848, y: 2},
STAR: {x: 645, y: 2},
COLLECTABLE: {x: 0, y: 0},
ALT_GAME_END: {x: 32, y: 0},
},
HDPI: {
BACKGROUND_EL: {x: 166, y: 2},
CACTUS_LARGE: {x: 652, y: 2},
CACTUS_SMALL: {x: 446, y: 2},
OBSTACLE_2: {x: 652, y: 2},
OBSTACLE: {x: 446, y: 2},
CLOUD: {x: 166, y: 2},
HORIZON: {x: 2, y: 104},
MOON: {x: 954, y: 2},
PTERODACTYL: {x: 260, y: 2},
RESTART: {x: 2, y: 130},
TEXT_SPRITE: {x: 1294, y: 2},
TREX: {x: 1678, y: 2},
STAR: {x: 1276, y: 2},
COLLECTABLE: {x: 0, y: 0},
ALT_GAME_END: {x: 64, y: 0},
},
MAX_GAP_COEFFICIENT: 1.5,
MAX_OBSTACLE_LENGTH: 3,
HAS_CLOUDS: 1,
BOTTOM_PAD: 10,
TREX: {
WAITING_1: {x: 44, w: 44, h: 47, xOffset: 0},
WAITING_2: {x: 0, w: 44, h: 47, xOffset: 0},
RUNNING_1: {x: 88, w: 44, h: 47, xOffset: 0},
RUNNING_2: {x: 132, w: 44, h: 47, xOffset: 0},
JUMPING: {x: 0, w: 44, h: 47, xOffset: 0},
CRASHED: {x: 220, w: 44, h: 47, xOffset: 0},
COLLISION_BOXES: [
new CollisionBox(22, 0, 17, 16),
new CollisionBox(1, 18, 30, 9),
new CollisionBox(10, 35, 14, 8),
new CollisionBox(1, 24, 29, 5),
new CollisionBox(5, 30, 21, 4),
new CollisionBox(9, 34, 15, 4),
],
},
/** @type {Array<ObstacleType>} */
OBSTACLES: [
{
type: 'CACTUS_SMALL',
width: 17,
height: 35,
yPos: 105,
multipleSpeed: 4,
minGap: 120,
minSpeed: 0,
collisionBoxes: [
new CollisionBox(0, 7, 5, 27),
new CollisionBox(4, 0, 6, 34),
new CollisionBox(10, 4, 7, 14),
],
},
{
type: 'CACTUS_LARGE',
width: 25,
height: 50,
yPos: 90,
multipleSpeed: 7,
minGap: 120,
minSpeed: 0,
collisionBoxes: [
new CollisionBox(0, 12, 7, 38),
new CollisionBox(8, 0, 7, 49),
new CollisionBox(13, 10, 10, 38),
],
},
{
type: 'PTERODACTYL',
width: 46,
height: 40,
yPos: [100, 75, 50], // Variable height.
yPosMobile: [100, 50], // Variable height mobile.
multipleSpeed: 999,
minSpeed: 8.5,
minGap: 150,
collisionBoxes: [
new CollisionBox(15, 15, 16, 5),
new CollisionBox(18, 21, 24, 6),
new CollisionBox(2, 14, 4, 3),
new CollisionBox(6, 10, 4, 7),
new CollisionBox(10, 8, 6, 9),
],
numFrames: 2,
frameRate: 1000 / 6,
speedOffset: .8,
},
{
type: 'COLLECTABLE',
width: 31,
height: 24,
yPos: 104,
multipleSpeed: 1000,
minGap: 9999,
minSpeed: 0,
collisionBoxes: [
new CollisionBox(0, 0, 32, 25),
],
},
],
BACKGROUND_EL: {
'CLOUD': {
HEIGHT: 14,
MAX_CLOUD_GAP: 400,
MAX_SKY_LEVEL: 30,
MIN_CLOUD_GAP: 100,
MIN_SKY_LEVEL: 71,
OFFSET: 4,
WIDTH: 46,
X_POS: 1,
Y_POS: 120,
},
},
BACKGROUND_EL_CONFIG: {
MAX_BG_ELS: 1,
MAX_GAP: 400,
MIN_GAP: 100,
POS: 0,
SPEED: 0.5,
Y_POS: 125,
},
LINES: [
{SOURCE_X: 2, SOURCE_Y: 52, WIDTH: 600, HEIGHT: 12, YPOS: 127},
],
ALT_GAME_OVER_TEXT_CONFIG: {
TEXT_X: 32,
TEXT_Y: 0,
TEXT_WIDTH: 246,
TEXT_HEIGHT: 17,
FLASH_DURATION: 1500,
FLASHING: false,
},
},
altgame: {
LDPI: {
BACKGROUND_EL: {x: 260, y: 19},
OBSTACLE1: {x: 152, y: 65},
OBSTACLE2: {x: 188, y: 65},
OBSTACLE3: {x: 152, y: 65},
OBSTACLE4: {x: 188, y: 65},
OBSTACLE5: {x: 0, y: 60},
OBSTACLE6: {x: 42, y: 58},
OBSTACLE7: {x: 98, y: 58},
OBSTACLE8: {x: 96, y: 19},
HORIZON: {x: 0, y: 3},
TREX: {x: 557, y: 63},
COLLECTABLE: {x: 193, y: 19},
},
HDPI: {
BACKGROUND_EL: {x: 520, y: 38},
OBSTACLE1: {x: 304, y: 130},
OBSTACLE2: {x: 376, y: 130},
OBSTACLE3: {x: 304, y: 130},
OBSTACLE4: {x: 376, y: 130},
OBSTACLE5: {x: 0, y: 120},
OBSTACLE6: {x: 84, y: 116},
OBSTACLE7: {x: 196, y: 116},
OBSTACLE8: {x: 192, y: 38},
HORIZON: {x: 0, y: 6},
TREX: {x: 1114, y: 126},
COLLECTABLE: {x: 386, y: 38},
},
MAX_GAP_COEFFICIENT: 1.5,
MAX_OBSTACLE_LENGTH: 2,
HAS_CLOUDS: 0,
BOTTOM_PAD: 10,
TREX: {
MAX_JUMP_HEIGHT: 50,
MIN_JUMP_HEIGHT: 40,
INITIAL_JUMP_VELOCITY: -10,
RUNNING_1: {x: 96, w: 49, h: 47, xOffset: 0},
RUNNING_2: {x: 145, w: 49, h: 47, xOffset: 0},
JUMPING: {x: 47, w: 49, h: 47, xOffset: 0},
CRASHED: {x: 194, w: 61, h: 47, xOffset: 0},
DUCKING_1: {x: 257, w: 55, h: 26, xOffset: 0},
DUCKING_2: {x: 316, w: 55, h: 26, xOffset: 0},
COLLISION_BOXES: [
new CollisionBox(22, 0, 17, 16),
new CollisionBox(1, 18, 30, 9),
new CollisionBox(10, 35, 14, 8),
new CollisionBox(1, 24, 29, 5),
new CollisionBox(5, 30, 21, 4),
new CollisionBox(9, 34, 15, 4),
],
},
/** @type {Array<ObstacleType>} */
OBSTACLES: [
{
type: 'OBSTACLE1',
width: 36,
height: 45,
yPos: 95,
multipleSpeed: 999,
minGap: 120,
minSpeed: 0,
collisionBoxes: [
new CollisionBox(0, 17, 8, 28),
new CollisionBox(6, 3, 24, 42),
new CollisionBox(28, 17, 8, 28),
],
},
{
type: 'OBSTACLE2',
width: 36,
height: 45,
yPos: 95,
multipleSpeed: 999,
minGap: 120,
minSpeed: 0,
collisionBoxes: [
new CollisionBox(0, 17, 8, 28),
new CollisionBox(6, 3, 24, 42),
new CollisionBox(28, 17, 8, 28),
],
},
{
type: 'OBSTACLE3',
width: 72,
height: 45,
yPos: 95,
multipleSpeed: 999,
minGap: 120,
minSpeed: 8,
collisionBoxes: [
new CollisionBox(0, 17, 8, 28),
new CollisionBox(6, 3, 24, 42),
new CollisionBox(28, 17, 8, 28),
new CollisionBox(36, 17, 8, 28),
new CollisionBox(42, 3, 24, 42),
new CollisionBox(64, 17, 8, 28),
],
},
{
type: 'OBSTACLE4',
width: 72,
height: 45,
yPos: 95,
multipleSpeed: 999,
minGap: 120,
minSpeed: 8,
collisionBoxes: [
new CollisionBox(0, 17, 8, 28),
new CollisionBox(6, 3, 24, 42),
new CollisionBox(28, 17, 8, 28),
new CollisionBox(36, 17, 8, 28),
new CollisionBox(42, 3, 24, 42),
new CollisionBox(64, 17, 8, 28),
],
},
{
type: 'OBSTACLE5',
width: 42,
height: 50,
yPos: 95,
multipleSpeed: 999,
minGap: 120,
minSpeed: 5,
collisionBoxes: [
new CollisionBox(0, 0, 42, 50),
],
},
{
type: 'OBSTACLE6',
width: 56,
height: 52,
yPos: 93,
multipleSpeed: 999,
minGap: 120,
minSpeed: 7,
collisionBoxes: [
new CollisionBox(0, 11, 8, 40),
new CollisionBox(8, 0, 19, 51),
new CollisionBox(27, 11, 28, 40),
],
},
{
type: 'OBSTACLE7',
width: 54,
height: 52,
yPos: 93,
multipleSpeed: 999,
minGap: 120,
minSpeed: 6,
collisionBoxes: [
new CollisionBox(0, 11, 19, 40),
new CollisionBox(19, 0, 19, 51),
new CollisionBox(38, 14, 15, 37),
],
},
{
type: 'OBSTACLE8',
width: 49,
height: 20,
yPos: [100, 75, 50], // Variable height.
yPosMobile: [100, 50], // Variable height mobile.
multipleSpeed: 999,
minSpeed: 8.5,
minGap: 150,
collisionBoxes: [
new CollisionBox(15, 15, 16, 5),
new CollisionBox(18, 21, 24, 6),
new CollisionBox(2, 14, 4, 3),
new CollisionBox(6, 10, 4, 7),
new CollisionBox(10, 8, 6, 9),
],
numFrames: 2,
frameRate: 1000 / 6,
speedOffset: .8,
},
],
BACKGROUND_EL: {
'GROUP1': {
HEIGHT: 91,
MAX_CLOUD_GAP: 600,
MAX_SKY_LEVEL: 0,
MIN_CLOUD_GAP: 300,
MIN_SKY_LEVEL: 0,
OFFSET: 11,
WIDTH: 131,
X_POS: 260,
},
'GROUP2': {
HEIGHT: 91,
MAX_CLOUD_GAP: 600,
MAX_SKY_LEVEL: 0,
MIN_CLOUD_GAP: 300,
MIN_SKY_LEVEL: 0,
OFFSET: 11,
WIDTH: 166,
X_POS: 391,
},
},
BACKGROUND_EL_CONFIG: {
MAX_BG_ELS: 8,
MAX_GAP: 600,
MIN_GAP: 300,
POS: 0,
SPEED: 0.8,
Y_POS: 122,
},
LINES: [
{SOURCE_X: 2, SOURCE_Y: 3, WIDTH: 600, HEIGHT: 12, YPOS: 128},
],
},
};