summaryrefslogtreecommitdiffstats
path: root/src/core/SurfaceTable.cpp
blob: e4f9c0cd89f0cfcca3112ef692de44b58287ff42 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#include "common.h"

#include "main.h"
#include "FileMgr.h"
#include "Weather.h"
#include "Collision.h"
#include "SurfaceTable.h"

float CSurfaceTable::ms_aAdhesiveLimitTable[NUMADHESIVEGROUPS][NUMADHESIVEGROUPS];

void
CSurfaceTable::Initialise(Const char *filename)
{
	int lineno, fieldno;
	char *line;
	char surfname[256];
	float adhesiveLimit;

	CFileMgr::SetDir("");
	CFileMgr::LoadFile(filename, work_buff, sizeof(work_buff), "r");

	line = (char*)work_buff;
	for(lineno = 0; lineno < NUMADHESIVEGROUPS; lineno++){
		// skip white space and comments
		while(*line == ' ' || *line == '\t' || *line == '\n' || *line == '\r' || *line == ';'){
			if(*line == ';'){
				while(*line != '\n' && *line != '\r')
					line++;
			}else
				line++;
		}

		sscanf(line, "%s", surfname);
		// skip what we just read
		while(!(*line == ' ' || *line == '\t' || *line == ','))
			line++;

		for(fieldno = 0; fieldno <= lineno; fieldno++){
			// skip white space
			while(*line == ' ' || *line == '\t' || *line == ',')
				line++;
			adhesiveLimit = 0.0f;
			if(*line != '-')
				sscanf(line, "%f", &adhesiveLimit);
			// skip what we just read
			while(!(*line == ' ' || *line == '\t' || *line == ',' || *line == '\n'))
				line++;

			ms_aAdhesiveLimitTable[lineno][fieldno] = adhesiveLimit;
			ms_aAdhesiveLimitTable[fieldno][lineno] = adhesiveLimit;
		}
	}
}

int
CSurfaceTable::GetAdhesionGroup(uint8 surfaceType)
{
	switch(surfaceType){
	case SURFACE_DEFAULT:		return ADHESIVE_ROAD;
	case SURFACE_TARMAC:		return ADHESIVE_ROAD;
	case SURFACE_GRASS:		return ADHESIVE_LOOSE;
	case SURFACE_DIRT:		return ADHESIVE_LOOSE;
	case SURFACE_DIRTTRACK:		return ADHESIVE_HARD;
	case SURFACE_PAVEMENT:		return ADHESIVE_ROAD;
	case SURFACE_METAL6:		return ADHESIVE_HARD;
	case SURFACE_GLASS:		return ADHESIVE_HARD;
	case SURFACE_SCAFFOLD:		return ADHESIVE_HARD;
	case SURFACE_METAL_DOOR:	return ADHESIVE_HARD;
	case SURFACE_BILLBOARD:		return ADHESIVE_HARD;
	case SURFACE_STEEL:		return ADHESIVE_HARD;
	case SURFACE_METAL_POLE:	return ADHESIVE_HARD;
	case SURFACE_STREET_LIGHT:	return ADHESIVE_HARD;
	case SURFACE_METAL14:		return ADHESIVE_HARD;
	case SURFACE_METAL15:		return ADHESIVE_HARD;
	case SURFACE_METAL_FENCE:	return ADHESIVE_HARD;
	case SURFACE_FLESH:		return ADHESIVE_RUBBER;
	case SURFACE_SAND:		return ADHESIVE_LOOSE;
	case SURFACE_PUDDLE:		return ADHESIVE_WET;
	case SURFACE_WOOD:		return ADHESIVE_ROAD;
	case SURFACE_WOOD_BOX:		return ADHESIVE_ROAD;
	case SURFACE_WOOD_PLANK:	return ADHESIVE_ROAD;
	case SURFACE_TIRE:		return ADHESIVE_RUBBER;
	case SURFACE_HARD24:		return ADHESIVE_HARD;
	case SURFACE_HEDGE:		return ADHESIVE_LOOSE;
	case SURFACE_STONE:		return ADHESIVE_LOOSE;
	case SURFACE_METAL27:		return ADHESIVE_HARD;
	case SURFACE_METAL28:		return ADHESIVE_HARD;
	case SURFACE_RUBBER29:		return ADHESIVE_RUBBER;
	case SURFACE_LOOSE30:		return ADHESIVE_LOOSE;
	case SURFACE_BOLLARD:		return ADHESIVE_HARD;
	case SURFACE_GATE:		return ADHESIVE_HARD;
	default:			return ADHESIVE_ROAD;
	}
}

float
CSurfaceTable::GetWetMultiplier(uint8 surfaceType)
{
	switch(surfaceType){
	case SURFACE_DEFAULT:
	case SURFACE_TARMAC:
	case SURFACE_DIRTTRACK:
	case SURFACE_PAVEMENT:
	case SURFACE_SCAFFOLD:
	case SURFACE_WOOD:
	case SURFACE_WOOD_BOX:
	case SURFACE_WOOD_PLANK:
	case SURFACE_HEDGE:
	case SURFACE_LOOSE30:
	case SURFACE_BOLLARD:
		return 1.0f - CWeather::WetRoads*0.25f;

	case SURFACE_GRASS:
	case SURFACE_METAL6:
	case SURFACE_GLASS:
	case SURFACE_METAL_DOOR:
	case SURFACE_BILLBOARD:
	case SURFACE_STEEL:
	case SURFACE_METAL_POLE:
	case SURFACE_STREET_LIGHT:
	case SURFACE_METAL14:
	case SURFACE_METAL15:
	case SURFACE_METAL_FENCE:
	case SURFACE_FLESH:
	case SURFACE_TIRE:
	case SURFACE_HARD24:
	case SURFACE_STONE:
	case SURFACE_METAL27:
	case SURFACE_METAL28:
	case SURFACE_RUBBER29:
	case SURFACE_GATE:
		return 1.0f - CWeather::WetRoads*0.4f;

	default:
		return 1.0f;
	}
}

float
CSurfaceTable::GetAdhesiveLimit(CColPoint &colpoint)
{
	return ms_aAdhesiveLimitTable[GetAdhesionGroup(colpoint.surfaceB)][GetAdhesionGroup(colpoint.surfaceA)];
}