Code edit (3 edits merged)
Please save this source code
User prompt
when the countdowntimer summons the boss, also play the clockChime sound
Code edit (4 edits merged)
Please save this source code
User prompt
when the enemyboss dies, play the enemyroar sound
Code edit (2 edits merged)
Please save this source code
User prompt
when the hero dies, show the game over on the next frame
User prompt
when the hero dies, play the heroDeath sound
User prompt
when the hero takes damage, play the heroImpact sound
Code edit (1 edits merged)
Please save this source code
User prompt
when a projectilecross deals damage to an enemy, play the weaponCrossImpact sound
Code edit (2 edits merged)
Please save this source code
User prompt
when an enemy dies play the enemyDeath sound
Code edit (2 edits merged)
Please save this source code
User prompt
when the hero is healed, play the heroHealed sound effect
Code edit (1 edits merged)
Please save this source code
User prompt
in the enemyboss onupdate function, self.graphics.scale.x *= -1 every 15 LK.ticks
Code edit (1 edits merged)
Please save this source code
Code edit (17 edits merged)
Please save this source code
User prompt
on game start play the backgroundAmbient sound and every 10 seconds
Code edit (3 edits merged)
Please save this source code
User prompt
Please fix the bug: 'ReferenceError: ENEMY_RANGED_SPEED_PROJECTILE is not defined' in or related to this line: 'self.moveInDirection(config.direction, ENEMY_RANGED_SPEED_PROJECTILE);' Line Number: 454
Code edit (1 edits merged)
Please save this source code
Code edit (3 edits merged)
Please save this source code
User prompt
Please fix the bug: 'ReferenceError: adjustStateBase is not defined' in or related to this line: 'var newStateValues = adjustStateBase(state, stateValues);' Line Number: 944
Code edit (1 edits merged)
Please save this source code
===================================================================
--- original.js
+++ change.js
@@ -410,20 +410,20 @@
return self;
});
var ProjectileEnemy = GameInstance.expand(function (config) {
var self = GameInstance.call(this, config);
- var projectileAsset = self.attachAsset('projectileEnemy', {
+ self.graphics = self.attachAsset('projectileEnemy', {
anchorX: 0.5,
anchorY: 0.5,
rotation: config.direction - MATH_QUARTER_PI
});
self.update = function () {
if (!isPaused) {
self.moveInDirection(config.direction, ENEMY_RANGED_PROJECTILE_SPEED);
if (LK.ticks % 15 === 0) {
- projectileAsset.scale.x *= -1;
- projectileAsset.scale.y *= -1;
- projectileAsset.rotation += Math.PI;
+ self.graphics.scale.x *= -1;
+ self.graphics.scale.y *= -1;
+ self.graphics.rotation += Math.PI;
}
if (self.intersectsInstance(hero)) {
hero.takeDamage(config.damage);
self.callDestroy();
@@ -431,8 +431,9 @@
self.callDestroy();
}
}
};
+ self.setElevation(self.elevation);
return self;
});
var ProjectileCross = GameInstance.expand(function (config) {
var self = GameInstance.call(this, config);
@@ -617,9 +618,9 @@
});
self.onActivate = function () {
for (var i = midgroundContainer.children.length - 1; i >= 0; i--) {
var child = midgroundContainer.children[i];
- if (child.tags[TAG_ENEMY]) {
+ if (child.tags[TAG_ENEMY] && !child.tags[TAG_BOSS]) {
child.callDestroy();
}
}
for (var i = backgroundContainer.children.length - 1; i >= 0; i--) {
@@ -743,9 +744,8 @@
self.xpDropBase = 0;
self.xpDropChance = 0;
self.xpDropExtraRolls = 0;
self.update = function () {
- self.animationAlpha++;
if (!isPaused) {
var state = ENEMY_STATE_MOVE;
var dx = hero.x - self.x;
var dy = hero.y - self.y;
@@ -771,10 +771,11 @@
if (stateValues.canAttack && cooldown <= 0) {
cooldown = self.attackCooldown;
self.onAttack();
}
- self.onUpdate();
}
+ self.animationAlpha++;
+ self.onUpdate();
};
self.adjustState = function (state, stateValues) {
switch (state) {
case ENEMY_STATE_MOVE:
@@ -797,9 +798,9 @@
self.callDestroy();
} else {
if (!self.healthBar) {
self.healthBar = self.addChild(new ProgressBar({
- y: self.healthOffset,
+ y: -self.elevation - self.graphics.height * self.graphics.anchor.x + self.healthOffset,
tint: ENEMY_COLOUR
}));
}
self.healthBar.setPercentage(Math.max(0, 1 - damageTaken / self.health));
@@ -839,21 +840,27 @@
var EnemyRanged = Enemy.expand(function (config) {
var self = Enemy.call(this, config);
var adjustStateBase = self.adjustState;
self.speed = ENEMY_RANGED_SPEED;
+ self.attackRange = ENEMY_RANGED_RANGE_MIN + ENEMY_RANGED_RANGE_VAR * Math.random();
+ self.attackCooldown = ENEMY_RANGED_ATTACK_COOLDOWN;
self.fleeRange = self.attackRange * ENEMY_RANGED_FLEE_DISTANCE_FACTOR;
self.health = ENEMY_RANGED_HEALTH_BASE + ENEMY_RANGED_HEALTH_SCALE * difficultyScale;
self.healthOffset = ENEMY_RANGED_HEALTH_OFFSET;
- self.attackRange = ENEMY_RANGED_RANGE_MIN * ENEMY_RANGED_RANGE_VAR * Math.random();
- self.attackCooldown = ENEMY_RANGED_ATTACK_COOLDOWN;
self.xpDropBase = ENEMY_RANGED_XP_DROP_BASE;
self.xpDropChance = ENEMY_RANGED_XP_DROP_CHANCE;
self.xpDropExtraRolls = ENEMY_RANGED_XP_EXTRA_ROLLS;
self.graphics = self.attachAsset('enemyRanged', {
- y: ENEMY_RANGED_GRAPHICS_OFFSET,
- anchorX: 0.6,
+ anchorX: 0.5,
anchorY: 0.5
});
+ self.onUpdate = function () {
+ // Scale the enemy up and down
+ var newScale = 1 + Math.sin(self.animationAlpha / ENEMY_RANGED_SCALE_PERIOD) * ENEMY_RANGED_SCALE_MAGNITUDE;
+ self.graphics.scale.x = newScale;
+ self.graphics.scale.y = newScale;
+ self.setRadius(ENEMY_RANGED_RADIUS_BASE * newScale);
+ };
self.adjustState = function (state, stateValues) {
var newStateValues = adjustStateBase(state, stateValues);
switch (state) {
case ENEMY_STATE_MOVE:
@@ -870,32 +877,26 @@
var dx = hero.x - self.x;
var dy = (hero.y - self.y) / GAME_PERSPECTIVE;
midgroundContainer.addChild(new ProjectileEnemy({
x: self.x,
- y: self.y + self.elevation,
+ y: self.y - self.graphics.y,
direction: Math.atan2(dy, dx),
elevation: self.elevation,
radius: ENEMY_RANGED_PROJECTILE_RADIUS,
damage: ENEMY_RANGED_ATTACK_DAMAGE
}));
};
- self.onUpdate = function () {
- // Scale the enemy up and down
- var newScale = 1 + Math.sin(self.animationAlpha / ENEMY_RANGED_SCALE_PERIOD) * ENEMY_RANGED_SCALE_MAGNITUDE;
- self.graphics.scale.x = newScale;
- self.graphics.scale.y = newScale;
- };
- self.setRadius(self.graphics.width / 2);
- self.setElevation(ENEMY_RANGED_GRAPHICS_OFFSET);
+ self.setElevation(ENEMY_RANGED_ELEVATION);
+ self.setRadius(ENEMY_RANGED_RADIUS_BASE);
return self;
});
var EnemyBoss = Enemy.expand(function (config) {
var self = Enemy.call(this, config);
- var baseUpdate = self.update;
var adjustStateBase = self.adjustState;
var container = self.addChild(new SortingContainer(function (a, b) {
return Math.sin(a.rotation) - Math.sin(b.rotation);
}));
+ self.tags[TAG_BOSS] = true;
self.speed = ENEMY_BOSS_SPEED;
self.health = ENEMY_BOSS_HEALTH;
self.attackRange = ENEMY_BOSS_ATTACK_RANGE;
self.attackCooldown = ENEMY_BOSS_ATTACK_COOLDOWN;
@@ -934,9 +935,9 @@
enemySpawner.setEnabled(false);
upgradeButton.setHidden(true);
for (var i = midgroundContainer.children.length - 1; i >= 0; i--) {
var child = midgroundContainer.children[i];
- if (child.tags[TAG_ENEMY]) {
+ if (child.tags[TAG_ENEMY] && !child.tags[TAG_BOSS]) {
child.callDestroy();
}
}
for (var i = backgroundContainer.children.length - 1; i >= 0; i--) {
@@ -967,9 +968,8 @@
return self;
});
var EnemyBasic = Enemy.expand(function (config) {
var self = Enemy.call(this, config);
- var updateBase = self.update;
var onDestroyBase = self.onDestroy;
self.speed = ENEMY_BASIC_SPEED;
self.health = ENEMY_BASIC_HEALTH_BASE + ENEMY_BASIC_HEALTH_SCALE * difficultyScale;
self.attackRange = ENEMY_BASIC_ATTACK_RANGE;
@@ -979,10 +979,9 @@
self.graphics = self.attachAsset('enemyBasic', {
anchorX: 0.5,
anchorY: 1.0
});
- self.update = function () {
- updateBase();
+ self.onUpdate = function () {
self.setElevation(ENEMY_BASIC_GRAPHICS_OFFSET + ENEMY_BASIC_BOB_MAGNITUDE * Math.sin(self.animationAlpha / ENEMY_BASIC_BOB_PERIOD));
if (self.healthBar) {
self.healthOffset = -self.elevation - self.graphics.height + ENEMY_BASIC_HEALTH_OFFSET;
self.healthBar.y = self.healthOffset;
@@ -1072,9 +1071,9 @@
var enabled = true;
self.update = function () {
if (!isPaused && enabled && enemyCount < ENEMY_LIMIT && --spawnTimer <= 0) {
spawnTimer = Math.max(ENEMY_SPAWN_RATE_MIN, ENEMY_SPAWN_RATE_BASE - Math.floor(ENEMY_SPAWN_RATE_SCALE * difficultyScale));
- var isRanged = difficultyScale >= ENEMY_RANGED_DIFFICULTY && Math.random() < Math.min(ENEMY_RANGED_SPAWN_CHANCE_MIN, ENEMY_RANGED_SPAWN_CHANCE_FACTOR * difficultyScale);
+ var isRanged = difficultyScale >= ENEMY_RANGED_SPAWN_DIFFICULTY && Math.random() < Math.max(ENEMY_RANGED_SPAWN_CHANCE_MIN, ENEMY_RANGED_SPAWN_CHANCE_FACTOR * difficultyScale);
var enemyClass = isRanged ? EnemyRanged : EnemyBasic;
self.spawnClass(enemyClass);
}
};
@@ -1135,8 +1134,15 @@
/****
* Game Code
****/
+// Play background ambient sound every 10 seconds
+LK.setInterval(function () {
+ backgroundAmbientSound.play();
+}, 10000);
+// Play background ambient sound on game start
+var backgroundAmbientSound = LK.getSound('backgroundAmbient');
+backgroundAmbientSound.play();
;
//==============================================================================
// Global constants & settings
//==============================================================================
@@ -1163,8 +1169,9 @@
var GAME_PERSPECTIVE = 0.5;
;
// Tags
var TAG_ENEMY = 'Enemy';
+var TAG_BOSS = 'Boss';
var TAG_PROJECTILE = 'Projectile';
var TAG_PICKUP = 'Pickup';
var TAG_EXPERIENCE = 'Experience';
var TAG_CRUCIFIX = 'Crucifix';
@@ -1202,24 +1209,25 @@
var WEAPON_OFFSET = 350;
var WEAPON_HEIGHT_BASE = 50;
var WEAPON_HEIGHT_PERIOD = 10;
var WEAPON_HEIGHT_MAGNITUDE = 10;
+;
var WEAPON_CROSS_SPLIT_INCREMENT = 20 / 180 * Math.PI;
var WEAPON_CROSS_RANGE_BASE = 200;
var WEAPON_CROSS_RANGE_SCALING = 100;
var WEAPON_CROSS_RANGE_VARIATION = 0.1;
var WEAPON_CROSS_RADIUS_BASE = 50;
-var WEAPON_CROSS_SCALE_SCALING = 0.25;
+var WEAPON_CROSS_SCALE_SCALING = 0.2;
var WEAPON_CROSS_SCALE_DAMAGE_FACTOR = 0.1;
var WEAPON_CROSS_COOLDOWN_HIT = GAME_TICKS / 6;
var WEAPON_CROSS_COOLDOWN_BASE = 120;
-var WEAPON_CROSS_COOLDOWN_SCALING = 0.25;
+var WEAPON_CROSS_COOLDOWN_SCALING = 0.15;
var WEAPON_CROSS_DAMAGE_BASE = 15;
var WEAPON_CROSS_DAMAGE_SCALING = 10;
var WEAPON_CROSS_LINGER_BASE = 0;
var WEAPON_CROSS_LINGER_VARIANCE = GAME_TICKS / 6;
var WEAPON_CROSS_LINGER_SCALING = 0.25 * GAME_TICKS;
-var WEAPON_CROSS_GROWTH_SCALING = 0.15 / GAME_TICKS;
+var WEAPON_CROSS_GROWTH_SCALING = 0.20 / GAME_TICKS;
var WEAPON_CROSS_SPEED_BASE = 30;
var WEAPON_CROSS_SPEED_DECREMENT = 1;
var WEAPON_CROSS_ELEVATION = 175;
var WEAPON_CROSS_ROTATION = 0.2;
@@ -1254,30 +1262,31 @@
;
var ENEMY_RANGED_SPEED = 1.0;
var ENEMY_RANGED_HEALTH_BASE = 20;
var ENEMY_RANGED_HEALTH_SCALE = 60;
-var ENEMY_RANGED_HEALTH_OFFSET = 20;
+var ENEMY_RANGED_HEALTH_OFFSET = -20;
var ENEMY_RANGED_RANGE_MIN = 500;
var ENEMY_RANGED_RANGE_VAR = 250;
var ENEMY_RANGED_ATTACK_DAMAGE = 5;
var ENEMY_RANGED_ATTACK_COOLDOWN = 4 * GAME_TICKS;
-var ENEMY_RANGED_MOVE_COOLDOWN_ADJUSTMENT = -0.5;
-var ENEMY_RANGED_GRAPHICS_OFFSET = 200;
+var ENEMY_RANGED_MOVE_COOLDOWN_ADJUSTMENT = -0.25;
+var ENEMY_RANGED_ELEVATION = 150;
var ENEMY_RANGED_FLEE_DISTANCE_FACTOR = 0.35;
var ENEMY_RANGED_FLEE_SPEED_FACTOR = 2.0;
var ENEMY_RANGED_SCALE_PERIOD = 20;
var ENEMY_RANGED_SCALE_MAGNITUDE = 0.05;
+var ENEMY_RANGED_RADIUS_BASE = 60;
var ENEMY_RANGED_XP_DROP_BASE = 2;
var ENEMY_RANGED_XP_DROP_CHANCE = 0.5; // Per level of Luck
var ENEMY_RANGED_XP_EXTRA_ROLLS = 0;
-var ENEMY_RANGED_DIFFICULTY = 0.2;
-var ENEMY_RANGED_SPAWN_CHANCE_MIN = 0.4;
-var ENEMY_RANGED_SPAWN_CHANCE_FACTOR = 0.5;
+var ENEMY_RANGED_SPAWN_DIFFICULTY = 0; // 0.2;
+var ENEMY_RANGED_SPAWN_CHANCE_MIN = 0.2;
+var ENEMY_RANGED_SPAWN_CHANCE_FACTOR = 0.6;
var ENEMY_RANGED_PROJECTILE_SPEED = 10;
-var ENEMY_RANGED_PROJECTILE_RADIUS = 50;
+var ENEMY_RANGED_PROJECTILE_RADIUS = 25;
;
var ENEMY_BOSS_SPEED = 3.0;
-var ENEMY_BOSS_HEALTH = 5000;
+var ENEMY_BOSS_HEALTH = 10000;
var ENEMY_BOSS_HEALTH_OFFSET = -30;
var ENEMY_BOSS_ATTACK_RANGE = 200;
var ENEMY_BOSS_ATTACK_DAMAGE = 5;
var ENEMY_BOSS_ATTACK_COOLDOWN = GAME_TICKS / 6;
@@ -1325,10 +1334,10 @@
'Health': 0,
'Speed': 0
};
var majorBoonLevels = {
- 'Growth': 0,
- 'Split': 0
+ 'Growth': 3,
+ 'Split': 3
};
;
// Game instances
game.attachAsset('grassTop', {
@@ -1349,9 +1358,9 @@
var interfaceContainer = game.addChild(new Container());
var hero = midgroundContainer.addChild(new Hero({
x: GAME_WIDTH / 2,
y: GAME_HEIGHT / 2,
- radius: 75
+ radius: 65
}));
/*
backgroundContainer.addChild(new PickupWeapon({
x: GAME_WIDTH / 4 * 2,
pixel art cross with blue accents Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
pixel art of a white orb. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
pixel art of a white orb with a halo. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
pixel art of a pulsating white heart with a halo. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
pixel art of a dark goo projectile with red highlights. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
pixel art tall blue fireball. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
pixel art of an evil fantasy sword facing downward. Minor red details. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
backgroundAmbient
Sound effect
heroHealed
Sound effect
pickupExperience
Sound effect
heroLeveled
Sound effect
weaponCrossImpact
Sound effect
heroImpact
Sound effect
enemyDeath
Sound effect
pickupWeapon
Sound effect
pickupCrucifix
Sound effect
weaponCrossLaunch
Sound effect
heroDeath
Sound effect
enemyRoar
Sound effect
clockChime
Sound effect