/****
* 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();