🏠 

PixelShop+

Makes it easier to create new custom shops for Idle Pixel

This script should not be not be installed directly. It is a library for other scripts to include with the meta directive // @require https://update.greasyfork.org/scripts/488260/1448277/PixelShop%2B.js

// ==UserScript==
// @name         Pixel Shop+
// @namespace    http://tampermonkey.net/
// @version      1.0.8
// @description  Makes it easier to create new custom shops for Idle Pixel
// @author       Dounford
// @license      MIT
// @match        *://idle-pixel.com/login/play*
// @grant        none
// ==/UserScript==
/*newCoinFormat = {
name:'testCoin',
image:'https://raw.githubusercontent.com/Dounford-Felipe/DHP-Pets/main/images/goldenHeart.gif',
value:2000
}
*/
//PixelShopPlus.newCoin(newCoinFormat)
//newShopFormat = PixelShopPlus.newShop('fish','testCoin')
/*newItemFormat = [{
name:"blueCat",
imageUrl:"https://raw.githubusercontent.com/Dounford-Felipe/DHP-Pets/main/images/blueCat.png",
coin:"testCoin",
price:1000,
tooltipText:"<span class='color-primary'>Blue Cat</span><br /><br />This cute cat wants to be your friend",
buyText:"Adopt this cat to be your friend",
boughtText:"Charlie will forever love you",
callback: function(){IdlePixelPlus.plugins.test.bought(pirate)}
}]*/
//PixelShopPlus.newItems('fish',newItemFormat)
if (!document.getElementById('shopButtons')) {
(function PixelShopPlus() {
'use strict';
const PixelShopPlus = {
shops: ['vanilla'],
coins: {},
items: {},
initialize: function () {
PixelShopPlus.newModals();
PixelShopPlus.newShopDivs();
},
//Creates
newModals: function () {
let customShopModalDiv = `<dialog id="customShopModal" onclick="event.target==this && this.close()" class="dounfordModal">
<div class="dounfordModalHeader">
<h5 class="modal-title text-secondary">Purchace Item</h5>
<button type="button" class="btn-close" onclick="document.getElementById('customShopModal').close()" style="padding: 0.5rem;"></button>
<input type="hidden" id="customShopModalShop">
<input type="hidden" id="customShopModalItem">
</div>
<div class="dounfordModalBody">
<span>
<center>
<img id="customShopModalImage" src="" title="Custom Shop Item" style="height:100px">
</center>
<br>
<br>
</span>
<div class="center" id="customShopModalText">Purchase this item?</div>
</div>
<div class="dounfordModalFooter">
<button onclick="document.getElementById('customShopModal').close()">
<span class="font-pixel hover">Cancel</span>
</button>
<button id="customShopModalBuy" class="background-primary">
<span class="font-pixel hover">Purchase</span>
</button>
</div>
</dialog>`
document.getElementById('content').insertAdjacentHTML('beforeend', customShopModalDiv);
document.getElementById('customShopModalBuy').addEventListener('click', PixelShopPlus.buyItem);
},
//Adds the change shop button
newShopDivs: function () {
let shopButton = document.createElement('div');
shopButton.id = "shopButtons";
shopButton.style.cssText = "white-space: nowrap; overflow-x: auto;";
shopButton.innerHTML = `<div id="vanilla-shop" onclick="PixelShopPlus.changeShopTabs('vanilla')" style="background-color: rgb(247, 122, 129); white-space: normal;" class="quest-tab-button hover">
VANILLA SHOP
</div>`
let vanillaShop = document.createElement('div');
vanillaShop.id = "vanillaShop";
while (document.getElementById('panel-shop').firstChild) {
vanillaShop.appendChild(document.getElementById('panel-shop').firstChild);
}
document.getElementById('panel-shop').appendChild(shopButton);
document.getElementById('panel-shop').insertAdjacentHTML('beforeend', '<hr>');
document.getElementById('panel-shop').appendChild(vanillaShop);
},
//Change which shop is shown
changeShopTabs: function(value) {
// Oculta todos os tabs e remove o destaque
for (const shopId of PixelShopPlus.shops) {
document.getElementById(shopId + 'Shop').style.display = "none";
document.getElementById(shopId + '-shop').style.backgroundColor = "";
}
document.getElementById(value + 'Shop').style.display = "";
document.getElementById(value + '-shop').style.backgroundColor = "#f77a81";
},
//Register a new coin
newCoin: function(coin) {
if (typeof PixelShopPlus.coins[coin.name] == 'undefined') {
PixelShopPlus.coins[coin.name] = {...coin}
}
},
//Increase the value of a coin
coinIncrease: function(coin,increase) {
PixelShopPlus.coins[coin].value += increase;
PixelShopPlus.saveCoins();
if (document.querySelector('[coin-value="' + coin + '"]')) {
let coinElements = document.querySelectorAll('[coin-value="' + coin + '"]');
coinElements.forEach(function(coinElement) {
coinElement.textContent = PixelShopPlus.coins[coin].value.toLocaleString("en-US");
});
}
},
//Decrease the value of a coin
coinDecrease: function(coin,decrease) {
PixelShopPlus.coins[coin].value -= decrease;
PixelShopPlus.saveCoins();
if (document.querySelector('[coin-value="' + coin + '"]')) {
let coinElements = document.querySelectorAll('[coin-value="' + coin + '"]');
coinElements.forEach(function(coinElement) {
coinElement.textContent = PixelShopPlus.coins[coin].value.toLocaleString("en-US");
});
}
},
//Set the value of a coin
coinSet: function(coin,setValue) {
PixelShopPlus.coins[coin].value = setValue;
PixelShopPlus.saveCoins();
if (document.querySelector('[coin-value="' + coin + '"]')) {
let coinElements = document.querySelectorAll('[coin-value="' + coin + '"]');
coinElements.forEach(function(coinElement) {
coinElement.textContent = PixelShopPlus.coins[coin].value.toLocaleString("en-US");
});
}
},
//Register a new shop
newShop: function (shop,coin,beforeFunction) {
PixelShopPlus.shops.push(shop);
PixelShopPlus.items[shop] = {};
let newTabButton = document.createElement('div');
newTabButton.id = shop + "-shop";
newTabButton.className = "quest-tab-button hover";
newTabButton.style.marginLeft = "20px";
newTabButton.innerHTML = shop.toLocaleUpperCase() + ' SHOP';
newTabButton.onclick = function() {
PixelShopPlus.changeShopTabs(shop);
};
document.getElementById('shopButtons').appendChild(newTabButton);
let newShopPanel = document.createElement('div');
newShopPanel.id = shop + "Shop"
newShopPanel.style.display = "none"
newShopPanel.innerHTML  = `<h1>${shop.toLocaleUpperCase()} SHOP</h1>`
if (typeof coin == 'string') {
let newCoinImage = document.createElement('img');
newCoinImage.src = PixelShopPlus.coins[coin].image
newCoinImage.className = "w30"
let newCoinValue = document.createElement('span');
newCoinValue.setAttribute('coin-value', coin)
newCoinValue.innerText = PixelShopPlus.coins[coin].value.toLocaleString("en-US")
newCoinValue.style.marginLeft = "5px"
newCoinValue.style.fontSize = "1.3rem"
newCoinValue.style.verticalAlign = "middle"
newShopPanel.appendChild(newCoinImage);
newShopPanel.appendChild(newCoinValue);
}
if (typeof beforeFunction == 'function') {
PixelShopPlus.items[shop].beforeFunction = beforeFunction;
}
newShopPanel.insertAdjacentHTML('beforeend', '<hr>');
document.getElementById('panel-shop').appendChild(newShopPanel);
},
//Register an array of new buyable items
newItems: function(shop,items) {
items.forEach(function(item) {
PixelShopPlus.items[shop][item.name] = item;
let newShopItem = `<div id="shop-${item.name}" onclick="PixelShopPlus.openBuyModal('${shop}','${item.name}')" class="game-shop-box hover shadow" data-tooltip="shop-${item.name}" data-bs-toggle="tooltip" data-bs-placement="right" data-bs-html="true" title="" data-bs-original-title="${item.tooltipText}" style="margin-right: 5px;">
<div class="center mt-2">
<img src="${item.imageUrl}" title="${item.name}" style="height: 50px;">
</div>
<div class="center mt-2">
<img src="${PixelShopPlus.coins[item.coin].image}" title="${item.coin}" class="w20">
<span id="${item.name}-shop-cost">${format_number(item.price)}</span>
</div>
</div>`
document.getElementById(shop + 'Shop').insertAdjacentHTML('beforeend',newShopItem)
$('#shop-' + item.name).tooltip()
})
},
//In case you want to remove an Item
removeItem: function(shop,item) {
let removedItem = document.getElementById('shop-' + item);
removedItem.parentNode.removeChild(removedItem);
delete PixelShopPlus.items[shop][item];
console.log(item + ' from ' + shop + ' Shop was removed');
},
//Open Buy Confirm
openBuyModal: function(shop,item) {
if (PixelShopPlus.items[shop][item]) {
document.getElementById('customShopModalShop').value = shop;
document.getElementById('customShopModalItem').value = item;
document.getElementById('customShopModalImage').src = PixelShopPlus.items[shop][item].imageUrl;
document.getElementById('customShopModalText').innerText = PixelShopPlus.items[shop][item].buyText || "Buy?";
document.getElementById('customShopModalBuy').style.display='';
document.getElementById('customShopModal').showModal();
}
},
//Buy Item
buyItem: async function() {
let shop = document.getElementById('customShopModalShop').value;
let item = document.getElementById('customShopModalItem').value;
let price = PixelShopPlus.items[shop][item].price
let coin = PixelShopPlus.items[shop][item].coin;
if (PixelShopPlus.coins[coin].value >= price) {
document.getElementById('customShopModalBuy').style.display="none";
if (typeof PixelShopPlus.items[shop].beforeFunction == "function") {
const success = await PixelShopPlus.items[shop].beforeFunction(item)
if (!success) {
document.getElementById('customShopModalBuy').style.display='none';
document.getElementById('customShopModalText').innerText = "You are unable to buy this, sorry.";
return
}
}
PixelShopPlus.coinDecrease(coin,price);
document.getElementById('shop-' + item).style.display = "none";
document.getElementById('customShopModalText').innerText = PixelShopPlus.items[shop][item].boughtText || "Bought!";
if(typeof PixelShopPlus.items[shop][item].callback == "function") {
PixelShopPlus.items[shop][item].callback(item)
}
} else {
document.getElementById('customShopModalBuy').style.display='none';
document.getElementById('customShopModalText').innerText = "You can't afford this, sorry.";
}
},
//Save the coin amount on localstorage
saveCoins: function() {
let key = `ShopPlusCoins-${var_username}`;
localStorage.setItem(key, JSON.stringify(PixelShopPlus.coins));
},
//Load the coin amount on localstorage
loadCoins: function() {
let key = `ShopPlusCoins-${var_username}`;
let loadedCoins = localStorage.getItem(key);
if (loadedCoins) {
PixelShopPlus.coins = JSON.parse(loadedCoins);
}
},
};
window.PixelShopPlus = PixelShopPlus;
PixelShopPlus.initialize();
})()
}