This file is indexed.

/etc/crossfire/stat_bonus is in crossfire-server 1.71.0+dfsg1-1.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
# This file sets the bonus for the various attributes, removing
# the hard coded values from the server.
#
# The default provided here match the old values as closely as possible,
# but there may be minor differences due to the way the calculations
# are done.
#
# Because the parsing is not super intelligent, format is as follows:
# table name to fill in
# opening brace
# stat values - they are comma separated, but any non digit will
# act as a seperator when the values are read in.
# closing brace
#
# Repeat for all stats.  If the server has an issue reading them,
# it will generate an error, and should abort.
#
# The names are also more consistent in this file - basically,
# stat name_type of bonus_bonus
# In the old living.c file, there was a mix - con_bonus (really hp),
# sp_bonus, etc.  The idea of putting in the stat name is to try and
# provide more information on what does what so when wants to make adjustments,
# one has a better idea what is being adjusted.
#
# Note that all stats must be fully filled in, eg, you can not fill in only
# the first 20 entries of a stat if the maximum in 30 - all 30 must be
# filled in.  All stats use the same max_stat value.
#
# Note also that the loader does not do anything to make sure the
# stat bonus make any real sense, eg, a bonus for a higher stat could be
# lower (worse) than if the stat was one less.  The loader can not
# really check for these, because it does not have any good idea to
# know what is good or bad - for some stats, low numbers are better,
# for others, high numbers are better

# max_stat must be declared before any of the stat bonuses.
max_stat 30

# How many extra HP a character gets per level (first 10).  Old
# living.c file was for every 2 levels, which is why these bonuses
# are roughly half the old ones.
con_hp_bonus
{
    -3,
    -2.5, -2, -1.5, -1, -0.5,
    -0.5, 0, 0, 0, 0,
    0.5, 1, 1.5, 2, 2.5,
    3, 3.5, 4, 4.5, 5,
    6, 7, 8, 9, 10,
    11, 12.5, 15, 20, 25
}


# SP (mana) bonus.  Bonus the character gets is 2/3 pow, 1/3 int.
# Note that in old file, the formula used to be (2*pow + int) / 12 -
# effectively diving old results by 4 (eg, table had 30 for a 26 stat,
# which effectively meant a 7.5 bonus) - that logic is removed,
# so these bonuses are real bonuses for each level, presuming both
# stats were same value - if pow gets bonus of 6, int bonus of 2,
# that would be (2*6 + 4)/ 3, or 5.
# Note that for first level, character get double this bonus - this
# is hard coded into the server.

pow_int_sp_bonus
{
    -2.5,
    -2.5, -2.25, -2, -1.75, -1.5,
    -1.25, -1, -0.75, -0.5, -0.25,
    0, 0.25, 0.5, .75, 1,
    1.25, 1.5, 1.75, 2, 2.25,
    2.5, 3, 3.75, 5, 6.25,
    7.5, 10, 12.5, 17.5, 25
}

# This is exactly like pow_int_sp_bonus above,
# but is 2/3 wis, 1/3 power.  In fact, table is exactly
# the same, and like sp bonus, character gets double value at
# first level.

wis_pow_grace_bonus
{
    -2.5,
    -2.5, -2.25, -2, -1.75, -1.5,
    -1.25, -1, -0.75, -0.5, -0.25,
    0, 0.25, 0.5, .75, 1,
    1.25, 1.5, 1.75, 2, 2.25,
    2.5, 3, 3.75, 5, 6.25,
    7.5, 10, 12.5, 17.5, 25
}

# There are lots of factors into shop pricing, cha
# being one of them.  Old system was a float,
# and the relevant formula was (bonus-1)/(bonus+1)
# Values below are converted with that formula
# and muliplied by 100 to make them integers.
# Note that due to rounding, some minor adjustments
# over the literal translated values have been made
# to make the changes smoother.
#
# If one really wants to know shop prices:
# adjustment is .4 + .5*((bonus below)/100)
#
# Cost to buy is 1*(1+adjustment), cost to sell is (1-adjusment)
# Thus, if the value below is 20, character pays 50% above
# and gets 50% of value (.4 + .5*(20/100) = .5
#
# That .4 mentioned above could get all the way down to .1
# with maximum bargaining skill.
#
# Best way to think of it: Bonus below are percentage discount/
# premium for buying/selling on the charisma side of things.
# If there was no bargaining in the game and only cha was used,
# the values below would be the total percent values, eg, a value
# of 50 means if you bought an item of value 100, you would pay
# 150, and get 50 if sold.
#
# Note: These values should probably really be re-done -
# I believe the formula that original values were based on changed
# at some point - it is also interesting to note that this is
# probably one of the few attributes where the effective
# bonus one gets at higher levels is lower (eg, difference
# in price for 26 to 20 is not as big a savings as 41 to 33).
# With revised shop code, max bonus should probably be much closer
# to zero (still would be 10% price difference even with max
# bargaining)

cha_shop_bonus
{
        81,
        81, 80, 78, 75, 71,
        67, 63, 60, 55, 50,
        49, 47, 46, 44, 43,
        41, 39, 37, 35, 33,
        32, 31, 30, 28, 27,
        26, 24, 23, 21, 20
}

