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

shrtypes.c File Reference

#include "lcconfig.h"
#include <stdio.h>
#include <stdlib.h>
#include "lcstring.h"
#include "common.h"
#include "lctypes.h"
#include "lin-city.h"
#include "typeinit.h"
#include "cliglobs.h"
#include "engglobs.h"

Go to the source code of this file.

Functions

void set_mappoint_used (int fromx, int fromy, int x, int y)
void set_mappoint (int x, int y, short selected_type)
void connect_transport (int originx, int originy, int w, int h)


Function Documentation

void connect_transport int  originx,
int  originy,
int  w,
int  h
 

Definition at line 78 of file shrtypes.c.

00079 {
00080   int x, y, mask, tflags;
00081   short group, type;
00082 
00083   static const short power_table[16] =
00084   {
00085     CST_POWERL_H_D, CST_POWERL_V_D, CST_POWERL_H_D, CST_POWERL_RD_D,
00086     CST_POWERL_H_D, CST_POWERL_LD_D, CST_POWERL_H_D, CST_POWERL_LDR_D,
00087     CST_POWERL_V_D, CST_POWERL_V_D, CST_POWERL_RU_D, CST_POWERL_UDR_D,
00088     CST_POWERL_LU_D, CST_POWERL_LDU_D, CST_POWERL_LUR_D, CST_POWERL_LUDR_D
00089   };
00090   static const short track_table[16] =
00091   {
00092     CST_TRACK_LR, CST_TRACK_LR, CST_TRACK_UD, CST_TRACK_LU,
00093     CST_TRACK_LR, CST_TRACK_LR, CST_TRACK_UR, CST_TRACK_LUR,
00094     CST_TRACK_UD, CST_TRACK_LD, CST_TRACK_UD, CST_TRACK_LUD,
00095     CST_TRACK_DR, CST_TRACK_LDR, CST_TRACK_UDR, CST_TRACK_LUDR
00096   };
00097   static const short road_table[16] =
00098   {
00099     CST_ROAD_LR, CST_ROAD_LR, CST_ROAD_UD, CST_ROAD_LU,
00100     CST_ROAD_LR, CST_ROAD_LR, CST_ROAD_UR, CST_ROAD_LUR,
00101     CST_ROAD_UD, CST_ROAD_LD, CST_ROAD_UD, CST_ROAD_LUD,
00102     CST_ROAD_DR, CST_ROAD_LDR, CST_ROAD_UDR, CST_ROAD_LUDR
00103   };
00104   static const short rail_table[16] =
00105   {
00106     CST_RAIL_LR, CST_RAIL_LR, CST_RAIL_UD, CST_RAIL_LU,
00107     CST_RAIL_LR, CST_RAIL_LR, CST_RAIL_UR, CST_RAIL_LUR,
00108     CST_RAIL_UD, CST_RAIL_LD, CST_RAIL_UD, CST_RAIL_LUD,
00109     CST_RAIL_DR, CST_RAIL_LDR, CST_RAIL_UDR, CST_RAIL_LUDR
00110   }; 
00111   static const short water_table[16] =
00112   {
00113     CST_WATER, CST_WATER_D, CST_WATER_R, CST_WATER_RD,
00114     CST_WATER_L, CST_WATER_LD, CST_WATER_LR, CST_WATER_LRD,
00115     CST_WATER_U, CST_WATER_UD, CST_WATER_UR, CST_WATER_URD,
00116     CST_WATER_LU, CST_WATER_LUD, CST_WATER_LUR, CST_WATER_LURD
00117   };
00118 
00119   /* Adjust originx,originy,w,h to proper range */
00120   if (originx <= 0) {
00121     w -= 1 - originx;
00122     originx = 1;
00123   }
00124   if (originy <= 0) {
00125     h -= 1 - originy;
00126     originy = 1;
00127   }
00128   if (originx + w >= WORLD_SIDE_LEN) {
00129     w = WORLD_SIDE_LEN - originx;
00130   }
00131   if (originy + h >= WORLD_SIDE_LEN) {
00132     h = WORLD_SIDE_LEN - originy;
00133   }
00134   
00135   for (x = originx; x < originx + w; x++) {
00136     for (y = originy; y < originy + h; y++) {
00137       switch (MP_GROUP(x,y))
00138         {
00139         case GROUP_POWER_LINE:
00140           /* First, set up a mask indicating into which directions 
00141              power may be transferred */
00142           mask = 0;
00143 #ifdef  THOMMY_MAY_BE_WRONG     /* just in case -- (ThMO) */
00144           if (y > 0)
00145 #endif
00146             {           /* up -- (ThMO) */
00147               group = MP_GROUP(x,y-1);
00148 
00149               /* see if dug under track, rail or road */
00150 
00151               if (y > 1 && (group == GROUP_TRACK
00152                             || group == GROUP_RAIL
00153                             || group == GROUP_ROAD
00154                             || group == GROUP_WATER))
00155                 group = MP_GROUP(x,y-2);
00156               switch (group)
00157                 {
00158                 case GROUP_POWER_LINE:
00159                 case GROUP_SOLAR_POWER:
00160                 case GROUP_SUBSTATION:
00161                 case GROUP_COAL_POWER:
00162                   mask |= 8;
00163                   break;
00164                 }
00165             }
00166 #ifdef  THOMMY_MAY_BE_WRONG     /* just in case -- (ThMO) */
00167           if (x > 0)
00168 #endif
00169             {           /* left -- (ThMO) */
00170               group = MP_GROUP(x-1,y);
00171               if (x > 1 && (group == GROUP_TRACK
00172                             || group == GROUP_RAIL
00173                             || group == GROUP_ROAD
00174                             || group == GROUP_WATER))
00175                 group = MP_GROUP(x-2,y);
00176               switch (group)
00177                 {
00178                 case GROUP_POWER_LINE:
00179                 case GROUP_SOLAR_POWER:
00180                 case GROUP_SUBSTATION:
00181                 case GROUP_COAL_POWER:
00182                   mask |= 4;
00183                   break;
00184                 }
00185             }
00186 #ifdef  THOMMY_MAY_BE_WRONG     /* just in case -- (ThMO) */
00187           if (x < WORLD_SIDE_LEN - 1)
00188 #endif
00189             {           /* right -- (ThMO) */
00190               group = MP_GROUP(x+1,y);
00191               if (x < WORLD_SIDE_LEN - 2 && (group == GROUP_TRACK
00192                                              || group == GROUP_RAIL
00193                                              || group == GROUP_ROAD
00194                                              || group == GROUP_WATER))
00195                 group = MP_GROUP(x+2,y);
00196               switch (group)
00197                 {
00198                 case GROUP_WINDMILL:
00199                   if (MP_INFO(x + 1,y).int_2 < MODERN_WINDMILL_TECH)
00200                     break;
00201                 case GROUP_POWER_LINE:
00202                 case GROUP_SOLAR_POWER:
00203                 case GROUP_SUBSTATION:
00204                 case GROUP_COAL_POWER:
00205                   mask |= 2;
00206                   break;
00207                 }
00208             }
00209 #ifdef  THOMMY_MAY_BE_WRONG     /* just in case -- (ThMO) */
00210           if (y < WORLD_SIDE_LEN - 1)
00211 #endif
00212             {           /* down -- (ThMO) */
00213               group = MP_GROUP(x,y+1);
00214               if (y < WORLD_SIDE_LEN - 2 && (group == GROUP_TRACK
00215                                              || group == GROUP_RAIL
00216                                              || group == GROUP_ROAD
00217                                              || group == GROUP_WATER))
00218                 group = MP_GROUP(x,y+2);
00219               switch (group)
00220                 {
00221                 case GROUP_WINDMILL:
00222                   if (MP_INFO(x,y + 1).int_2 < MODERN_WINDMILL_TECH)
00223                     break;
00224                 case GROUP_POWER_LINE:
00225                 case GROUP_SOLAR_POWER:
00226                 case GROUP_SUBSTATION:
00227                 case GROUP_COAL_POWER:
00228                   ++mask;
00229                   break;
00230                 }
00231             }
00232           /* Next, set the connectivity into MP_TYPE */
00233           MP_TYPE(x,y) = power_table[mask];
00234           /* Finally, adjust MP_TYPE to show electon bolt */
00235 #ifdef commentout
00236            WCK: This is done in do_power_line now 
00237                   if (MP_INFO(x,y).int_1 != 0)
00238                   MP_TYPE(x,y) -= 11; 
00239 #endif
00240           break;
00241 
00242         case GROUP_TRACK:
00243 #if     FLAG_LEFT != 1 || FLAG_UP != 2 || FLAG_RIGHT != 4 || FLAG_DOWN != 8
00244 #error  check_track_graphics(): you loose
00245 #error  this algorithm depends on proper flag settings -- (ThMO)
00246 #endif
00247           mask = 0;
00248 #ifdef  THOMMY_MAY_BE_WRONG     /* just in case -- (ThMO) */
00249           if (y > 0)
00250 #endif
00251             {
00252               if (MP_GROUP(x,y-1) == GROUP_TRACK)
00253                 mask |= FLAG_UP;
00254             }
00255 #ifdef  THOMMY_MAY_BE_WRONG     /* just in case -- (ThMO) */
00256           if (x > 0)
00257 #endif
00258             {
00259               if (MP_GROUP(x-1,y) == GROUP_TRACK)
00260                 mask |= FLAG_LEFT;
00261             }
00262           tflags = mask;
00263 #ifdef  THOMMY_MAY_BE_WRONG     /* just in case -- (ThMO) */
00264           if (x < WORLD_SIDE_LEN - 1)
00265 #endif
00266             {
00267               switch (MP_GROUP(x+1,y))
00268                 {
00269                 case GROUP_TRACK:
00270                   tflags |= FLAG_RIGHT;
00271                 case GROUP_COMMUNE:
00272                 case GROUP_COALMINE:
00273                 case GROUP_OREMINE:
00274                 case GROUP_INDUSTRY_L:
00275                 case GROUP_INDUSTRY_H:
00276                 case GROUP_RECYCLE:
00277                 case GROUP_TIP:
00278                 case GROUP_PORT:
00279                   mask |= FLAG_RIGHT;
00280                   break;
00281                 default:
00282 #ifdef  THOMMY_MAY_BE_WRONG     /* just in case -- (ThMO) */
00283                   if (y > 0)
00284 #endif
00285                     if (MP_GROUP(x+1,y-1) == GROUP_COAL_POWER)
00286                       mask |= FLAG_RIGHT;
00287                   break;
00288                 }
00289             }
00290 #ifdef  THOMMY_MAY_BE_WRONG     /* just in case -- (ThMO) */
00291           if (y < WORLD_SIDE_LEN - 1)
00292 #endif
00293             {
00294               switch (MP_GROUP(x,y+1))
00295                 {
00296                 case GROUP_TRACK:
00297                   tflags |= FLAG_DOWN;
00298                 case GROUP_COMMUNE:
00299                 case GROUP_COALMINE:
00300                 case GROUP_OREMINE:
00301                 case GROUP_INDUSTRY_L:
00302                 case GROUP_INDUSTRY_H:
00303                 case GROUP_RECYCLE:
00304                 case GROUP_TIP:
00305                 case GROUP_PORT:
00306                   mask |= FLAG_DOWN;
00307                   break;
00308                 default:
00309 #ifdef  THOMMY_MAY_BE_WRONG     /* just in case -- (ThMO) */
00310                   if (x > 0)
00311 #endif
00312                     if (MP_GROUP(x-1,y+1) == GROUP_COAL_POWER)
00313                       mask |= FLAG_DOWN;
00314                   break;
00315                 }
00316             }
00317           MP_INFO(x,y).flags &= ~(FLAG_UP | FLAG_DOWN | FLAG_LEFT
00318                                   | FLAG_RIGHT);
00319           MP_INFO(x,y).flags |= tflags;
00320           MP_TYPE(x,y) = track_table[mask];
00321           break;
00322 
00323         case GROUP_ROAD:
00324 #if     FLAG_LEFT != 1 || FLAG_UP != 2 || FLAG_RIGHT != 4 || FLAG_DOWN != 8
00325 #error  check_road_graphics(): you loose
00326 #error  this algorithm depends on proper flag settings -- (ThMO)
00327 #endif
00328           mask = 0;
00329 #ifdef  THOMMY_MAY_BE_WRONG     /* just in case -- (ThMO) */
00330           if (y > 0)
00331 #endif
00332             {
00333               if (MP_GROUP(x,y-1) == GROUP_ROAD)
00334                 mask |= FLAG_UP;
00335             }
00336 #ifdef  THOMMY_MAY_BE_WRONG     /* just in case -- (ThMO) */
00337           if (x > 0)
00338 #endif
00339             {
00340               if (MP_GROUP(x-1,y) == GROUP_ROAD)
00341                 mask |= FLAG_LEFT;
00342             }
00343           tflags = mask;
00344 #ifdef  THOMMY_MAY_BE_WRONG     /* just in case -- (ThMO) */
00345           if (x < WORLD_SIDE_LEN - 1)
00346 #endif
00347             {
00348               switch (MP_GROUP(x+1,y))
00349                 {
00350                 case GROUP_ROAD:
00351                   tflags |= FLAG_RIGHT;
00352                 case GROUP_COMMUNE:
00353                 case GROUP_COALMINE:
00354                 case GROUP_OREMINE:
00355                 case GROUP_INDUSTRY_L:
00356                 case GROUP_INDUSTRY_H:
00357                 case GROUP_RECYCLE:
00358                 case GROUP_TIP:
00359                 case GROUP_PORT:
00360                   mask |= FLAG_RIGHT;
00361                   break;
00362                 default:
00363 #ifdef  THOMMY_MAY_BE_WRONG     /* just in case -- (ThMO) */
00364                   if (y > 0)
00365 #endif
00366                     if (MP_GROUP(x+1,y-1) == GROUP_COAL_POWER)
00367                       mask |= FLAG_RIGHT;
00368                   break;
00369                 }
00370             }
00371 #ifdef  THOMMY_MAY_BE_WRONG     /* just in case -- (ThMO) */
00372           if (y < WORLD_SIDE_LEN - 1)
00373 #endif
00374             {
00375               switch (MP_GROUP(x,y+1))
00376                 {
00377                 case GROUP_ROAD:
00378                   tflags |= FLAG_DOWN;
00379                 case GROUP_COMMUNE:
00380                 case GROUP_COALMINE:
00381                 case GROUP_OREMINE:
00382                 case GROUP_INDUSTRY_L:
00383                 case GROUP_INDUSTRY_H:
00384                 case GROUP_RECYCLE:
00385                 case GROUP_TIP:
00386                 case GROUP_PORT:
00387                   mask |= FLAG_DOWN;
00388                   break;
00389                 default:
00390 #ifdef  THOMMY_MAY_BE_WRONG     /* just in case -- (ThMO) */
00391                   if (x > 0)
00392 #endif
00393                     if (MP_GROUP(x-1,y+1) == GROUP_COAL_POWER)
00394                       mask |= FLAG_DOWN;
00395                   break;
00396                 }
00397             }
00398           MP_INFO(x,y).flags &= ~(FLAG_UP | FLAG_DOWN | FLAG_LEFT
00399                                   | FLAG_RIGHT);
00400           MP_INFO(x,y).flags |= tflags;
00401           MP_TYPE(x,y) = road_table[mask];
00402           break;
00403 
00404         case GROUP_RAIL:
00405 #if     FLAG_LEFT != 1 || FLAG_UP != 2 || FLAG_RIGHT != 4 || FLAG_DOWN != 8
00406 #error  check_rail_graphics(): you loose
00407 #error  this algorithm depends on proper flag settings -- (ThMO)
00408 #endif
00409           mask = 0;
00410 #ifdef  THOMMY_MAY_BE_WRONG     /* just in case -- (ThMO) */
00411           if (y > 0)
00412 #endif
00413             {
00414               if (MP_GROUP(x,y-1) == GROUP_RAIL)
00415                 mask |= FLAG_UP;
00416             }
00417 #ifdef  THOMMY_MAY_BE_WRONG     /* just in case -- (ThMO) */
00418           if (x > 0)
00419 #endif
00420             {
00421               if (MP_GROUP(x-1,y) == GROUP_RAIL)
00422                 mask |= FLAG_LEFT;
00423             }
00424           tflags = mask;
00425 #ifdef  THOMMY_MAY_BE_WRONG     /* just in case -- (ThMO) */
00426           if (x < WORLD_SIDE_LEN - 1)
00427 #endif
00428             {
00429               switch (MP_GROUP(x+1,y))
00430                 {
00431                 case GROUP_RAIL:
00432                   tflags |= FLAG_RIGHT;
00433                 case GROUP_COMMUNE:
00434                 case GROUP_COALMINE:
00435                 case GROUP_OREMINE:
00436                 case GROUP_INDUSTRY_L:
00437                 case GROUP_INDUSTRY_H:
00438                 case GROUP_RECYCLE:
00439                 case GROUP_TIP:
00440                 case GROUP_PORT:
00441                   mask |= FLAG_RIGHT;
00442                   break;
00443                 default:
00444 #ifdef  THOMMY_MAY_BE_WRONG     /* just in case -- (ThMO) */
00445                   if (y > 0)
00446 #endif
00447                     if (MP_GROUP(x+1,y-1) == GROUP_COAL_POWER)
00448                       mask |= FLAG_RIGHT;
00449                   break;
00450                 }
00451             }
00452 #ifdef  THOMMY_MAY_BE_WRONG     /* just in case -- (ThMO) */
00453           if (y < WORLD_SIDE_LEN - 1)
00454 #endif
00455             {
00456               switch (MP_GROUP(x,y + 1))
00457                 {
00458                 case GROUP_RAIL:
00459                   tflags |= FLAG_DOWN;
00460                 case GROUP_COMMUNE:
00461                 case GROUP_COALMINE:
00462                 case GROUP_OREMINE:
00463                 case GROUP_INDUSTRY_L:
00464                 case GROUP_INDUSTRY_H:
00465                 case GROUP_RECYCLE:
00466                 case GROUP_TIP:
00467                 case GROUP_PORT:
00468                   mask |= FLAG_DOWN;
00469                   break;
00470                 default:
00471 #ifdef  THOMMY_MAY_BE_WRONG     /* just in case -- (ThMO) */
00472                   if (x > 0)
00473 #endif
00474                     if (MP_GROUP(x - 1,y + 1)
00475                         == GROUP_COAL_POWER)
00476                       mask |= FLAG_DOWN;
00477                   break;
00478                 }
00479             }
00480           MP_INFO(x,y).flags &= ~(FLAG_UP | FLAG_DOWN | FLAG_LEFT
00481                                   | FLAG_RIGHT);
00482           MP_INFO(x,y).flags |= tflags;
00483           MP_TYPE(x,y) = rail_table[mask];
00484           break;
00485 
00486         case GROUP_WATER:
00487           mask = 0;
00488 #ifdef  THOMMY_MAY_BE_WRONG     /* just in case -- (ThMO) */
00489           if (y > 0)
00490 #endif
00491             {           /* up -- (ThMO) */
00492               if (MP_GROUP(x,y - 1)
00493                   == GROUP_WATER)
00494                 mask |= 8;
00495             }
00496 #ifdef  THOMMY_MAY_BE_WRONG     /* just in case -- (ThMO) */
00497           if (x > 0)
00498 #endif
00499             {           /* left -- (ThMO) */
00500               type = MP_TYPE(x - 1,y);
00501               if ((type == CST_USED && 
00502                    MP_GROUP(MP_INFO(x-1,y).int_1,MP_INFO(x-1,y).int_2)
00503                    == GROUP_PORT)
00504                   || get_group_of_type(type) == GROUP_WATER)
00505                 mask |= 4;
00506             }
00507 #ifdef  THOMMY_MAY_BE_WRONG     /* just in case -- (ThMO) */
00508           if (x < WORLD_SIDE_LEN - 1)
00509 #endif
00510             {           /* right -- (ThMO) */
00511               if (MP_GROUP(x + 1,y)
00512                   == GROUP_WATER)
00513                 mask |= 2;
00514             }
00515 #ifdef  THOMMY_MAY_BE_WRONG     /* just in case -- (ThMO) */
00516           if (y < WORLD_SIDE_LEN - 1)
00517 #endif
00518             {           /* down -- (ThMO) */
00519               if (MP_GROUP(x,y + 1)
00520                   == GROUP_WATER)
00521                 ++mask;
00522             }
00523           MP_TYPE(x,y) = water_table[mask];
00524           break;
00525         } /* end switch */
00526     } /* end for */
00527   } /* end for */
00528 }

