src/newgrf_townname.cpp
author rubidium
Sat, 17 Nov 2007 12:42:15 +0000
changeset 7898 7c6a9c9030b5
parent 6956 3579bfc5157b
child 7928 63e18de69e50
permissions -rw-r--r--
(svn r11449) -Fix [FS#1160]: trams could deadlock themselves. As of now trams will turn as roadvehicles do when the player cannot build a tram track piece on the next tile without destroying anything. It will not turn when the player can build the before mentioned track piece on the 'next' tile.
6956
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
     1
/* $Id$ */
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
     2
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
     3
/** @file newgrf_townname.cpp
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
     4
 * Implementation of  Action 0F "universal holder" structure and functions.
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
     5
 * This file implements a linked-lists of townname generators,
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
     6
 * holding everything that the newgrf action 0F will send over to OpenTTD.
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
     7
 */
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
     8
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
     9
#include "stdafx.h"
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    10
#include "openttd.h"
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    11
#include "table/strings.h"
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    12
#include "newgrf_townname.h"
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    13
#include "string.h"
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    14
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    15
static GRFTownName *_grf_townnames = NULL;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    16
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    17
GRFTownName *GetGRFTownName(uint32 grfid)
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    18
{
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    19
	GRFTownName *t = _grf_townnames;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    20
	for (; t != NULL; t = t->next) {
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    21
		if (t->grfid == grfid) return t;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    22
	}
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    23
	return NULL;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    24
}
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    25
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    26
GRFTownName *AddGRFTownName(uint32 grfid)
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    27
{
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    28
	GRFTownName *t = GetGRFTownName(grfid);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    29
	if (t == NULL) {
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    30
		t = CallocT<GRFTownName>(1);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    31
		t->grfid = grfid;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    32
		t->next = _grf_townnames;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    33
		_grf_townnames = t;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    34
	}
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    35
	return t;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    36
}
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    37
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    38
void DelGRFTownName(uint32 grfid)
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    39
{
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    40
	GRFTownName *t = _grf_townnames;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    41
	GRFTownName *p = NULL;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    42
	for (;t != NULL; p = t, t = t->next) if (t->grfid == grfid) break;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    43
	if (t != NULL) {
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    44
		for (int i = 0; i < 128; i++) {
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    45
			for (int j = 0; j < t->nbparts[i]; j++) {
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    46
				for (int k = 0; k < t->partlist[i][j].partcount; k++) {
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    47
					if (!HASBIT(t->partlist[i][j].parts[k].prob, 7)) free(t->partlist[i][j].parts[k].data.text);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    48
				}
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    49
				free(t->partlist[i][j].parts);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    50
			}
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    51
			free(t->partlist[i]);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    52
		}
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    53
		if (p != NULL) {
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    54
			p->next = t->next;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    55
		} else {
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    56
			_grf_townnames = t->next;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    57
		}
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    58
		free(t);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    59
	}
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    60
}
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    61
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    62
static char *RandomPart(char *buf, GRFTownName *t, uint32 seed, byte id, const char *last)
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    63
{
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    64
	assert(t != NULL);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    65
	for (int i = 0; i < t->nbparts[id]; i++) {
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    66
		byte count = t->partlist[id][i].bitcount;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    67
		uint16 maxprob = t->partlist[id][i].maxprob;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    68
		uint32 r = (GB(seed, t->partlist[id][i].bitstart, count) * maxprob) >> count;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    69
		for (int j = 0; j < t->partlist[id][i].partcount; j++) {
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    70
			byte prob = t->partlist[id][i].parts[j].prob;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    71
			maxprob -= GB(prob, 0, 7);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    72
			if (maxprob > r) continue;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    73
			if (HASBIT(prob, 7)) {
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    74
				buf = RandomPart(buf, t, seed, t->partlist[id][i].parts[j].data.id, last);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    75
			} else {
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    76
				buf = strecat(buf, t->partlist[id][i].parts[j].data.text, last);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    77
			}
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    78
			break;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    79
		}
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    80
	}
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    81
	return buf;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    82
}
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    83
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    84
char *GRFTownNameGenerate(char *buf, uint32 grfid, uint16 gen, uint32 seed, const char *last)
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    85
{
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    86
	strecpy(buf, "", last);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    87
	for (GRFTownName *t = _grf_townnames; t != NULL; t = t->next) {
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    88
		if (t->grfid == grfid) {
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    89
			assert(gen < t->nb_gen);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    90
			buf = RandomPart(buf, t, seed, t->id[gen], last);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    91
			break;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    92
		}
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    93
	}
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    94
	return buf;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    95
}
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    96
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    97
StringID *GetGRFTownNameList()
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    98
{
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    99
	int nb_names = 0, n = 0;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   100
	for (GRFTownName *t = _grf_townnames; t != NULL; t = t->next) nb_names += t->nb_gen;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   101
	StringID *list = MallocT<StringID>(nb_names + 1);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   102
	for (GRFTownName *t = _grf_townnames; t != NULL; t = t->next) {
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   103
		for (int j = 0; j < t->nb_gen; j++) list[n++] = t->name[j];
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   104
	}
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   105
	list[n] = INVALID_STRING_ID;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   106
	return list;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   107
}
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   108
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   109
void CleanUpGRFTownNames()
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   110
{
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   111
	while (_grf_townnames != NULL) DelGRFTownName(_grf_townnames->grfid);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   112
}
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   113
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   114
uint32 GetGRFTownNameId(int gen)
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   115
{
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   116
	for (GRFTownName *t = _grf_townnames; t != NULL; t = t->next) {
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   117
		if (gen < t->nb_gen) return t->grfid;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   118
		gen -= t->nb_gen;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   119
	}
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   120
	/* Fallback to no NewGRF */
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   121
	return 0;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   122
}
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   123
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   124
uint16 GetGRFTownNameType(int gen)
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   125
{
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   126
	for (GRFTownName *t = _grf_townnames; t != NULL; t = t->next) {
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   127
		if (gen < t->nb_gen) return gen;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   128
		gen -= t->nb_gen;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   129
	}
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   130
	/* Fallback to english original */
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   131
	return SPECSTR_TOWNNAME_ENGLISH;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   132
}