User prompt
Aumentar la velocidad de movimiento del jugador
User prompt
Aumenta la dificultad en el primer nivel
User prompt
Ahora en el nivel 2 genera al barco enemigo que nos ataca
User prompt
No el el segundo nivel solo aparecerá un barco enemigo el cual nos va a atacar
User prompt
En el nivel 2 solo aparecerá el enemigo que está programado para que no ataque
User prompt
Elimina la generación de enemigos en el segundo nivel, solo deja el barco contra el que se lleva la batalla
User prompt
Agregar mayor velocidad en el primer nivel y que cuando comience el 2do nivel se densa la generación de obstáculos, runas y escudos, solo llevar a cabo la batalla en este nivel y al derrotar al barco enemigo ganar la partida también mejorar la IA del barco enemigo para mayor dificultad ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Disminuye el número de carriles en 2
User prompt
Hagamos una regla de aparición de los obstáculos que para mayor dificultad sin ser imposible y que en el primer nivel la velocidad valla aumentando con el tiempo ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Quita el botón haz que podamos movernos un solo carril a la vez deslizando el dedo en la pantalla y para disparar en el nivel 2 será con un toque en la pantalla
User prompt
Vamos a ponerle 2 niveles de momento el primer nivel durará 2 minutos añadiremos unos botones para cambiar de carriel y en el nivel 2 uno para atacar, en el nivel 2 vamos a hacer un barco enemigo que nos ataque programa la IA para que dispare con un tiempo de recarga de 2 segundos y que también esquive ↪💡 Consider importing and using the following plugins: @upit/tween.v1
Code edit (1 edits merged)
Please save this source code
User prompt
Viking Sea Conquest
Initial prompt
Vamos a controlar un bote viquingo, nos vamos a lanzar al mar para enfrentar a los dioses y otros peligros, lo haremos en 5 carriles y con varios niveles
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.lastY = 0;
self.update = function () {
self.y += self.speed;
};
return self;
});
var Lightning = Container.expand(function () {
var self = Container.call(this);
var lightningGraphics = self.attachAsset('lightning', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 12;
self.lastY = 0;
self.update = function () {
self.y += self.speed;
};
return self;
});
var Rune = Container.expand(function () {
var self = Container.call(this);
var runeGraphics = self.attachAsset('rune', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 6;
self.lastY = 0;
self.update = function () {
self.y += self.speed;
self.rotation += 0.1;
};
return self;
});
var SeaSerpent = Container.expand(function () {
var self = Container.call(this);
var serpentGraphics = self.attachAsset('seaSerpent', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 4;
self.lastY = 0;
self.update = function () {
self.y += self.speed;
self.x += Math.sin(self.y * 0.01) * 2;
};
return self;
});
var Shield = Container.expand(function () {
var self = Container.call(this);
var shieldGraphics = self.attachAsset('shield', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 6;
self.lastY = 0;
self.update = function () {
self.y += self.speed;
self.rotation += 0.05;
};
return self;
});
var VikingShip = Container.expand(function () {
var self = Container.call(this);
var shipGraphics = self.attachAsset('vikingShip', {
anchorX: 0.5,
anchorY: 0.5
});
self.targetLane = 2;
self.currentLane = 2;
self.health = 3;
self.shields = 0;
self.invulnerable = false;
self.invulnerableTimer = 0;
self.setLane = function (lane) {
self.targetLane = Math.max(0, Math.min(4, lane));
};
self.takeDamage = function () {
if (self.invulnerable) return;
if (self.shields > 0) {
self.shields--;
updateShieldDisplay();
} else {
self.health--;
updateHealthDisplay();
LK.getSound('hit').play();
if (self.health <= 0) {
LK.showGameOver();
return;
}
}
self.invulnerable = true;
self.invulnerableTimer = 120;
LK.effects.flashObject(self, 0xff0000, 500);
};
self.update = function () {
var targetX = lanePositions[self.targetLane];
var diff = targetX - self.x;
if (Math.abs(diff) > 5) {
self.x += diff * 0.15;
} else {
self.x = targetX;
self.currentLane = self.targetLane;
}
if (self.invulnerable) {
self.invulnerableTimer--;
if (self.invulnerableTimer <= 0) {
self.invulnerable = false;
}
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1e3a8a
});
/****
* Game Code
****/
var lanePositions = [2048 * 0.1, 2048 * 0.275, 2048 * 0.5, 2048 * 0.725, 2048 * 0.9];
var vikingShip = null;
var enemies = [];
var runes = [];
var shields = [];
var lightnings = [];
var seaSerpents = [];
var level = 1;
var score = 0;
var distance = 0;
var enemySpawnTimer = 0;
var runeSpawnTimer = 0;
var shieldSpawnTimer = 0;
var lightningSpawnTimer = 0;
var serpentSpawnTimer = 0;
var gameSpeed = 1;
var scoreTxt = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0, 0);
scoreTxt.x = 150;
scoreTxt.y = 50;
LK.gui.topLeft.addChild(scoreTxt);
var levelTxt = new Text2('Level: 1', {
size: 60,
fill: 0xFFFFFF
});
levelTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(levelTxt);
var healthTxt = new Text2('Health: 3', {
size: 60,
fill: 0xFF0000
});
healthTxt.anchor.set(1, 0);
healthTxt.x = -50;
healthTxt.y = 50;
LK.gui.topRight.addChild(healthTxt);
var shieldTxt = new Text2('Shields: 0', {
size: 60,
fill: 0x4169E1
});
shieldTxt.anchor.set(1, 0);
shieldTxt.x = -50;
shieldTxt.y = 120;
LK.gui.topRight.addChild(shieldTxt);
function updateScore() {
scoreTxt.setText('Score: ' + score);
}
function updateLevel() {
levelTxt.setText('Level: ' + level);
}
function updateHealthDisplay() {
healthTxt.setText('Health: ' + vikingShip.health);
}
function updateShieldDisplay() {
shieldTxt.setText('Shields: ' + vikingShip.shields);
}
function spawnEnemy() {
var enemy = new Enemy();
var lane = Math.floor(Math.random() * 5);
enemy.x = lanePositions[lane];
enemy.y = -100;
enemy.lastY = enemy.y;
enemies.push(enemy);
game.addChild(enemy);
}
function spawnRune() {
var rune = new Rune();
var lane = Math.floor(Math.random() * 5);
rune.x = lanePositions[lane];
rune.y = -100;
rune.lastY = rune.y;
runes.push(rune);
game.addChild(rune);
}
function spawnShield() {
var shield = new Shield();
var lane = Math.floor(Math.random() * 5);
shield.x = lanePositions[lane];
shield.y = -100;
shield.lastY = shield.y;
shields.push(shield);
game.addChild(shield);
}
function spawnLightning() {
var lightning = new Lightning();
var lane = Math.floor(Math.random() * 5);
lightning.x = lanePositions[lane];
lightning.y = -100;
lightning.lastY = lightning.y;
lightnings.push(lightning);
game.addChild(lightning);
}
function spawnSeaSerpent() {
var serpent = new SeaSerpent();
var lane = Math.floor(Math.random() * 5);
serpent.x = lanePositions[lane];
serpent.y = -200;
serpent.lastY = serpent.y;
seaSerpents.push(serpent);
game.addChild(serpent);
}
function checkCollisions() {
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
if (enemy.intersects(vikingShip)) {
vikingShip.takeDamage();
enemy.destroy();
enemies.splice(i, 1);
}
}
for (var i = runes.length - 1; i >= 0; i--) {
var rune = runes[i];
if (rune.intersects(vikingShip)) {
score += 100;
updateScore();
LK.getSound('collect').play();
rune.destroy();
runes.splice(i, 1);
}
}
for (var i = shields.length - 1; i >= 0; i--) {
var shield = shields[i];
if (shield.intersects(vikingShip)) {
vikingShip.shields++;
updateShieldDisplay();
LK.getSound('collect').play();
shield.destroy();
shields.splice(i, 1);
}
}
for (var i = lightnings.length - 1; i >= 0; i--) {
var lightning = lightnings[i];
if (lightning.intersects(vikingShip)) {
vikingShip.takeDamage();
lightning.destroy();
lightnings.splice(i, 1);
}
}
for (var i = seaSerpents.length - 1; i >= 0; i--) {
var serpent = seaSerpents[i];
if (serpent.intersects(vikingShip)) {
vikingShip.takeDamage();
serpent.destroy();
seaSerpents.splice(i, 1);
}
}
}
function cleanupObjects() {
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
if (enemy.lastY < 2800 && enemy.y >= 2800) {
enemy.destroy();
enemies.splice(i, 1);
}
enemy.lastY = enemy.y;
}
for (var i = runes.length - 1; i >= 0; i--) {
var rune = runes[i];
if (rune.lastY < 2800 && rune.y >= 2800) {
rune.destroy();
runes.splice(i, 1);
}
rune.lastY = rune.y;
}
for (var i = shields.length - 1; i >= 0; i--) {
var shield = shields[i];
if (shield.lastY < 2800 && shield.y >= 2800) {
shield.destroy();
shields.splice(i, 1);
}
shield.lastY = shield.y;
}
for (var i = lightnings.length - 1; i >= 0; i--) {
var lightning = lightnings[i];
if (lightning.lastY < 2800 && lightning.y >= 2800) {
lightning.destroy();
lightnings.splice(i, 1);
}
lightning.lastY = lightning.y;
}
for (var i = seaSerpents.length - 1; i >= 0; i--) {
var serpent = seaSerpents[i];
if (serpent.lastY < 2800 && serpent.y >= 2800) {
serpent.destroy();
seaSerpents.splice(i, 1);
}
serpent.lastY = serpent.y;
}
}
vikingShip = new VikingShip();
vikingShip.x = lanePositions[2];
vikingShip.y = 2200;
game.addChild(vikingShip);
game.down = function (x, y, obj) {
var closestLane = 0;
var closestDistance = Math.abs(x - lanePositions[0]);
for (var i = 1; i < 5; i++) {
var distance = Math.abs(x - lanePositions[i]);
if (distance < closestDistance) {
closestDistance = distance;
closestLane = i;
}
}
vikingShip.setLane(closestLane);
};
game.update = function () {
distance++;
score += 1;
if (distance % 3000 === 0) {
level++;
gameSpeed += 0.2;
updateLevel();
}
enemySpawnTimer++;
if (enemySpawnTimer >= Math.max(60 - level * 5, 30)) {
spawnEnemy();
enemySpawnTimer = 0;
}
runeSpawnTimer++;
if (runeSpawnTimer >= 180) {
spawnRune();
runeSpawnTimer = 0;
}
shieldSpawnTimer++;
if (shieldSpawnTimer >= 600) {
spawnShield();
shieldSpawnTimer = 0;
}
if (level >= 2) {
lightningSpawnTimer++;
if (lightningSpawnTimer >= 120) {
spawnLightning();
lightningSpawnTimer = 0;
}
}
if (level >= 3) {
serpentSpawnTimer++;
if (serpentSpawnTimer >= 300) {
spawnSeaSerpent();
serpentSpawnTimer = 0;
}
}
checkCollisions();
cleanupObjects();
if (LK.ticks % 10 === 0) {
updateScore();
}
};
LK.playMusic('vikingTheme'); ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,390 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1");
+
+/****
+* Classes
+****/
+var Enemy = Container.expand(function () {
+ var self = Container.call(this);
+ var enemyGraphics = self.attachAsset('enemy', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 8;
+ self.lastY = 0;
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+var Lightning = Container.expand(function () {
+ var self = Container.call(this);
+ var lightningGraphics = self.attachAsset('lightning', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 12;
+ self.lastY = 0;
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+var Rune = Container.expand(function () {
+ var self = Container.call(this);
+ var runeGraphics = self.attachAsset('rune', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 6;
+ self.lastY = 0;
+ self.update = function () {
+ self.y += self.speed;
+ self.rotation += 0.1;
+ };
+ return self;
+});
+var SeaSerpent = Container.expand(function () {
+ var self = Container.call(this);
+ var serpentGraphics = self.attachAsset('seaSerpent', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 4;
+ self.lastY = 0;
+ self.update = function () {
+ self.y += self.speed;
+ self.x += Math.sin(self.y * 0.01) * 2;
+ };
+ return self;
+});
+var Shield = Container.expand(function () {
+ var self = Container.call(this);
+ var shieldGraphics = self.attachAsset('shield', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 6;
+ self.lastY = 0;
+ self.update = function () {
+ self.y += self.speed;
+ self.rotation += 0.05;
+ };
+ return self;
+});
+var VikingShip = Container.expand(function () {
+ var self = Container.call(this);
+ var shipGraphics = self.attachAsset('vikingShip', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.targetLane = 2;
+ self.currentLane = 2;
+ self.health = 3;
+ self.shields = 0;
+ self.invulnerable = false;
+ self.invulnerableTimer = 0;
+ self.setLane = function (lane) {
+ self.targetLane = Math.max(0, Math.min(4, lane));
+ };
+ self.takeDamage = function () {
+ if (self.invulnerable) return;
+ if (self.shields > 0) {
+ self.shields--;
+ updateShieldDisplay();
+ } else {
+ self.health--;
+ updateHealthDisplay();
+ LK.getSound('hit').play();
+ if (self.health <= 0) {
+ LK.showGameOver();
+ return;
+ }
+ }
+ self.invulnerable = true;
+ self.invulnerableTimer = 120;
+ LK.effects.flashObject(self, 0xff0000, 500);
+ };
+ self.update = function () {
+ var targetX = lanePositions[self.targetLane];
+ var diff = targetX - self.x;
+ if (Math.abs(diff) > 5) {
+ self.x += diff * 0.15;
+ } else {
+ self.x = targetX;
+ self.currentLane = self.targetLane;
+ }
+ if (self.invulnerable) {
+ self.invulnerableTimer--;
+ if (self.invulnerableTimer <= 0) {
+ self.invulnerable = false;
+ }
+ }
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x1e3a8a
+});
+
+/****
+* Game Code
+****/
+var lanePositions = [2048 * 0.1, 2048 * 0.275, 2048 * 0.5, 2048 * 0.725, 2048 * 0.9];
+var vikingShip = null;
+var enemies = [];
+var runes = [];
+var shields = [];
+var lightnings = [];
+var seaSerpents = [];
+var level = 1;
+var score = 0;
+var distance = 0;
+var enemySpawnTimer = 0;
+var runeSpawnTimer = 0;
+var shieldSpawnTimer = 0;
+var lightningSpawnTimer = 0;
+var serpentSpawnTimer = 0;
+var gameSpeed = 1;
+var scoreTxt = new Text2('Score: 0', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+scoreTxt.anchor.set(0, 0);
+scoreTxt.x = 150;
+scoreTxt.y = 50;
+LK.gui.topLeft.addChild(scoreTxt);
+var levelTxt = new Text2('Level: 1', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+levelTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(levelTxt);
+var healthTxt = new Text2('Health: 3', {
+ size: 60,
+ fill: 0xFF0000
+});
+healthTxt.anchor.set(1, 0);
+healthTxt.x = -50;
+healthTxt.y = 50;
+LK.gui.topRight.addChild(healthTxt);
+var shieldTxt = new Text2('Shields: 0', {
+ size: 60,
+ fill: 0x4169E1
+});
+shieldTxt.anchor.set(1, 0);
+shieldTxt.x = -50;
+shieldTxt.y = 120;
+LK.gui.topRight.addChild(shieldTxt);
+function updateScore() {
+ scoreTxt.setText('Score: ' + score);
+}
+function updateLevel() {
+ levelTxt.setText('Level: ' + level);
+}
+function updateHealthDisplay() {
+ healthTxt.setText('Health: ' + vikingShip.health);
+}
+function updateShieldDisplay() {
+ shieldTxt.setText('Shields: ' + vikingShip.shields);
+}
+function spawnEnemy() {
+ var enemy = new Enemy();
+ var lane = Math.floor(Math.random() * 5);
+ enemy.x = lanePositions[lane];
+ enemy.y = -100;
+ enemy.lastY = enemy.y;
+ enemies.push(enemy);
+ game.addChild(enemy);
+}
+function spawnRune() {
+ var rune = new Rune();
+ var lane = Math.floor(Math.random() * 5);
+ rune.x = lanePositions[lane];
+ rune.y = -100;
+ rune.lastY = rune.y;
+ runes.push(rune);
+ game.addChild(rune);
+}
+function spawnShield() {
+ var shield = new Shield();
+ var lane = Math.floor(Math.random() * 5);
+ shield.x = lanePositions[lane];
+ shield.y = -100;
+ shield.lastY = shield.y;
+ shields.push(shield);
+ game.addChild(shield);
+}
+function spawnLightning() {
+ var lightning = new Lightning();
+ var lane = Math.floor(Math.random() * 5);
+ lightning.x = lanePositions[lane];
+ lightning.y = -100;
+ lightning.lastY = lightning.y;
+ lightnings.push(lightning);
+ game.addChild(lightning);
+}
+function spawnSeaSerpent() {
+ var serpent = new SeaSerpent();
+ var lane = Math.floor(Math.random() * 5);
+ serpent.x = lanePositions[lane];
+ serpent.y = -200;
+ serpent.lastY = serpent.y;
+ seaSerpents.push(serpent);
+ game.addChild(serpent);
+}
+function checkCollisions() {
+ for (var i = enemies.length - 1; i >= 0; i--) {
+ var enemy = enemies[i];
+ if (enemy.intersects(vikingShip)) {
+ vikingShip.takeDamage();
+ enemy.destroy();
+ enemies.splice(i, 1);
+ }
+ }
+ for (var i = runes.length - 1; i >= 0; i--) {
+ var rune = runes[i];
+ if (rune.intersects(vikingShip)) {
+ score += 100;
+ updateScore();
+ LK.getSound('collect').play();
+ rune.destroy();
+ runes.splice(i, 1);
+ }
+ }
+ for (var i = shields.length - 1; i >= 0; i--) {
+ var shield = shields[i];
+ if (shield.intersects(vikingShip)) {
+ vikingShip.shields++;
+ updateShieldDisplay();
+ LK.getSound('collect').play();
+ shield.destroy();
+ shields.splice(i, 1);
+ }
+ }
+ for (var i = lightnings.length - 1; i >= 0; i--) {
+ var lightning = lightnings[i];
+ if (lightning.intersects(vikingShip)) {
+ vikingShip.takeDamage();
+ lightning.destroy();
+ lightnings.splice(i, 1);
+ }
+ }
+ for (var i = seaSerpents.length - 1; i >= 0; i--) {
+ var serpent = seaSerpents[i];
+ if (serpent.intersects(vikingShip)) {
+ vikingShip.takeDamage();
+ serpent.destroy();
+ seaSerpents.splice(i, 1);
+ }
+ }
+}
+function cleanupObjects() {
+ for (var i = enemies.length - 1; i >= 0; i--) {
+ var enemy = enemies[i];
+ if (enemy.lastY < 2800 && enemy.y >= 2800) {
+ enemy.destroy();
+ enemies.splice(i, 1);
+ }
+ enemy.lastY = enemy.y;
+ }
+ for (var i = runes.length - 1; i >= 0; i--) {
+ var rune = runes[i];
+ if (rune.lastY < 2800 && rune.y >= 2800) {
+ rune.destroy();
+ runes.splice(i, 1);
+ }
+ rune.lastY = rune.y;
+ }
+ for (var i = shields.length - 1; i >= 0; i--) {
+ var shield = shields[i];
+ if (shield.lastY < 2800 && shield.y >= 2800) {
+ shield.destroy();
+ shields.splice(i, 1);
+ }
+ shield.lastY = shield.y;
+ }
+ for (var i = lightnings.length - 1; i >= 0; i--) {
+ var lightning = lightnings[i];
+ if (lightning.lastY < 2800 && lightning.y >= 2800) {
+ lightning.destroy();
+ lightnings.splice(i, 1);
+ }
+ lightning.lastY = lightning.y;
+ }
+ for (var i = seaSerpents.length - 1; i >= 0; i--) {
+ var serpent = seaSerpents[i];
+ if (serpent.lastY < 2800 && serpent.y >= 2800) {
+ serpent.destroy();
+ seaSerpents.splice(i, 1);
+ }
+ serpent.lastY = serpent.y;
+ }
+}
+vikingShip = new VikingShip();
+vikingShip.x = lanePositions[2];
+vikingShip.y = 2200;
+game.addChild(vikingShip);
+game.down = function (x, y, obj) {
+ var closestLane = 0;
+ var closestDistance = Math.abs(x - lanePositions[0]);
+ for (var i = 1; i < 5; i++) {
+ var distance = Math.abs(x - lanePositions[i]);
+ if (distance < closestDistance) {
+ closestDistance = distance;
+ closestLane = i;
+ }
+ }
+ vikingShip.setLane(closestLane);
+};
+game.update = function () {
+ distance++;
+ score += 1;
+ if (distance % 3000 === 0) {
+ level++;
+ gameSpeed += 0.2;
+ updateLevel();
+ }
+ enemySpawnTimer++;
+ if (enemySpawnTimer >= Math.max(60 - level * 5, 30)) {
+ spawnEnemy();
+ enemySpawnTimer = 0;
+ }
+ runeSpawnTimer++;
+ if (runeSpawnTimer >= 180) {
+ spawnRune();
+ runeSpawnTimer = 0;
+ }
+ shieldSpawnTimer++;
+ if (shieldSpawnTimer >= 600) {
+ spawnShield();
+ shieldSpawnTimer = 0;
+ }
+ if (level >= 2) {
+ lightningSpawnTimer++;
+ if (lightningSpawnTimer >= 120) {
+ spawnLightning();
+ lightningSpawnTimer = 0;
+ }
+ }
+ if (level >= 3) {
+ serpentSpawnTimer++;
+ if (serpentSpawnTimer >= 300) {
+ spawnSeaSerpent();
+ serpentSpawnTimer = 0;
+ }
+ }
+ checkCollisions();
+ cleanupObjects();
+ if (LK.ticks % 10 === 0) {
+ updateScore();
+ }
+};
+LK.playMusic('vikingTheme');
\ No newline at end of file
Barco viquingo visto desde arriba que viene de frente. In-Game asset. 2d. High contrast. No shadows
Runa nórdica. In-Game asset. 2d. High contrast. No shadows
Escudo viquingo. In-Game asset. 2d. High contrast. No shadows
Una flecha de arco. In-Game asset. 2d. High contrast. No shadows
Pequeño rayo. In-Game asset. 2d. High contrast. No shadows
Serpiente marina vista desde arriba que viene de frente. In-Game asset. 2d. High contrast. No shadows