User prompt
Make it so sometimes swords can fail to forge not always but sometimes
User prompt
Make the sword actually look different when you add the different sword types together and make more types of handles and more other sword part types and make it so you can scroll down to select the different sword types too
User prompt
Make more types of swords so THERES more options then a basic sword and more types of sword ingredients so you can craft the different types of swords
User prompt
Connect the sword with the parts more
User prompt
Make the sword look more realistic looking
User prompt
Make the sword spawn somewhere in the middle when you click craft and make the sword not spawn when the ingredients aren’t on the crafts table
User prompt
When you click craft it makes a sword appear
User prompt
Well make it so when you drag all the sword ingredients you have into the slots on the crafts table to make the sword
User prompt
And you can drag the ingredients for the sword to the crafts table to make the sword
Code edit (1 edits merged)
Please save this source code
User prompt
Forge & Craft: Sword Smithy
Initial prompt
A game about crafting swords on a crafts table that is a dark brown a bit big square with a long tan rectangle on the top
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var CraftedSword = Container.expand(function () {
var self = Container.call(this);
self.quality = 1;
self.materials = {
blade: null,
handle: null,
guard: null
};
self.bladeAsset = 'blade';
self.handleAsset = 'handle';
self.guardAsset = 'crossguard';
var bladeGraphics = LK.getAsset('blade', {
anchorX: 0.5,
anchorY: 1
});
var bladeEdgeGraphics = LK.getAsset('bladeEdge', {
anchorX: 0.5,
//{d_new}
anchorY: 1 //{e_new}
}); //{f_new}
var crossguardGraphics = LK.getAsset('crossguard', {
anchorX: 0.5,
//{g_new}
anchorY: 0.5 //{h_new}
}); //{i_new}
var handleGraphics = LK.getAsset('handle', {
anchorX: 0.5,
anchorY: 0.2
});
var connectorTop = LK.getAsset('connectorPart', {
anchorX: 0.5,
anchorY: 0.5
});
var connectorBottom = LK.getAsset('connectorPart', {
anchorX: 0.5,
anchorY: 0.5
});
self.bladeGraphics = bladeGraphics;
self.bladeEdgeGraphics = bladeEdgeGraphics;
self.crossguardGraphics = crossguardGraphics;
self.handleGraphics = handleGraphics;
self.addChild(bladeGraphics);
self.addChild(bladeEdgeGraphics);
self.addChild(connectorTop);
self.addChild(crossguardGraphics);
self.addChild(connectorBottom);
self.addChild(handleGraphics);
bladeGraphics.y = -100;
bladeEdgeGraphics.y = -100;
connectorTop.y = -45;
crossguardGraphics.y = 10;
connectorBottom.y = 60;
handleGraphics.y = 100;
connectorTop.tint = 0x606060;
connectorBottom.tint = 0x606060;
bladeGraphics.tint = 0xe8e8e8;
bladeEdgeGraphics.tint = 0x606060;
self.setCraftedSword = function (materials, quality) {
self.materials = materials;
self.quality = quality;
var recipe = getRecipeFromMaterials(materials);
self.swordType = recipe;
self.updateColor();
self.updateVisualParts();
tween(self, {
scaleX: 1,
scaleY: 1
}, {
duration: 500,
easing: tween.elasticOut
});
};
self.updateVisualParts = function () {
if (self.swordType.bladeAsset && self.swordType.bladeAsset !== 'blade') {
self.removeChild(self.bladeGraphics);
self.bladeGraphics = LK.getAsset(self.swordType.bladeAsset, {
anchorX: 0.5,
anchorY: 1
});
self.addChildAt(self.bladeGraphics, 0);
self.bladeGraphics.y = -100;
}
if (self.swordType.handleAsset && self.swordType.handleAsset !== 'handle') {
self.removeChild(self.handleGraphics);
self.handleGraphics = LK.getAsset(self.swordType.handleAsset, {
anchorX: 0.5,
anchorY: 0.2
});
self.addChild(self.handleGraphics);
self.handleGraphics.y = 100;
}
if (self.swordType.guardAsset && self.swordType.guardAsset !== 'crossguard') {
self.removeChild(self.crossguardGraphics);
self.crossguardGraphics = LK.getAsset(self.swordType.guardAsset, {
anchorX: 0.5,
anchorY: 0.5
});
var guardIdx = self.getChildIndex(self.crossguardGraphics);
self.addChildAt(self.crossguardGraphics, Math.max(0, guardIdx));
self.crossguardGraphics.y = 10;
}
};
self.updateColor = function () {
var baseColor = self.swordType.color || 0xe8e8e8;
var edgeColor = self.swordType.edgeColor || 0x606060;
var guardColor = self.swordType.guardColor || 0xffd700;
bladeGraphics.tint = baseColor;
bladeEdgeGraphics.tint = edgeColor;
crossguardGraphics.tint = guardColor;
connectorTop.tint = edgeColor;
connectorBottom.tint = edgeColor;
if (self.quality >= 2) {
var enhancedBlade = baseColor;
var enhancedEdge = edgeColor;
if (self.quality === 2) {
enhancedBlade = baseColor;
enhancedEdge = edgeColor;
}
bladeGraphics.tint = enhancedBlade;
bladeEdgeGraphics.tint = enhancedEdge;
connectorTop.tint = enhancedEdge;
connectorBottom.tint = enhancedEdge;
}
if (self.quality >= 3) {
handleGraphics.tint = 0xff6b35;
connectorTop.tint = guardColor;
connectorBottom.tint = guardColor;
}
};
self.scaleX = 0.5;
self.scaleY = 0.5;
return self;
});
var CraftingWorkbench = Container.expand(function () {
var self = Container.call(this);
var tableGraphics = self.attachAsset('craftingTable', {
anchorX: 0.5,
anchorY: 0.5
});
var workSurfaceGraphics = LK.getAsset('workSurface', {
anchorX: 0.5,
anchorY: 0.5
});
self.addChild(workSurfaceGraphics);
workSurfaceGraphics.y = -50;
self.materialSlots = [];
self.selectedSlots = [];
var slot1 = new MaterialSlot();
slot1.x = -280;
slot1.y = -150;
slot1.slotIndex = 0;
self.addChild(slot1);
self.materialSlots.push(slot1);
var slot2 = new MaterialSlot();
slot2.x = 0;
slot2.y = -150;
slot2.slotIndex = 1;
self.addChild(slot2);
self.materialSlots.push(slot2);
var slot3 = new MaterialSlot();
slot3.x = 280;
slot3.y = -150;
slot3.slotIndex = 2;
self.addChild(slot3);
self.materialSlots.push(slot3);
var craftButtonGraphics = LK.getAsset('craftButton', {
anchorX: 0.5,
anchorY: 0.5
});
self.addChild(craftButtonGraphics);
craftButtonGraphics.x = 0;
craftButtonGraphics.y = 250;
var craftButtonText = new Text2('CRAFT', {
size: 50,
fill: '#ffffff'
});
craftButtonText.anchor.set(0.5, 0.5);
self.addChild(craftButtonText);
craftButtonText.x = 0;
craftButtonText.y = 250;
self.craftButtonGraphics = craftButtonGraphics;
self.craftButtonGraphics.down = function (x, y, obj) {
self.attemptCraft();
};
self.attemptCraft = function () {
var selectedCount = 0;
var materials = {};
for (var i = 0; i < self.materialSlots.length; i++) {
if (self.materialSlots[i].materialType) {
selectedCount++;
var matType = self.materialSlots[i].materialType;
materials[matType] = true;
}
}
if (selectedCount < 3) {
tween(self.craftButtonGraphics, {
tint: 0xff0000
}, {
duration: 200,
onFinish: function onFinish() {
tween(self.craftButtonGraphics, {
tint: 0xff6b35
}, {
duration: 200
});
}
});
return;
}
if (selectedCount === 3) {
var failureChance = 0.3;
var willFail = Math.random() < failureChance;
if (willFail) {
self.failedCraft();
} else {
self.successfulCraft(materials);
}
} else {
self.failedCraft();
}
};
self.successfulCraft = function (materials) {
LK.getSound('craftSuccess').play();
var quality = Math.floor(Math.random() * 3) + 1;
LK.setScore(LK.getScore() + quality * 10);
for (var i = 0; i < self.materialSlots.length; i++) {
self.materialSlots[i].clear();
}
storage.swordsForged = (storage.swordsForged || 0) + 1;
var craftedSword = new CraftedSword();
game.addChild(craftedSword);
craftedSword.x = 1024;
craftedSword.y = 1366;
craftedSword.setCraftedSword(materials, quality);
craftedSwordsCollection.push(craftedSword);
tween(self.craftButtonGraphics, {
scaleX: 1.1,
scaleY: 1.1
}, {
duration: 300,
easing: tween.elasticOut
});
tween(self.craftButtonGraphics, {
scaleX: 1,
scaleY: 1
}, {
duration: 300
});
};
self.failedCraft = function () {
for (var i = 0; i < self.materialSlots.length; i++) {
self.materialSlots[i].clear();
}
};
self.addMaterialToSlot = function (slotIndex, materialType) {
if (slotIndex < self.materialSlots.length) {
self.materialSlots[slotIndex].setMaterial(materialType);
}
};
return self;
});
var MaterialSelector = Container.expand(function () {
var self = Container.call(this);
self.materials = ['ironBlade', 'goldenBlade', 'darkBlade', 'silverBlade', 'curvedBlade', 'ironHandle', 'leatherHandle', 'silverHandle', 'boneHandle', 'ebonyHandle', 'stoneGuard', 'rubyGuard', 'sapphireGuard', 'emeraldGuard'];
self.buttons = [];
self.scrollOffset = 0;
self.maxScroll = Math.max(0, Math.ceil(self.materials.length / 4) - 2);
var scrollContainer = new Container();
self.addChild(scrollContainer);
self.scrollContainer = scrollContainer;
self.updateMaterialDisplay = function () {
for (var btn = 0; btn < self.buttons.length; btn++) {
self.scrollContainer.removeChild(self.buttons[btn].graphic);
}
self.buttons = [];
var visibleMaterials = 8;
var startIdx = self.scrollOffset * 4;
var endIdx = Math.min(startIdx + visibleMaterials, self.materials.length);
var positions = [-450, -150, 150, 450, -450, -150, 150, 450];
var yPositions = [0, 0, 0, 0, -180, -180, -180, -180];
for (var i = startIdx; i < endIdx; i++) {
var buttonGraphics = LK.getAsset('materialSlot', {
anchorX: 0.5,
anchorY: 0.5
});
self.scrollContainer.addChild(buttonGraphics);
var posIdx = i - startIdx;
buttonGraphics.x = positions[posIdx];
buttonGraphics.y = yPositions[posIdx];
var materialType = self.materials[i];
var displayName = materialType.replace(/([A-Z])/g, ' $1').trim().toUpperCase();
var buttonText = new Text2(displayName, {
size: 30,
fill: '#ffffff'
});
buttonText.anchor.set(0.5, 0.5);
self.scrollContainer.addChild(buttonText);
buttonText.x = positions[posIdx];
buttonText.y = yPositions[posIdx];
(function (type, graphic) {
graphic.down = function (x, y, obj) {
draggedMaterial = type;
draggedButton = graphic;
tween(graphic, {
scaleX: 1.1,
scaleY: 1.1,
alpha: 0.7
}, {
duration: 100
});
LK.getSound('selectMaterial').play();
};
})(materialType, buttonGraphics);
buttonGraphics.graphic = buttonGraphics;
self.buttons.push({
graphic: buttonGraphics,
up: function up() {
tween(this.graphic, {
scaleX: 1,
scaleY: 1,
alpha: 1
}, {
duration: 100
});
draggedMaterial = null;
draggedButton = null;
}
});
}
};
self.scroll = function (direction) {
if (direction > 0 && self.scrollOffset < self.maxScroll) {
self.scrollOffset++;
self.updateMaterialDisplay();
} else if (direction < 0 && self.scrollOffset > 0) {
self.scrollOffset--;
self.updateMaterialDisplay();
}
};
self.updateMaterialDisplay();
return self;
});
var MaterialSlot = Container.expand(function () {
var self = Container.call(this);
var slotGraphics = self.attachAsset('materialSlot', {
anchorX: 0.5,
anchorY: 0.5
});
self.slotGraphics = slotGraphics;
self.materialType = null;
self.selected = false;
self.slotIndex = 0;
self.down = function (x, y, obj) {
if (draggedMaterial && !self.materialType) {
self.setMaterial(draggedMaterial);
draggedMaterial = null;
if (draggedButton) {
tween(draggedButton, {
scaleX: 1,
scaleY: 1,
alpha: 1
}, {
duration: 100
});
draggedButton = null;
}
} else if (!self.selected) {
self.select();
} else {
self.deselect();
}
LK.getSound('selectMaterial').play();
};
self.select = function () {
self.selected = true;
slotGraphics.tint = 0xffaa00;
tween(slotGraphics, {
tint: 0xff6b35
}, {
duration: 300
});
};
self.deselect = function () {
self.selected = false;
slotGraphics.tint = 0x8b7355;
};
self.setMaterial = function (material) {
self.materialType = material;
self.updateVisuals();
};
self.updateVisuals = function () {
if (self.materialType === 'blade' || self.materialType === 'ironBlade' || self.materialType === 'goldenBlade' || self.materialType === 'darkBlade') {
slotGraphics.tint = 0xc0c0c0;
} else if (self.materialType === 'handle' || self.materialType === 'ironHandle' || self.materialType === 'leatherHandle') {
slotGraphics.tint = 0x8b4513;
} else if (self.materialType === 'guard' || self.materialType === 'stoneGuard' || self.materialType === 'rubyGuard') {
slotGraphics.tint = 0xffd700;
}
};
self.clear = function () {
self.materialType = null;
self.selected = false;
slotGraphics.tint = 0x8b7355;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1a1a1a
});
/****
* Game Code
****/
var workbench = null;
var materialSelector = null;
var craftedSwordsCollection = [];
var selectedMaterialType = null;
var selectedSlot = null;
var draggedMaterial = null;
var draggedButton = null;
var swordRecipes = {
basic: {
blade: 'blade',
handle: 'handle',
guard: 'guard',
bladeAsset: 'blade',
handleAsset: 'handle',
guardAsset: 'crossguard',
color: 0xe8e8e8,
edgeColor: 0x606060,
guardColor: 0xffd700,
name: 'Basic Sword'
},
iron: {
blade: 'ironBlade',
handle: 'ironHandle',
guard: 'stoneGuard',
bladeAsset: 'ironBlade',
handleAsset: 'ironHandle',
guardAsset: 'stoneGuard',
color: 0x505050,
edgeColor: 0x303030,
guardColor: 0x808080,
name: 'Iron Sword'
},
golden: {
blade: 'goldenBlade',
handle: 'leatherHandle',
guard: 'rubyGuard',
bladeAsset: 'goldenBlade',
handleAsset: 'leatherHandle',
guardAsset: 'rubyGuard',
color: 0xffd700,
edgeColor: 0xffaa00,
guardColor: 0xff0000,
name: 'Golden Sword'
},
dark: {
blade: 'darkBlade',
handle: 'ironHandle',
guard: 'rubyGuard',
bladeAsset: 'darkBlade',
handleAsset: 'ebonyHandle',
guardAsset: 'rubyGuard',
color: 0x1a1a1a,
edgeColor: 0x333333,
guardColor: 0xff0000,
name: 'Dark Sword'
},
elite: {
blade: 'silverBlade',
handle: 'silverHandle',
guard: 'sapphireGuard',
bladeAsset: 'silverBlade',
handleAsset: 'silverHandle',
guardAsset: 'sapphireGuard',
color: 0xc0c0c0,
edgeColor: 0xffffff,
guardColor: 0x0f52ba,
name: 'Elite Sword'
},
forest: {
blade: 'curvedBlade',
handle: 'boneHandle',
guard: 'emeraldGuard',
bladeAsset: 'curvedBlade',
handleAsset: 'boneHandle',
guardAsset: 'emeraldGuard',
color: 0x228b22,
edgeColor: 0x90ee90,
guardColor: 0x50c878,
name: 'Forest Sword'
}
};
function getRecipeFromMaterials(materials) {
if (materials.ironBlade && materials.ironHandle && materials.stoneGuard) {
return swordRecipes.iron;
}
if (materials.goldenBlade && materials.leatherHandle && materials.rubyGuard) {
return swordRecipes.golden;
}
if (materials.darkBlade && materials.ebonyHandle && materials.rubyGuard) {
return swordRecipes.dark;
}
if (materials.silverBlade && materials.silverHandle && materials.sapphireGuard) {
return swordRecipes.elite;
}
if (materials.curvedBlade && materials.boneHandle && materials.emeraldGuard) {
return swordRecipes.forest;
}
return swordRecipes.basic;
}
function initializeGame() {
workbench = game.addChild(new CraftingWorkbench());
workbench.x = 1024;
workbench.y = 1000;
materialSelector = game.addChild(new MaterialSelector());
materialSelector.x = 1024;
materialSelector.y = 2400;
var scoreText = new Text2('Swords Forged: 0', {
size: 60,
fill: '#ffffff'
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
LK.playMusic('forgeMusic');
storage.swordsForged = storage.swordsForged || 0;
}
game.update = function () {
for (var i = 0; i < workbench.materialSlots.length; i++) {
var slot = workbench.materialSlots[i];
if (slot.selected) {
tween(slot, {
rotation: slot.rotation + 0.05
}, {
duration: 16
});
}
}
};
game.move = function (x, y, obj) {
if (draggedButton) {
draggedButton.x = x - materialSelector.x;
draggedButton.y = y - materialSelector.y;
var globalPos = materialSelector.toGlobal(draggedButton.position);
for (var i = 0; i < workbench.materialSlots.length; i++) {
var slot = workbench.materialSlots[i];
var slotGlobalPos = workbench.toGlobal(slot.position);
var distance = Math.sqrt(Math.pow(globalPos.x - slotGlobalPos.x, 2) + Math.pow(globalPos.y - slotGlobalPos.y, 2));
if (distance < 100) {
slot.slotGraphics.tint = 0x00ff00;
} else {
if (!slot.materialType) {
slot.slotGraphics.tint = 0x8b7355;
}
}
}
}
};
game.down = function (x, y, obj) {};
game.up = function (x, y, obj) {
if (draggedButton && draggedMaterial) {
var globalPos = materialSelector.toGlobal(draggedButton.position);
var droppedOnSlot = false;
for (var i = 0; i < workbench.materialSlots.length; i++) {
var slot = workbench.materialSlots[i];
var slotGlobalPos = workbench.toGlobal(slot.position);
var distance = Math.sqrt(Math.pow(globalPos.x - slotGlobalPos.x, 2) + Math.pow(globalPos.y - slotGlobalPos.y, 2));
if (distance < 100 && !slot.materialType) {
slot.setMaterial(draggedMaterial);
droppedOnSlot = true;
slot.slotGraphics.tint = 0x8b7355;
break;
}
}
tween(draggedButton, {
scaleX: 1,
scaleY: 1,
alpha: 1
}, {
duration: 100
});
draggedMaterial = null;
draggedButton = null;
}
};
initializeGame(); /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var CraftedSword = Container.expand(function () {
var self = Container.call(this);
self.quality = 1;
self.materials = {
blade: null,
handle: null,
guard: null
};
self.bladeAsset = 'blade';
self.handleAsset = 'handle';
self.guardAsset = 'crossguard';
var bladeGraphics = LK.getAsset('blade', {
anchorX: 0.5,
anchorY: 1
});
var bladeEdgeGraphics = LK.getAsset('bladeEdge', {
anchorX: 0.5,
//{d_new}
anchorY: 1 //{e_new}
}); //{f_new}
var crossguardGraphics = LK.getAsset('crossguard', {
anchorX: 0.5,
//{g_new}
anchorY: 0.5 //{h_new}
}); //{i_new}
var handleGraphics = LK.getAsset('handle', {
anchorX: 0.5,
anchorY: 0.2
});
var connectorTop = LK.getAsset('connectorPart', {
anchorX: 0.5,
anchorY: 0.5
});
var connectorBottom = LK.getAsset('connectorPart', {
anchorX: 0.5,
anchorY: 0.5
});
self.bladeGraphics = bladeGraphics;
self.bladeEdgeGraphics = bladeEdgeGraphics;
self.crossguardGraphics = crossguardGraphics;
self.handleGraphics = handleGraphics;
self.addChild(bladeGraphics);
self.addChild(bladeEdgeGraphics);
self.addChild(connectorTop);
self.addChild(crossguardGraphics);
self.addChild(connectorBottom);
self.addChild(handleGraphics);
bladeGraphics.y = -100;
bladeEdgeGraphics.y = -100;
connectorTop.y = -45;
crossguardGraphics.y = 10;
connectorBottom.y = 60;
handleGraphics.y = 100;
connectorTop.tint = 0x606060;
connectorBottom.tint = 0x606060;
bladeGraphics.tint = 0xe8e8e8;
bladeEdgeGraphics.tint = 0x606060;
self.setCraftedSword = function (materials, quality) {
self.materials = materials;
self.quality = quality;
var recipe = getRecipeFromMaterials(materials);
self.swordType = recipe;
self.updateColor();
self.updateVisualParts();
tween(self, {
scaleX: 1,
scaleY: 1
}, {
duration: 500,
easing: tween.elasticOut
});
};
self.updateVisualParts = function () {
if (self.swordType.bladeAsset && self.swordType.bladeAsset !== 'blade') {
self.removeChild(self.bladeGraphics);
self.bladeGraphics = LK.getAsset(self.swordType.bladeAsset, {
anchorX: 0.5,
anchorY: 1
});
self.addChildAt(self.bladeGraphics, 0);
self.bladeGraphics.y = -100;
}
if (self.swordType.handleAsset && self.swordType.handleAsset !== 'handle') {
self.removeChild(self.handleGraphics);
self.handleGraphics = LK.getAsset(self.swordType.handleAsset, {
anchorX: 0.5,
anchorY: 0.2
});
self.addChild(self.handleGraphics);
self.handleGraphics.y = 100;
}
if (self.swordType.guardAsset && self.swordType.guardAsset !== 'crossguard') {
self.removeChild(self.crossguardGraphics);
self.crossguardGraphics = LK.getAsset(self.swordType.guardAsset, {
anchorX: 0.5,
anchorY: 0.5
});
var guardIdx = self.getChildIndex(self.crossguardGraphics);
self.addChildAt(self.crossguardGraphics, Math.max(0, guardIdx));
self.crossguardGraphics.y = 10;
}
};
self.updateColor = function () {
var baseColor = self.swordType.color || 0xe8e8e8;
var edgeColor = self.swordType.edgeColor || 0x606060;
var guardColor = self.swordType.guardColor || 0xffd700;
bladeGraphics.tint = baseColor;
bladeEdgeGraphics.tint = edgeColor;
crossguardGraphics.tint = guardColor;
connectorTop.tint = edgeColor;
connectorBottom.tint = edgeColor;
if (self.quality >= 2) {
var enhancedBlade = baseColor;
var enhancedEdge = edgeColor;
if (self.quality === 2) {
enhancedBlade = baseColor;
enhancedEdge = edgeColor;
}
bladeGraphics.tint = enhancedBlade;
bladeEdgeGraphics.tint = enhancedEdge;
connectorTop.tint = enhancedEdge;
connectorBottom.tint = enhancedEdge;
}
if (self.quality >= 3) {
handleGraphics.tint = 0xff6b35;
connectorTop.tint = guardColor;
connectorBottom.tint = guardColor;
}
};
self.scaleX = 0.5;
self.scaleY = 0.5;
return self;
});
var CraftingWorkbench = Container.expand(function () {
var self = Container.call(this);
var tableGraphics = self.attachAsset('craftingTable', {
anchorX: 0.5,
anchorY: 0.5
});
var workSurfaceGraphics = LK.getAsset('workSurface', {
anchorX: 0.5,
anchorY: 0.5
});
self.addChild(workSurfaceGraphics);
workSurfaceGraphics.y = -50;
self.materialSlots = [];
self.selectedSlots = [];
var slot1 = new MaterialSlot();
slot1.x = -280;
slot1.y = -150;
slot1.slotIndex = 0;
self.addChild(slot1);
self.materialSlots.push(slot1);
var slot2 = new MaterialSlot();
slot2.x = 0;
slot2.y = -150;
slot2.slotIndex = 1;
self.addChild(slot2);
self.materialSlots.push(slot2);
var slot3 = new MaterialSlot();
slot3.x = 280;
slot3.y = -150;
slot3.slotIndex = 2;
self.addChild(slot3);
self.materialSlots.push(slot3);
var craftButtonGraphics = LK.getAsset('craftButton', {
anchorX: 0.5,
anchorY: 0.5
});
self.addChild(craftButtonGraphics);
craftButtonGraphics.x = 0;
craftButtonGraphics.y = 250;
var craftButtonText = new Text2('CRAFT', {
size: 50,
fill: '#ffffff'
});
craftButtonText.anchor.set(0.5, 0.5);
self.addChild(craftButtonText);
craftButtonText.x = 0;
craftButtonText.y = 250;
self.craftButtonGraphics = craftButtonGraphics;
self.craftButtonGraphics.down = function (x, y, obj) {
self.attemptCraft();
};
self.attemptCraft = function () {
var selectedCount = 0;
var materials = {};
for (var i = 0; i < self.materialSlots.length; i++) {
if (self.materialSlots[i].materialType) {
selectedCount++;
var matType = self.materialSlots[i].materialType;
materials[matType] = true;
}
}
if (selectedCount < 3) {
tween(self.craftButtonGraphics, {
tint: 0xff0000
}, {
duration: 200,
onFinish: function onFinish() {
tween(self.craftButtonGraphics, {
tint: 0xff6b35
}, {
duration: 200
});
}
});
return;
}
if (selectedCount === 3) {
var failureChance = 0.3;
var willFail = Math.random() < failureChance;
if (willFail) {
self.failedCraft();
} else {
self.successfulCraft(materials);
}
} else {
self.failedCraft();
}
};
self.successfulCraft = function (materials) {
LK.getSound('craftSuccess').play();
var quality = Math.floor(Math.random() * 3) + 1;
LK.setScore(LK.getScore() + quality * 10);
for (var i = 0; i < self.materialSlots.length; i++) {
self.materialSlots[i].clear();
}
storage.swordsForged = (storage.swordsForged || 0) + 1;
var craftedSword = new CraftedSword();
game.addChild(craftedSword);
craftedSword.x = 1024;
craftedSword.y = 1366;
craftedSword.setCraftedSword(materials, quality);
craftedSwordsCollection.push(craftedSword);
tween(self.craftButtonGraphics, {
scaleX: 1.1,
scaleY: 1.1
}, {
duration: 300,
easing: tween.elasticOut
});
tween(self.craftButtonGraphics, {
scaleX: 1,
scaleY: 1
}, {
duration: 300
});
};
self.failedCraft = function () {
for (var i = 0; i < self.materialSlots.length; i++) {
self.materialSlots[i].clear();
}
};
self.addMaterialToSlot = function (slotIndex, materialType) {
if (slotIndex < self.materialSlots.length) {
self.materialSlots[slotIndex].setMaterial(materialType);
}
};
return self;
});
var MaterialSelector = Container.expand(function () {
var self = Container.call(this);
self.materials = ['ironBlade', 'goldenBlade', 'darkBlade', 'silverBlade', 'curvedBlade', 'ironHandle', 'leatherHandle', 'silverHandle', 'boneHandle', 'ebonyHandle', 'stoneGuard', 'rubyGuard', 'sapphireGuard', 'emeraldGuard'];
self.buttons = [];
self.scrollOffset = 0;
self.maxScroll = Math.max(0, Math.ceil(self.materials.length / 4) - 2);
var scrollContainer = new Container();
self.addChild(scrollContainer);
self.scrollContainer = scrollContainer;
self.updateMaterialDisplay = function () {
for (var btn = 0; btn < self.buttons.length; btn++) {
self.scrollContainer.removeChild(self.buttons[btn].graphic);
}
self.buttons = [];
var visibleMaterials = 8;
var startIdx = self.scrollOffset * 4;
var endIdx = Math.min(startIdx + visibleMaterials, self.materials.length);
var positions = [-450, -150, 150, 450, -450, -150, 150, 450];
var yPositions = [0, 0, 0, 0, -180, -180, -180, -180];
for (var i = startIdx; i < endIdx; i++) {
var buttonGraphics = LK.getAsset('materialSlot', {
anchorX: 0.5,
anchorY: 0.5
});
self.scrollContainer.addChild(buttonGraphics);
var posIdx = i - startIdx;
buttonGraphics.x = positions[posIdx];
buttonGraphics.y = yPositions[posIdx];
var materialType = self.materials[i];
var displayName = materialType.replace(/([A-Z])/g, ' $1').trim().toUpperCase();
var buttonText = new Text2(displayName, {
size: 30,
fill: '#ffffff'
});
buttonText.anchor.set(0.5, 0.5);
self.scrollContainer.addChild(buttonText);
buttonText.x = positions[posIdx];
buttonText.y = yPositions[posIdx];
(function (type, graphic) {
graphic.down = function (x, y, obj) {
draggedMaterial = type;
draggedButton = graphic;
tween(graphic, {
scaleX: 1.1,
scaleY: 1.1,
alpha: 0.7
}, {
duration: 100
});
LK.getSound('selectMaterial').play();
};
})(materialType, buttonGraphics);
buttonGraphics.graphic = buttonGraphics;
self.buttons.push({
graphic: buttonGraphics,
up: function up() {
tween(this.graphic, {
scaleX: 1,
scaleY: 1,
alpha: 1
}, {
duration: 100
});
draggedMaterial = null;
draggedButton = null;
}
});
}
};
self.scroll = function (direction) {
if (direction > 0 && self.scrollOffset < self.maxScroll) {
self.scrollOffset++;
self.updateMaterialDisplay();
} else if (direction < 0 && self.scrollOffset > 0) {
self.scrollOffset--;
self.updateMaterialDisplay();
}
};
self.updateMaterialDisplay();
return self;
});
var MaterialSlot = Container.expand(function () {
var self = Container.call(this);
var slotGraphics = self.attachAsset('materialSlot', {
anchorX: 0.5,
anchorY: 0.5
});
self.slotGraphics = slotGraphics;
self.materialType = null;
self.selected = false;
self.slotIndex = 0;
self.down = function (x, y, obj) {
if (draggedMaterial && !self.materialType) {
self.setMaterial(draggedMaterial);
draggedMaterial = null;
if (draggedButton) {
tween(draggedButton, {
scaleX: 1,
scaleY: 1,
alpha: 1
}, {
duration: 100
});
draggedButton = null;
}
} else if (!self.selected) {
self.select();
} else {
self.deselect();
}
LK.getSound('selectMaterial').play();
};
self.select = function () {
self.selected = true;
slotGraphics.tint = 0xffaa00;
tween(slotGraphics, {
tint: 0xff6b35
}, {
duration: 300
});
};
self.deselect = function () {
self.selected = false;
slotGraphics.tint = 0x8b7355;
};
self.setMaterial = function (material) {
self.materialType = material;
self.updateVisuals();
};
self.updateVisuals = function () {
if (self.materialType === 'blade' || self.materialType === 'ironBlade' || self.materialType === 'goldenBlade' || self.materialType === 'darkBlade') {
slotGraphics.tint = 0xc0c0c0;
} else if (self.materialType === 'handle' || self.materialType === 'ironHandle' || self.materialType === 'leatherHandle') {
slotGraphics.tint = 0x8b4513;
} else if (self.materialType === 'guard' || self.materialType === 'stoneGuard' || self.materialType === 'rubyGuard') {
slotGraphics.tint = 0xffd700;
}
};
self.clear = function () {
self.materialType = null;
self.selected = false;
slotGraphics.tint = 0x8b7355;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1a1a1a
});
/****
* Game Code
****/
var workbench = null;
var materialSelector = null;
var craftedSwordsCollection = [];
var selectedMaterialType = null;
var selectedSlot = null;
var draggedMaterial = null;
var draggedButton = null;
var swordRecipes = {
basic: {
blade: 'blade',
handle: 'handle',
guard: 'guard',
bladeAsset: 'blade',
handleAsset: 'handle',
guardAsset: 'crossguard',
color: 0xe8e8e8,
edgeColor: 0x606060,
guardColor: 0xffd700,
name: 'Basic Sword'
},
iron: {
blade: 'ironBlade',
handle: 'ironHandle',
guard: 'stoneGuard',
bladeAsset: 'ironBlade',
handleAsset: 'ironHandle',
guardAsset: 'stoneGuard',
color: 0x505050,
edgeColor: 0x303030,
guardColor: 0x808080,
name: 'Iron Sword'
},
golden: {
blade: 'goldenBlade',
handle: 'leatherHandle',
guard: 'rubyGuard',
bladeAsset: 'goldenBlade',
handleAsset: 'leatherHandle',
guardAsset: 'rubyGuard',
color: 0xffd700,
edgeColor: 0xffaa00,
guardColor: 0xff0000,
name: 'Golden Sword'
},
dark: {
blade: 'darkBlade',
handle: 'ironHandle',
guard: 'rubyGuard',
bladeAsset: 'darkBlade',
handleAsset: 'ebonyHandle',
guardAsset: 'rubyGuard',
color: 0x1a1a1a,
edgeColor: 0x333333,
guardColor: 0xff0000,
name: 'Dark Sword'
},
elite: {
blade: 'silverBlade',
handle: 'silverHandle',
guard: 'sapphireGuard',
bladeAsset: 'silverBlade',
handleAsset: 'silverHandle',
guardAsset: 'sapphireGuard',
color: 0xc0c0c0,
edgeColor: 0xffffff,
guardColor: 0x0f52ba,
name: 'Elite Sword'
},
forest: {
blade: 'curvedBlade',
handle: 'boneHandle',
guard: 'emeraldGuard',
bladeAsset: 'curvedBlade',
handleAsset: 'boneHandle',
guardAsset: 'emeraldGuard',
color: 0x228b22,
edgeColor: 0x90ee90,
guardColor: 0x50c878,
name: 'Forest Sword'
}
};
function getRecipeFromMaterials(materials) {
if (materials.ironBlade && materials.ironHandle && materials.stoneGuard) {
return swordRecipes.iron;
}
if (materials.goldenBlade && materials.leatherHandle && materials.rubyGuard) {
return swordRecipes.golden;
}
if (materials.darkBlade && materials.ebonyHandle && materials.rubyGuard) {
return swordRecipes.dark;
}
if (materials.silverBlade && materials.silverHandle && materials.sapphireGuard) {
return swordRecipes.elite;
}
if (materials.curvedBlade && materials.boneHandle && materials.emeraldGuard) {
return swordRecipes.forest;
}
return swordRecipes.basic;
}
function initializeGame() {
workbench = game.addChild(new CraftingWorkbench());
workbench.x = 1024;
workbench.y = 1000;
materialSelector = game.addChild(new MaterialSelector());
materialSelector.x = 1024;
materialSelector.y = 2400;
var scoreText = new Text2('Swords Forged: 0', {
size: 60,
fill: '#ffffff'
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
LK.playMusic('forgeMusic');
storage.swordsForged = storage.swordsForged || 0;
}
game.update = function () {
for (var i = 0; i < workbench.materialSlots.length; i++) {
var slot = workbench.materialSlots[i];
if (slot.selected) {
tween(slot, {
rotation: slot.rotation + 0.05
}, {
duration: 16
});
}
}
};
game.move = function (x, y, obj) {
if (draggedButton) {
draggedButton.x = x - materialSelector.x;
draggedButton.y = y - materialSelector.y;
var globalPos = materialSelector.toGlobal(draggedButton.position);
for (var i = 0; i < workbench.materialSlots.length; i++) {
var slot = workbench.materialSlots[i];
var slotGlobalPos = workbench.toGlobal(slot.position);
var distance = Math.sqrt(Math.pow(globalPos.x - slotGlobalPos.x, 2) + Math.pow(globalPos.y - slotGlobalPos.y, 2));
if (distance < 100) {
slot.slotGraphics.tint = 0x00ff00;
} else {
if (!slot.materialType) {
slot.slotGraphics.tint = 0x8b7355;
}
}
}
}
};
game.down = function (x, y, obj) {};
game.up = function (x, y, obj) {
if (draggedButton && draggedMaterial) {
var globalPos = materialSelector.toGlobal(draggedButton.position);
var droppedOnSlot = false;
for (var i = 0; i < workbench.materialSlots.length; i++) {
var slot = workbench.materialSlots[i];
var slotGlobalPos = workbench.toGlobal(slot.position);
var distance = Math.sqrt(Math.pow(globalPos.x - slotGlobalPos.x, 2) + Math.pow(globalPos.y - slotGlobalPos.y, 2));
if (distance < 100 && !slot.materialType) {
slot.setMaterial(draggedMaterial);
droppedOnSlot = true;
slot.slotGraphics.tint = 0x8b7355;
break;
}
}
tween(draggedButton, {
scaleX: 1,
scaleY: 1,
alpha: 1
}, {
duration: 100
});
draggedMaterial = null;
draggedButton = null;
}
};
initializeGame();