econ.h 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403
  1. #include <stdint.h>
  2. #include "c3dlas/c3dlas.h"
  3. #include "mempool.h"
  4. #include "ds.h"
  5. typedef int64_t money_t;
  6. typedef uint32_t entityid_t;
  7. typedef uint32_t compid_t;
  8. typedef uint32_t econid_t;
  9. typedef uint32_t commodityid_t;
  10. typedef int32_t qty_t;
  11. typedef uint32_t tick_t; // 4 billion tick limit to world sim time
  12. #define ECON_MAGIC (INT64_MAX - 1)
  13. #define ECON_CASHMAX (INT64_MAX - 10)
  14. typedef struct EcCashflow {
  15. econid_t from, to;
  16. money_t amount;
  17. tick_t frequency;
  18. } EcCashflow;
  19. typedef struct EcAsset {
  20. econid_t id;
  21. econid_t owner;
  22. econid_t type;
  23. econid_t location;
  24. money_t purchasePrice; // last purchase price
  25. money_t curEstValue;
  26. money_t buyNowPrice;
  27. char* name;
  28. } EcAsset;
  29. typedef struct EcWarehouse {
  30. } EcWarehouse;
  31. #define ECORDERTYPE_ASK 0x00
  32. #define ECORDERTYPE_BID 0x01
  33. #define ECORDERTYPE_MARKET 0x00
  34. #define ECORDERTYPE_LIMIT 0x02
  35. #define ECORDERTYPE_M_ASKBID 0x01
  36. #define ECORDERTYPE_M_MARLIM 0x02
  37. typedef struct EcMarketOrder {
  38. unsigned char type;
  39. money_t price;
  40. uint32_t qty; // 0 for unlimited
  41. econid_t who;
  42. } EcMarketOrder;
  43. typedef struct EcMarket {
  44. econid_t commodity;
  45. VEC(EcMarketOrder) asks;
  46. VEC(EcMarketOrder) bids;
  47. } EcMarket;
  48. typedef struct EcActor {
  49. econid_t id;
  50. char* name;
  51. // type, ie, person or corporation
  52. // occupation
  53. // age
  54. } EcActor;
  55. #define COMMODITY_LIST \
  56. X(Ore) \
  57. X(Metal) \
  58. X(Widget) \
  59. X(Food)
  60. enum CommodityType {
  61. CT_None = 0,
  62. #define X(x) CT_##x,
  63. COMMODITY_LIST
  64. #undef X
  65. CT_MAXVALUE,
  66. };
  67. typedef struct CommodityBucket {
  68. commodityid_t comm;
  69. qty_t qty;
  70. } CommodityBucket;
  71. typedef struct CommoditySet {
  72. int length;
  73. int fill;
  74. CommodityBucket buckets[0];
  75. } CommoditySet;
  76. // name doFn
  77. #define ENTITY_TYPE_LIST \
  78. X(Parcel, 1) \
  79. X(Mine, 1) \
  80. X(Factory, 1) \
  81. X(Company, 1) \
  82. X(Store, 1) \
  83. X(House, 0) \
  84. X(Farm, 1) \
  85. X(Person, 1)
  86. #define COMP_TYPE_LIST \
  87. X(Position, 0) \
  88. X(Movement, 0) \
  89. X(Money, 0) \
  90. X(PathFollow, 0) \
  91. enum EntityType {
  92. ET_None = 0,
  93. #define X(x, a) ET_##x,
  94. ENTITY_TYPE_LIST
  95. #undef X
  96. ET_MAXVALUE,
  97. };
  98. /*
  99. */
  100. typedef struct Entity {
  101. unsigned int dead : 1;
  102. unsigned int _pad : 23;
  103. unsigned int uniqueCounter : 8;
  104. tick_t created;
  105. enum EntityType type;
  106. econid_t owner;
  107. econid_t money;
  108. econid_t position;
  109. econid_t movement;
  110. econid_t pathFollow;
  111. void* userData;
  112. // for debugging:
  113. char* name;
  114. } Entity;
  115. typedef struct Money {
  116. money_t cash;
  117. money_t totalDebt;
  118. money_t totalAssets;
  119. } Money;
  120. typedef struct Position {
  121. Vector p;
  122. } Position;
  123. typedef struct Movement {
  124. Vector direction;
  125. float vel;
  126. float acc;
  127. float maxVel;
  128. float maxAcc;
  129. } Movement;
  130. typedef struct Path {
  131. VEC(Vector) nodes;
  132. float totalLength;
  133. } Path;
  134. typedef struct PathFollow {
  135. Path* p;
  136. int a, b; // moving from a to b
  137. float segmentProgress;
  138. float totalProgress;
  139. } PathFollow;
  140. // TODO: get rid of this in favor of CPosition
  141. typedef struct Location {
  142. int x, y;
  143. } Location;
  144. typedef struct Parcel {
  145. entityid_t id;
  146. Location loc;
  147. money_t price;
  148. int minerals;
  149. entityid_t owner;
  150. entityid_t structure;
  151. } Parcel;
  152. typedef struct House {
  153. entityid_t id;
  154. money_t price;
  155. money_t rent;
  156. entityid_t owner;
  157. entityid_t occupants[4];
  158. } House;
  159. typedef struct Farm {
  160. entityid_t id;
  161. money_t price;
  162. int food;
  163. entityid_t owner;
  164. } Farm;
  165. typedef struct Company {
  166. entityid_t id;
  167. char* name;
  168. VEC(entityid_t) parcels;
  169. VEC(entityid_t) mines;
  170. VEC(entityid_t) factories;
  171. VEC(entityid_t) stores;
  172. int metalsInTransit;
  173. int widgetsInTransit;
  174. } Company;
  175. typedef struct Mine {
  176. entityid_t id;
  177. char* name;
  178. Location loc;
  179. entityid_t parcel;
  180. entityid_t owner;
  181. int metals;
  182. } Mine;
  183. typedef struct Factory {
  184. entityid_t id;
  185. char* name;
  186. Location loc;
  187. entityid_t owner;
  188. entityid_t parcel;
  189. int metals;
  190. int widgets;
  191. } Factory;
  192. typedef struct Person {
  193. entityid_t id;
  194. char* name;
  195. } Person;
  196. typedef struct Store {
  197. entityid_t id;
  198. char* name;
  199. entityid_t owner;
  200. entityid_t parcel;
  201. int widgets;
  202. money_t sales;
  203. } Store;
  204. typedef struct Economy {
  205. // processed every tick
  206. VECMP(EcCashflow) cashflow;
  207. // VECMP(EcAsset) assets;
  208. // TODO: debt
  209. // EcMarket* markets;
  210. // char** comNames;
  211. // VECMP(EcActor) actors;
  212. // VECMP(char*) cfDescriptions;
  213. size_t entityCounts[ET_MAXVALUE];
  214. VECMP(Entity) Entity;
  215. #define X(type, a) VECMP(type) type;
  216. ENTITY_TYPE_LIST
  217. #undef X
  218. #define X(type, a) VECMP(type) type;
  219. COMP_TYPE_LIST
  220. #undef X
  221. // // total amount of each commodity in the world
  222. int64_t commodityTotals[CT_MAXVALUE];
  223. // temporary junk:
  224. entityid_t parcelGrid[64][64];
  225. } Economy;
  226. // tick loop functions
  227. #define X(type, a) void tick##type(Economy* ec);
  228. ENTITY_TYPE_LIST
  229. #undef X
  230. #define X(type, a) entityid_t Econ_NewEnt##type(Economy* ec, type** out);
  231. ENTITY_TYPE_LIST
  232. #undef X
  233. #define X(type, a) compid_t Econ_NewComp##type(Economy* ec, type** out);
  234. COMP_TYPE_LIST
  235. #undef X
  236. #define X(type, a) type* Econ_GetComp##type(Economy* ec, compid_t id);
  237. COMP_TYPE_LIST
  238. #undef X
  239. void Economy_tick(Economy* ec);
  240. econid_t Economy_AddActor(Economy* ec, char* name, money_t cash);
  241. econid_t Economy_AddCashflow(Economy* ec, money_t amount, econid_t from, econid_t to, uint32_t freq, char* desc);
  242. econid_t Economy_AddAsset(Economy* ec, EcAsset* ass);
  243. void Economy_init(Economy* ec);
  244. Entity* Econ_GetEntity(Economy* ec, econid_t eid);
  245. entityid_t Econ_CreateCompany(Economy* ec, char* name);
  246. entityid_t Econ_CreatePerson(Economy* ec, char* name);
  247. entityid_t Econ_CreateMine(Economy* ec, entityid_t parcel_id, char* name);
  248. entityid_t Econ_CreateFactory(Economy* ec, entityid_t parcel_id, char* name);
  249. entityid_t Econ_CreateStore(Economy* ec, entityid_t parcel_id, char* name);
  250. void Econ_CommodityExNihilo(Economy* ec, commodityid_t comm, qty_t qty);
  251. CommoditySet* CommoditySet_New(int size);
  252. int CommoditySet_Add(CommoditySet* cs, commodityid_t comm, qty_t qty, int compact);
  253. qty_t CommoditySet_Get(CommoditySet* cs, commodityid_t comm);