void set_mappoint int  x,
int  y,
short  selected_type
 

Definition at line 29 of file shrtypes.c.

00030 {
00031   int grp;
00032 
00033   if ((grp = get_group_of_type(selected_type)) < 0) return;
00034 
00035   MP_TYPE(x,y) = selected_type;
00036   MP_GROUP(x,y) = grp;
00037 
00038   if (main_groups[grp].size == 2)
00039     {
00040       set_mappoint_used (x, y, x + 1, y);
00041       set_mappoint_used (x, y, x, y + 1);
00042       set_mappoint_used (x, y, x + 1, y + 1);
00043     }
00044   else if (main_groups[grp].size == 3)
00045     {
00046       set_mappoint_used (x, y, x + 1, y);
00047       set_mappoint_used (x, y, x + 2, y);
00048       set_mappoint_used (x, y, x + 1, y + 1);
00049       set_mappoint_used (x, y, x + 2, y + 1);
00050       set_mappoint_used (x, y, x + 1, y + 2);
00051       set_mappoint_used (x, y, x + 2, y + 2);
00052       set_mappoint_used (x, y, x, y + 1);
00053       set_mappoint_used (x, y, x, y + 2);
00054     }
00055   else if (main_groups[grp].size == 4)
00056     {
00057       set_mappoint_used (x, y, x + 1, y);
00058       set_mappoint_used (x, y, x + 2, y);
00059       set_mappoint_used (x, y, x + 1, y + 1);
00060       set_mappoint_used (x, y, x + 2, y + 1);
00061       set_mappoint_used (x, y, x + 1, y + 2);
00062       set_mappoint_used (x, y, x + 2, y + 2);
00063       set_mappoint_used (x, y, x, y + 1);
00064       set_mappoint_used (x, y, x, y + 2);
00065 
00066       set_mappoint_used (x, y, x + 3, y);
00067       set_mappoint_used (x, y, x + 3, y + 1);
00068       set_mappoint_used (x, y, x + 3, y + 2);
00069       set_mappoint_used (x, y, x + 3, y + 3);
00070       set_mappoint_used (x, y, x, y + 3);
00071       set_mappoint_used (x, y, x + 1, y + 3);
00072       set_mappoint_used (x, y, x + 2, y + 3);
00073     }
00074 }

void set_mappoint_used int  fromx,
int  fromy,
int  x,
int  y
 

Definition at line 19 of file shrtypes.c.

00020 {
00021     MP_TYPE(x,y) = CST_USED;
00022     MP_GROUP(x,y) = GROUP_USED;
00023     MP_INFO(x,y).int_1 = fromx;
00024     MP_INFO(x,y).int_2 = fromy;
00025 }


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