Here is a boilerplate template that you can use as a starting point for an HTML game:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>My HTML Game</title>
<style>
/* Add your CSS styles here */
</style>
</head>
<body>
<!-- Add your HTML content here -->
<script>
// Add your JavaScript code here
</script>
</body>
</html>
This template includes the basic structure of an HTML document, including the <html>
, <head>
, and <body>
elements. The <style>
element can be used to add CSS styles to your game, and the <script>
element can be used to add JavaScript code.
You can use this template as a starting point and add your own HTML, CSS, and JavaScript code to create your game.
I hope this helps to give you an idea of how to structure your HTML game. If you have any other questions or need further assistance, please don't hesitate to ask.
To create a canvas that is always full height and width, you can use the following HTML and CSS code:
<canvas id="game-canvas"></canvas>
canvas#game-canvas {
width: 100%;
height: 100%;
}
This will create a canvas element with an ID of "game-canvas" that takes up the full height and width of the viewport.
To create a game loop in JavaScript, you can use a function that contains your game logic and use the requestAnimationFrame
function to call it repeatedly at a set interval. Here is an example of a game loop function:
function gameLoop() {
// Update game logic
// Render game
requestAnimationFrame(gameLoop);
}
// Start the game loop
gameLoop();
This function will be called repeatedly, allowing you to update and render your game at a consistent rate. The requestAnimationFrame
function helps to optimize the game loop by synchronizing it with the browser's rendering engine, so that the game runs smoothly and efficiently.
I hope this helps to give you an idea of how to create a canvas and game loop in JavaScript. If you have any other questions or need further assistance, please don't hesitate to ask.
To resize the canvas when the window is resized, you can use the window.addEventListener
function to attach a "resize" event listener to the window object, and then update the width and height of the canvas element accordingly. Here is an example of how you could do this:
// Get a reference to the canvas element
var canvas = document.getElementById("game-canvas");
// Set the width and height of the canvas to the full size of the window
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
// Add a "resize" event listener to the window object
window.addEventListener("resize", function() {
// Update the width and height of the canvas to the full size of the window
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
});
This code will set the initial size of the canvas to the full size of the window, and then update the size of the canvas whenever the window is resized.
I hope this helps to give you an idea of how to resize the canvas element when the window is resized. If you have any other questions or need further assistance, please don't hesitate to ask.
To create a player object with a render function that renders a square and follows the mouse pointer, you can use the following code:
// Create the player object
var player = {
// Set the initial position of the player to the center of the canvas
x: canvas.width / 2,
y: canvas.height / 2,
// Set the size of the player
size: 50,
// Define the render function
render: function() {
// Get the context of the canvas
var ctx = canvas.getContext("2d");
// Set the fill color of the player
ctx.fillStyle = "red";
// Draw a filled rectangle at the current position of the player
ctx.fillRect(this.x - this.size / 2, this.y - this.size / 2, this.size, this.size);
}
};
// Add an event listener to track the mouse position
canvas.addEventListener("mousemove", function(event) {
// Update the position of the player to follow the mouse
player.x = event.clientX;
player.y = event.clientY;
});
This code creates a player object with an x
and y
position, a size
, and a render
function. The render
function uses the canvas context to draw a filled rectangle at the current position of the player.
The code also adds an event listener to the canvas element to track the mouse position. When the mouse is moved, the event listener updates the position of the player to follow the mouse.
To use this code, you will need to call the render
function of the player object in your game loop, like this:
function gameLoop() {
// Update game logic
// Clear the canvas
var ctx = canvas.getContext("2d");
ctx.clearRect(0, 0, canvas.width, canvas.height);
// Render the player
player.render();
requestAnimationFrame(gameLoop);
}
I hope this helps to give you an idea of how to create a player object with a render function that follows the mouse pointer. If you have any other questions or need further assistance, please don't hesitate to ask.
To generate a bullet object that spawns at the player's location and moves to the top of the screen, you can use the following code:
// Create the bullet object
var bullet = {
// Set the initial position of the bullet to the position of the player
x: player.x,
y: player.y,
// Set the size and speed of the bullet
size: 10,
speed: 5,
// Define the update function
update: function() {
// Update the position of the bullet
this.y -= this.speed;
// Remove the bullet if it reaches the top of the screen
if (this.y < 0) {
// Remove the bullet from the game
removeBullet(this);
}
},
// Define the render function
render: function() {
// Get the context of the canvas
var ctx = canvas.getContext("2d");
// Set the fill color of the bullet
ctx.fillStyle = "black";
// Draw a filled circle at the current position of the bullet
ctx.beginPath();
ctx.arc(this.x, this.y, this.size / 2, 0, 2 * Math.PI);
ctx.fill();
}
};
// Add the bullet to the game
addBullet(bullet);
// Define the removeBullet function
function removeBullet(bullet) {
// Remove the bullet from the game
}
// Define the addBullet function
function addBullet(bullet) {
// Add the bullet to the game
}
This code creates a bullet object with an x
and y
position, a size
, and a speed
. The update
function updates the position of the bullet and removes it if it reaches the top of the screen. The render
function uses the canvas context to draw a filled circle at the current position of the bullet.
The code also defines addBullet
and removeBullet
functions, which you can use to add and remove the bullet from the game. You will need to implement these functions to suit your specific game needs.
To use this code, you will need to call the update
and render
functions of the bullet object in your game loop, like this:
function gameLoop() {
// Update game logic
// Clear the canvas
var ctx = canvas.getContext("2d");
ctx.clearRect(0, 0, canvas.width, canvas.height);
// Update and render the bullet
bullet.update();
bullet.render();
requestAnimationFrame(gameLoop);
}
I hope this helps to give you an idea of how
To add a bullet to the game when the user clicks with the mouse, you can modify the addBullet
function like this:
// Define the addBullet function
function addBullet() {
// Create a new bullet object
var bullet = {
// Set the initial position of the bullet to the position of the player
x: player.x,
y: player.y,
// Set the size and speed of the bullet
size: 10,
speed: 5,
// Define the update function
update: function() {
// Update the position of the bullet
this.y -= this.speed;
// Remove the bullet if it reaches the top of the screen
if (this.y < 0) {
// Remove the bullet from the game
removeBullet(this);
}
},
// Define the render function
render: function() {
// Get the context of the canvas
var ctx = canvas.getContext("2d");
// Set the fill color of the bullet
ctx.fillStyle = "black";
// Draw a filled circle at the current position of the bullet
ctx.beginPath();
ctx.arc(this.x, this.y, this.size / 2, 0, 2 * Math.PI);
ctx.fill();
}
};
// Add the bullet to the game
bullets.push(bullet);
}
This modified addBullet
function creates a new bullet object and adds it to an array of bullets called bullets
.
To add a bullet to the game when the user clicks with the mouse, you can attach a "click" event listener to the canvas element and call the addBullet
function in the event listener, like this:
// Attach a "click" event listener to the canvas element
canvas.addEventListener("click", function(event) {
// Add a bullet to the game
addBullet();
});
To update and render the bullets in the game loop, you can use a for
loop to iterate over the bullets
array and call the update
and render
functions of each bullet, like this:
function gameLoop() {
// Update game logic
// Clear the canvas
var ctx = canvas.getContext("2d");
ctx.clearRect(0, 0, canvas.width, canvas.height);
// Update and render the bullets
for (var i = 0; i < bullets.length; i++) {
bullets[i].update();
bullets[i].render();
}
requestAnimationFrame(gameLoop);
}
I hope this helps to give you an idea of how to add a bullet to the game when the user clicks with the mouse, and how to update and render multiple bullets in the game loop. If you have any other questions or need further assistance, please don't hesitate to ask.
To generate the removeBullet
function, you can use the following code:
// Define the removeBullet function
function removeBullet(bullet) {
// Find the index of the bullet in the bullets array
var index = bullets.indexOf(bullet);
// Remove the bullet from the bullets array
if (index > -1) {
bullets.splice(index, 1);
}
}
This removeBullet
function uses the indexOf
and splice
methods of the bullets
array to remove the specified bullet from the array.
The indexOf
method returns the index of the specified element in the array, or -1
if the element is not found. If the index of the bullet is greater than -1
, it means that the bullet is in the array, so we can use the splice
method to remove it.
The splice
method removes elements from an array and optionally adds new elements in their place. In this case, we pass the index of the bullet and the number 1
to the splice
method to remove the bullet from the array.
I hope this helps to give you an idea of how to generate the removeBullet
function. If you have any other questions or need further assistance, please don't hesitate to ask.
To hide the mouse when it is over the canvas, you can use the following code:
// Get the canvas element
var canvas = document.getElementById("canvas");
// Set the cursor style of the canvas to "none"
canvas.style.cursor = "none";
// Attach a "mousemove" event listener to the canvas element
canvas.addEventListener("mousemove", function(event) {
// Get the mouse position relative to the canvas
var rect = canvas.getBoundingClientRect();
var mouseX = event.clientX - rect.left;
var mouseY = event.clientY - rect.top;
// Update the position of the player
player.x = mouseX;
player.y = mouseY;
});
This code sets the cursor style of the canvas element to "none" to hide the mouse when it is over the canvas. It also attaches a "mousemove" event listener to the canvas element and updates the position of the player based on the mouse position relative to the canvas.
To show the mouse again when it is not over the canvas, you can set the cursor style of the canvas back to the default value, like this:
// Set the cursor style of the canvas to "default"
canvas.style.cursor = "default";
I hope this helps to give you an idea of how to hide the mouse when it is over the canvas. If you have any other questions or need further assistance, please don't hesitate to ask.
To create an enemy object that can add multiple enemies and let them move from left to right on the screen, you can use the following code:
// Create the enemy object
var enemy = {
// Set the initial position and size of the enemy
x: 0,
y: 0,
size: 50,
// Set the speed of the enemy
speed: 5,
// Set the direction of the enemy
direction: 1, // 1 = right, -1 = left
// Define the update function
update: function() {
// Update the position of the enemy
this.x += this.speed * this.direction;
// Reverse the direction of the enemy if it reaches the edge of the screen
if (this.x < 0 || this.x + this.size > canvas.width) {
this.direction *= -1;
}
},
// Define the render function
render: function() {
// Get the context of the canvas
var ctx = canvas.getContext("2d");
// Set the fill color of the enemy
ctx.fillStyle = "red";
// Draw a filled rectangle at the current position of the enemy
ctx.fillRect(this.x, this.y, this.size, this.size);
}
};
// Add the enemy to the game
addEnemy(enemy);
// Define the addEnemy function
function addEnemy(enemy) {
// Add the enemy to the game
}
This code creates an enemy object with an x
and y
position, a size
, and a speed
. The update
function updates the position of the enemy and reverses its direction if it reaches the edge of the screen. The render
function uses the canvas context to draw a filled rectangle at the current position of the enemy.
The code also defines an addEnemy
function, which you can use to add the enemy to the game. You will need to implement this function to suit your specific game needs.
To update and render the enemy in the game loop, you can call the update
and render
functions of the enemy object, like this:
function gameLoop() {
// Update game logic
// Clear the canvas
var ctx = canvas.getContext("2d");
ctx.clearRect(0, 0, canvas.width, canvas.height);
// Update and render the enemy
enemy.update();
enemy.render();
requestAnimationFrame(gameLoop);
}
To remove the enemy when it is hit by a bullet, you can modify the update
function of the enemy object to check for collisions with the bullets, like this:
``
To generate multiple enemies in a list with an addEnemy
function, you can modify the code like this:
// Define the enemies array
var enemies = [];
// Create the enemy object
var enemy = {
// Set the initial position and size of the enemy
x: 0,
y: 0,
size: 50,
// Set the speed of the enemy
speed: 5,
// Set the direction of the enemy
direction: 1, // 1 = right, -1 = left
// Define the update function
update: function() {
// Update the position of the enemy
this.x += this.speed * this.direction;
// Reverse the direction of the enemy if it reaches the edge of the screen
if (this.x < 0 || this.x + this.size > canvas.width) {
this.direction *= -1;
}
},
// Define the render function
render: function() {
// Get the context of the canvas
var ctx = canvas.getContext("2d");
// Set the fill color of the enemy
ctx.fillStyle = "red";
// Draw a filled rectangle at the current position of the enemy
ctx.fillRect(this.x, this.y, this.size, this.size);
}
};
// Define the addEnemy function
function addEnemy() {
// Create a new enemy object
var newEnemy = Object.create(enemy);
// Set the position of the new enemy
newEnemy.x = Math.random() * canvas.width;
newEnemy.y = Math.random() * canvas.height;
// Add the new enemy to the enemies array
enemies.push(newEnemy);
}
// Add multiple enemies to the game
addEnemy();
addEnemy();
addEnemy();
// Update and render the enemies in the game loop
function gameLoop() {
// Update game logic
// Clear the canvas
var ctx = canvas.getContext("2d");
ctx.clearRect(0, 0, canvas.width, canvas.height);
// Update and render the enemies
for (var i = 0; i < enemies.length; i++) {
enemies[i].update();
enemies[i].render();
}
requestAnimationFrame(gameLoop);
}
This code defines an enemies
array to store the enemy objects, and an addEnemy
function that creates a new enemy object using the Object.create
method and adds it to the `enemies
To generate a removeEnemy
function that removes an enemy from the enemies
array, you can use the following code:
// Define the removeEnemy function
function removeEnemy(enemy) {
// Find the index of the enemy in the enemies array
var index = enemies.indexOf(enemy);
// Remove the enemy from the enemies array
if (index > -1) {
enemies.splice(index, 1);
}
}
This removeEnemy
function uses the indexOf
and splice
methods of the enemies
array to remove the specified enemy from the array.
The indexOf
method returns the index of the specified element in the array, or -1
if the element is not found. If the index of the enemy is greater than -1
, it means that the enemy is in the array, so we can use the splice
method to remove it.
The splice
method removes elements from an array and optionally adds new elements in their place. In this case, we pass the index of the enemy and the number 1
to the splice
method to remove the enemy from the array.
I hope this helps to give you an idea of how to generate the removeEnemy
function. If you have any other questions or need further assistance, please don't hesitate to ask.
To call the removeEnemy
function when the enemy is hitting a bullet, you can modify the update
function of the enemy object like this:
// Define the update function
update: function() {
// Update the position of the enemy
this.x += this.speed * this.direction;
// Reverse the direction of the enemy if it reaches the edge of the screen
if (this.x < 0 || this.x + this.size > canvas.width) {
this.direction *= -1;
}
// Check for collisions with the bullets
for (var i = 0; i < bullets.length; i++) {
var bullet = bullets[i];
// Check if the enemy is colliding with the bullet
if (this.x < bullet.x + bullet.size && this.x + this.size > bullet.x &&
this.y < bullet.y + bullet.size && this.y + this.size > bullet.y) {
// Remove the enemy and the bullet
removeEnemy(this);
removeBullet(bullet);
}
}
},
This code uses a loop to check for collisions between the enemy and the bullets in the bullets
array. If a collision is detected, it calls the removeEnemy
and removeBullet
functions to remove the enemy and the bullet from the game.
You will need to define the bullets
array and the removeBullet
function to suit your specific game needs.
I hope this helps to give you an idea of how to call the removeEnemy
function when the enemy is hitting a bullet. If you have any other questions or need further assistance, please don't hesitate to ask.
To add enemies at a random interval, you can use a timer to call the addEnemy
function at random intervals. Here's an example of how you can do this:
// Define the enemies array
var enemies = [];
// Create the enemy object
var enemy = {
// Set the initial position and size of the enemy
x: 0,
y: 0,
size: 50,
// Set the speed of the enemy
speed: 5,
// Set the direction of the enemy
direction: 1, // 1 = right, -1 = left
// Define the update function
update: function() {
// Update the position of the enemy
this.x += this.speed * this.direction;
// Reverse the direction of the enemy if it reaches the edge of the screen
if (this.x < 0 || this.x + this.size > canvas.width) {
this.direction *= -1;
}
},
// Define the render function
render: function() {
// Get the context of the canvas
var ctx = canvas.getContext("2d");
// Set the fill color of the enemy
ctx.fillStyle = "red";
// Draw a filled rectangle at the current position of the enemy
ctx.fillRect(this.x, this.y, this.size, this.size);
}
};
// Define the addEnemy function
function addEnemy() {
// Create a new enemy object
var newEnemy = Object.create(enemy);
// Set the position of the new enemy
newEnemy.x = Math.random() * canvas.width;
newEnemy.y = Math.random() * canvas.height;
// Add the new enemy to the enemies array
enemies.push(newEnemy);
}
// Update and render the enemies in the game loop
function gameLoop() {
// Update game logic
// Clear the canvas
var ctx = canvas.getContext("2d");
ctx.clearRect(0, 0, canvas.width, canvas.height);
// Update and render the enemies
for (var i = 0; i < enemies.length; i++) {
enemies[i].update();
enemies[i].render();
}
requestAnimationFrame(gameLoop);
}
// Set a timer to add enemies at random intervals
setInterval(addEnemy, Math.random() * 2000 + 1000);
To add a score variable and update the score when an enemy is hit, you can use the following code:
// Define the score variable
var score = 0;
// Update the score when an enemy is hit
function updateScore() {
score++;
}
// Render the score in the HTML
function renderScore() {
var scoreElement = document.getElementById("score");
scoreElement.innerHTML = score;
}
// Update and render the score in the game loop
function gameLoop() {
// Update game logic
// Clear the canvas
var ctx = canvas.getContext("2d");
ctx.clearRect(0, 0, canvas.width, canvas.height);
// Update and render the enemies
for (var i = 0; i < enemies.length; i++) {
enemies[i].update();
enemies[i].render();
}
// Update and render the score
updateScore();
renderScore();
requestAnimationFrame(gameLoop);
}
This code defines the score
variable to store the current score, and the updateScore
and renderScore
functions to update and render the score in the game.
The updateScore
function simply increments the score
variable by 1
every time it is called.
The renderScore
function uses the getElementById
method to get a reference to the score
element in the HTML, and then sets the innerHTML
property of the element to the value of the score
variable.
In the gameLoop
function, the updateScore
and renderScore
functions are called to update and render the score every frame.
I hope this helps to give you an idea of how to add a score variable and update the score when an enemy is hit. If you have any other questions or need further assistance, please don't hesitate to ask.
To draw a blue triangle as an enemy, you can modify the render
function of the enemy object like this:
// Define the render function
render: function() {
// Get the context of the canvas
var ctx = canvas.getContext("2d");
// Set the fill color of the enemy
ctx.fillStyle = "blue";
// Begin drawing the path
ctx.beginPath();
// Move to the top point of the triangle
ctx.moveTo(this.x + this.size / 2, this.y);
// Draw the left and right sides of the triangle
ctx.lineTo(this.x, this.y + this.size);
ctx.lineTo(this.x + this.size, this.y + this.size);
// Close the path and fill the triangle
ctx.closePath();
ctx.fill();
}
This code uses the beginPath
, moveTo
, lineTo
, and closePath
methods of the canvas context to draw a triangle.
The beginPath
method starts a new path. The moveTo
method moves the current position of the path to the top point of the triangle. The lineTo
method draws lines from the current position to the left and right points of the triangle. Finally, the closePath
method closes the path by drawing a line from the right point of the triangle back to the top point.
The fill
method fills the path with the current fill color, which in this case is set to blue.
I hope this helps to give you an idea of how to draw a blue triangle as an enemy. If you have any other questions or need further assistance, please don't hesitate to ask.
To add an enemy at the top half of the canvas and increase the speed each time it hits the side, you can modify the addEnemy
function and the update
function of the enemy object like this:
// Define the enemies array
var enemies = [];
// Create the enemy object
var enemy = {
// Set the initial position and size of the enemy
x: 0,
y: 0,
size: 50,
// Set the speed of the enemy
speed: 5,
// Set the direction of the enemy
direction: 1, // 1 = right, -1 = left
// Define the update function
update: function() {
// Update the position of the enemy
this.x += this.speed * this.direction;
// Reverse the direction of the enemy and increase the speed if it reaches the edge of the screen
if (this.x < 0 || this.x + this.size > canvas.width) {
this.direction *= -1;
this.speed++;
}
},
// Define the render function
render: function() {
// Get the context of the canvas
var ctx = canvas.getContext("2d");
// Set the fill color of the enemy
ctx.fillStyle = "red";
// Draw a filled rectangle at the current position of the enemy
ctx.fillRect(this.x, this.y, this.size, this.size);
}
};
// Define the addEnemy function
function addEnemy() {
// Create a new enemy object
var newEnemy = Object.create(enemy);
// Set the position of the new enemy at the top half of the canvas
newEnemy.x = Math.random() * canvas.width;
newEnemy.y = Math.random() * canvas.height / 2;
// Add the new enemy to the enemies array
enemies.push(newEnemy);
}
This code defines the addEnemy
function to create a new enemy object and set its position at the top half of the canvas. The update
function of the enemy object uses an if
statement to check if the enemy has reached the edge of the screen, and if it has, it reverses the direction and increases the speed of the enemy.
I hope this helps to give you an idea of how to add an enemy at the top half of the canvas and increase the speed each time it hits the side. If you have any other questions or need further assistance, please don't hesitate to ask.
To set a maximum speed of 15
for the enemy, you can modify the update
function of the enemy object like this:
// Define the update function
update: function() {
// Update the position of the enemy
this.x += this.speed * this.direction;
// Reverse the direction of the enemy and increase the speed if it reaches the edge of the screen, but not above 15
if (this.x < 0 || this.x + this.size > canvas.width) {
this.direction *= -1;
this.speed = Math.min(this.speed + 1, 15);
}
}
This code uses the Math.min
function to ensure that the speed of the enemy is not increased above 15
when it reaches the edge of the screen.
I hope this helps to give you an idea of how to set a maximum speed of 15
for the enemy. If you have any other questions or need further assistance, please don't hesitate to ask.
To move the enemy down when it hits the side, you can modify the update
function of the enemy object like this:
// Define the update function
update: function() {
// Update the position of the enemy
this.x += this.speed * this.direction;
// Reverse the direction of the enemy and move it down when it reaches the edge of the screen
if (this.x < 0 || this.x + this.size > canvas.width) {
this.direction *= -1;
this.y += this.size;
}
}
This code uses an if
statement to check if the enemy has reached the edge of the screen, and if it has, it reverses the direction and moves the enemy down by this.size
pixels.
I hope this helps to give you an idea of how to move the enemy down when it hits the side. If you have any other questions or need further assistance, please don't hesitate to ask.
To remove the enemy when it reaches the bottom or hits the player and decrease the score, you can modify the update
function of the enemy object and add a checkCollision
function like this:
// Define the score variable
var score = 0;
// Define the player object
var player = {
// Set the position and size of the player
x: canvas.width / 2,
y: canvas.height - 50,
size: 50
};
// Create the enemy object
var enemy = {
// Set the initial position and size of the enemy
x: 0,
y: 0,
size: 50,
// Set the speed of the enemy
speed: 5,
// Set the direction of the enemy
direction: 1, // 1 = right, -1 = left
// Define the update function
update: function() {
// Update the position of the enemy
this.x += this.speed * this.direction;
// Reverse the direction of the enemy when it reaches the edge of the screen
if (this.x < 0 || this.x + this.size > canvas.width) {
this.direction *= -1;
}
// Check for collision with the player
if (checkCollision(this, player)) {
// Remove the enemy from the enemies array
enemies.splice(enemies.indexOf(this), 1);
// Decrease the score
score--;
}
// Remove the enemy when it reaches the bottom of the screen
if (this.y + this.size > canvas.height) {
enemies.splice(enemies.indexOf(this), 1);
}
},
// Define the render function
render: function() {
// Get the context of the canvas
var ctx = canvas.getContext("2d");
// Set the fill color of the enemy
ctx.fillStyle = "red";
// Draw a filled rectangle at the current position of the enemy
ctx.fillRect(this.x, this.y, this.size, this.size);
}
};
// Define the checkCollision function
function checkCollision(a, b) {
// Check if the two objects are colliding
return (a.x < b.x + b.size && a.x + a.size > b.x && a.y < b.y + b.size && a.y + a.size > b.y);
}
This code defines the score
variable to keep track of the player's score and the player
object to represent the player. The update
function of the enemy object uses an if
statement to check if the enemy has reached the edge of the screen, and if it has, it reverses the direction.
The update
function also calls the checkCollision
function to check if the enemy is colliding with the player. If it is, the enemy is removed from the enemies
array and the score is decreased by 1
.
Finally, the update
function uses another if
statement to check if the enemy has reached the bottom of the screen, and if it has, it is removed from the enemies
array.
I hope this helps to give you an idea
Too many requests in 1 hour. Try again later.
Too many requests in 1 hour. Try again later.
Too many requests in 1 hour. Try again later.
Too many requests in 1 hour. Try again later.
Too many requests in 1 hour. Try again later.