src/newgrf_townname.cpp
author peter1138
Tue, 22 Jan 2008 07:27:06 +0000
changeset 8374 7a1b6c89cb89
parent 8264 b1e85998c7d3
permissions -rw-r--r--
(svn r11940) -Codechange: Store short filename once per open file instead of once per sprite cache entry. Not all file types need this, but most of the time no sprite cache entry needed it either.
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 "newgrf_townname.h"
8130
d2eb7d04f6e1 (svn r11691) -Codechange: move+rename helpers.hpp and only include it when it is really needed.
rubidium
parents: 7928
diff changeset
    12
#include "core/alloc_func.hpp"
8214
971f861d5543 (svn r11777) -Codechange: split the string header and make do not include it when it's not necessary.
rubidium
parents: 8130
diff changeset
    13
#include "string_func.h"
6956
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    14
8264
b1e85998c7d3 (svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium
parents: 8214
diff changeset
    15
#include "table/strings.h"
b1e85998c7d3 (svn r11828) -Codechange: include table/* as the last includes and remove an unneeded include from openttd.h.
rubidium
parents: 8214
diff changeset
    16
6956
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    17
static GRFTownName *_grf_townnames = NULL;
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 *GetGRFTownName(uint32 grfid)
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    20
{
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    21
	GRFTownName *t = _grf_townnames;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    22
	for (; t != NULL; t = t->next) {
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    23
		if (t->grfid == grfid) return t;
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
	return NULL;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    26
}
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 *AddGRFTownName(uint32 grfid)
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    29
{
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    30
	GRFTownName *t = GetGRFTownName(grfid);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    31
	if (t == NULL) {
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    32
		t = CallocT<GRFTownName>(1);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    33
		t->grfid = grfid;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    34
		t->next = _grf_townnames;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    35
		_grf_townnames = 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
	return t;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    38
}
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
void DelGRFTownName(uint32 grfid)
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    41
{
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    42
	GRFTownName *t = _grf_townnames;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    43
	GRFTownName *p = NULL;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    44
	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
    45
	if (t != NULL) {
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    46
		for (int i = 0; i < 128; i++) {
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    47
			for (int j = 0; j < t->nbparts[i]; j++) {
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    48
				for (int k = 0; k < t->partlist[i][j].partcount; k++) {
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 6956
diff changeset
    49
					if (!HasBit(t->partlist[i][j].parts[k].prob, 7)) free(t->partlist[i][j].parts[k].data.text);
6956
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][j].parts);
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
			free(t->partlist[i]);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    54
		}
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    55
		if (p != NULL) {
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    56
			p->next = t->next;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    57
		} else {
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    58
			_grf_townnames = t->next;
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
		free(t);
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
}
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
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
    65
{
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    66
	assert(t != NULL);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    67
	for (int i = 0; i < t->nbparts[id]; i++) {
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    68
		byte count = t->partlist[id][i].bitcount;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    69
		uint16 maxprob = t->partlist[id][i].maxprob;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    70
		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
    71
		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
    72
			byte prob = t->partlist[id][i].parts[j].prob;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    73
			maxprob -= GB(prob, 0, 7);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    74
			if (maxprob > r) continue;
7928
63e18de69e50 (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 6956
diff changeset
    75
			if (HasBit(prob, 7)) {
6956
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    76
				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
    77
			} else {
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    78
				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
    79
			}
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    80
			break;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    81
		}
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
	return buf;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    84
}
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
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
    87
{
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    88
	strecpy(buf, "", last);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    89
	for (GRFTownName *t = _grf_townnames; t != NULL; t = t->next) {
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    90
		if (t->grfid == grfid) {
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    91
			assert(gen < t->nb_gen);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    92
			buf = RandomPart(buf, t, seed, t->id[gen], last);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    93
			break;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    94
		}
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
	return buf;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
    97
}
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
StringID *GetGRFTownNameList()
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   100
{
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   101
	int nb_names = 0, n = 0;
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) nb_names += t->nb_gen;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   103
	StringID *list = MallocT<StringID>(nb_names + 1);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   104
	for (GRFTownName *t = _grf_townnames; t != NULL; t = t->next) {
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   105
		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
   106
	}
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   107
	list[n] = INVALID_STRING_ID;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   108
	return list;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   109
}
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
void CleanUpGRFTownNames()
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
	while (_grf_townnames != NULL) DelGRFTownName(_grf_townnames->grfid);
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   114
}
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
uint32 GetGRFTownNameId(int gen)
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   117
{
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   118
	for (GRFTownName *t = _grf_townnames; t != NULL; t = t->next) {
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   119
		if (gen < t->nb_gen) return t->grfid;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   120
		gen -= t->nb_gen;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   121
	}
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   122
	/* Fallback to no NewGRF */
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   123
	return 0;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   124
}
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
uint16 GetGRFTownNameType(int gen)
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   127
{
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   128
	for (GRFTownName *t = _grf_townnames; t != NULL; t = t->next) {
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   129
		if (gen < t->nb_gen) return gen;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   130
		gen -= t->nb_gen;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   131
	}
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   132
	/* Fallback to english original */
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   133
	return SPECSTR_TOWNNAME_ENGLISH;
3579bfc5157b (svn r10211) -Feature: [NewGRF] Add support for action 0F
glx
parents:
diff changeset
   134
}