Перейти к содержимому
Zone of Games Forum

Рекомендованные сообщения

58 минут назад, Freeman665 сказал:

@Alex Po Quest ясно. Т.е. можно и 500 языков заявить, ничего не поменяло бы, зато показало ИХ борьбу. Это так по-украински)

Ну, да. Видел игры, где, точно, заявлено 130 языков, интерфейс, субтитры и даже озвучение. Но в самой игре, даже, текста нет.

Изменено пользователем Alex Po Quest
  • Хаха (+1) 1

Поделиться сообщением


Ссылка на сообщение
7 часов назад, lordik555 сказал:

Купленных и ни разу не устанавливавшихся? 

И этих то-же,ноя про те что продаются в РФ:D

Поделиться сообщением


Ссылка на сообщение
10 часов назад, Сильвер_79 сказал:

Последние пару лет Стим не так жестко падает. Иливентили нарастили мощности, или игроки постыли к большим распродажам, или и то и то одновременно.

Просто распродажи стали делать “на отвали”. Интерактив пропал совсем. Даже для рисования артов распродажи и то привлекают каких-то самых дешёвых художников. А скидки на разные игры и без того случаются периодически, главное в желаемое добавить. Соответственно и интерес упал.

7 часов назад, lordik555 сказал:

Тут статистику недавно выкатывали на эту тему. Если коротко, то портал анализировал 10% открытых профилей Steam и пришёл к выводу, что у этих 10% есть игр ни разу не запускавшихся на сумму в 1.9 миллиарда долларов. Затем они просто умножили это число на 10.

Там вычисления очень сказочные. А по уму надо было делать так:

  1. Скачиваем информацию по достижениям всех игр и узнаём, какой процент выполнения у самого популярного (из него вычисляем, сколько людей не получило даже самое элементарное достижение, т.е. скорее всего не запустило игру)
  2. Берём данные по имеющимся копиям всех игр у Галёнкина.
  3. Затем берём обзоры и узнаем примерное процентное распределение по регионам.
  4. САМОЕ ГЛАВНОЕ — в соответствии с распределением по регионам получаем среднюю цену с учётом распродаж в этих регионах.

То есть надо считать по стоимости во всех регионах. Ибо в половине регионов цена может может быть в 2 и 3 раза ниже.
Ну и главный нюанс — многие закупают игры, когда те имеют 50%+ скидку.

В данном же же случае "баснословные цифры" получены за счёт умножения на оригинальную цены, кек.

А что до того, какое бабло делает Valve, с этим можно заглянуть на торговую площадку.
В 2016-м году я проанализировал только 1 предмет:

Скрытый текст

Скин с торговой площадки steam: "Штык-нож M9 | Волны".

За период с 9 января 2015 по 30 августа 2016 (год и семь месяцев) было продано 20702 штуки.

Люди потратили на один скин в общей сложности 451 535 647 рублей. На один миллион больше годового бюджета на строительство и ремонт дорог в Пскове.

Более того, около 4660 людей в данный момент желают его купить по минимальной цене в 12561 рубль, что выльется в траты 58 534 819 рублей. Это равняется сумме, перечисленной Амурским филиалом Всемирного фонда дикой природы на сохранение природы в Приморье.

Steam забирает 13% с каждой сделки. Год и семь месяцев продаж одного лишь скина (Из тысяч) принесли сервису 58 699 634 рублей.

oC3NOr8.png

А теперь можете представить, какие цифры выйдут, если собрать информацию со всей торговой площадки.

Поделиться сообщением


Ссылка на сообщение
В 25.06.2024 в 22:06, DeeMan сказал:

Хорошие цены, мб кому то будет интересно.

https://gamesforfarm.com/goods/info/2424560-bravery-and-greed

Написал скрипт для этого сайта под Tamper Monkey.

Скрытый текст

