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 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506
|
Information for the BZFlag Developer
====================================
BZFlag source code lives in the following directories:
applications
------------
src/bzadmin - the BZFlag admin tool and chat client
src/bzflag - the BZFlag client
src/bzfs - the BZFlag server
tools/ - various helper tools
game dependent libraries
------------------------
plugins/ - optional server plugins
src/game - core game logic
game independent, platform independent libraries
------------------------------------------------
src/3D - 3D geometry (actually; not much 3D here, fonts and textures)
src/common - general utility
src/geometry - geometric mathematics
src/mediafile - sound and image file support
src/obstacle - collision detection
src/ogl - wrapper classes for OpenGL
src/scene - scene graph
game independent, platform dependent libraries
----------------------------------------------
src/date - build dates and versioning
src/net - networking
src/platform - general platform dependent code
"other stuff"
-------------
Xcode/ - project definitions for Apple XCode
MSVC/ - project definitions for Microsoft Visual C
data/ - images, sounds, fonts, translations
include/ - public headers
m4/ - configuration macros
man/ - documentation in manual page format
misc/ - kitchen sink of anything
package/ - packaging aids for specific operating systems
Note that only a few directories contain code directly related to the
game BZFlag. In particular: bzflag, bzadmin, bzfs, plugins, and game.
(And obstacle, but that will hopefully be made more general some day.)
The rest of the code could potentially be used in a different game.
If your code is BZFlag specific then it should go into one of the
above directories (game if it can potentially be used by more than one
app, otherwise into the appropriate app directory). If not then put
it in one of the other directories or add a new directory.
Coding conventions
==================
If you plan on contributing any source code to BZFlag, we would like
you to follow certain conventions. Contributions that don't conform are
likely to be ridiculed and rejected until they do.
Code Organization
-----------------
Follow the above organization when introducing new files. Any code
that would potentially be useful in another game goes outside of the
app directories and outside the game directory. Platform dependent
code normally goes into platform, net. Code that is specific to
BZFlag should go into the game directory. There are README files in
most all of the source directories that describe what belongs in those
directories
Header files that are private to a library go into that library's
directory. Header files exported from a library go into the include
directory off the top-level. Header files for classes introduced in
an application directory should never go into a #include outside of
that application directory.
C files use the .c extension. C++ files use the .cxx extension for
everything except plugins which use the .cpp extension. Header files
for both C and C++ use the .h extension.
Headers
-------
Don't put interface headers into the common.h header. Class interface
headers should include just what is necessary to make the interface
work. The source implementation file should include it's interface
and whatever else it might need specific to the implementation. For C
code, the header file should include everything the C code needs
(otherwise there's no point to the header) including prototypes for
all non-static functions.
The include order for headers within a header is common.h, system
headers, common interface headers, and then local interface headers.
The include order for headers within a source file is its own
interface header if there is one, or common.h otherwise, system
headers, common implementation headers, and then local implementation
headers.
Adhering to this order will avoid nasty ordering dependencies and
makes it easy to change things down the road.
Ideally, there should be one class per file. There are, of course,
exceptions to this such as simple utility classes that are local to
that same file's implementation. If it's a public class, though, it's
usually best to separate it out into another file by itself.
Avoid "extern" in C files. This prevents the compiler from type
checking in most cases. If you need access to something, put it in a
header. That's what headers are for.
C++ features
------------
Earlier versions of BZFlag avoided certain features of C++ that have
matured enough to be widely and well supported. These features are
now permitted and encouraged including:
bool -- the boolean type and True and False are gone
standard C++ library -- use where appropriate (AList is gone)
templates -- use sparingly where appropriate
These should still be avoided:
exceptions -- still poorly supported on old lame compilers
run-time typing -- if you find yourself needing RTTI, its often a
sign of bad design. Try to find another way to
implement your idea.
Multiple inheritance is strongly discouraged unless in the Java style
of single implementation inheritance and multiple interface
inheritance. Multiple inheritance otherwise can quickly lead to very
hard to understand code.
To prevent ambiguity, do not use the C++ "using" keyword just to avoid
typing explicit references to the "std" namespace. Other namespaces,
especially those defined in BZFlag code, may be introduced with
"using" when it improves code readability.
Only use standard C++ language features, at no time should any
compiler-specific extensions be used (GNU or VisualC++ extensions).
If an extension can not be avoided then it must be able to be disabled
or replaced using a #define in config.h. BZFlag is a cross-platform
application so it is important to remember that not all builds will
use your specific compiler. This also includes not using features
in C99 and C1x as the windows compiler only supports C++11 and
there are some features in the later C versions that were not adopted
by the C++ standard, namely the 'not' and 'or' keywords instead of ! and ||.
Also MSVC seems to be a bit picky about what bits of older standards it
supports. When the windows compiler supports this, we should stick with
a consistent method and not mix AND with &&. Use the same type of operators
that are in the existing code.
Formatting
----------
Everybody has their own style and has things they don't like about any
other style. Well, we can't have a zillion styles in the code, so
follow the BZFlag style if you want your contribution included.
BZFlag is formatted using the Allman Style, and this is enforced
with the artistic styler, astyle, using these command line options:
astyle --style=allman -nxjQ --convert-tabs --max-code-length=120 \
--recursive './*.cxx' './*.cpp' './*.h'
The source code serves for examples of the following rules.
1) Indents are 4 characters. Tabs are 4 characters. There are vi
and emacs settings in each file to adopt, enforce, remind, and
encourage this convention. Suggestions are welcome here for
setting up other environments. Here are the lines that should
be included at the end of source files:
// Local Variables: ***
// mode: C++ ***
// tab-width: 4 ***
// c-basic-offset: 4 ***
// indent-tabs-mode: nil ***
// End: ***
// ex: shiftwidth=4 tabstop=4
In emacs the the indent-region command (bound to C-M-\ by
default) does a good job of making the needed changes to conform
to this convention. Installing exTabSettings in MSVC will make
it conform.
2) The opening brace of all blocks goes on the next line following the
statement introducing it. The closing brace is indented
like the statement except for functions where it aligns with the
open brace. For example:
void foo()
{
for (;;)
{
if (expr)
{
}
}
}
3) An else clause goes on next line just like the opening brace:
if (expr)
{
}
else
{
}
4) If *either* the if block or else block requires brackets then
they both get brackets. if neither requires brackets then use
brackets on both or neither at your discretion. In case both
styles are allowed, don't change the existing code just because
it is not coded like you prefer.
5) When using `delete' or `delete[]' don't bother to test the
pointer if it's NULL first. use new and delete rather than
malloc and free.
6) Data members should be usually private unless making plain old
data. separate methods from data in class definitions with
(possibly redundant) access specifiers. public c'tors/d'tors
should be first, followed by public member functions, protected
member functions, private member functions, and data members.
7) Macro names are all capitals, class names have the first letter
of each word capitalized, all other names have the first letter
of each word except the first capitalized. Only macros may use
underscores, except for in the names of method parameters where
a leading underscore is allowed to make it different from a
member variable.
#define FOO bar
class MyClass
{
public:
void addStuff(int addMe, int _y) { y = addMe + _y; }
private:
int y;
};
8) Put spaces after statements followed by expressions and spaces
around operators. For example:
if (a == b)
not
if(a==b)
9) Do not leave old commented code hanging around and do not submit
patches with "// Added by foo on xx" comments. This is what
version control software is for.
10) Do not code very long lines. Try to stay within 120 columns if
possible, but don't go over 200 if you should raise that limit
for some reason.
Violations of these rules in the existing code are not excuses to
follow suit. Non-conforming code may be fixed. Patches to
non-conforming code should follow the non-conforming code's style if
following the rules would cause an ugly mess.
Performance
-----------
If the code you are editing is in a performance-critical section of
BZFlag (that is, if it is called multiple times per frame on the
client, or per server loop on the server), you should profile the
proposed changes. The new code does not necessarily need to be
faster, but a quantitative analysis is required.
Committing Changes
==================
Make atomic changes in a way that a system will be working, or at least
will compile successfully, before and after committing a set of changes.
Try to separate out bigger commits into smaller ones. In particular,
if a change involves multiple functionality changes, the commit should
be broken up into smaller coherent chunks. This way if a bug or other
issue with a particular commit is later encountered, the change can be
more easily isolated and undone or fixed.
Submitting changes
--------------
If you do not have source code commit access and would like to propose
a change for inclusion, you should create a pull request. Requests
should be submitted on GitHub at:
https://github.com/BZFlag-Dev/bzflag/pulls
In general, these should be relatively small succinct changes that
can be readily reviewed, tested, and applied. Changes that are
difficult to review, test, or apply will likely not be accepted. That
said, creating useful changes that have been discussed with the
existing developers is one of the more immediate means to become a
developer for BZFlag yourself.
Licensing and Developer Agreement
---------
By committing to a source code repository or submitting a patch/pull request, you
the developer are assigning copyright of the submission to the project maintainer (Tim Riker),
and his successors, as defined in the BZFlag Developer Agreement located at
https://github.com/BZFlag-Dev/bzflag/wiki/Developer-Agreement
Grant of Copyright Assignment
Each Contributor hereby assigns to the project maintainer all right, title,
and interest worldwide in all Copyright covering the Contribution.
All submissions are subject to these terms.
Notes.
You may not place any restrictions on how the project maintainer (Tim Riker)
maintains or handles your submitted works. Works that are derivations of
existing works in the project are subject to the current project licenses
(LGPL and MPL) and any other licenses the project may be released under.
Authors that submit works must have the legal right to agree to these terms,
either as original author or authorized licensee of derived works.
Testing
=======
If you have rendering problems, you might want to try setting:
LIBGL_ALWAYS_INDIRECT=1
On many systems this will force software rendering. It will greatly
reduce the performance, but may assist in solving rendering issues.
A debug build may be specified via:
./configure --enable-debug
A profile build is specified via:
./configure --enable-profile
Sounds
======
Sounds are stored as uncompressed 22.050KHz WAV files. We will likely
move to OGG someday.
Images
======
Images are stored as portable network graphics (.png). Compression is
okay, but no additional options such as interlacing.
BZDB
====
BZDB is the generic name:value pair database within bzflag and
bzfs. It is useful for data that can be serialized to a string that
needs to be accessible to many areas of the code. It also provides
facilities for saving persistent pairs to the config file and
downloading variables from the server.
BZDB is not an object broker, and isn't meant to be. If you have data
within an object that needs to be accessible from a number of places,
but don't want to pass the object around, you could store that data
within BZDB (if accessed often, such as game variables like gravity,
you will need a cached version anyway to avoid the overhead of
lookup). Using BZDB adds unnecessary overhead if objects generally
keep their data hidden without needing persistent state.
Basically, if your data can be serialized to a string, and it makes
sense to do so (eg: config file option, game variable downloaded from
server), use BZDB. If you wanted an object broker, use a freakin'
global.
Version numbers
===============
The BZFlag versioning info is defined in: include/version.h
There are a number of #defines in that file that define the Major,
Minor, and Revision versions, as well as the build type, build date,
build user, and network protocol version.
The BZFlag version number is in the format of:
MajorVersion.MinorVersion.Revision
All "development" versions use an odd number for the minor version
number. All "release" versions use an even number for the minor
version, e.g.. 1.9.x is a development version for a future 1.10
release. Release versions also use even revision version
numbers. Maintenance work is done on odd numbered revisions and
releases are even numbered. For development versions the revision
version represents significant feature changes or stages in a
development version, such as a change to the network protocol or a
move to a definite testing stage. For "release" versions, the
revision represents patches or bug fixes to the base release, but not
new feature development. This allows the developers to "leave some
room" for patches and emergency fixes to a release line.
The network protocol version is a string. When changes to the protocol
are made that render it incompatible with prior releases, the version
number of the protocol must be changed. This is necessary to prevent
incompatible clients from attempting connections. When a change is
made, the network protocol version needs to be set to the application
version that is current at that time. This is also when the revision
of the application should be incremented.
The displayed application version includes additional information in
the format:
Major.Minor.Revision-BuildDate-BuildType-BuildOS
BuildDate represents the date of the build in the format YYYYMMDD.
This string is generated during runtime by the compiler's preprocessor
__DATE__ macro.
BuildType is a string that represents the intended use of the build.
For development releases, the build type is normally "DEVEL". For
testing releases, the build type can be "ALPHA", "BETA", "RC1" etc.
For final release versions the build type should be "STABLE" or
"MAINT". The build type provides a human readable keyword for the
version and intended or expected stability of the build.
BuildOS is the operating system that the building system is running;
on systems that use the automake build system this is automatically
generated.
If a build includes SDL or SDL2, the build string ends in "-SDL" or
"-SDL2", respectively.
Making a Release
================
In order to make a release, there are handful of steps that need to be
taken. If any step fails to be completed successfully, the release
cannot proceed. A checklist of items to be completed follows:
- All code is committed to the repository.
- ChangeLog includes a comment for all items added since the previous
release, preferably denoting who made what changes.
- Man files and bzfs.conf files are updated with latest changes.
- Version numbers are updated to the next expected release number.
This minimally includes updating README, ChangeLog, configure.ac,
buildDate.cxx, Version.rc, Xcode/BZFlag.xcodeproj/project.pbxproj,
Xcode/BZFlag-Info.plist, and the title.png image. Version numbers in all
other platform-specific README.* files should also be verified.
- Edit updateConfigFile in clientConfig.cxx to update any necessary
configuration settings, and remove the 'break;' from the latest switch
case so that it will update the config version.
- When BZ_PROTO_VERSION has already changed since the last release,
increment it one more time in buildDate.cxx, bzfquery.*, and
bzls.lua to distinguish the new release from development versions.
- BZ_BUILD_TYPE is changed to MAINT in buildDate.cxx.
- Update package/win32/nsis/*.nsi (for windows) with appropriate
version numbers.
- Perform a "make distcheck" on multiple (preferably all) platforms.
This will verify that a proper source distribution can be made.
Also verify that all non-autotools builds build properly.
- Tag the release. Tag format should be consistent with the other
tags using the format of vMAJOR.MINOR.RELEASE.
e.g. git tag -a v2.6.0 -m 'Version 2.6.0 release'
git push origin v2.6.0
- Perform a "make dist" generate a source release tarball.
- Verify that the source tarball can be expanded, builds, and runs.
- Build platform-specific binaries from the source tarball.
- Post the source tarball, zip and platform-specific binaries to
SourceForge. Update the per-operating system default download
settings.
- Add a new page to the BZFlag wiki for the new version and update
other pages (including Download, Releases, Versions) appropriately.
- Increment and commit the version number in configure.ac and other
files (see above) to the source repository so that later builds are
immediately distinguished. Also, change BZ_BUILD_TYPE back to DEVEL
in buildDate.cxx.
- Update the following:
https://github.com/BZFlag-Dev/bzflag.org
https://github.com/BZFlag-Dev/download.bzflag.org
- Post release at:
https://forums.bzflag.org
https://github.com/BZFlag-Dev/bzflag
Testing the server
==================
An example line to use for bzfs testing is:
src/bzfs/bzfs -c -d -d -d +f good +f bad -fb -j -ms 3 -password \
password -s 10 -sa -sb -sw 1 -st 15 -world misc/maps/hix.bzw
|