summaryrefslogtreecommitdiff
path: root/order.h
diff options
context:
space:
mode:
authortruelight <truelight@openttd.org>2005-02-06 10:24:57 +0000
committertruelight <truelight@openttd.org>2005-02-06 10:24:57 +0000
commit020c1e9b6c228ee812ed85ecc02dc52847940821 (patch)
tree6c6585bdaca582be23e16326cdd45058a6e3a17f /order.h
parente9c93f9c0ca76117ac1315b6aff03f1f138f62e4 (diff)
downloadopenttd-020c1e9b6c228ee812ed85ecc02dc52847940821.tar.xz
(svn r1818) -Add: Dynamic orders (up to 64k orders)
Diffstat (limited to 'order.h')
-rw-r--r--order.h28
1 files changed, 22 insertions, 6 deletions
diff --git a/order.h b/order.h
index 430e3bb8b..840e1ec22 100644
--- a/order.h
+++ b/order.h
@@ -1,6 +1,8 @@
#ifndef ORDER_H
#define ORDER_H
+#include "pool.h"
+
/* Order types */
enum {
OT_NOTHING = 0,
@@ -64,17 +66,27 @@ typedef struct {
VARDEF TileIndex _backup_orders_tile;
VARDEF BackuppedOrders _backup_orders_data[1];
-VARDEF Order _orders[5000];
-VARDEF uint32 _orders_size;
+extern MemoryPool _order_pool;
+/**
+ * Get the pointer to the order with index 'index'
+ */
static inline Order *GetOrder(uint index)
{
- assert(index < _orders_size);
- return &_orders[index];
+ return (Order*)GetItemFromPool(&_order_pool, index);
+}
+
+/**
+ * Get the current size of the OrderPool
+ */
+static inline uint16 GetOrderPoolSize(void)
+{
+ return _order_pool.total_items;
}
-#define FOR_ALL_ORDERS_FROM(o, from) for(o = GetOrder(from); o != &_orders[_orders_size]; o++)
-#define FOR_ALL_ORDERS(o) FOR_ALL_ORDERS_FROM(o, 0)
+#define FOR_ALL_ORDERS_FROM(order, start) for (order = GetOrder(start); order != NULL; order = (order->index + 1 < GetOrderPoolSize()) ? GetOrder(order->index + 1) : NULL)
+#define FOR_ALL_ORDERS(order) FOR_ALL_ORDERS_FROM(order, 0)
+
#define FOR_VEHICLE_ORDERS(v, order) for (order = v->orders; order != NULL; order = order->next)
@@ -82,6 +94,10 @@ static inline bool HasOrderPoolFree(uint amount)
{
const Order *order;
+ /* There is always room if not all blocks in the pool are reserved */
+ if (_order_pool.current_blocks < _order_pool.max_blocks)
+ return true;
+
FOR_ALL_ORDERS(order)
if (order->type == OT_NOTHING)
if (--amount == 0)