User prompt
make it not green and reg color and make this better ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Please fix the bug: 'TypeError: Cannot set properties of undefined (setting 'fill')' in or related to this line: 'self.costText.style.fill = "#ff6666";' Line Number: 177
Code edit (1 edits merged)
Please save this source code
User prompt
Hack Clicker Empire
Initial prompt
make hack clicker and i can set the image has what you are clicking
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
bits: 0,
bitsPerClick: 1,
autoClickerCount: 0,
autoClickerCost: 10,
autoClickerRate: 1,
serverCount: 0,
serverCost: 100,
serverRate: 5,
botnetCount: 0,
botnetCost: 1000,
botnetRate: 50,
targetType: "server"
});
/****
* Classes
****/
var HackingTarget = Container.expand(function () {
var self = Container.call(this);
var targetGraphics = self.attachAsset('target', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1,
scaleY: 1
});
// Clicked effect
self.click = function () {
// Play clicking sound
LK.getSound('click').play();
// Add bits based on current rate
var bitsEarned = storage.bitsPerClick;
storage.bits += bitsEarned;
// Visual feedback for click
LK.effects.flashObject(targetGraphics, 0xffffff, 300);
// Create temporary text showing bits earned
var earnText = new Text2("+" + bitsEarned, {
size: 60,
fill: 0x33FF33
});
earnText.anchor.set(0.5, 0.5);
earnText.x = 0;
earnText.y = 0;
self.addChild(earnText);
// Animate the text upward and fade out
tween(earnText, {
y: earnText.y - 100,
alpha: 0
}, {
duration: 1000,
easing: tween.easeOut,
onFinish: function onFinish() {
earnText.destroy();
}
});
// Slight grow/shrink effect
tween(targetGraphics, {
scaleX: 1.1,
scaleY: 1.1
}, {
duration: 100,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(targetGraphics, {
scaleX: 1,
scaleY: 1
}, {
duration: 200,
easing: tween.elasticOut
});
}
});
};
// Update target appearance based on type
self.updateType = function (type) {
if (type === 'server') {
targetGraphics.tint = 0x33ff33; // Green
} else if (type === 'terminal') {
targetGraphics.tint = 0x3366ff; // Blue
} else if (type === 'network') {
targetGraphics.tint = 0xff3366; // Red
}
};
// Event handlers
self.down = function (x, y, obj) {
self.click();
};
return self;
});
var TargetTypeButton = Container.expand(function (type, title) {
var self = Container.call(this);
var buttonBg = self.attachAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.8,
scaleY: 0.6
});
self.type = type;
// Button text
var titleText = new Text2(title, {
size: 35,
fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0.5);
self.addChild(titleText);
// Event handlers
self.down = function (x, y, obj) {
storage.targetType = type;
// Flash button to indicate selection
LK.effects.flashObject(buttonBg, 0xffffff, 200);
};
// Update appearance based on selection state
self.update = function () {
if (storage.targetType === self.type) {
buttonBg.tint = 0x33aa33;
} else {
buttonBg.tint = 0x555555;
}
};
return self;
});
var UpgradeButton = Container.expand(function (type, title) {
var self = Container.call(this);
var buttonBg = self.attachAsset('upgradeButton', {
anchorX: 0.5,
anchorY: 0.5
});
self.type = type;
// Button text
self.titleText = new Text2(title, {
size: 40,
fill: 0xFFFFFF
});
self.titleText.anchor.set(0.5, 0);
self.titleText.y = -30;
self.addChild(self.titleText);
// Cost text
self.costText = new Text2("", {
size: 30,
fill: 0xAAFFAA
});
self.costText.anchor.set(0.5, 1);
self.costText.y = 30;
self.addChild(self.costText);
// Update button cost display
self.updateCost = function () {
var cost = 0;
if (self.type === 'autoClicker') {
cost = storage.autoClickerCost;
} else if (self.type === 'server') {
cost = storage.serverCost;
} else if (self.type === 'botnet') {
cost = storage.botnetCost;
}
self.costText.setText("Cost: " + formatNumber(cost) + " bits");
// Visual indication of affordability
if (storage.bits >= cost) {
buttonBg.tint = 0x555555;
self.costText.style.fill = "#aaffaa";
} else {
buttonBg.tint = 0x333333;
self.costText.style.fill = "#ff6666";
}
};
// Purchase the upgrade
self.purchase = function () {
var cost = 0;
var canPurchase = false;
if (self.type === 'autoClicker') {
cost = storage.autoClickerCost;
if (storage.bits >= cost) {
storage.bits -= cost;
storage.autoClickerCount++;
storage.autoClickerCost = Math.floor(storage.autoClickerCost * 1.2);
canPurchase = true;
}
} else if (self.type === 'server') {
cost = storage.serverCost;
if (storage.bits >= cost) {
storage.bits -= cost;
storage.serverCount++;
storage.serverCost = Math.floor(storage.serverCost * 1.3);
canPurchase = true;
}
} else if (self.type === 'botnet') {
cost = storage.botnetCost;
if (storage.bits >= cost) {
storage.bits -= cost;
storage.botnetCount++;
storage.botnetCost = Math.floor(storage.botnetCost * 1.4);
canPurchase = true;
}
}
if (canPurchase) {
LK.getSound('upgrade').play();
LK.effects.flashObject(buttonBg, 0x33ff33, 300);
// Button pulse animation
tween(buttonBg, {
scaleX: 1.1,
scaleY: 1.1
}, {
duration: 100,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(buttonBg, {
scaleX: 1,
scaleY: 1
}, {
duration: 200,
easing: tween.elasticOut
});
}
});
}
};
// Event handlers
self.down = function (x, y, obj) {
self.purchase();
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x111111
});
/****
* Game Code
****/
// Format large numbers with K, M, B, T suffixes
function formatNumber(num) {
if (num < 1000) {
return num.toString();
}
if (num < 1000000) {
return (num / 1000).toFixed(1) + "K";
}
if (num < 1000000000) {
return (num / 1000000).toFixed(1) + "M";
}
if (num < 1000000000000) {
return (num / 1000000000).toFixed(1) + "B";
}
return (num / 1000000000000).toFixed(1) + "T";
}
// Game variables
var lastUpdate = Date.now();
var target;
var bitsText;
var bpsText;
var clickValueText;
var upgradeButtons = [];
var targetTypeButtons = [];
// Create hacking target
target = new HackingTarget();
target.x = 2048 / 2;
target.y = 800;
target.updateType(storage.targetType);
game.addChild(target);
// Create stats display
var statsBox = LK.getAsset('statsBackground', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 200,
alpha: 0.8
});
game.addChild(statsBox);
// Bits counter
bitsText = new Text2("Bits: " + formatNumber(storage.bits), {
size: 60,
fill: 0x33FF33
});
bitsText.anchor.set(0.5, 0);
bitsText.x = 2048 / 2;
bitsText.y = 140;
game.addChild(bitsText);
// Bits per second display
bpsText = new Text2("0 bits/sec", {
size: 40,
fill: 0xAAFFAA
});
bpsText.anchor.set(0.5, 0);
bpsText.x = 2048 / 2;
bpsText.y = 210;
game.addChild(bpsText);
// Bits per click display
clickValueText = new Text2("+" + storage.bitsPerClick + " bits/click", {
size: 35,
fill: 0xFFFFFF
});
clickValueText.anchor.set(0.5, 0);
clickValueText.x = 2048 / 2;
clickValueText.y = 260;
game.addChild(clickValueText);
// Create target type selection buttons
var targetTypes = [{
type: 'server',
title: 'Server'
}, {
type: 'terminal',
title: 'Terminal'
}, {
type: 'network',
title: 'Network'
}];
for (var i = 0; i < targetTypes.length; i++) {
var typeButton = new TargetTypeButton(targetTypes[i].type, targetTypes[i].title);
typeButton.x = 2048 / 2 + (i - 1) * 320;
typeButton.y = 400;
targetTypeButtons.push(typeButton);
game.addChild(typeButton);
}
// Create upgrade buttons
var upgradeTypes = [{
type: 'autoClicker',
title: 'Auto Clicker'
}, {
type: 'server',
title: 'Server Farm'
}, {
type: 'botnet',
title: 'Botnet'
}];
for (var i = 0; i < upgradeTypes.length; i++) {
var upgradeButton = new UpgradeButton(upgradeTypes[i].type, upgradeTypes[i].title);
upgradeButton.x = 2048 / 2;
upgradeButton.y = 1500 + i * 150;
upgradeButtons.push(upgradeButton);
game.addChild(upgradeButton);
}
// Play background music
LK.playMusic('hackerMusic');
// Game update function
game.update = function () {
// Calculate time since last update for idle income
var now = Date.now();
var deltaTime = (now - lastUpdate) / 1000; // Convert to seconds
lastUpdate = now;
// Calculate automated bits per second
var bitsPerSecond = storage.autoClickerCount * storage.autoClickerRate + storage.serverCount * storage.serverRate + storage.botnetCount * storage.botnetRate;
// Add earned bits
if (bitsPerSecond > 0) {
storage.bits += bitsPerSecond * deltaTime;
}
// Update UI
bitsText.setText("Bits: " + formatNumber(Math.floor(storage.bits)));
bpsText.setText(formatNumber(bitsPerSecond) + " bits/sec");
clickValueText.setText("+" + storage.bitsPerClick + " bits/click");
// Update target appearance based on selected type
target.updateType(storage.targetType);
// Update target type buttons
for (var i = 0; i < targetTypeButtons.length; i++) {
targetTypeButtons[i].update();
}
// Update upgrade button costs
for (var i = 0; i < upgradeButtons.length; i++) {
upgradeButtons[i].updateCost();
}
// Occasional subtle pulse animation on target to attract attention
if (LK.ticks % 180 === 0) {
tween(target, {
scaleX: 1.05,
scaleY: 1.05
}, {
duration: 300,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(target, {
scaleX: 1,
scaleY: 1
}, {
duration: 400,
easing: tween.elasticOut
});
}
});
}
// Check for milestone achievements
if (storage.bits >= 1000000 && storage.bitsPerClick === 1) {
storage.bitsPerClick = 2;
LK.effects.flashScreen(0x33ff33, 500);
} else if (storage.bits >= 10000000 && storage.bitsPerClick === 2) {
storage.bitsPerClick = 5;
LK.effects.flashScreen(0x33ff33, 500);
} else if (storage.bits >= 100000000 && storage.bitsPerClick === 5) {
storage.bitsPerClick = 10;
LK.effects.flashScreen(0x33ff33, 500);
}
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,397 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1", {
+ bits: 0,
+ bitsPerClick: 1,
+ autoClickerCount: 0,
+ autoClickerCost: 10,
+ autoClickerRate: 1,
+ serverCount: 0,
+ serverCost: 100,
+ serverRate: 5,
+ botnetCount: 0,
+ botnetCost: 1000,
+ botnetRate: 50,
+ targetType: "server"
+});
+
+/****
+* Classes
+****/
+var HackingTarget = Container.expand(function () {
+ var self = Container.call(this);
+ var targetGraphics = self.attachAsset('target', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 1,
+ scaleY: 1
+ });
+ // Clicked effect
+ self.click = function () {
+ // Play clicking sound
+ LK.getSound('click').play();
+ // Add bits based on current rate
+ var bitsEarned = storage.bitsPerClick;
+ storage.bits += bitsEarned;
+ // Visual feedback for click
+ LK.effects.flashObject(targetGraphics, 0xffffff, 300);
+ // Create temporary text showing bits earned
+ var earnText = new Text2("+" + bitsEarned, {
+ size: 60,
+ fill: 0x33FF33
+ });
+ earnText.anchor.set(0.5, 0.5);
+ earnText.x = 0;
+ earnText.y = 0;
+ self.addChild(earnText);
+ // Animate the text upward and fade out
+ tween(earnText, {
+ y: earnText.y - 100,
+ alpha: 0
+ }, {
+ duration: 1000,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ earnText.destroy();
+ }
+ });
+ // Slight grow/shrink effect
+ tween(targetGraphics, {
+ scaleX: 1.1,
+ scaleY: 1.1
+ }, {
+ duration: 100,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ tween(targetGraphics, {
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 200,
+ easing: tween.elasticOut
+ });
+ }
+ });
+ };
+ // Update target appearance based on type
+ self.updateType = function (type) {
+ if (type === 'server') {
+ targetGraphics.tint = 0x33ff33; // Green
+ } else if (type === 'terminal') {
+ targetGraphics.tint = 0x3366ff; // Blue
+ } else if (type === 'network') {
+ targetGraphics.tint = 0xff3366; // Red
+ }
+ };
+ // Event handlers
+ self.down = function (x, y, obj) {
+ self.click();
+ };
+ return self;
+});
+var TargetTypeButton = Container.expand(function (type, title) {
+ var self = Container.call(this);
+ var buttonBg = self.attachAsset('upgradeButton', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 0.8,
+ scaleY: 0.6
+ });
+ self.type = type;
+ // Button text
+ var titleText = new Text2(title, {
+ size: 35,
+ fill: 0xFFFFFF
+ });
+ titleText.anchor.set(0.5, 0.5);
+ self.addChild(titleText);
+ // Event handlers
+ self.down = function (x, y, obj) {
+ storage.targetType = type;
+ // Flash button to indicate selection
+ LK.effects.flashObject(buttonBg, 0xffffff, 200);
+ };
+ // Update appearance based on selection state
+ self.update = function () {
+ if (storage.targetType === self.type) {
+ buttonBg.tint = 0x33aa33;
+ } else {
+ buttonBg.tint = 0x555555;
+ }
+ };
+ return self;
+});
+var UpgradeButton = Container.expand(function (type, title) {
+ var self = Container.call(this);
+ var buttonBg = self.attachAsset('upgradeButton', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.type = type;
+ // Button text
+ self.titleText = new Text2(title, {
+ size: 40,
+ fill: 0xFFFFFF
+ });
+ self.titleText.anchor.set(0.5, 0);
+ self.titleText.y = -30;
+ self.addChild(self.titleText);
+ // Cost text
+ self.costText = new Text2("", {
+ size: 30,
+ fill: 0xAAFFAA
+ });
+ self.costText.anchor.set(0.5, 1);
+ self.costText.y = 30;
+ self.addChild(self.costText);
+ // Update button cost display
+ self.updateCost = function () {
+ var cost = 0;
+ if (self.type === 'autoClicker') {
+ cost = storage.autoClickerCost;
+ } else if (self.type === 'server') {
+ cost = storage.serverCost;
+ } else if (self.type === 'botnet') {
+ cost = storage.botnetCost;
+ }
+ self.costText.setText("Cost: " + formatNumber(cost) + " bits");
+ // Visual indication of affordability
+ if (storage.bits >= cost) {
+ buttonBg.tint = 0x555555;
+ self.costText.style.fill = "#aaffaa";
+ } else {
+ buttonBg.tint = 0x333333;
+ self.costText.style.fill = "#ff6666";
+ }
+ };
+ // Purchase the upgrade
+ self.purchase = function () {
+ var cost = 0;
+ var canPurchase = false;
+ if (self.type === 'autoClicker') {
+ cost = storage.autoClickerCost;
+ if (storage.bits >= cost) {
+ storage.bits -= cost;
+ storage.autoClickerCount++;
+ storage.autoClickerCost = Math.floor(storage.autoClickerCost * 1.2);
+ canPurchase = true;
+ }
+ } else if (self.type === 'server') {
+ cost = storage.serverCost;
+ if (storage.bits >= cost) {
+ storage.bits -= cost;
+ storage.serverCount++;
+ storage.serverCost = Math.floor(storage.serverCost * 1.3);
+ canPurchase = true;
+ }
+ } else if (self.type === 'botnet') {
+ cost = storage.botnetCost;
+ if (storage.bits >= cost) {
+ storage.bits -= cost;
+ storage.botnetCount++;
+ storage.botnetCost = Math.floor(storage.botnetCost * 1.4);
+ canPurchase = true;
+ }
+ }
+ if (canPurchase) {
+ LK.getSound('upgrade').play();
+ LK.effects.flashObject(buttonBg, 0x33ff33, 300);
+ // Button pulse animation
+ tween(buttonBg, {
+ scaleX: 1.1,
+ scaleY: 1.1
+ }, {
+ duration: 100,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ tween(buttonBg, {
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 200,
+ easing: tween.elasticOut
+ });
+ }
+ });
+ }
+ };
+ // Event handlers
+ self.down = function (x, y, obj) {
+ self.purchase();
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x111111
+});
+
+/****
+* Game Code
+****/
+// Format large numbers with K, M, B, T suffixes
+function formatNumber(num) {
+ if (num < 1000) {
+ return num.toString();
+ }
+ if (num < 1000000) {
+ return (num / 1000).toFixed(1) + "K";
+ }
+ if (num < 1000000000) {
+ return (num / 1000000).toFixed(1) + "M";
+ }
+ if (num < 1000000000000) {
+ return (num / 1000000000).toFixed(1) + "B";
+ }
+ return (num / 1000000000000).toFixed(1) + "T";
+}
+// Game variables
+var lastUpdate = Date.now();
+var target;
+var bitsText;
+var bpsText;
+var clickValueText;
+var upgradeButtons = [];
+var targetTypeButtons = [];
+// Create hacking target
+target = new HackingTarget();
+target.x = 2048 / 2;
+target.y = 800;
+target.updateType(storage.targetType);
+game.addChild(target);
+// Create stats display
+var statsBox = LK.getAsset('statsBackground', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 2048 / 2,
+ y: 200,
+ alpha: 0.8
+});
+game.addChild(statsBox);
+// Bits counter
+bitsText = new Text2("Bits: " + formatNumber(storage.bits), {
+ size: 60,
+ fill: 0x33FF33
+});
+bitsText.anchor.set(0.5, 0);
+bitsText.x = 2048 / 2;
+bitsText.y = 140;
+game.addChild(bitsText);
+// Bits per second display
+bpsText = new Text2("0 bits/sec", {
+ size: 40,
+ fill: 0xAAFFAA
+});
+bpsText.anchor.set(0.5, 0);
+bpsText.x = 2048 / 2;
+bpsText.y = 210;
+game.addChild(bpsText);
+// Bits per click display
+clickValueText = new Text2("+" + storage.bitsPerClick + " bits/click", {
+ size: 35,
+ fill: 0xFFFFFF
+});
+clickValueText.anchor.set(0.5, 0);
+clickValueText.x = 2048 / 2;
+clickValueText.y = 260;
+game.addChild(clickValueText);
+// Create target type selection buttons
+var targetTypes = [{
+ type: 'server',
+ title: 'Server'
+}, {
+ type: 'terminal',
+ title: 'Terminal'
+}, {
+ type: 'network',
+ title: 'Network'
+}];
+for (var i = 0; i < targetTypes.length; i++) {
+ var typeButton = new TargetTypeButton(targetTypes[i].type, targetTypes[i].title);
+ typeButton.x = 2048 / 2 + (i - 1) * 320;
+ typeButton.y = 400;
+ targetTypeButtons.push(typeButton);
+ game.addChild(typeButton);
+}
+// Create upgrade buttons
+var upgradeTypes = [{
+ type: 'autoClicker',
+ title: 'Auto Clicker'
+}, {
+ type: 'server',
+ title: 'Server Farm'
+}, {
+ type: 'botnet',
+ title: 'Botnet'
+}];
+for (var i = 0; i < upgradeTypes.length; i++) {
+ var upgradeButton = new UpgradeButton(upgradeTypes[i].type, upgradeTypes[i].title);
+ upgradeButton.x = 2048 / 2;
+ upgradeButton.y = 1500 + i * 150;
+ upgradeButtons.push(upgradeButton);
+ game.addChild(upgradeButton);
+}
+// Play background music
+LK.playMusic('hackerMusic');
+// Game update function
+game.update = function () {
+ // Calculate time since last update for idle income
+ var now = Date.now();
+ var deltaTime = (now - lastUpdate) / 1000; // Convert to seconds
+ lastUpdate = now;
+ // Calculate automated bits per second
+ var bitsPerSecond = storage.autoClickerCount * storage.autoClickerRate + storage.serverCount * storage.serverRate + storage.botnetCount * storage.botnetRate;
+ // Add earned bits
+ if (bitsPerSecond > 0) {
+ storage.bits += bitsPerSecond * deltaTime;
+ }
+ // Update UI
+ bitsText.setText("Bits: " + formatNumber(Math.floor(storage.bits)));
+ bpsText.setText(formatNumber(bitsPerSecond) + " bits/sec");
+ clickValueText.setText("+" + storage.bitsPerClick + " bits/click");
+ // Update target appearance based on selected type
+ target.updateType(storage.targetType);
+ // Update target type buttons
+ for (var i = 0; i < targetTypeButtons.length; i++) {
+ targetTypeButtons[i].update();
+ }
+ // Update upgrade button costs
+ for (var i = 0; i < upgradeButtons.length; i++) {
+ upgradeButtons[i].updateCost();
+ }
+ // Occasional subtle pulse animation on target to attract attention
+ if (LK.ticks % 180 === 0) {
+ tween(target, {
+ scaleX: 1.05,
+ scaleY: 1.05
+ }, {
+ duration: 300,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ tween(target, {
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 400,
+ easing: tween.elasticOut
+ });
+ }
+ });
+ }
+ // Check for milestone achievements
+ if (storage.bits >= 1000000 && storage.bitsPerClick === 1) {
+ storage.bitsPerClick = 2;
+ LK.effects.flashScreen(0x33ff33, 500);
+ } else if (storage.bits >= 10000000 && storage.bitsPerClick === 2) {
+ storage.bitsPerClick = 5;
+ LK.effects.flashScreen(0x33ff33, 500);
+ } else if (storage.bits >= 100000000 && storage.bitsPerClick === 5) {
+ storage.bitsPerClick = 10;
+ LK.effects.flashScreen(0x33ff33, 500);
+ }
+};
\ No newline at end of file