chiark / gitweb /
Proper Subversion configuration.
[newkind] / trade.c
1 /*
2  * Elite - The New Kind.
3  *
4  * Reverse engineered from the BBC disk version of Elite.
5  * Additional material by C.J.Pinder.
6  *
7  * The original Elite code is (C) I.Bell & D.Braben 1984.
8  * This version re-engineered in C by C.J.Pinder 1999-2001.
9  *
10  * email: <christian@newkind.co.uk>
11  *
12  *
13  */
14
15 /*
16  * trade.c
17  */
18
19 #include <stdlib.h>
20  
21 #include "config.h"
22 #include "gfx.h"
23 #include "elite.h"
24 #include "trade.h"
25 #include "docked.h"
26 #include "planet.h"
27 #include "space.h"
28 #include "sound.h"
29 #include "random.h"
30 #include "main.h"
31 #include "swat.h"
32  
33 #define SLAVES          3
34 #define NARCOTICS       6
35 #define FIREARMS        10
36
37 /*
38  * The following holds the Elite Planet Stock Market.
39  */
40
41 #define TONNES          0
42 #define KILOGRAMS       1
43 #define GRAMS           2
44
45 struct stock_item stock_market[NO_OF_STOCK_ITEMS]=
46 {
47         {"Food",                 0, 0,  19, -2,   6, 0x01, TONNES},
48         {"Textiles",     0, 0,  20, -1,  10, 0x03, TONNES},
49         {"Radioactives", 0, 0,  65, -3,   2, 0x07, TONNES},
50         {"Slaves",               0, 0,  40, -5, 226, 0x1F, TONNES},
51         {"Liquor/Wines", 0, 0,  83, -5, 251, 0x0F, TONNES},
52         {"Luxuries",     0, 0, 196,  8,  54, 0x03, TONNES},
53         {"Narcotics",    0, 0, 235, 29,   8, 0x78, TONNES},
54         {"Computers",    0, 0, 154, 14,  56, 0x03, TONNES},
55         {"Machinery",    0, 0, 117,  6,  40, 0x07, TONNES},
56         {"Alloys",               0, 0,  78,  1,  17, 0x1F, TONNES},
57         {"Firearms",     0, 0, 124, 13,  29, 0x07, TONNES},
58         {"Furs",                 0, 0, 176, -9, 220, 0x3F, TONNES},
59         {"Minerals",     0, 0,  32, -1,  53, 0x03, TONNES},
60         {"Gold",                 0, 0,  97, -1,  66, 0x07, KILOGRAMS},
61         {"Platinum",     0, 0, 171, -2,  55, 0x1F, KILOGRAMS},
62         {"Gem-Stones",   0, 0,  45, -1, 250, 0x0F, GRAMS},
63         {"Alien Items",  0, 0,  53, 15, 192, 0x07, TONNES},
64 };
65
66
67
68
69 /*
70  * Generate the Elite stock market.
71  * The prices and quantities are affected by the planet's economy.
72  * There is also a slight amount of randomness added in.
73  * The random value is changed each time we hyperspace.
74  */
75
76
77 void generate_stock_market (void)
78 {
79         int quant;
80         int price;
81         int i;
82
83         for (i = 0; i < NO_OF_STOCK_ITEMS; i++)
84         {
85                 price  = stock_market[i].base_price;                                                            /* Start with the base price    */
86                 price += cmdr.market_rnd & stock_market[i].mask;                                        /* Add in a random amount               */
87                 price += current_planet_data.economy * stock_market[i].eco_adjust;      /* Adjust for planet economy    */
88                 price &= 255;                                                                                                           /* Only need bottom 8 bits              */
89
90                 quant  = stock_market[i].base_quantity;                                                         /* Start with the base quantity */
91                 quant += cmdr.market_rnd & stock_market[i].mask;                                        /* Add in a random amount               */
92                 quant -= current_planet_data.economy * stock_market[i].eco_adjust;      /* Adjust for planet economy    */
93                 quant &= 255;                                                                                                           /* Only need bottom 8 bits              */
94
95                 if (quant > 127)        /* In an 8-bit environment '>127' would be negative */
96                         quant = 0;              /* So we set it to a minimum of zero. */
97
98                 quant &= 63;            /* Quantities range from 0..63 */
99
100                 stock_market[i].current_price = price * 4;
101                 stock_market[i].current_quantity = quant;
102         }
103
104
105         /* Alien Items are never available for purchase... */
106
107         stock_market[ALIEN_ITEMS_IDX].current_quantity = 0;
108 }
109
110
111
112 void set_stock_quantities(int *quant)
113 {
114         int i;
115
116         for (i = 0; i < NO_OF_STOCK_ITEMS; i++)
117                 stock_market[i].current_quantity = quant[i];
118
119         stock_market[ALIEN_ITEMS_IDX].current_quantity = 0;
120 }
121
122  
123 int carrying_contraband (void)
124 {
125         return (cmdr.current_cargo[SLAVES] + cmdr.current_cargo[NARCOTICS]) * 2 +
126                         cmdr.current_cargo[FIREARMS];
127 }
128
129
130 int total_cargo (void)
131 {
132         int i;
133         int cargo_held;
134
135         cargo_held = 0;
136         for (i = 0; i < 17; i++)
137         {
138                 if ((cmdr.current_cargo[i] > 0) &&
139                         (stock_market[i].units == TONNES))
140                 {
141                         cargo_held += cmdr.current_cargo[i];
142                 }
143         }
144
145         return cargo_held;
146 }
147
148
149 void scoop_item (int un)
150 {
151         int type;
152         int trade;
153
154         if (universe[un].flags & FLG_DEAD)
155                 return;
156         
157         type = universe[un].type;
158         
159         if (type == SHIP_MISSILE)
160                 return;
161
162         if ((cmdr.fuel_scoop == 0) || (universe[un].location.y >= 0) ||
163                 (total_cargo() == cmdr.cargo_capacity))
164         {
165                 universe[un].flags |= FLG_TARGET;
166                 explode_object (un);
167                 damage_ship (128 + (universe[un].energy / 2), universe[un].location.z > 0);
168                 return;
169         }
170
171         if (type == SHIP_CARGO)
172         {
173                 trade = rand255() & 7;
174                 cmdr.current_cargo[trade]++;
175                 info_message (stock_market[trade].name);
176                 remove_ship (un);
177                 return;                                 
178         }
179
180         if (ship_list[type]->scoop_type != 0)
181         {
182                 trade = ship_list[type]->scoop_type + 1;
183                 cmdr.current_cargo[trade]++;
184                 info_message (stock_market[trade].name);
185                 remove_ship (un);
186                 return;                                 
187         }
188         
189         explode_object (un);
190         damage_ship (universe[un].energy / 2, universe[un].location.z > 0);
191 }
192