// ==UserScript==
// @name         GamesForFarm - Парсер
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Получает все игры в GamesForFarm и ищет имеющиеся и желаемые
// @author       0wn3df1x
// @match        https://gamesforfarm.com*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // Добавляем стили
    const style = document.createElement('style');
    style.textContent = `
        .load-button {
            background-color: #171a21;
            color: #acb2b8;
            border: 1px solid #171a21;
            padding: 10px 20px;
            font-size: 16px;
            cursor: pointer;
            transition: background-color 0.3s, color 0.3s;
            margin-left: 10px;
            margin-top: 10px;
        }
        .load-button:hover {
            background-color: #66c0f4;
            color: #171a21;
        }
        .json-input {
            background-color: #171a21;
            color: #acb2b8;
            border: 1px solid #171a21;
            padding: 10px;
            font-size: 14px;
            width: 300px;
            height: 100px;
            margin-left: 10px;
            margin-top: 10px;
            resize: none;
        }
        .data-link {
            margin-left: 10px;
            margin-top: 10px;
            color: #66c0f4;
            text-decoration: none;
        }
        .data-link:hover {
            text-decoration: underline;
        }
    `;
    document.head.appendChild(style);

    // Добавляем кнопку "Загрузить таблицу" и текстовое поле под <div class="main__title">Каталог</div>
    const mainTitle = document.querySelector('.main__title');
    if (mainTitle) {
        const loadButton = document.createElement('button');
        loadButton.textContent = 'Загрузить таблицу';
        loadButton.className = 'load-button';

        const jsonInput = document.createElement('textarea');
        jsonInput.className = 'json-input';
        jsonInput.placeholder = 'Вставьте JSON сюда';

        const dataLink = document.createElement('a');
        dataLink.href = 'https://store.steampowered.com/dynamicstore/userdata/';
        dataLink.target = '_blank'; // Открывает ссылку в новой вкладке
        dataLink.textContent = 'Получить данные своей UserData в Steam';
        dataLink.className = 'data-link';

        mainTitle.parentNode.insertBefore(loadButton, mainTitle.nextSibling);
        mainTitle.parentNode.insertBefore(jsonInput, loadButton.nextSibling);
        mainTitle.parentNode.insertBefore(dataLink, jsonInput.nextSibling);

        // Обработчик нажатия на кнопку "Загрузить таблицу"
        loadButton.addEventListener('click', function() {
            let jsonData = {};
            try {
                if (jsonInput.value.trim() !== '') {
                    jsonData = JSON.parse(jsonInput.value);
                }
            } catch (e) {
                alert('Неверный формат JSON');
                return;
            }

            const rgWishlist = new Set(jsonData.rgWishlist || []);
            const rgOwnedApps = new Set(jsonData.rgOwnedApps || []);

            // Находим кнопку и нажимаем на неё
            const button = document.querySelector('.btn-reset.product__more-button.fn_product_more.ddd3');
            if (button) {
                button.click();
            }

            // Ждём 5 секунд (увеличим время ожидания)
            setTimeout(() => {
                // Создаем массив для хранения данных всех игр
                const gamesData = [];

                // Находим все элементы с классом product__item внутри элемента с id gamesCatalog
                const productItems = document.querySelectorAll('#gamesCatalog .product__item');

                productItems.forEach(item => {
                    // Извлекаем Steam ID
                    const steamLink = item.querySelector('a[href*="store.steampowered.com/app/"]');
                    let steamId = '-';
                    if (steamLink) {
                        const href = steamLink.getAttribute('href');
                        const match = href.match(/\/app\/(\d+)\//);
                        if (match && match[1]) {
                            steamId = match[1];
                        }
                    }

                    // Пропускаем элемент, если нет Steam ID
                    if (steamId === '-') {
                        return;
                    }

                    // Извлекаем цену
                    const priceElement = item.querySelector('.product__box-price');
                    let price = '-';
                    if (priceElement) {
                        price = priceElement.textContent.trim();
                        price = formatPrice(price);
                    }

                    // Извлекаем адрес картинки
                    const imageElement = item.querySelector('.product__box-image img');
                    let imageUrl = '-';
                    if (imageElement) {
                        imageUrl = imageElement.getAttribute('data-src');
                    }

                    // Извлекаем название игры
                    const titleElement = item.querySelector('.product__box-title a');
                    let gameTitle = '-';
                    if (titleElement) {
                        gameTitle = titleElement.textContent.trim();
                    }

                    // Извлекаем размер скидки
                    const discountElement = item.querySelector('.product__box-prop.prop—discount');
                    let discount = '-';
                    if (discountElement) {
                        discount = discountElement.textContent.trim();
                    }

                    // Проверяем наличие Steam ID в списках
                    const inWishlist = rgWishlist.has(parseInt(steamId)) ? '[VVV]' : '';
                    const inOwnedApps = rgOwnedApps.has(parseInt(steamId)) ? '[VVV]' : '';

                    // Добавляем данные в массив
                    gamesData.push({
                        steamId,
                        price,
                        imageUrl,
                        gameTitle,
                        discount,
                        inWishlist,
                        inOwnedApps
                    });
                });

                // Сортируем массив сначала по наличию в rgWishlist, затем по цене
                gamesData.sort((a, b) => {
                    if (a.inWishlist && !b.inWishlist) return -1;
                    if (!a.inWishlist && b.inWishlist) return 1;
                    return parseFloat(b.price.replace(',', '.')) - parseFloat(a.price.replace(',', '.'));
                });

                // Создаем новое окно для вывода результатов
                const newWindow = window.open("", "_blank", "width=600,height=400");
                newWindow.document.write('<html><head><title>Результаты</title></head><body><table border="1" id="gamesTable"><tr><th>Steam ID</th><th>Название игры</th><th>Цена</th><th>Размер скидки</th>' + (jsonData.rgWishlist ? '<th>rgWishlist</th>' : '') + (jsonData.rgOwnedApps ? '<th>rgOwnedApps</th>' : '') + '<th>Адрес картинки</th></tr>');

                gamesData.forEach(game => {
                    newWindow.document.write(`<tr><td>${game.steamId}</td><td>${game.gameTitle}</td><td>${game.price}</td><td>${game.discount}</td>${jsonData.rgWishlist ? `<td>${game.inWishlist}</td>` : ''}${jsonData.rgOwnedApps ? `<td>${game.inOwnedApps}</td>` : ''}<td>${game.imageUrl}</td></tr>`);
                });

                newWindow.document.write('</table></body></html>');
                newWindow.document.close();

                // Добавляем функциональность сортировки таблицы по клику на заголовки
                const table = newWindow.document.getElementById('gamesTable');
                if (table) {
                    const headers = table.getElementsByTagName('th');
                    for (let i = 0; i < headers.length; i++) {
                        headers[i].addEventListener('click', () => {
                            sortTable(table, i);
                        });
                    }
                }
            }, 5000); // Ожидание 5 секунд
        });
    }

    // Функция для форматирования цены
    function formatPrice(price) {
        return price.replace('.', ',').replace('₽', '').trim();
    }

    // Функция для сортировки таблицы
    function sortTable(table, columnIndex) {
        const rows = Array.from(table.rows).slice(1);
        const isNumeric = columnIndex === 0 || columnIndex === 2; // Steam ID и Цена

        rows.sort((a, b) => {
            const aValue = a.cells[columnIndex].textContent;
            const bValue = b.cells[columnIndex].textContent;

            if (isNumeric) {
                return parseFloat(aValue.replace(',', '.')) - parseFloat(bValue.replace(',', '.'));
            } else {
                return aValue.localeCompare(bValue);
            }
        });

        // Определяем направление сортировки
        const header = table.rows[0].cells[columnIndex];
        const sortDirection = header.getAttribute('data-sort') || 'asc';
        if (sortDirection === 'asc') {
            rows.reverse();
            header.setAttribute('data-sort', 'desc');
        } else {
            header.setAttribute('data-sort', 'asc');
        }

        // Очищаем таблицу и добавляем отсортированные строки
        while (table.rows.length > 1) {
            table.deleteRow(1);
        }

        rows.forEach(row => table.appendChild(row));
    }
})();

 

  1. Если вы хотите узнать, какие игры, продающиеся на сайте, есть у вас в списке желаемого и на аккаунте, то читайте пункты 0-4, если вы хотите просто получить таблицу имеющихся на сайте игры, то можете перейти к пункту 5.
    Итак. Что касается списка имеющихся игр и списка желаемого — они содержатся в юзердате. Если вы не пользуетесь Steam в браузере и не вошли в аккаунт со своего браузера — надо войти, т.к. Userdata пользователя доступна только ему самому. После установки скрипта вы увидите на странице магазина три новых элемента:
    sS8iaNW.png
  2. Щёлкнув по первому элементу — вы окажетесь на странице со своей Userdata
    Там хранится информация о вашем списке желаемого, имеющихся играх и тех играх, которые вы решили скрыть в магазине. Также там есть информация о рекомендуемых жанрах и кураторах. Но ничего конфиденциального — если есть желание, можете проверить.
    wP5cmnD.png
  3. Нужно скопировать данные своей Userdata и вставить в текстовое окно.
    fuv8fee.png
  4. После чего щёлкнуть “Загрузить таблицу”. Через 5 секунд откроется новое окно, в котором вы увидите:
    50NfDjF.png
    В самом верху списка идут игры, которые есть у вас в списке желаемого. Упорядочены по убыванию цены. Затем идут все остальные игры аналогично по убыванию цены. Можно щёлкать по заголовкам, чтобы сортировать данные.
  5. Вы можете скопировать данные и вставить их на Google-таблицу. После чего можете использовать формулу Image, чтобы отобразить картинки, будет выглядеть так:GNJ4KRK.png
  6. Если вы не вставите Json и просто нажмёте кнопку “Загрузить таблицу”, то таблица всё равно откроется в новом окне, просто в ней не будет информации об играх, которые есть у вас на аккаунте и в списке желаемого. Таблицу также можно будет упорядочить, щёлкая по заголовкам и аналогично можно будет скопировать в Google-таблицы для дальнейшей работы.
