Перейти к содержимому

Рынок

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

Ничто здесь никогда не спрашивает у внешнего мира, сколько что-то стоит. Цены — ваши, серверные.


ОткрытиеРазмахЧто это
Santocoin SNT$42,0003%Первая, которую придумал город. Медленная, тяжёлая, есть в каждом кошельке
Vinewood VNW$3,2008%Слава, оцениваемая почасово
Bayview BAY$1802%Скучная намеренно. Место, куда можно положить деньги, пока вы решаете
Dustcoin DST$1215%Родом из округа, и на Луне уже побывала дважды
Voltline VLT$6409%Электричество, вода и дороги. Скучная, пока не погаснет свет
Omen OMN$422%Никто не знает, кто её создал

Уберите монету из конфига — и она перестанет существовать. Ничьи накопления при этом не удаляются: верните монету — и у каждого будет то, что было.


shared/config/crypto.lua:

Tick = 300, -- seconds between one price and the next
Volatility = 1.0, -- every coin's swing, multiplied. One number for the whole market
History = 48, -- how many prices the chart remembers
Shock = { Chance = 0.02, Size = 0.22 }, -- rare, and the reason anybody checks twice a day
Fee = 0.02, -- the house, on the way in and on the way out
Trade = { Min = 10, Max = 250000 }, -- what one order may be, in money

А для каждой монеты: цена открытия, её Swing, Drift, смещающий цену вверх или вниз на протяжении недель, Floor и Ceiling, за которые она никогда не выходит, и Depth — деньги, нужные для того, чтобы сдвинуть эту монету на один процент, когда кто-то ею торгует. Тонкую монету богатый игрок может сдвинуть в одиночку, и именно поэтому тонкую монету стоит и держать, и бояться. Depth = 0 означает, что ордера вообще не двигают цену — это проще, но и фармить гораздо легче.

Icon задаёт монете картинку; у вашей собственной монеты без неё используется нарисованный глиф, а затем первая буква её символа.


Wallet = 'character', -- or 'device'

В режиме character украденный телефон показывает вору пустое приложение. В режиме device телефон и есть кошелёк, и кража телефона уносит с собой весь портфель.

По умолчанию стоит character, потому что второй вариант превращает каждое ограбление на улице в ограбление банка, и это должно быть чьим-то осознанным решением, а не значением по умолчанию.


Цена хранится в центах, а пакет — в миллионных долях монеты; оба — целые числа на всём пути, оба округляются против того, кто торгует, а сверху добавляется комиссия. Купить что-то и продать обратно в ту же секунду всегда стоит денег — рынок, где это выходит в ноль, это рынок, на котором цикл «купи-продай-купи-продай» печатает деньги.

У клиента никогда не спрашивают, сколько стоит монета, и он никогда не присылает цену. Каждая запись в кошелёк идёт под блокировкой, потому что чтение пакетов, перемещение денег и запись обратно — это три шага с yield между каждым из них, и два ордера в одном тике иначе оба продали бы одни и те же монеты.


exports.mic_phone:Coins() --> every coin, with price, change and history
exports.mic_phone:CoinPrice('santo') --> 42137.55, in money
exports.mic_phone:GetCrypto(src, 'santo') --> 0.4218
exports.mic_phone:GetCryptoValue(src) --> the whole portfolio, in money
exports.mic_phone:AddCrypto(src, 'omen', 12.5) --> a hack that pays in coin, a mining script
exports.mic_phone:RemoveCrypto(src, 'omen', 12.5) --> false when they did not have it, and nothing moves
exports.mic_phone:SetCoinPrice('omen', 0.4) --> move the market for a story

RemoveCrypto отказывает, а не уходит в минус, поэтому его ответ — это ещё и смог ли человек заплатить, — именно тот вопрос, который на самом деле задаёт магазин, продающий что-то за монеты:

if exports.mic_phone:RemoveCrypto(src, 'omen', price) then giveThem(thing) end