Main Page | Data Structures | Directories | File List | Data Fields | Globals

transport.c File Reference

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "common.h"
#include "lctypes.h"
#include "lin-city.h"
#include "transport.h"
#include "power.h"
#include "stats.h"

Go to the source code of this file.

Functions

void do_track (int x, int y)
void do_rail (int x, int y)
void do_road (int x, int y)
void general_transport (Map_Point_Info *minfo, int *pol, int max_waste, int *waste_count)


Function Documentation

void do_rail int  x,
int  y
 

Definition at line 37 of file transport.c.

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 }

void do_road int  x,
int  y
 

Definition at line 57 of file transport.c.

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 }

void do_track int  x,
int  y
 

Definition at line 29 of file transport.c.

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 }

void general_transport Map_Point_Info minfo,
int *  pol,
int  max_waste,
int *  waste_count
 

Definition at line 73 of file transport.c.

00075 {
00076     int tot, av, *base, xm1, xp1, ym1, yp1;
00077 
00078     /* 30. Oct 1996:
00079      * we'll use a loop with pointers here instead of doin' each
00080      * operation by hand.  this reduces code complexity and should
00081      * lead to a higher cache hit ratio - theoretically
00082      * (ThMO)
00083      *
00084      * 12. Dec 1996:
00085      * as this is a heavy used routine, another speedup improvement is
00086      * needed.  we'll now use 1 pointer, which will be incremented and
00087      * 1 .. 4 constant indices, which replaces the old pointer-pure
00088      * version.
00089      * advantages:  elimination of unnecessary pointer increments.
00090      * Note:  this *only* works, if the related addresses use one and the
00091      *        same address space - which is naturally for 2-dimensional
00092      *        arrays.
00093      * (ThMO)
00094      */
00095 
00096     base = &minfo->int_1;
00097     switch (minfo->flags & 0x0F)
00098     {
00099     case 0:
00100         return;
00101 
00102     case 1:                     /* inlined t_av_l() -- (ThMO) */
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:                     /* inlined t_av_u() -- (ThMO) */
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:                     /* inlined t_av_lu() -- (ThMO) */
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:                     /* inlined t_av_r() -- (ThMO) */
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:                     /* inlined t_av_lr() -- (ThMO) */
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:                     /* inline t_av_ur() -- (ThMO) */
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:                     /* inlined t_av_lur() -- (ThMO) */
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:                     /* inlined t_av_d() -- (ThMO) */
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:                     /* inlined t_av_ld() -- (ThMO) */
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:                    /* inlined t_av_ud() -- (ThMO) */
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:                    /* inlined t_av_lud() -- (ThMO) */
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:                    /* inlined t_av_rd() -- (ThMO) */
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:                    /* inlined t_av_lrd() -- (ThMO) */
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:                    /* inlined t_av_urd() -- (ThMO) */
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:                    /* inlined t_av_lurd() -- (ThMO) */
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 }


Generated on Sun Dec 26 11:23:42 2004 for lincity by  doxygen 1.3.9.1