# dex_bonus is used for several things for players -
# AC, bonus to hit with bows, bonus to damage with
# bows, and bonus to hit with thrown weapons.
# As such, name just remains dex bonus for now, but
# arguably, all of these different bonuses should probably
# get broken out to other tables.

dex_bonus
{
    -4,
    -3, -2, -2, -1, -1,
    -1, 0, 0, 0, 0,
     0, 0, 0, 1, 1,
     1, 2, 2, 2, 3,
     3, 3, 4, 4, 4,
     5, 5, 6, 6, 7
}

# How much faster the character moves or attacks.
# These are the usual tick counts.
# Note - I made some adjustments to smooth these out -
# I don't see a good reason to go from .15 to .20, repeat
# 4 times, then jump to 0.25.  With this change, at
# some points, the bonus is slightly higher (.02) than
# before, at other points, slightly lower.
#
dex_speed_bonus
{
   -0.1,
   -0.09, -0.08, -0.07, -0.06, -0.05,
   -0.025, 0.00, 0.00,  0.00, 0.00,
    0.025, 0.05, 0.07, 0.09, 0.10,
    0.11, 0.12,  0.13, 0.14, 0.15,
    0.16, 0.17, 0.18, 0.19, 0.20,
    0.21, 0.22, 0.23, 0.24, 0.25
}

#
# damage bonus from strength
#
str_damage_bonus
{
    -2,
    -2, -2, -1, -1, -1,
    0, 0, 0, 0, 0,
    0, 1, 1, 1, 2,
    2, 2, 3, 3, 3,
    4, 4, 5, 5, 6,
    6, 7, 8, 9, 10
}

# bonus to hit from strength.
# renamed from thaco_bonus, since thaco (really thac0) is an acronym
# for 'to hit AC 0' - in old AD&D, it was a literal number.  This bonus
# here is to hit any ac.
#
str_hit_bonus
{
    -2,
    -2, -2, -2, -1, -1,
    -1, -1, 0, 0, 0,
    0, 1, 1, 1, 1,
    2, 2, 2, 2, 2,
    3, 3, 3, 3, 4,
    4, 4, 4, 5, 5
}

# This determines how much the character can carry -
# note that characters start to get penalties to movement before
# reaching maximum.
#
str_weight_limit
{
    200000,
    250000, 300000, 350000, 400000, 500000,
    600000, 700000, 800000, 900000, 1000000,
    1100000, 1200000, 1300000, 1400000, 1500000,
    1650000, 1800000, 1950000, 2100000, 2250000,
    2400000, 2550000, 2700000, 2850000, 3000000,
    3250000, 3500000, 3750000, 4000000, 4500000
}

#
# Chance to learn a spell from a spellbook.  Note that
# overall level also increases these odds by a minor amount
# (level/5).  int or wis is used depending on the type of spell.
#
int_wis_learn_spell
{
    0,
    0, 0, 1, 2, 4,
    8, 12, 16, 25, 36,
    45, 55, 65, 70, 75,
    80, 85, 90, 95, 100,
    100, 100, 100, 100, 100,
    100, 100, 100, 100, 100
}

#
# Chance for a cleric to fail casting a spell.
# The chance is random(0,99) < ((spell_level * chance) / char_level)
# Thus, if chance is 0, character never fails.  If chance is 10,
# then if the character is same level as spell, 10% chance of
# of failure - if character is double level of the spell, 5% chance
# of failure.
#
wis_cleric_chance
{
    100,
    100, 100, 100, 90, 80,
    70, 60, 50, 40, 35,
    30, 25, 20, 15, 14,
    13, 12, 11, 10, 9,
    8, 7, 6, 5, 4,
    3, 2, 1, 0, 0
}

# Bonus for turning (scarring) undead with various prayers.
# The bonus effectively increase the character level.
# To scare a creature, the characters turn level has to be
# higher than the creatures level, so this bonus can be
# pretty important.  Note if the creature being turned is not
# an enemy of the characters god, turn bonus has to greater than
# twice the creatures level

wis_turn_bonus
{
    -1,
    -1, -1, -1, -1, -1,
    -1, -1, 0, 0, 0,
    1, 1, 1, 2, 2,
    2, 3, 3, 3, 4,
    4, 5, 5, 6, 7,
    8, 9, 10, 12, 15
}

# fear bonus increases the duration for fear
# spells (it does not affect other fear attacks,
# like those from weapons.)
# Note: The comment in living.c, that these are bonuses
# to fear resistance for players, seems incorrect/no longer
# valid - the only place where get_fear_bonus() is called
# is from cast_cone()
#
# These bonuses are as they were in the living.c
# file - the only rationale I can think of for low stats
# giving the bonus is idea of really ugly characters
# being more fearsome - however, this goes against
# the idea of higher stat is better.
#
cha_fear_bonus
{
    3,
    3, 3, 3, 2, 2,
    2, 1, 1, 1, 0,
    0, 0, 0, 0, 0,
    0, 0, 0, 0, 0,
    0, 0, 0, 0, 0,
    0, 0, 0, 0, 0
}