User prompt
2x katlaya basınca coinflip yap
User prompt
ortadaki çarkı 2 kez çevir
User prompt
ekrana kasa açmadaki aynı şeyi getir
User prompt
2x katladan 2x gelmezse parayı verme
User prompt
BİR Çark ekle dönsübn
User prompt
hala skin çıkar çıkmaz bakiyeye ekleniyo
User prompt
otomatik satma 2x butonuna bastıktan sonra kazanırsak 2x kaybedersek normal bakiye olarak eklensin
User prompt
2x katla butonunu ortala ve aşşağıya al
User prompt
2x katla butonuna basılmöıyor
User prompt
2x katla çalışmıyor
User prompt
%45 şans ile 2x bakiyeye eklensin bunu gösteren bir popup yap
User prompt
2x katlaya basınca ekrana bir çark gelsin %45 şansı olsun
User prompt
çıkan skini 2x katlamak için ekrana İki Katı Yada Kapat seçeneği ekle katla seçeneği seçilince %45 şansla çark çevir
User prompt
200 price üstü skinler hala çıkıyor ayarla daha az gelsin şansı düşür
User prompt
mehmet berat zıvlakın parasını 99999999999 yap
User prompt
kasaya %1 şanla çıkabilen adıda Mehmet Berat Zıvlak olsun asset olarakta ekle
User prompt
fiyatı 200 ü geçen her skinin şansını düşür
User prompt
skinin adını karambit doppler yap
User prompt
eklediğin nadir bıçağı asset olarak ekle kasayada ekle
User prompt
oyuna en nadir skin olarak bıçak ekle 145000 tl olsun
User prompt
yukardaki bombardilo yazısını kaldır
User prompt
farklı 2 3 tane market ekle hepsini farklı kodla yaz
User prompt
market hala çalışmıyor ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Please fix the bug: 'Uncaught TypeError: storage.getItem is not a function' in or related to this line: 'var equipped = storage.getItem("equipped_skin");' Line Number: 195
User prompt
Please fix the bug: 'Uncaught TypeError: storage.get is not a function' in or related to this line: 'var equipped = storage.get("equipped_skin");' Line Number: 195
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
// CarouselSkin: a skin in the scrolling carousel
var CarouselSkin = Container.expand(function () {
var self = Container.call(this);
self.skinData = null;
self.asset = null;
self.label = null;
self.setSkin = function (skin) {
self.skinData = skin;
if (self.asset) self.removeChild(self.asset);
self.asset = self.attachAsset(skin.asset, {
anchorX: 0.5,
anchorY: 0.5
});
if (self.label) self.removeChild(self.label);
self.label = new Text2(skin.name, {
size: 48,
fill: RARITY_COLORS[skin.rarity]
});
self.label.anchor.set(0.5, 0.5);
self.label.y = 0;
self.addChild(self.label);
};
return self;
});
// InventorySkin: a skin in the inventory grid
var InventorySkin = Container.expand(function () {
var self = Container.call(this);
self.skinData = null;
self.asset = null;
self.label = null;
self.setSkin = function (skin) {
self.skinData = skin;
if (self.asset) self.removeChild(self.asset);
self.asset = self.attachAsset(skin.asset, {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.7,
scaleY: 0.7
});
if (self.label) self.removeChild(self.label);
self.label = new Text2(skin.name, {
size: 32,
fill: RARITY_COLORS[skin.rarity]
});
self.label.anchor.set(0.5, 0.5);
self.label.y = 60;
self.addChild(self.label);
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x181a20
});
/****
* Game Code
****/
// Arrow indicator asset (downward arrow, yellow)
// Unique image assets for each skin (replace with your own images as needed)
// Skin data: name, rarity, assetId
/*
We use simple shapes for cases and skins, and Text2 for labels.
Each skin rarity gets a unique color.
*/
var SKIN_POOL = [{
name: "Urban DDPAT",
rarity: "common",
asset: "skin_urban_ddpat"
}, {
name: "Sand Spray",
rarity: "common",
asset: "skin_sand_spray"
}, {
name: "Forest Leaves",
rarity: "common",
asset: "skin_forest_leaves"
}, {
name: "Jungle Tiger",
rarity: "common",
asset: "skin_jungle_tiger"
}, {
name: "Night Ops",
rarity: "common",
asset: "skin_night_ops"
}, {
name: "Blue Streak",
rarity: "rare",
asset: "skin_blue_streak"
}, {
name: "Redline",
rarity: "rare",
asset: "skin_redline"
}, {
name: "Firestarter",
rarity: "rare",
asset: "skin_firestarter"
}, {
name: "Ocean Foam",
rarity: "rare",
asset: "skin_ocean_foam"
}, {
name: "Hyper Beast",
rarity: "mythic",
asset: "skin_hyper_beast"
}, {
name: "Asiimov",
rarity: "legendary",
//{1c} // RED
asset: "skin_asiimov"
}, {
name: "Neon Rider",
rarity: "mythic",
asset: "skin_neon_rider"
}, {
name: "Bloodsport",
rarity: "mythic",
asset: "skin_bloodsport"
}, {
name: "Dragon Lore",
rarity: "ultra",
//{1i} // GOLD
asset: "skin_dragon_lore"
}, {
name: "Howl",
rarity: "legendary",
//{1k} // RED
asset: "skin_howl"
}, {
name: "Medusa",
rarity: "legendary",
//{1m} // RED
asset: "skin_medusa"
}, {
name: "Poseidon",
rarity: "legendary",
//{1o} // RED
asset: "skin_poseidon"
}, {
name: "Gungnir",
rarity: "ultra",
//{1q} // GOLD
asset: "skin_gungnir"
}, {
name: "The Prince",
rarity: "ultra",
//{1s} // GOLD
asset: "skin_the_prince"
}];
// Rarity weights for random selection
var RARITY_WEIGHTS = {
"common": 60,
"rare": 25,
"mythic": 10,
"legendary": 4,
"ultra": 1
};
// Rarity display colors
var RARITY_COLORS = {
"common": 0xCCCCCC,
"rare": 0x4A90E2,
"mythic": 0x9B59B6,
"legendary": 0xF1C40F,
"ultra": 0xFF3B3B
};
// Helper: get a random skin based on weights
function getRandomSkin() {
// First, build a list of all skins with their odds, based on the rarity weights
// Count how many skins per rarity
var rarityCounts = {};
for (var i = 0; i < SKIN_POOL.length; i++) {
var rarity = SKIN_POOL[i].rarity;
if (!rarityCounts[rarity]) rarityCounts[rarity] = 0;
rarityCounts[rarity]++;
}
// Build a flat array of {skin, weight}
var weightedSkins = [];
for (var i = 0; i < SKIN_POOL.length; i++) {
var skin = SKIN_POOL[i];
var rarity = skin.rarity;
// Each skin gets a weight proportional to its rarity weight divided by number of skins of that rarity
var weight = RARITY_WEIGHTS[rarity] / rarityCounts[rarity];
weightedSkins.push({
skin: skin,
weight: weight
});
}
// Total weight
var total = 0;
for (var i = 0; i < weightedSkins.length; i++) {
total += weightedSkins[i].weight;
}
var pick = Math.random() * total;
var acc = 0;
for (var i = 0; i < weightedSkins.length; i++) {
acc += weightedSkins[i].weight;
if (pick < acc) return weightedSkins[i].skin;
}
return SKIN_POOL[0];
}
var caseNode = LK.getAsset('case', {
anchorX: 0.5,
anchorY: 0.5
});
caseNode.x = 2048 / 2;
caseNode.y = 900; // moved higher up
// Add the case node
// "Open Case" button (Text2, acts as button)
var openBtn = new Text2("OPEN CASE", {
size: 90,
fill: 0xFFFFFF
});
openBtn.anchor.set(0.5, 0.5);
openBtn.x = 2048 / 2;
openBtn.y = 1850; // move button down to match new case position
// Balance text (moved to top right)
var balanceTxt = new Text2("Balance: 0₺", {
size: 48,
fill: 0xF1C40F
});
balanceTxt.anchor.set(1, 0); // top right
balanceTxt.x = 2048 - 40;
balanceTxt.y = 40;
// Add to game
game.addChild(caseNode);
// Carousel container (skin scroll area)
var isOpening = false;
var carouselSkins = [];
var carouselContainer = new Container();
carouselContainer.x = 2048 / 2;
// Add an arrow indicator asset (downward arrow) first, so we can position the carouselContainer right above it
var arrowIndicator = LK.getAsset('arrow_indicator', {
anchorX: 0.5,
anchorY: 0,
x: 2048 / 2,
y: 1550 // moved further down
});
game.addChild(arrowIndicator);
// Move carouselContainer so its bottom is flush with the top of the arrow indicator
carouselContainer.y = arrowIndicator.y - 220; // 220 is the height of the carousel area (skins)
game.addChild(carouselContainer);
// Optionally, adjust arrowIndicator.y if you want it to be a fixed distance below the case opening area
game.addChild(openBtn);
game.addChild(balanceTxt);
// --- Skin Prompt UI ---
// Removed skinPromptContainer and skinPromptBg as requested
// --- Functions ---
// Start case opening animation
function startCaseOpening() {
if (isOpening) return;
isOpening = true;
// skinPromptContainer.visible = false; // removed, no longer exists
openBtn.setText("OPENING...");
LK.getSound('case_open').play();
// Remove old carousel
while (carouselContainer.children.length) carouselContainer.removeChild(carouselContainer.children[0]);
carouselSkins = [];
// Build carousel: 20 random skins, winner always lands in front of the arrow
var winner = getRandomSkin();
var skins = [];
var winnerPos = 10; // winner will always be at index 10 (centered in front of arrow)
for (var i = 0; i < 20; i++) {
if (i === winnerPos) {
skins.push(winner);
} else {
// Random, but not always the winner
var s;
do {
s = getRandomSkin();
} while (s.name === winner.name);
skins.push(s);
}
}
// Create skin nodes
for (var j = 0; j < skins.length; j++) {
var node = new CarouselSkin();
node.setSkin(skins[j]);
node.x = (j - winnerPos) * 400;
node.y = 0;
carouselContainer.addChild(node);
carouselSkins.push(node);
}
// Animate: scroll so the winner lands exactly in front of the arrow (center)
// We'll spin the carousel several times before stopping at the winner
var stopOffset = 0; // winnerPos is at center, so offset is 0
var spinDistance = 400 * 20 * 2; // 2 full spins (20 skins per spin, 400px per skin)
var startX = 2048 / 2 + spinDistance;
var endX = 2048 / 2 + stopOffset;
var duration = 2200 + Math.random() * 400; // 2.2-2.6s
// Reset to start position for animation
carouselContainer.x = startX;
// Animate with cubicOut for a nice deceleration
tween(carouselContainer, {
x: endX
}, {
duration: duration,
easing: tween.cubicOut,
onFinish: function onFinish() {
LK.getSound('skin_land').play();
showUnboxedSkin(winner);
}
});
}
// Show the unboxed skin, add to inventory, update UI
function showUnboxedSkin(skin) {
// Pop up effect: scale up winner skin
var winnerNode = null;
var minDist = 99999;
for (var i = 0; i < carouselSkins.length; i++) {
if (carouselSkins[i].skinData.name === skin.name) {
var dist = Math.abs(carouselSkins[i].x);
if (dist < minDist) {
minDist = dist;
winnerNode = carouselSkins[i];
}
}
}
// Show a popup with the skin image, name, and "Close" button, and balance
if (winnerNode) {
// --- Otomatik satış işlemi ---
if (typeof window.balance === "undefined") window.balance = 0;
// Satış fiyatı: rarity'ye göre belirle
var sellPrices = {
"common": 20,
"rare": 200,
"mythic": 250,
"legendary": 800,
"ultra": 2500
};
var sellAmount = sellPrices[skin.rarity] || 10;
if (skin.name === "Redline") {
sellAmount = 350;
}
window.balance += sellAmount;
// Add a fullscreen black background behind the popup
var popupBg = new Container();
popupBg.x = 0;
popupBg.y = 0;
// Use a shape as a black overlay
var bgRect = LK.getAsset('skin_prompt_bg', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0,
width: 2048,
height: 2732,
color: 0x000000,
scaleX: 2048 / 700,
scaleY: 2732 / 220
});
popupBg.addChild(bgRect);
popupBg.alpha = 0.85;
game.addChild(popupBg);
var popup = new Container();
popup.x = 2048 / 2;
popup.y = 1200;
// Add skin asset image
var skinImg = LK.getAsset(skin.asset, {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.2,
scaleY: 1.2
});
popup.addChild(skinImg);
// Add skin name label (always use winnerNode.skinData.name to ensure correct name)
var skinLabel = new Text2(winnerNode.skinData.name, {
size: 80,
fill: RARITY_COLORS[winnerNode.skinData.rarity]
});
skinLabel.anchor.set(0.5, 0);
skinLabel.y = 120;
popup.addChild(skinLabel);
// --- Otomatik satış bildirimi ---
var soldLabel = new Text2("Otomatik satıldı +" + sellAmount + "₺", {
size: 54,
fill: 0x4A90E2
});
soldLabel.anchor.set(0.5, 0);
soldLabel.y = 220;
popup.addChild(soldLabel);
// --- CLOSE BUTTON ---
var closeBtn = new Text2("CLOSE", {
size: 60,
fill: 0x4A90E2
});
closeBtn.anchor.set(0.5, 0.5);
closeBtn.x = 260;
closeBtn.y = 340;
popup.addChild(closeBtn);
// Show current balance
var balanceTxtPopup = new Text2("Balance: " + window.balance + "₺", {
size: 44,
fill: 0xFFFFFF
});
balanceTxtPopup.anchor.set(0.5, 0.5);
balanceTxtPopup.x = 0;
balanceTxtPopup.y = 340;
popup.addChild(balanceTxtPopup);
// Ana ekrandaki balance'ı da güncelle
if (typeof balanceTxt !== "undefined" && balanceTxt.setText) {
balanceTxt.setText("Balance: " + window.balance + "₺");
}
// Animate popup in
popup.scale.x = 0.1;
popup.scale.y = 0.1;
game.addChild(popup);
tween(popup.scale, {
x: 1,
y: 1
}, {
duration: 350,
easing: tween.elasticOut,
onFinish: function onFinish() {
tween(popup.scale, {
x: 1,
y: 1
}, {
duration: 200,
easing: tween.linear
});
}
});
// Animate winner node
tween(winnerNode, {
scaleX: 1.3,
scaleY: 1.3
}, {
duration: 350,
easing: tween.elasticOut,
onFinish: function onFinish() {
tween(winnerNode, {
scaleX: 1,
scaleY: 1
}, {
duration: 200,
easing: tween.linear
});
}
});
// Pause opening until popup is closed
isOpening = true;
openBtn.setText("OPEN CASE");
// Sell button logic removed
// Close button logic
closeBtn.down = function () {
if (popup.parent) popup.parent.removeChild(popup);
if (popupBg && popupBg.parent) popupBg.parent.removeChild(popupBg);
isOpening = false;
openBtn.setText("OPEN CASE");
while (carouselContainer.children.length) carouselContainer.removeChild(carouselContainer.children[0]);
carouselSkins = [];
};
// Also allow closing popup by tapping anywhere else on popup
popup.down = function (x, y, obj) {
if (popup.parent) popup.parent.removeChild(popup);
if (popupBg && popupBg.parent) popupBg.parent.removeChild(popupBg);
isOpening = false;
openBtn.setText("OPEN CASE");
while (carouselContainer.children.length) carouselContainer.removeChild(carouselContainer.children[0]);
carouselSkins = [];
};
}
}
// --- Event Handlers ---
// Open case on tap
openBtn.down = function (x, y, obj) {
if (!isOpening) startCaseOpening();
};
// Prevent accidental tap on top left (menu area)
caseNode.down = function (x, y, obj) {
if (x < 100 && y < 100) return;
};
// --- Initial UI ---
// updateInventory removed
// Move the 'bombardilo' text (game title) higher up on the screen
// --- No update loop needed, all is event-driven ---; ===================================================================
--- original.js
+++ change.js
@@ -67,827 +67,15 @@
/****
* Game Code
****/
-// Market button (top right, below balance)
-// Third Market button
-var marketBtn3 = new Text2("MARKET 3", {
- size: 54,
- fill: 0x4A90E2
-});
-marketBtn3.anchor.set(1, 0);
-marketBtn3.x = 2048 - 40;
-marketBtn3.y = 360;
-game.addChild(marketBtn3);
-// Third Market popup container (hidden by default)
-var marketPopupBg3 = null;
-var marketPopup3 = null;
-// Helper: get all skins not owned and not available from the case (market exclusives) for Market 3
-function getUnownedSkins3() {
- var marketOnlySkins3 = [{
- name: "Obsidian Fury",
- rarity: "ultra",
- asset: "skin_the_prince"
- }, {
- name: "Amber Blaze",
- rarity: "legendary",
- asset: "skin_poseidon"
- }, {
- name: "Emerald Edge",
- rarity: "mythic",
- asset: "skin_hyper_beast"
- }];
- var owned = getOwnedSkins();
- var unowned = [];
- for (var i = 0; i < marketOnlySkins3.length; i++) {
- if (owned.indexOf(marketOnlySkins3[i].name) === -1) {
- unowned.push(marketOnlySkins3[i]);
- }
- }
- return unowned;
-}
-// Show third market popup
-function showMarketPopup3() {
- if (marketPopup3) return;
- marketPopupBg3 = new Container();
- var bgRect3 = LK.getAsset('skin_prompt_bg', {
- anchorX: 0,
- anchorY: 0,
- x: 0,
- y: 0,
- width: 2048,
- height: 2732,
- color: 0x000000,
- scaleX: 2048 / 700,
- scaleY: 2732 / 220
- });
- marketPopupBg3.addChild(bgRect3);
- marketPopupBg3.alpha = 0.85;
- game.addChild(marketPopupBg3);
- marketPopup3 = new Container();
- marketPopup3.x = 2048 / 2;
- marketPopup3.y = 1360;
- var marketTitle3 = new Text2("MARKET 3", {
- size: 90,
- fill: 0xF1C40F
- });
- marketTitle3.anchor.set(0.5, 0);
- marketTitle3.y = -540;
- marketPopup3.addChild(marketTitle3);
- var marketBalance3 = new Text2("Balance: " + (window.balance || 0) + "₺", {
- size: 54,
- fill: 0xFFFFFF
- });
- marketBalance3.anchor.set(0.5, 0);
- marketBalance3.y = -440;
- marketPopup3.addChild(marketBalance3);
- var equippedSkinName3 = getEquippedSkin();
- var equippedSkinLabel3 = new Text2("Equipped: " + (equippedSkinName3 ? equippedSkinName3 : "None"), {
- size: 44,
- fill: 0x4A90E2
- });
- equippedSkinLabel3.anchor.set(0.5, 0);
- equippedSkinLabel3.y = -370;
- marketPopup3.addChild(equippedSkinLabel3);
- var skins3 = getUnownedSkins3();
- var colCount3 = 4;
- var rowSpacing3 = 260;
- var colSpacing3 = 400;
- var startY3 = -250;
- var startX3 = -((colCount3 - 1) * colSpacing3) / 2;
- for (var i = 0; i < skins3.length; i++) {
- var skin3 = skins3[i];
- var col3 = i % colCount3;
- var row3 = Math.floor(i / colCount3);
- var skinAsset3 = LK.getAsset(skin3.asset, {
- anchorX: 0.5,
- anchorY: 0.5,
- scaleX: 0.7,
- scaleY: 0.7
- });
- skinAsset3.x = startX3 + col3 * colSpacing3;
- skinAsset3.y = startY3 + row3 * rowSpacing3;
- marketPopup3.addChild(skinAsset3);
- var skinNameTxt3 = new Text2(skin3.name, {
- size: 36,
- fill: RARITY_COLORS[skin3.rarity]
- });
- skinNameTxt3.anchor.set(0.5, 0);
- skinNameTxt3.x = skinAsset3.x;
- skinNameTxt3.y = skinAsset3.y + 90;
- marketPopup3.addChild(skinNameTxt3);
- var price3 = getSkinPrice(skin3);
- var ownedThis3 = isSkinOwned(skin3.name);
- var isEquipped3 = equippedSkinName3 === skin3.name;
- var btnLabel3 = "";
- var btnColor3 = 0x4A90E2;
- if (ownedThis3) {
- btnLabel3 = isEquipped3 ? "EQUIPPED" : "EQUIP";
- btnColor3 = isEquipped3 ? 0xF1C40F : 0x4A90E2;
- } else {
- btnLabel3 = price3 + "₺ BUY";
- btnColor3 = 0x4A90E2;
- }
- var buyBtn3 = new Text2(btnLabel3, {
- size: 38,
- fill: btnColor3
- });
- buyBtn3.anchor.set(0.5, 0);
- buyBtn3.x = skinAsset3.x;
- buyBtn3.y = skinAsset3.y + 140;
- marketPopup3.addChild(buyBtn3);
- (function (skin3, buyBtn3, ownedThis3, isEquipped3, price3, skinAsset3, skinNameTxt3) {
- buyBtn3.down = function () {
- if (ownedThis3) {
- setEquippedSkin(skin3.name);
- equippedSkinLabel3.setText("Equipped: " + skin3.name);
- for (var j = 0; j < marketPopup3.children.length; j++) {
- var child3 = marketPopup3.children[j];
- if (child3 && child3.setText && child3.text && (child3.text === "EQUIPPED" || child3.text === "EQUIP")) {
- child3.setText("EQUIP");
- child3.style.fill = 0x4A90E2;
- }
- }
- buyBtn3.setText("EQUIPPED");
- buyBtn3.style.fill = 0xF1C40F;
- } else {
- if ((window.balance || 0) < price3) {
- buyBtn3.setText("NO MONEY");
- buyBtn3.style.fill = 0xFF3B3B;
- return;
- }
- window.balance -= price3;
- if (typeof balanceTxt !== "undefined" && balanceTxt.setText) {
- balanceTxt.setText("Balance: " + window.balance + "₺");
- }
- marketBalance3.setText("Balance: " + window.balance + "₺");
- addOwnedSkin(skin3.name);
- setEquippedSkin(skin3.name);
- equippedSkinLabel3.setText("Equipped: " + skin3.name);
- buyBtn3.setText("EQUIPPED");
- buyBtn3.style.fill = 0xF1C40F;
- }
- };
- })(skin3, buyBtn3, ownedThis3, isEquipped3, price3, skinAsset3, skinNameTxt3);
- }
- var closeMarketBtn3 = new Text2("CLOSE", {
- size: 60,
- fill: 0x4A90E2
- });
- closeMarketBtn3.anchor.set(0.5, 0.5);
- closeMarketBtn3.x = 0;
- closeMarketBtn3.y = startY3 + Math.ceil(skins3.length / colCount3) * rowSpacing3 + 100;
- marketPopup3.addChild(closeMarketBtn3);
- closeMarketBtn3.down = function () {
- if (marketPopup3 && marketPopup3.parent) marketPopup3.parent.removeChild(marketPopup3);
- if (marketPopupBg3 && marketPopupBg3.parent) marketPopupBg3.parent.removeChild(marketPopupBg3);
- marketPopup3 = null;
- marketPopupBg3 = null;
- };
- marketPopupBg3.down = function () {
- if (marketPopup3 && marketPopup3.parent) marketPopup3.parent.removeChild(marketPopup3);
- if (marketPopupBg3 && marketPopupBg3.parent) marketPopupBg3.parent.removeChild(marketPopupBg3);
- marketPopup3 = null;
- marketPopupBg3 = null;
- };
- game.addChild(marketPopup3);
-}
-// Third Market button event
-marketBtn3.down = function () {
- showMarketPopup3();
-};
-// Second Market button
-var marketBtn2 = new Text2("MARKET 2", {
- size: 54,
- fill: 0x4A90E2
-});
-marketBtn2.anchor.set(1, 0);
-marketBtn2.x = 2048 - 40;
-marketBtn2.y = 280;
-game.addChild(marketBtn2);
-// Second Market popup container (hidden by default)
-var marketPopupBg2 = null;
-var marketPopup2 = null;
-// Helper: get all skins not owned and not available from the case (market exclusives) for Market 2
-function getUnownedSkins2() {
- var marketOnlySkins2 = [{
- name: "Silver Fang",
- rarity: "ultra",
- asset: "skin_dragon_lore"
- }, {
- name: "Ruby Blaze",
- rarity: "legendary",
- asset: "skin_howl"
- }, {
- name: "Sapphire Strike",
- rarity: "mythic",
- asset: "skin_neon_rider"
- }];
- var owned = getOwnedSkins();
- var unowned = [];
- for (var i = 0; i < marketOnlySkins2.length; i++) {
- if (owned.indexOf(marketOnlySkins2[i].name) === -1) {
- unowned.push(marketOnlySkins2[i]);
- }
- }
- return unowned;
-}
-// Show second market popup
-function showMarketPopup2() {
- if (marketPopup2) return;
- marketPopupBg2 = new Container();
- var bgRect2 = LK.getAsset('skin_prompt_bg', {
- anchorX: 0,
- anchorY: 0,
- x: 0,
- y: 0,
- width: 2048,
- height: 2732,
- color: 0x000000,
- scaleX: 2048 / 700,
- scaleY: 2732 / 220
- });
- marketPopupBg2.addChild(bgRect2);
- marketPopupBg2.alpha = 0.85;
- game.addChild(marketPopupBg2);
- marketPopup2 = new Container();
- marketPopup2.x = 2048 / 2;
- marketPopup2.y = 1360;
- var marketTitle2 = new Text2("MARKET 2", {
- size: 90,
- fill: 0xF1C40F
- });
- marketTitle2.anchor.set(0.5, 0);
- marketTitle2.y = -540;
- marketPopup2.addChild(marketTitle2);
- var marketBalance2 = new Text2("Balance: " + (window.balance || 0) + "₺", {
- size: 54,
- fill: 0xFFFFFF
- });
- marketBalance2.anchor.set(0.5, 0);
- marketBalance2.y = -440;
- marketPopup2.addChild(marketBalance2);
- var equippedSkinName2 = getEquippedSkin();
- var equippedSkinLabel2 = new Text2("Equipped: " + (equippedSkinName2 ? equippedSkinName2 : "None"), {
- size: 44,
- fill: 0x4A90E2
- });
- equippedSkinLabel2.anchor.set(0.5, 0);
- equippedSkinLabel2.y = -370;
- marketPopup2.addChild(equippedSkinLabel2);
- var skins2 = getUnownedSkins2();
- var colCount2 = 4;
- var rowSpacing2 = 260;
- var colSpacing2 = 400;
- var startY2 = -250;
- var startX2 = -((colCount2 - 1) * colSpacing2) / 2;
- for (var i = 0; i < skins2.length; i++) {
- var skin2 = skins2[i];
- var col2 = i % colCount2;
- var row2 = Math.floor(i / colCount2);
- var skinAsset2 = LK.getAsset(skin2.asset, {
- anchorX: 0.5,
- anchorY: 0.5,
- scaleX: 0.7,
- scaleY: 0.7
- });
- skinAsset2.x = startX2 + col2 * colSpacing2;
- skinAsset2.y = startY2 + row2 * rowSpacing2;
- marketPopup2.addChild(skinAsset2);
- var skinNameTxt2 = new Text2(skin2.name, {
- size: 36,
- fill: RARITY_COLORS[skin2.rarity]
- });
- skinNameTxt2.anchor.set(0.5, 0);
- skinNameTxt2.x = skinAsset2.x;
- skinNameTxt2.y = skinAsset2.y + 90;
- marketPopup2.addChild(skinNameTxt2);
- var price2 = getSkinPrice(skin2);
- var ownedThis2 = isSkinOwned(skin2.name);
- var isEquipped2 = equippedSkinName2 === skin2.name;
- var btnLabel2 = "";
- var btnColor2 = 0x4A90E2;
- if (ownedThis2) {
- btnLabel2 = isEquipped2 ? "EQUIPPED" : "EQUIP";
- btnColor2 = isEquipped2 ? 0xF1C40F : 0x4A90E2;
- } else {
- btnLabel2 = price2 + "₺ BUY";
- btnColor2 = 0x4A90E2;
- }
- var buyBtn2 = new Text2(btnLabel2, {
- size: 38,
- fill: btnColor2
- });
- buyBtn2.anchor.set(0.5, 0);
- buyBtn2.x = skinAsset2.x;
- buyBtn2.y = skinAsset2.y + 140;
- marketPopup2.addChild(buyBtn2);
- (function (skin2, buyBtn2, ownedThis2, isEquipped2, price2, skinAsset2, skinNameTxt2) {
- buyBtn2.down = function () {
- if (ownedThis2) {
- setEquippedSkin(skin2.name);
- equippedSkinLabel2.setText("Equipped: " + skin2.name);
- for (var j = 0; j < marketPopup2.children.length; j++) {
- var child2 = marketPopup2.children[j];
- if (child2 && child2.setText && child2.text && (child2.text === "EQUIPPED" || child2.text === "EQUIP")) {
- child2.setText("EQUIP");
- child2.style.fill = 0x4A90E2;
- }
- }
- buyBtn2.setText("EQUIPPED");
- buyBtn2.style.fill = 0xF1C40F;
- } else {
- if ((window.balance || 0) < price2) {
- buyBtn2.setText("NO MONEY");
- buyBtn2.style.fill = 0xFF3B3B;
- return;
- }
- window.balance -= price2;
- if (typeof balanceTxt !== "undefined" && balanceTxt.setText) {
- balanceTxt.setText("Balance: " + window.balance + "₺");
- }
- marketBalance2.setText("Balance: " + window.balance + "₺");
- addOwnedSkin(skin2.name);
- setEquippedSkin(skin2.name);
- equippedSkinLabel2.setText("Equipped: " + skin2.name);
- buyBtn2.setText("EQUIPPED");
- buyBtn2.style.fill = 0xF1C40F;
- }
- };
- })(skin2, buyBtn2, ownedThis2, isEquipped2, price2, skinAsset2, skinNameTxt2);
- }
- var closeMarketBtn2 = new Text2("CLOSE", {
- size: 60,
- fill: 0x4A90E2
- });
- closeMarketBtn2.anchor.set(0.5, 0.5);
- closeMarketBtn2.x = 0;
- closeMarketBtn2.y = startY2 + Math.ceil(skins2.length / colCount2) * rowSpacing2 + 100;
- marketPopup2.addChild(closeMarketBtn2);
- closeMarketBtn2.down = function () {
- if (marketPopup2 && marketPopup2.parent) marketPopup2.parent.removeChild(marketPopup2);
- if (marketPopupBg2 && marketPopupBg2.parent) marketPopupBg2.parent.removeChild(marketPopupBg2);
- marketPopup2 = null;
- marketPopupBg2 = null;
- };
- marketPopupBg2.down = function () {
- if (marketPopup2 && marketPopup2.parent) marketPopup2.parent.removeChild(marketPopup2);
- if (marketPopupBg2 && marketPopupBg2.parent) marketPopupBg2.parent.removeChild(marketPopupBg2);
- marketPopup2 = null;
- marketPopupBg2 = null;
- };
- game.addChild(marketPopup2);
-}
-// Second Market button event
-marketBtn2.down = function () {
- showMarketPopup2();
-};
-// First Market button
-var marketBtn1 = new Text2("MARKET 1", {
- size: 54,
- fill: 0x4A90E2
-});
-marketBtn1.anchor.set(1, 0);
-marketBtn1.x = 2048 - 40;
-marketBtn1.y = 200;
-game.addChild(marketBtn1);
-// First Market popup container (hidden by default)
-var marketPopupBg1 = null;
-var marketPopup1 = null;
-// Helper: get all skins not owned and not available from the case (market exclusives) for Market 1
-function getUnownedSkins1() {
- var marketOnlySkins1 = [{
- name: "Golden Tiger",
- rarity: "ultra",
- asset: "skin_gungnir"
- }, {
- name: "Emerald Dream",
- rarity: "legendary",
- asset: "skin_medusa"
- }, {
- name: "Crimson Web",
- rarity: "mythic",
- asset: "skin_bloodsport"
- }];
- var owned = getOwnedSkins();
- var unowned = [];
- for (var i = 0; i < marketOnlySkins1.length; i++) {
- if (owned.indexOf(marketOnlySkins1[i].name) === -1) {
- unowned.push(marketOnlySkins1[i]);
- }
- }
- return unowned;
-}
-// Show first market popup
-function showMarketPopup1() {
- if (marketPopup1) return;
- marketPopupBg1 = new Container();
- var bgRect1 = LK.getAsset('skin_prompt_bg', {
- anchorX: 0,
- anchorY: 0,
- x: 0,
- y: 0,
- width: 2048,
- height: 2732,
- color: 0x000000,
- scaleX: 2048 / 700,
- scaleY: 2732 / 220
- });
- marketPopupBg1.addChild(bgRect1);
- marketPopupBg1.alpha = 0.85;
- game.addChild(marketPopupBg1);
- marketPopup1 = new Container();
- marketPopup1.x = 2048 / 2;
- marketPopup1.y = 1360;
- var marketTitle1 = new Text2("MARKET 1", {
- size: 90,
- fill: 0xF1C40F
- });
- marketTitle1.anchor.set(0.5, 0);
- marketTitle1.y = -540;
- marketPopup1.addChild(marketTitle1);
- var marketBalance1 = new Text2("Balance: " + (window.balance || 0) + "₺", {
- size: 54,
- fill: 0xFFFFFF
- });
- marketBalance1.anchor.set(0.5, 0);
- marketBalance1.y = -440;
- marketPopup1.addChild(marketBalance1);
- var equippedSkinName1 = getEquippedSkin();
- var equippedSkinLabel1 = new Text2("Equipped: " + (equippedSkinName1 ? equippedSkinName1 : "None"), {
- size: 44,
- fill: 0x4A90E2
- });
- equippedSkinLabel1.anchor.set(0.5, 0);
- equippedSkinLabel1.y = -370;
- marketPopup1.addChild(equippedSkinLabel1);
- var skins1 = getUnownedSkins1();
- var colCount1 = 4;
- var rowSpacing1 = 260;
- var colSpacing1 = 400;
- var startY1 = -250;
- var startX1 = -((colCount1 - 1) * colSpacing1) / 2;
- for (var i = 0; i < skins1.length; i++) {
- var skin1 = skins1[i];
- var col1 = i % colCount1;
- var row1 = Math.floor(i / colCount1);
- var skinAsset1 = LK.getAsset(skin1.asset, {
- anchorX: 0.5,
- anchorY: 0.5,
- scaleX: 0.7,
- scaleY: 0.7
- });
- skinAsset1.x = startX1 + col1 * colSpacing1;
- skinAsset1.y = startY1 + row1 * rowSpacing1;
- marketPopup1.addChild(skinAsset1);
- var skinNameTxt1 = new Text2(skin1.name, {
- size: 36,
- fill: RARITY_COLORS[skin1.rarity]
- });
- skinNameTxt1.anchor.set(0.5, 0);
- skinNameTxt1.x = skinAsset1.x;
- skinNameTxt1.y = skinAsset1.y + 90;
- marketPopup1.addChild(skinNameTxt1);
- var price1 = getSkinPrice(skin1);
- var ownedThis1 = isSkinOwned(skin1.name);
- var isEquipped1 = equippedSkinName1 === skin1.name;
- var btnLabel1 = "";
- var btnColor1 = 0x4A90E2;
- if (ownedThis1) {
- btnLabel1 = isEquipped1 ? "EQUIPPED" : "EQUIP";
- btnColor1 = isEquipped1 ? 0xF1C40F : 0x4A90E2;
- } else {
- btnLabel1 = price1 + "₺ BUY";
- btnColor1 = 0x4A90E2;
- }
- var buyBtn1 = new Text2(btnLabel1, {
- size: 38,
- fill: btnColor1
- });
- buyBtn1.anchor.set(0.5, 0);
- buyBtn1.x = skinAsset1.x;
- buyBtn1.y = skinAsset1.y + 140;
- marketPopup1.addChild(buyBtn1);
- (function (skin1, buyBtn1, ownedThis1, isEquipped1, price1, skinAsset1, skinNameTxt1) {
- buyBtn1.down = function () {
- if (ownedThis1) {
- setEquippedSkin(skin1.name);
- equippedSkinLabel1.setText("Equipped: " + skin1.name);
- for (var j = 0; j < marketPopup1.children.length; j++) {
- var child1 = marketPopup1.children[j];
- if (child1 && child1.setText && child1.text && (child1.text === "EQUIPPED" || child1.text === "EQUIP")) {
- child1.setText("EQUIP");
- child1.style.fill = 0x4A90E2;
- }
- }
- buyBtn1.setText("EQUIPPED");
- buyBtn1.style.fill = 0xF1C40F;
- } else {
- if ((window.balance || 0) < price1) {
- buyBtn1.setText("NO MONEY");
- buyBtn1.style.fill = 0xFF3B3B;
- return;
- }
- window.balance -= price1;
- if (typeof balanceTxt !== "undefined" && balanceTxt.setText) {
- balanceTxt.setText("Balance: " + window.balance + "₺");
- }
- marketBalance1.setText("Balance: " + window.balance + "₺");
- addOwnedSkin(skin1.name);
- setEquippedSkin(skin1.name);
- equippedSkinLabel1.setText("Equipped: " + skin1.name);
- buyBtn1.setText("EQUIPPED");
- buyBtn1.style.fill = 0xF1C40F;
- }
- };
- })(skin1, buyBtn1, ownedThis1, isEquipped1, price1, skinAsset1, skinNameTxt1);
- }
- var closeMarketBtn1 = new Text2("CLOSE", {
- size: 60,
- fill: 0x4A90E2
- });
- closeMarketBtn1.anchor.set(0.5, 0.5);
- closeMarketBtn1.x = 0;
- closeMarketBtn1.y = startY1 + Math.ceil(skins1.length / colCount1) * rowSpacing1 + 100;
- marketPopup1.addChild(closeMarketBtn1);
- closeMarketBtn1.down = function () {
- if (marketPopup1 && marketPopup1.parent) marketPopup1.parent.removeChild(marketPopup1);
- if (marketPopupBg1 && marketPopupBg1.parent) marketPopupBg1.parent.removeChild(marketPopupBg1);
- marketPopup1 = null;
- marketPopupBg1 = null;
- };
- marketPopupBg1.down = function () {
- if (marketPopup1 && marketPopup1.parent) marketPopup1.parent.removeChild(marketPopup1);
- if (marketPopupBg1 && marketPopupBg1.parent) marketPopupBg1.parent.removeChild(marketPopupBg1);
- marketPopup1 = null;
- marketPopupBg1 = null;
- };
- game.addChild(marketPopup1);
-}
-// First Market button event
-marketBtn1.down = function () {
- showMarketPopup1();
-};
-// --- MARKET SYSTEM ---
-// --- No update loop needed, all is event-driven ---;;
+// Arrow indicator asset (downward arrow, yellow)
+// Unique image assets for each skin (replace with your own images as needed)
+// Skin data: name, rarity, assetId
/*
We use simple shapes for cases and skins, and Text2 for labels.
Each skin rarity gets a unique color.
*/
-var marketBtn = new Text2("MARKET", {
- size: 54,
- fill: 0x4A90E2
-});
-marketBtn.anchor.set(1, 0);
-marketBtn.x = 2048 - 40;
-marketBtn.y = 120;
-game.addChild(marketBtn);
-// Market popup container (hidden by default)
-var marketPopupBg = null;
-var marketPopup = null;
-// Helper: get all skins not owned and not available from the case (market exclusives)
-function getUnownedSkins() {
- // Market-only skins (not in SKIN_POOL)
- var marketOnlySkins = [{
- name: "Golden Tiger",
- rarity: "ultra",
- asset: "skin_gungnir" // Use an existing asset for demo, replace with unique asset if available
- }, {
- name: "Emerald Dream",
- rarity: "legendary",
- asset: "skin_medusa"
- }, {
- name: "Crimson Web",
- rarity: "mythic",
- asset: "skin_bloodsport"
- }];
- // Only show market-only skins that are not owned
- var owned = getOwnedSkins();
- var unowned = [];
- for (var i = 0; i < marketOnlySkins.length; i++) {
- if (owned.indexOf(marketOnlySkins[i].name) === -1) {
- unowned.push(marketOnlySkins[i]);
- }
- }
- return unowned;
-}
-// Helper: get price for a skin
-function getSkinPrice(skin) {
- var prices = {
- "common": 100,
- "rare": 400,
- "mythic": 1200,
- "legendary": 3000,
- "ultra": 8000
- };
- return prices[skin.rarity] || 100;
-}
-// Helper: get owned skins from storage
-function getOwnedSkins() {
- var owned = storage.get("owned_skins");
- if (!owned) return [];
- // Defensive: ensure owned is always an array
- if (!(owned instanceof Array)) return [];
- return owned;
-}
-// Helper: add skin to owned skins in storage
-function addOwnedSkin(skinName) {
- var owned = getOwnedSkins();
- if (owned.indexOf(skinName) === -1) {
- owned.push(skinName);
- storage.set("owned_skins", owned);
- }
-}
-// Helper: check if skin is owned
-function isSkinOwned(skinName) {
- var owned = getOwnedSkins();
- return owned.indexOf(skinName) !== -1;
-}
-// Helper: get equipped skin
-function getEquippedSkin() {
- var equipped = storage.get("equipped_skin");
- if (typeof equipped !== "string") return null;
- return equipped || null;
-}
-// Helper: set equipped skin
-function setEquippedSkin(skinName) {
- storage.set("equipped_skin", skinName);
-}
-// Show market popup
-function showMarketPopup() {
- // Prevent multiple popups
- if (marketPopup) return;
- // Black overlay
- marketPopupBg = new Container();
- var bgRect = LK.getAsset('skin_prompt_bg', {
- anchorX: 0,
- anchorY: 0,
- x: 0,
- y: 0,
- width: 2048,
- height: 2732,
- color: 0x000000,
- scaleX: 2048 / 700,
- scaleY: 2732 / 220
- });
- marketPopupBg.addChild(bgRect);
- marketPopupBg.alpha = 0.85;
- game.addChild(marketPopupBg);
- // Popup container
- marketPopup = new Container();
- marketPopup.x = 2048 / 2;
- marketPopup.y = 1360;
- // Title
- var marketTitle = new Text2("MARKET", {
- size: 90,
- fill: 0xF1C40F
- });
- marketTitle.anchor.set(0.5, 0);
- marketTitle.y = -540;
- marketPopup.addChild(marketTitle);
- // Show balance
- var marketBalance = new Text2("Balance: " + (window.balance || 0) + "₺", {
- size: 54,
- fill: 0xFFFFFF
- });
- marketBalance.anchor.set(0.5, 0);
- marketBalance.y = -440;
- marketPopup.addChild(marketBalance);
- // Show equipped skin
- var equippedSkinName = getEquippedSkin();
- var equippedSkinLabel = new Text2("Equipped: " + (equippedSkinName ? equippedSkinName : "None"), {
- size: 44,
- fill: 0x4A90E2
- });
- equippedSkinLabel.anchor.set(0.5, 0);
- equippedSkinLabel.y = -370;
- marketPopup.addChild(equippedSkinLabel);
- // List all skins in a grid (4 per row)
- var skins = getUnownedSkins();
- var owned = getOwnedSkins();
- var colCount = 4;
- var rowSpacing = 260;
- var colSpacing = 400;
- var startY = -250;
- var startX = -((colCount - 1) * colSpacing) / 2;
- for (var i = 0; i < skins.length; i++) {
- var skin = skins[i];
- var col = i % colCount;
- var row = Math.floor(i / colCount);
- // Skin asset
- var skinAsset = LK.getAsset(skin.asset, {
- anchorX: 0.5,
- anchorY: 0.5,
- scaleX: 0.7,
- scaleY: 0.7
- });
- skinAsset.x = startX + col * colSpacing;
- skinAsset.y = startY + row * rowSpacing;
- marketPopup.addChild(skinAsset);
- // Skin name
- var skinNameTxt = new Text2(skin.name, {
- size: 36,
- fill: RARITY_COLORS[skin.rarity]
- });
- skinNameTxt.anchor.set(0.5, 0);
- skinNameTxt.x = skinAsset.x;
- skinNameTxt.y = skinAsset.y + 90;
- marketPopup.addChild(skinNameTxt);
- // Price or owned/equip button
- var price = getSkinPrice(skin);
- var ownedThis = isSkinOwned(skin.name);
- var isEquipped = equippedSkinName === skin.name;
- var btnLabel = "";
- var btnColor = 0x4A90E2;
- if (ownedThis) {
- btnLabel = isEquipped ? "EQUIPPED" : "EQUIP";
- btnColor = isEquipped ? 0xF1C40F : 0x4A90E2;
- } else {
- btnLabel = price + "₺ BUY";
- btnColor = 0x4A90E2;
- }
- var buyBtn = new Text2(btnLabel, {
- size: 38,
- fill: btnColor
- });
- buyBtn.anchor.set(0.5, 0);
- buyBtn.x = skinAsset.x;
- buyBtn.y = skinAsset.y + 140;
- marketPopup.addChild(buyBtn);
- // Button logic
- (function (skin, buyBtn, ownedThis, isEquipped, price, skinAsset, skinNameTxt) {
- buyBtn.down = function () {
- if (ownedThis) {
- // Equip skin
- setEquippedSkin(skin.name);
- // Update equipped label and all buttons
- equippedSkinLabel.setText("Equipped: " + skin.name);
- // Update all buttons to reflect new equipped state
- for (var j = 0; j < marketPopup.children.length; j++) {
- var child = marketPopup.children[j];
- if (child && child.setText && child.text && (child.text === "EQUIPPED" || child.text === "EQUIP")) {
- child.setText("EQUIP");
- child.style.fill = 0x4A90E2;
- }
- }
- buyBtn.setText("EQUIPPED");
- buyBtn.style.fill = 0xF1C40F;
- } else {
- // Buy skin
- if ((window.balance || 0) < price) {
- // Not enough money
- buyBtn.setText("NO MONEY");
- buyBtn.style.fill = 0xFF3B3B;
- return;
- }
- // Deduct balance
- window.balance -= price;
- if (typeof balanceTxt !== "undefined" && balanceTxt.setText) {
- balanceTxt.setText("Balance: " + window.balance + "₺");
- }
- marketBalance.setText("Balance: " + window.balance + "₺");
- // Add to owned
- addOwnedSkin(skin.name);
- // Equip on purchase
- setEquippedSkin(skin.name);
- equippedSkinLabel.setText("Equipped: " + skin.name);
- // Update button
- buyBtn.setText("EQUIPPED");
- buyBtn.style.fill = 0xF1C40F;
- }
- };
- })(skin, buyBtn, ownedThis, isEquipped, price, skinAsset, skinNameTxt);
- }
- // Close button
- var closeMarketBtn = new Text2("CLOSE", {
- size: 60,
- fill: 0x4A90E2
- });
- closeMarketBtn.anchor.set(0.5, 0.5);
- closeMarketBtn.x = 0;
- closeMarketBtn.y = startY + Math.ceil(skins.length / colCount) * rowSpacing + 100;
- marketPopup.addChild(closeMarketBtn);
- closeMarketBtn.down = function () {
- if (marketPopup && marketPopup.parent) marketPopup.parent.removeChild(marketPopup);
- if (marketPopupBg && marketPopupBg.parent) marketPopupBg.parent.removeChild(marketPopupBg);
- marketPopup = null;
- marketPopupBg = null;
- };
- // Also close on background tap
- marketPopupBg.down = function () {
- if (marketPopup && marketPopup.parent) marketPopup.parent.removeChild(marketPopup);
- if (marketPopupBg && marketPopupBg.parent) marketPopupBg.parent.removeChild(marketPopupBg);
- marketPopup = null;
- marketPopupBg = null;
- };
- game.addChild(marketPopup);
-}
-// Market button event
-marketBtn.down = function () {
- showMarketPopup();
-};
-// Unique image assets for each skin (replace with your own images as needed)
-// Arrow indicator asset (downward arrow, yellow)
var SKIN_POOL = [{
name: "Urban DDPAT",
rarity: "common",
asset: "skin_urban_ddpat"
@@ -1296,13 +484,5 @@
};
// --- Initial UI ---
// updateInventory removed
// Move the 'bombardilo' text (game title) higher up on the screen
-var titleTxt = new Text2("bombardilo", {
- size: 120,
- fill: 0xFFFFFF
-});
-titleTxt.anchor.set(0.5, 0);
-titleTxt.x = 2048 / 2;
-titleTxt.y = 120; // moved higher up
-game.addChild(titleTxt);
// --- No update loop needed, all is event-driven ---;
\ No newline at end of file
Awp Asimov ekle ve görünüş karikatür olmasın oyundakiyle aynı olsun. In-Game asset. 2d. High contrast. No shadows
Cs2 deki ak 47 bloodsport skinini ekle. In-Game asset. 2d. High contrast. No shadows
Cs2 neon rider skinini ekle. In-Game asset. 2d. High contrast. No shadows
Ayakları olmasın ve altında bombardilo crocodilo case yazsın
triangle. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat