Game.market

## Рыночные заказы

Рынок в Screeps позволяет торговать различными ресурсами между игроками с помощью специальных структур, называемых терминалами. Они могут мгновенно переводить ресурсы в другие комнаты на любом расстоянии.Торговля на этом рынке требует внутриигровой валюты под названием Credits. Ваши Credits привязаны к вашей учетной записи и служат для выполнения ваших рыночных ордеров.

Рыночная система основана на ордерах на продажу и покупку, привязанных к вашим терминалам. Создавая заказ, вы указываете терминал, тип и количество ресурса для продажи или покупки, а также его цену за единицу в кредитах. Каждый размещенный заказ виден всем игрокам во всем игровом мире на странице Market или с помощью API-метода Game.market.getAllOrders. При создании любого заказа взимается комиссия в размере 5% в кредитах.

## Терминалы NPC

Все «перекрестки шоссе» между секторами (то есть в комнатах W0N0, W10N0, W10N10 и т. Д.) Содержат нейтральные терминалы NPC. Вы можете торговать с этими терминалами так же, как с реальными игроками, используя интерфейс рынка или объект Game.market. Заказы в терминалах NPC имеют ограниченное количество ресурсов и пополняются в соответствии с набором правил. Хотя они не могут похвастаться наиболее конкурентоспособными ценами, они позволяют вам конвертировать излишки ресурсов в кредиты и наоборот.

## Свойства

 Game.market.incomingTransactions | Массив последних 100 входящих транзакций на ваши терминалы
```
[{
    transactionId : "56dec546a180ce641dd65960",
    time : 10390687,
    sender : {username: "Sender"},
    recipient : {username: "Me"},
    resourceType : "U",
    amount : 100,
    from : "W0N0",
    to : "W10N10",
    description : "trade contract #1",
    order: {        // optional
        id : "55c34a6b5be41a0a6e80c68b",
        type : "sell",
        price : 2.95
    }
}]

 Game.market.outgoingTransactions | Массив последних 100 исходящих транзакций с ваших терминалов
```
[{
    transactionId : "56dec546a180ce641dd65960",
    time : 10390687,
    sender : {username: "Me"},
    recipient : {username: "Recipient"},
    resourceType : "U",
    amount : 100,
    from : "W0N0",
    to : "W10N10",
    description : "trade contract #1",
    order: {        // optional
        id : "55c34a6b5be41a0a6e80c68b",
        type : "sell",
        price : 2.95
    }
}]

 Game.market.orders | Объект с вашими активными и неактивными ордерами на покупку / продажу на рынке
```
{
    "55c34a6b5be41a0a6e80c68b": {
        id : "55c34a6b5be41a0a6e80c68b",
        created : 13131117,
        active: true,
        type : "sell"
        resourceType : "OH",
        roomName : "W1N1",
        amount : 15821,
        remainingAmount : 30000,
        totalAmount : 50000,
        price : 2.95
    },
    "55c34a6b52411a0a6e80693a": {
        id : "55c34a6b52411a0a6e80693a",
        created : 13134122,
        active: true,
        type : "buy"
        resourceType : "energy",
        roomName : "W1N1",
        amount : 94000,
        remainingAmount : 94000,
        totalAmount : 94000
        price : 0.45
    },
    "55c34a6b5be41a0a6e80c123": {
        id : "55c34a6b5be41a0a6e80c123",
        created : 13105123,
        active: false,
        type : "sell"
        resourceType : "token",
        amount : 0,
        remainingAmount : 10,
        totalAmount : 10,
        price : 50000
    }
}

```

## Методы

### Game.market.calcTransactionCost(amount, roomName1, roomName2)

Оцените стоимость транзакций (в энергии) методов StructureTerminal.send и Game.market.deal.

Формула

Math.ceil( amount \* ( 1 - Math.exp(-distanceBetweenRooms/30) ) )

distanceBetweenRooms - расстояние между комнатами

 roomName1
 roomName2

```
const cost = Game.market.calcTransactionCost(1000, 'W0N0', 'W10N5');
// -> 284 energy units

```

### Game.market.cancelOrder(orderId)

Отмените ранее созданный заказ. 5% комиссия не возвращается.

 ERR\_INVALID\_ARGS

```
for(const id in Game.market.orders) {
    Game.market.cancelOrder(id);
}

```

### Game.market.changeOrderPrice(orderId, newPrice)

Изменяет цену ордера. Если новая цена больше старой, то будет изъята комиссия=

=([Новая цена]-[Старая цена])\*[непроданные ресурсы в ордере]\*0.05 кредитов

 newPrice

 ERR\_NOT\_OWNER
 ERR\_NOT\_ENOUGH\_RESOURCES
 ERR\_INVALID\_ARGS

```
Game.market.changeOrderPrice('57bec1bf77f4d17c4c011960', 9.95);

```

### Game.market.createOrder(type, resourceType, price, totalAmount, [roomName])

Создаёт рыночный ордер в вашем терминале. При размещении заказа с вас будет взиматься комиссия = цена \* сумма ресурсев \* 0,05 кредита. Максимальное количество заказов составляет 50 на игрока. Вы можете в любое время создать заказ на любую сумму, он будет автоматически активирован и деактивирован в зависимости от наличия ресурса / кредитов

 resourceType
 price
 totalAmount
 roomName

 ERR\_NOT\_OWNER
 ERR\_NOT\_ENOUGH\_RESOURCES
 ERR\_FULL
 ERR\_INVALID\_ARGS

```
Game.market.createOrder(ORDER_SELL, RESOURCE_GHODIUM, 9.95, 10000, "W1N1");

```

### Game.market.deal(orderId, amount, [yourRoomName])

Совершает торговую сделку с вашего терминала в yourRoomName на терминал другого игрока, используя указанный ордер на покупку / продажу. С вашего терминала будет взиматься энергетическая единица равная стоимости трансфера независимо от типа ресурса заказа. Вы можете использовать метод Game.market.calcTransactionCost, чтобы оценить его. Когда несколько игроков пытаются выполнить одну и ту же сделку, тот, у кого самая короткая дистанция, имеет преимущество. Вы не можете совершить более 10 сделок за один тик.

 amount
 yourRoomName

 ERR\_NOT\_OWNER
 ERR\_NOT\_ENOUGH\_RESOURCES
 ERR\_FULL
 ERR\_INVALID\_ARGS
 ERR\_TIRED