Изменено пользователем 0wn3df1x

Поделиться сообщением


Ссылка на сообщение
8 минут назад, Сильвер_79 сказал:

Смута вышла в Стим.:wink:

О, да, РЕАЛЬНО … :dash3:

Поделиться сообщением


Ссылка на сообщение
19 часов назад, Freeman665 сказал:

@Alex Po Quest ясно. Т.е. можно и 500 языков заявить, ничего не поменяло бы, зато показало ИХ борьбу. Это так по-украински)

там даже в обсуждениях кто-то уже пытался разжечь “огонь” по этому поводу)

но мне пофиг, игры вне политики я считаю.

  • +1 1
  • -1 1

Поделиться сообщением


Ссылка на сообщение
4 часа назад, lordik555 сказал:

игры вне политики я считаю.

нет, и уже давно.

Поделиться сообщением


Ссылка на сообщение
4 часа назад, lordik555 сказал:

игры вне политики я считаю.

Стоят рядом вместе с Олимпийскими((

Поделиться сообщением


Ссылка на сообщение

Написал скрипт под Tamper Monkey для страницы со списком наборов на SteamDB (валюту можно изменить):
https://steamdb.info/bundles/?cc=ru 

Основная проблема этого списка наборов в том, что в нём, несмотря на наличие ряда полезных фильтров, отсутствуют самые базовые и необходимые фильтры, а именно по цене, количеству игр, скидкам и рейтингу.

Скрытый текст

vPLTYuj.png


Мой скрипт это исправляет.

Скрытый текст

0qLfH83.png

К самому скрипту. Для того, чтобы он заработал, нужно предварительно поменять entries per page на All (Slow):
d2xPGEh.png
(Чтобы скрипт имел доступ ко всему объёму данных для последующей фильтрации).

После этого достаточно вбивать нужные данные в фильтры и нажимать “фильтр”.

Вот, к примеру, я упорядочил по количеству игр в бандле.
А затем накинул фильтр на то, чтоб цена была ниже 2000 и рейтинг был выше 90.

Скрытый текст

nZrjJuL.png


Код скрипта:

Скрытый текст

 


// ==UserScript==
// @name         SteamDB Bundle Filter
// @namespace    https://steamdb.info/
// @version      0.1
// @description  Добавляет фильтры для бандлов
// @author       0wn3df1x
// @match        https://steamdb.info/bundles/?cc*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // Парсинг цен
    function parsePrice(priceStr) {
        return parseFloat(priceStr.replace(/\s|₽/g, '').replace(',', '.'));
    }

    // Парсинг скидок
    function parseDiscount(discountStr) {
        return Math.abs(parseInt(discountStr.replace(/[%\-]/g, ''), 10));
    }

    // Парсинг рейтинга
    function parseRating(ratingStr) {
        return parseFloat(ratingStr.replace('%', ''));
    }

    // Управление
    const headerTitle = document.querySelector('h1.header-title');
    const filterContainer = document.createElement('div');
    filterContainer.style.marginBottom = '20px';
    filterContainer.style.fontSize = '12px';
    filterContainer.innerHTML = `
        <div>
            <label style="min-width: 100px;">Цена от:</label><input type="text" id="price-from" size="5">
            <label style="min-width: 100px;">Цена до:</label><input type="text" id="price-to" size="5">
        </div>
        <div>
            <label style="min-width: 100px;">Скидка от:</label><input type="text" id="discount-from" size="5">
            <label style="min-width: 100px;">Скидка до:</label><input type="text" id="discount-to" size="5">
        </div>
        <div>
            <label style="min-width: 100px;">Игр от:</label><input type="text" id="count-from" size="5">
            <label style="min-width: 100px;">Игр до:</label><input type="text" id="count-to" size="5">
        </div>
        <div>
            <label style="min-width: 100px;">Рейтинг от:</label><input type="text" id="rating-from" size="5">
            <label style="min-width: 100px;">Рейтинг до:</label><input type="text" id="rating-to" size="5">
        </div>
        <button id="filter-button">Фильтр</button>
    `;
    headerTitle.parentNode.insertBefore(filterContainer, headerTitle.nextSibling);

    // CSS
    const style = document.createElement('style');
    style.textContent = `
        label {
            display: inline-block;
            margin-right: 10px;
            text-align: left;
        }
        input[type="text"] {
            padding: 5px;
            border: 1px solid #ccc;
            border-radius: 3px;
            font-size: 12px;
        }
        button {
            padding: 5px 10px;
            border: none;
            border-radius: 3px;
            background-color: #007bff;
            color: white;
            cursor: pointer;
            font-size: 22px;
        }
        button:hover {
            background-color: #0056b3;
        }
        div {
            margin-bottom: 1px;
        }
    `;
    document.head.appendChild(style);

    // Логика
    document.getElementById('filter-button').addEventListener('click', function() {
        const priceFrom = parsePrice(document.getElementById('price-from').value) || 0;
        const priceTo = parsePrice(document.getElementById('price-to').value) || Infinity;
        const discountFrom = parseDiscount(document.getElementById('discount-from').value) || 0;
        const discountTo = parseDiscount(document.getElementById('discount-to').value) || Infinity;
        const countFrom = parseInt(document.getElementById('count-from').value, 10) || 0;
        const countTo = parseInt(document.getElementById('count-to').value, 10) || Infinity;
        const ratingFrom = parseRating(document.getElementById('rating-from').value) || 0;
        const ratingTo = parseRating(document.getElementById('rating-to').value) || 100;

        document.querySelectorAll('tr.bundle').forEach(bundle => {
            const price = parsePrice(bundle.querySelector('td.price').textContent);
            const discount = parseDiscount(bundle.querySelector('td.discount').textContent);
            const count = parseInt(bundle.querySelector('td.count').textContent, 10);
            const rating = parseRating(bundle.querySelector('td.rating').textContent);

            const show = (
                price >= priceFrom && price <= priceTo &&
                discount >= discountFrom && discount <= discountTo &&
                count >= countFrom && count <= countTo &&
                rating >= ratingFrom && rating <= ratingTo
            );

            bundle.style.display = show ? '' : 'none';
        });
    });
})();

 

 

