00001
00002
00003
00004
00005
00006 #include <stdio.h>
00007 #include <stdlib.h>
00008 #include <assert.h>
00009 #include "common.h"
00010 #include "lctypes.h"
00011 #include "lin-city.h"
00012 #include "transport.h"
00013 #include "power.h"
00014 #include "stats.h"
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 void
00029 do_track (int x, int y)
00030 {
00031 static int wb_count = 0;
00032 general_transport (&MP_INFO(x,y), &MP_POL(x,y),
00033 MAX_WASTE_ON_TRACK, &wb_count);
00034 }
00035
00036 void
00037 do_rail (int x, int y)
00038 {
00039 static int wb_count = 0;
00040 int *pol = &MP_POL(x,y);
00041 Map_Point_Info *minfo = &MP_INFO(x,y);
00042 transport_cost += 3;
00043 if (total_time % DAYS_PER_RAIL_POLLUTION == 0)
00044 *pol += RAIL_POLLUTION;
00045 if ((total_time & RAIL_GOODS_USED_MASK) == 0 && minfo->int_4 > 0) {
00046 --minfo->int_4;
00047 ++minfo->int_7;
00048 }
00049 if ((total_time & RAIL_STEEL_USED_MASK) == 0 && minfo->int_6 > 0) {
00050 --minfo->int_6;
00051 ++minfo->int_7;
00052 }
00053 general_transport (minfo, pol, MAX_WASTE_ON_RAIL, &wb_count);
00054 }
00055
00056 void
00057 do_road (int x, int y)
00058 {
00059 static int wb_count = 0;
00060 int *pol = &MP_POL(x,y);
00061 Map_Point_Info *minfo = &MP_INFO(x,y);
00062 ++transport_cost;
00063 if (total_time % DAYS_PER_ROAD_POLLUTION == 0)
00064 *pol += ROAD_POLLUTION;
00065 if ((total_time & ROAD_GOODS_USED_MASK) == 0 && minfo->int_4 > 0) {
00066 --minfo->int_4;
00067 ++minfo->int_7;
00068 }
00069 general_transport (minfo, pol, MAX_WASTE_ON_ROAD, &wb_count);
00070 }
00071
00072 void
00073 general_transport (Map_Point_Info *minfo, int *pol,
00074 int max_waste, int *waste_count)
00075 {
00076 int tot, av, *base, xm1, xp1, ym1, yp1;
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096 base = &minfo->int_1;
00097 switch (minfo->flags & 0x0F)
00098 {
00099 case 0:
00100 return;
00101
00102 case 1:
00103 xm1 = &minfo[-WORLD_SIDE_LEN].int_1 - base;
00104 do {
00105 tot = *base + base[xm1];
00106 av = tot / 2;
00107 base[xm1] = av;
00108 *base++ = av + tot % 2;
00109 } while (base <= &minfo->int_7);
00110 break;
00111
00112 case 2:
00113 ym1 = &minfo[-1].int_1 - base;
00114 do {
00115 tot = *base + base[ym1];
00116 av = tot / 2;
00117 base[ym1] = av;
00118 *base++ = av + tot % 2;
00119 } while (base <= &minfo->int_7);
00120 break;
00121
00122 case 3:
00123 xm1 = &minfo[-WORLD_SIDE_LEN].int_1 - base;
00124 ym1 = &minfo[-1].int_1 - base;
00125 do {
00126 tot = *base + base[xm1] + base[ym1];
00127 av = tot / 3;
00128 base[xm1] = base[ym1] = av;
00129 *base++ = av + tot % 3;
00130 } while (base <= &minfo->int_7);
00131 break;
00132
00133 case 4:
00134 xp1 = &minfo[WORLD_SIDE_LEN].int_1 - base;
00135 do {
00136 tot = *base + base[xp1];
00137 av = tot / 2;
00138 base[xp1] = av;
00139 *base++ = av + tot % 2;
00140 } while (base <= &minfo->int_7);
00141 break;
00142
00143 case 5:
00144 xm1 = &minfo[-WORLD_SIDE_LEN].int_1 - base;
00145 xp1 = &minfo[WORLD_SIDE_LEN].int_1 - base;
00146 do {
00147 tot = *base + base[xm1] + base[xp1];
00148 av = tot / 3;
00149 base[xm1] = base[xp1] = av;
00150 *base++ = av + tot % 3;
00151 } while (base <= &minfo->int_7);
00152 break;
00153
00154 case 6:
00155 ym1 = &minfo[-1].int_1 - base;
00156 xp1 = &minfo[WORLD_SIDE_LEN].int_1 - base;
00157 do {
00158 tot = *base + base[ym1] + base[xp1];
00159 av = tot / 3;
00160 base[ym1] = base[xp1] = av;
00161 *base++ = av + tot % 3;
00162 } while (base <= &minfo->int_7);
00163 break;
00164
00165 case 7:
00166 xm1 = &minfo[-WORLD_SIDE_LEN].int_1 - base;
00167 ym1 = &minfo[-1].int_1 - base;
00168 xp1 = &minfo[WORLD_SIDE_LEN].int_1 - base;
00169 do {
00170 tot = *base + base[xm1] + base[ym1] + base[xp1];
00171 av = tot / 4;
00172 base[xm1] = base[ym1] = base[xp1] = av;
00173 *base++ = av + tot % 4;
00174 } while (base <= &minfo->int_7);
00175 break;
00176
00177 case 8:
00178 yp1 = &minfo[1].int_1 - base;
00179 do {
00180 tot = *base + base[yp1];
00181 av = tot / 2;
00182 base[yp1] = av;
00183 *base++ = av + tot % 2;
00184 } while (base <= &minfo->int_7);
00185 break;
00186
00187 case 9:
00188 xm1 = &minfo[-WORLD_SIDE_LEN].int_1 - base;
00189 yp1 = &minfo[1].int_1 - base;
00190 do {
00191 tot = *base + base[xm1] + base[yp1];
00192 av = tot / 3;
00193 base[xm1] = base[yp1] = av;
00194 *base++ = av + tot % 3;
00195 } while (base <= &minfo->int_7);
00196 break;
00197
00198 case 10:
00199 ym1 = &minfo[-1].int_1 - base;
00200 yp1 = &minfo[1].int_1 - base;
00201 do {
00202 tot = *base + base[ym1] + base[yp1];
00203 av = tot / 3;
00204 base[ym1] = base[yp1] = av;
00205 *base++ = av + tot % 3;
00206 } while (base <= &minfo->int_7);
00207 break;
00208
00209 case 11:
00210 xm1 = &minfo[-WORLD_SIDE_LEN].int_1 - base;
00211 ym1 = &minfo[-1].int_1 - base;
00212 yp1 = &minfo[1].int_1 - base;
00213 do {
00214 tot = *base + base[xm1] + base[ym1] + base[yp1];
00215 av = tot / 4;
00216 base[xm1] = base[ym1] = base[yp1] = av;
00217 *base++ = av + tot % 4;
00218 } while (base <= &minfo->int_7);
00219 break;
00220
00221 case 12:
00222 xp1 = &minfo[WORLD_SIDE_LEN].int_1 - base;
00223 yp1 = &minfo[1].int_1 - base;
00224 do {
00225 tot = *base + base[xp1] + base[yp1];
00226 av = tot / 3;
00227 base[xp1] = base[yp1] = av;
00228 *base++ = av + tot % 3;
00229 } while (base <= &minfo->int_7);
00230 break;
00231
00232 case 13:
00233 xm1 = &minfo[-WORLD_SIDE_LEN].int_1 - base;
00234 xp1 = &minfo[WORLD_SIDE_LEN].int_1 - base;
00235 yp1 = &minfo[1].int_1 - base;
00236 do {
00237 tot = *base + base[xm1] + base[xp1] + base[yp1];
00238 av = tot / 4;
00239 base[xm1] = base[xp1] = base[yp1] = av;
00240 *base++ = av + tot % 4;
00241 } while (base <= &minfo->int_7);
00242 break;
00243
00244 case 14:
00245 ym1 = &minfo[-1].int_1 - base;
00246 xp1 = &minfo[WORLD_SIDE_LEN].int_1 - base;
00247 yp1 = &minfo[1].int_1 - base;
00248 do {
00249 tot = *base + base[ym1] + base[xp1] + base[yp1];
00250 av = tot / 4;
00251 base[ym1] = base[xp1] = base[yp1] = av;
00252 *base++ = av + tot % 4;
00253 } while (base <= &minfo->int_7);
00254 break;
00255
00256 case 15:
00257 xm1 = &minfo[-WORLD_SIDE_LEN].int_1 - base;
00258 ym1 = &minfo[-1].int_1 - base;
00259 xp1 = &minfo[WORLD_SIDE_LEN].int_1 - base;
00260 yp1 = &minfo[1].int_1 - base;
00261 do {
00262 tot = *base + base[xm1] + base[ym1] + base[xp1] + base[yp1];
00263 av = tot / 5;
00264 base[xm1] = base[ym1] = base[xp1] = base[yp1] = av;
00265 *base++ = av + tot % 5;
00266 } while (base <= &minfo->int_7);
00267 break;
00268 }
00269 if (*--base >= max_waste) {
00270 *base -= WASTE_BURN_ON_TRANSPORT;
00271 ++*pol;
00272 if (*waste_count > TRANSPORT_BURN_WASTE_COUNT) {
00273 *waste_count = 0;
00274 } else {
00275 ++ * waste_count;
00276 }
00277 }
00278 }
00279