Subversion Repositories shark

Rev

Blame | Last modification | View Log | RSS feed

#include <math.h>
#include "include/misc.h"
#include "include/simcity.h"

int my_rint(float num) {
  return (int)floor(num+0.5);
}

void fill_table(void) {
  int i;
  for (i=0;i<360;i++) {
    sine[i]=sin(DEG_TO_RAD(i));
    cosine[i]=cos(DEG_TO_RAD(i));
  }
}

void tl_init() {
//MAPX,MAPY
  char col[2];
  short i;

  col[0]='r';
  col[1]='g';
  for(i=0;i<MAX_TL;i++) {
    tl_data_array[i].vpos=col[i%2];
    tl_data_array[i].period=(i+3)*SECOND;
    tl_data_array[i].l.x+=MAPX;
    tl_data_array[i].l.y+=MAPY;
    tl_data_array[i].r.x+=MAPX;
    tl_data_array[i].r.y+=MAPY;
    tl_data_array[i].u.x+=MAPX;
    tl_data_array[i].u.y+=MAPY;
    tl_data_array[i].d.x+=MAPX;
    tl_data_array[i].d.y+=MAPY;
  }
}

void set_start_point() {
  //MAPX,MAPY
  starting_set_array[0].xpos=607+MAPX;
  starting_set_array[0].ypos=20+MAPY;
  starting_set_array[0].angles=180;
  starting_set_array[1].xpos=12+MAPX;
  starting_set_array[1].ypos=62+MAPY;
  starting_set_array[1].angles=0;
  starting_set_array[2].xpos=260+MAPX;
  starting_set_array[2].ypos=460+MAPY;
  starting_set_array[2].angles=90;
  starting_set_array[3].xpos=605+MAPX;
  starting_set_array[3].ypos=205+MAPY;
  starting_set_array[3].angles=180;
}

int returnCarIndex(int a) {
        int indice=-1;
        int angle;

  angle=normalize(a);
  if (((angle>=0) && (angle<=8)) || ((angle>353) && (angle<360))) {   // 0  (+8 ; -7)
                indice=0;
        }
        if ((angle<=23) && (angle>8)) {    // 15
                indice=1;
        }
        if ((angle<=38) && (angle>23)) {   // 30
                indice=2;
        }
        if ((angle<=53) && (angle>38)) {   // 45
                indice=3;
        }
        if ((angle<=68) && (angle>53)) {   // 60
                indice=4;
        }
        if ((angle<=83) && (angle>68)) {   // 75
                indice=5;
        }
        if ((angle<=98) && (angle>83)) {   // 90
                indice=6;
        }
        if ((angle<=113) && (angle>98)) {   // 105
                indice=7;
        }
        if ((angle<=128) && (angle>113)) {   // 120
                indice=8;
        }
        if ((angle<=143) && (angle>128)) {   // 135
                indice=9;
        }
        if ((angle<=158) && (angle>143)) {   // 150
                indice=10;
        }
        if ((angle<=173) && (angle>158)) {   // 165
                indice=11;
        }
        if ((angle<=188) && (angle>173)) {   // 180
                indice=12;
        }
        if ((angle<=203) && (angle>188)) {   // 195
                indice=13;
        }
        if ((angle<=218) && (angle>203)) {   // 210
                indice=14;
        }
        if ((angle<=233) && (angle>218)) {   // 225
                indice=15;
        }
        if ((angle<=248) && (angle>233)) {   // 240
                indice=16;
        }
        if ((angle<=263) && (angle>248)) {   // 255
                indice=17;
        }
        if ((angle<=278) && (angle>263)) {   // 270
                indice=18;
        }
        if ((angle<=293) && (angle>278)) {   // 285
                indice=19;
        }
        if ((angle<=308) && (angle>293)) {   // 300
                indice=20;
        }
        if ((angle<=323) && (angle>308)) {   // 315
                indice=21;
        }
        if ((angle<=338) && (angle>323)) {   // 330
                indice=22;
        }
        if ((angle<=353) && (angle>338)) {   // 345
                indice=23;
        }
        if (angle==360) {
                indice=0;
        }
        return indice;
}

int normalize(int angle) {
  if(angle<0)
    return ((angle+360));
  if(angle>=360)
    return ((angle-360));
  return angle;
}

int module(int x1,int x2,int y1,int y2) {
  int x,y;

  x=x1-x2;
  y=y1-y2;
  x*=x;
  y*=y;
  return x+y;
}

int allinea(int angle) {
int old_angle;

  old_angle=normalize(angle);
  if(old_angle<45)
    old_angle=0;
  else if(old_angle<135)
    old_angle=90;
  else if(old_angle<225)
    old_angle=180;
  else
    old_angle=270;
 return old_angle;
}

int find_tl(int angle,int xp,int yp) {
  int a,min_tl,old_min,mins,i;

  a=allinea(angle);
  min_tl=old_min=10000;
  for(mins=i=0;i<MAX_TL;i++) {
    switch(a) {
      case 0:
       min_tl=module( xp,tl_data_array[i].l.x, yp,tl_data_array[i].l.y);
      break;
      case 90:
        min_tl=module( xp,tl_data_array[i].d.x, yp,tl_data_array[i].d.y);
      break;
      case 180:
        min_tl=module( xp,tl_data_array[i].r.x, yp,tl_data_array[i].r.y);
      break;
      case 270:
        min_tl=module( xp,tl_data_array[i].u.x, yp,tl_data_array[i].u.y);
      break;
      default:
      break;
    }
    if(min_tl<old_min) {
      old_min=min_tl;
      mins=i;
    }
  }
  return mins;
}

int find_col(int angle,int tl) {
  int min_tl=0,a;

  a=allinea(angle);
  switch(a) {
    case 0:
    case 180:
      min_tl=tl_data_array[tl].hpos;
    break;
    case 90:
    case 270:
      min_tl=tl_data_array[tl].vpos;
    break;
  }
  return min_tl;
}