===================================================================
--- original.js
+++ change.js
@@ -249,10 +249,10 @@
}));
for (var i = 0; i < selectedBoons.length; i++) {
var boon = selectedBoons[i];
var boonButton = self.attachAsset('uiBoonUpgrade', {
- y: i * 120,
- x: -120,
+ y: i * 140,
+ x: -140,
anchorX: 0.5,
anchorY: 0.5,
tint: 0xDEC1AB // Slightly darker brown tint
});
@@ -268,9 +268,9 @@
anchorX: .5,
anchorY: .5
}));
var boonName = self.addChild(new BorderedText(boon, {
- x: boonButton.x + 60,
+ x: boonButton.x + 80,
y: boonButton.y,
size: 50,
anchorX: 0,
anchorY: .5
@@ -368,20 +368,22 @@
var pressed = false;
self.magnitude = 0;
self.direction = undefined;
self.down = function (x, y, obj) {
- movePosition = undefined; // Clear the global move postion
- if (x === 0 && y === 0) {
- self.magnitude = 0;
- self.direction = undefined;
- } else {
- var distance = Math.sqrt(x * x + y * y);
- if (distance <= size / 2) {
- pressed = true;
- knob.x = x;
- knob.y = y;
- self.magnitude = distance / maxDistance;
- self.direction = Math.atan2(y, x);
+ if (!isPaused) {
+ movePosition = undefined; // Clear the global move postion
+ if (x === 0 && y === 0) {
+ self.magnitude = 0;
+ self.direction = undefined;
+ } else {
+ var distance = Math.sqrt(x * x + y * y);
+ if (distance <= size / 2) {
+ pressed = true;
+ knob.x = x;
+ knob.y = y;
+ self.magnitude = distance / maxDistance;
+ self.direction = Math.atan2(y, x);
+ }
}
}
};
self.movement = function (x, y, obj) {
@@ -470,15 +472,15 @@
anchorY: 0.5,
rotation: config.direction - MATH_QUARTER_PI
});
self.update = function () {
+ if (LK.ticks % 15 === 0) {
+ self.graphics.scale.x *= -1;
+ self.graphics.scale.y *= -1;
+ self.graphics.rotation += Math.PI;
+ }
if (!isPaused) {
self.moveInDirection(config.direction, ENEMY_RANGED_PROJECTILE_SPEED);
- if (LK.ticks % 15 === 0) {
- 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();
} else if (!checkBounds(self.x, self.y, ENEMY_BORDER_SPAWN)) {
@@ -557,10 +559,11 @@
var Pickup = GameInstance.expand(function (config) {
var self = GameInstance.call(this, config);
self.tags[TAG_PICKUP] = true;
self.activated = false;
+ self.pickupRadius = self.radius;
self.update = function () {
- if (!isPaused && !self.activated && self.intersectsInstance(hero)) {
+ if (!isPaused && !self.activated && hero.intersectsRadius(self.x, self.y, self.pickupRadius)) {
self.activate();
}
};
self.activate = function () {
@@ -596,14 +599,16 @@
self.callDestroy();
};
self.setElevation(WEAPON_HEIGHT_BASE);
self.setRadius(self.graphics.width / 2);
+ self.pickupRadius = self.radius;
return self;
});
var PickupHealing = Pickup.expand(function (config) {
var self = Pickup.call(this, config);
var updateBase = self.update;
self.tags[TAG_HEALING] = true;
+ self.pickupRadius = PICKUP_HEALTH_RANGE;
self.graphics = self.attachAsset('pickupHealing', {
anchorX: 0.5,
anchorY: 1.0
});
@@ -612,9 +617,9 @@
updateBase();
}
};
self.onActivate = function () {
- hero.healPercentage(PICKUP_HEAL_MINOR);
+ hero.healPercentage(PICKUP_HEAL_MINOR_BASE + PICKUP_HEAL_MINOR_SCALING * minorBoonLevels[BOON_HEALTH]);
self.callDestroy();
};
self.onDestroy = function () {
pickupHealthCount--;
@@ -624,10 +629,12 @@
return self;
});
var PickupExperience = Pickup.expand(function (config) {
var self = Pickup.call(this, config);
- self.experience = config.experience;
+ var updateBase = self.update;
self.tags[TAG_EXPERIENCE] = true;
+ self.experience = config.experience;
+ self.pickupRadius = PICKUP_XP_RANGE;
// Try combine experience
// var combineCount = 1;
// var combineX = self.x;
// var combineY = self.y;
@@ -648,17 +655,16 @@
anchorX: 0.5,
anchorY: 1.0
});
self.update = function () {
- if (!isPaused) {
- if (self.activated) {
- var direction = Math.atan2(hero.y - self.y, hero.x - self.x);
- self.moveInDirection(direction, PICKUP_XP_SPEED);
- if (self.intersectsInstance(hero)) {
- self.callDestroy();
- }
- } else if (self.intersectsRadius(hero.x, hero.y, PICKUP_XP_ACTIVATE_RANGE)) {
- self.activate();
+ updateBase();
+ if (!isPaused && self.activated) {
+ var dx = hero.x - self.x;
+ var dy = (hero.y - self.y) / GAME_PERSPECTIVE;
+ var direction = Math.atan2(dy, dx);
+ self.moveInDirection(direction, PICKUP_XP_SPEED);
+ if (self.intersectsInstance(hero)) {
+ self.callDestroy();
}
}
};
self.onDestroy = function () {
@@ -682,9 +688,9 @@
}
}
for (var i = backgroundContainer.children.length - 1; i >= 0; i--) {
var child = backgroundContainer.children[i];
- if (child && child.tags[TAG_PICKUP] && (child.tags[TAG_EXPERIENCE] || child.tags[TAG_HEALING])) {
+ if (child && child.tags[TAG_PICKUP] && child.tags[TAG_EXPERIENCE]) {
child.activate();
}
}
LK.getSound('pickupCrucifix').play();
@@ -1012,9 +1018,9 @@
}
}
for (var i = backgroundContainer.children.length - 1; i >= 0; i--) {
var child = backgroundContainer.children[i];
- if (child && child.tags[TAG_PICKUP] && (child.tags[TAG_EXPERIENCE] || child.tags[TAG_HEALING])) {
+ if (child && child.tags[TAG_PICKUP] && child.tags[TAG_EXPERIENCE]) {
child.activate();
}
}
backgroundContainer.addChild(new PickupWeapon({
@@ -1044,8 +1050,9 @@
self.speed = ENEMY_BASIC_SPEED;
self.health = ENEMY_BASIC_HEALTH_BASE + ENEMY_BASIC_HEALTH_SCALE * difficultyScale;
self.attackRange = ENEMY_BASIC_ATTACK_RANGE;
self.attackCooldown = ENEMY_BASIC_ATTACK_COOLDOWN;
+ self.xpDropBase = ENEMY_BASIC_XP_DROP_BASE;
self.xpDropChance = ENEMY_BASIC_XP_DROP_CHANCE;
self.xpDropExtraRolls = ENEMY_BASIC_XP_EXTRA_ROLLS;
self.graphics = self.attachAsset('enemyBasic', {
anchorX: 0.5,
@@ -1063,9 +1070,9 @@
};
self.onDestroy = function () {
onDestroyBase();
if (checkBounds(self.x, self.y, HERO_BORDER)) {
- if (pickupCrucifixCount < PICKUP_CRUCIFIX_COUNT && Math.random() < Math.sqrt(minorBoonLevels['Luck']) / 100) {
+ if (pickupCrucifixCount < PICKUP_CRUCIFIX_COUNT && Math.random() < Math.sqrt(minorBoonLevels[BOON_LUCK]) / 100) {
backgroundContainer.addChild(new PickupCrucifix({
x: self.x,
y: self.y
}));
@@ -1082,9 +1089,9 @@
}
}
};
self.setElevation(ENEMY_BASIC_GRAPHICS_OFFSET);
- self.setRadius(45);
+ self.setRadius(ENEMY_BASIC_ATTACK_RANGE);
return self;
});
var EffectEnemyDeath = ConfigContainer.expand(function (config) {
var self = ConfigContainer.call(this, config);
@@ -1278,9 +1285,9 @@
var HERO_HEALTH_BONUS = 30;
var HERO_SPEED_BASE = 10;
var HERO_SPEED_BONUS = 3;
var HERO_XP_REQUIRED = 15;
-var HERO_XP_SCALING = 1.15;
+var HERO_XP_SCALING = 1.1;
;
// Boon settings
var BOON_OPTIONS = 3;
var BOON_MAX_LEVEL = 3;
@@ -1289,9 +1296,9 @@
var BOON_SCALE = 'Scale';
var BOON_RANGE = 'Range';
var BOON_DAMAGE = 'Damage';
var BOON_REARM = 'Rearm';
-var BOON_DURATION = 'Duration';
+var BOON_DURATION = 'Linger';
var BOON_HEALTH = 'Health';
var BOON_SPEED = 'Speed';
var BOON_GROWTH = 'Growth';
var BOON_SPLIT = 'Split';
@@ -1325,8 +1332,23 @@
var WEAPON_CROSS_ELEVATION = 175;
var WEAPON_CROSS_ROTATION = 0.2;
var WEAPON_CROSS_BORDER = -1000;
;
+var WEAPON_FIREBALL_FLASH_COLOUR = 0x0FA0FF;
+var WEAPON_FIREBALL_COOLDOWN_BASE = 120;
+var WEAPON_FIREBALL_COOLDOWN_SCALING = -20; // Per level of 'Rearm'
+var WEAPON_FIREBALL_DAMAGE_BASE = 20;
+var WEAPON_FIREBALL_DAMAGE_SCALING = 15;
+var WEAPON_FIREBALL_ROTATION_SPEED = 0.25 * Math.PI / GAME_TICKS;
+var WEAPON_FIREBALL_RADIUS_BASE = 80;
+var WEAPON_FIREBALL_RADIUS_SCALING = 0.35;
+var WEAPON_FIREBALL_DURATION_BASE = 60;
+var WEAPON_FIREBALL_DURATION_SCALING = 45;
+var WEAPON_FIREBALL_PIERCE_BASE = 2;
+var WEAPON_FIREBALL_PIERCE_SCALING = 1;
+var WEAPON_FIREBALL_GROWTH_SCALING = 0.15 / GAME_TICKS;
+var WEAPON_FIREBALL_PROJECTILE_OFFSET = 150;
+;
// Enemy settings
var ENEMY_COLOUR = 0xAA0000;
var ENEMY_BORDER = 50; // Forced minimum move distance from the edge of the screen
var ENEMY_BORDER_SPAWN = -300;
@@ -1343,15 +1365,16 @@
var ENEMY_BASIC_SPEED = 2.5;
var ENEMY_BASIC_HEALTH_BASE = 10;
var ENEMY_BASIC_HEALTH_SCALE = 50;
var ENEMY_BASIC_HEALTH_OFFSET = -30;
-var ENEMY_BASIC_ATTACK_RANGE = 100;
+var ENEMY_BASIC_ATTACK_RANGE = 50;
var ENEMY_BASIC_ATTACK_DAMAGE = 10;
var ENEMY_BASIC_ATTACK_COOLDOWN = GAME_TICKS / 3;
var ENEMY_BASIC_GRAPHICS_OFFSET = 115;
var ENEMY_BASIC_BOB_MAGNITUDE = 15;
var ENEMY_BASIC_BOB_PERIOD = 15;
-var ENEMY_BASIC_XP_DROP_CHANCE = 0.3; // Per level of Luck
+var ENEMY_BASIC_XP_DROP_BASE = 1;
+var ENEMY_BASIC_XP_DROP_CHANCE = 0.25; // Per level of Luck
var ENEMY_BASIC_XP_EXTRA_ROLLS = 2;
;
var ENEMY_RANGED_SPEED = 1.5;
var ENEMY_RANGED_HEALTH_BASE = 20;
@@ -1388,20 +1411,20 @@
var ENEMY_BOSS_PROJECTILE_ROTATION = MATH_2_PI / GAME_TICKS;
var ENEMY_BOSS_PROJECTILE_OFFSET = -100;
;
// Pickup settings
-var PICKUP_HEAL_MINOR = 0.1;
+var PICKUP_HEAL_MINOR_BASE = 0.20;
+var PICKUP_HEAL_MINOR_SCALING = 0.1;
var PICKUP_HEAL_MAJOR = 1.0;
var PICKUP_HEALTH_COUNT = 3;
var PICKUP_HEALTH_CHANCE = 0.02; // Per level of luck
+var PICKUP_HEALTH_RANGE = 250;
var PICKUP_CRUCIFIX_COUNT = 1;
-var PICKUP_CRUCIFIX_RANGE = 200;
-var PICKUP_WEAPON_RANGE = 200;
var PICKUP_XP_MEDIUM = 5;
var PICKUP_XP_LARGE = 10;
var PICKUP_XP_SPEED = 20;
+var PICKUP_XP_RANGE = 500;
var PICKUP_XP_COMBINE_RANGE = 150;
-var PICKUP_XP_ACTIVATE_RANGE = 300;
;
//==============================================================================
// Instances & variables
//==============================================================================
@@ -1410,28 +1433,25 @@
var id = 0;
var isPaused = false;
var movePosition;
var enemyCount = 0;
-var minorBoonCount = 1;
+var minorBoonCount = 3;
var majorBoonCount = 0;
var pickupHealthCount = 0;
var pickupCrucifixCount = 0;
var difficultyScale = 0;
-var startingWeapons = [];
-var minorBoonLevels = {
- 'Luck': 0,
- 'Scale': 0,
- 'Range': 0,
- 'Damage': 0,
- 'Rearm': 0,
- 'Duration': 0,
- 'Health': 0,
- 'Speed': 0
-};
-var majorBoonLevels = {
- 'Growth': 0,
- 'Split': 0
-};
+var minorBoonLevels = {};
+var majorBoonLevels = {};
+minorBoonLevels[BOON_LUCK] = 0;
+minorBoonLevels[BOON_SCALE] = 0;
+minorBoonLevels[BOON_RANGE] = 0;
+minorBoonLevels[BOON_DAMAGE] = 0;
+minorBoonLevels[BOON_REARM] = 0;
+minorBoonLevels[BOON_DURATION] = 0;
+minorBoonLevels[BOON_HEALTH] = 0;
+minorBoonLevels[BOON_SPEED] = 0;
+majorBoonLevels[BOON_GROWTH] = 0;
+majorBoonLevels[BOON_SPLIT] = 0;
;
// Game instances
game.attachAsset('grassTop', {
y: HERO_BORDER - 100,
@@ -1453,12 +1473,12 @@
x: GAME_WIDTH / 2,
y: GAME_HEIGHT / 2,
radius: 65
}));
-/*
+/*
backgroundContainer.addChild(new PickupWeapon({
- x: GAME_WIDTH / 4 * 2,
- y: GAME_HEIGHT / 4,
+ x: GAME_WIDTH / 2 + WEAPON_OFFSET,
+ y: GAME_HEIGHT / 2 - WEAPON_OFFSET * GAME_PERSPECTIVE,
scale: 1.25,
graphics: 'weaponFireball',
weaponClass: WeaponFireball
}));
@@ -1472,16 +1492,16 @@
}));
;
// Interface instances
var joystick = game.addChild(new Joystick({
- size: 400,
- x: GAME_WIDTH - 400,
- y: GAME_HEIGHT - 400
+ size: 500,
+ x: GAME_WIDTH - 450,
+ y: GAME_HEIGHT - 450
}));
var upgradeButton = interfaceContainer.addChild(new UiBoonUpgradeButton({
- x: GAME_WIDTH - 200,
- y: GAME_HEIGHT - 750,
- size: 200,
+ x: GAME_WIDTH - 250,
+ y: GAME_HEIGHT - 850,
+ size: 250,
callback: function callback() {
if (minorBoonCount + majorBoonCount > 0) {
showBoonSelection();
}
@@ -1567,16 +1587,17 @@
}
function checkBoonActions(boon) {
switch (boon) {
case BOON_HEALTH:
+ hero.health += HERO_HEALTH_BONUS;
hero.healthMax += HERO_HEALTH_BONUS;
hero.healPercentage(0); // Update the health bar
return true;
case BOON_SPEED:
hero.speed += HERO_SPEED_BONUS;
return true;
case BOON_MINOR_HEAL:
- hero.healPercentage(PICKUP_HEAL_MINOR);
+ hero.healPercentage(PICKUP_HEAL_MINOR_BASE + PICKUP_HEAL_MINOR_SCALING * minorBoonLevels[BOON_HEALTH]);
return false;
case BOON_FULL_HEAL:
hero.healPercentage(PICKUP_HEAL_MAJOR);
return false;
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