Изменено пользователем 0wn3df1x
  • Лайк (+1) 1
  • +1 1

Поделиться сообщением


Ссылка на сообщение

На яндекс маркете продают The Survivalists за 70  рублей.

Поделиться сообщением


Ссылка на сообщение
5 минут назад, edifiei сказал:

На яндекс маркете продают The Survivalists за 70  рублей.

Вот это? Мне с яндекс пеем вообще за 58, а так за 75. Реально недорого. При чем в своем магазине Бука её за 85 отдает.

  • Хаха (+1) 1

Поделиться сообщением


Ссылка на сообщение
14 минут назад, Сильвер_79 сказал:

Вот это? Мне с яндекс пеем вообще за 58, а так за 75. Реально недорого. При чем в своем магазине Бука её за 85 отдает.

Да)  Мне с пеем 69. а без за 70 :D

Я взял ключ минут чрез 5-7 пришел на почту.

Изменено пользователем edifiei
  • +1 1

Поделиться сообщением


Ссылка на сообщение

Снова проверил сайт GamesForFarm моим скриптом.

На сайте появились ключи от Roadwarden за 35 рублей. В Steam игра стоит 399 рублей (по скидке продавалась за 199 рублей), на плати и других площадках цена составляет около 77 рублей.

Русификатор в процессе создания.
logo.png

  • +1 2

Поделиться сообщением


Ссылка на сообщение
2 часа назад, Сильвер_79 сказал:

Вот это? Мне с яндекс пеем вообще за 58, а так за 75. Реально недорого. При чем в своем магазине Бука её за 85 отдает.

Там еще присмотрел King of Seas ,The Serpent Rogue  и  Epic Chef  ,все со скидкой 90+

  • Лайк (+1) 1

Поделиться сообщением


Ссылка на сообщение

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Похожие публикации

    • Автор: james_sun

      Ранее релиз проекта состоялся в Epic Games Store.
      Ironclad Games и Stardock объявили дату выхода глобальной стратегии Sins of a Solar Empire II в Steam.
      Ранее релиз проекта состоялся в Epic Games Store.
      На площадке Valve игра увидит свет 15 августа. Русский язык заявлен.
    • Автор: SerGEAnt

      В архиве есть полная локализация, если что.
      В Steam в течение аж 30 дней можно бесплатно добавить в библиотеку Drawful 2 — кооперативную игру про угадывание сути ужасных рисунков ваших друзей.
      В архиве есть полная локализация, если что.



Zone of Games © 2003–2024 | Реклама на сайте.

×