Added full source code
This commit is contained in:
commit
33f8586698
1377 changed files with 123808 additions and 0 deletions
11
AUTHORS
Normal file
11
AUTHORS
Normal file
|
@ -0,0 +1,11 @@
|
|||
Legacy Worlds Beta 5 authors
|
||||
-----------------------------
|
||||
|
||||
Legacy Worlds Beta 4:
|
||||
Chris Wicks <el_christoph@deepclone.co.uk>
|
||||
|
||||
Legacy Worlds Beta 5:
|
||||
Emmanuel Benoît <tseeker@deepclone.co.uk>
|
||||
Julie Bourbeillon <ju@deepclone.co.uk>
|
||||
Douglas Rodgers <sycop@deepclone.co.uk>
|
||||
Dave Timmermans <lord_omega@legacyworlds.com>
|
32
COPYING
Normal file
32
COPYING
Normal file
|
@ -0,0 +1,32 @@
|
|||
Licensing information
|
||||
----------------------
|
||||
|
||||
The IRC bot code is based on PHP-IRC (http://www.phpbots.org/) with some
|
||||
changes for LW integration. It is distributed under the GNU GPL license.
|
||||
|
||||
The main LW code (admin and scripts directories), as well as the CSS and JS
|
||||
code (with the exception of the jquery library) in site/static, the planet
|
||||
generator and the SQL database structure and associated functions are
|
||||
distributed under the GNU GPL license. Same goes for whatever is in the
|
||||
misc/ directory.
|
||||
|
||||
The outdated copy of the JQuery (http://www.jquery.org) library found in the
|
||||
site/static/main/js/ directory is distributed under the MIT license.
|
||||
|
||||
Icons used in the site's appearance have been taken and modified from various
|
||||
sources. Their respective licenses are mostly unknown.
|
||||
|
||||
The game data (including the manual and all files in the sql subdirectory
|
||||
which contain actual values - sql/beta5/data/ most notably) remain the
|
||||
exclusive property of Deep Clone Development. This data may be copied,
|
||||
distributed or used as long as:
|
||||
1) the distribution is free,
|
||||
2) the distribution is complete and unmodified (it should match the
|
||||
contents of the official SVN repository),
|
||||
3) no profits are made from using this data.
|
||||
Feel free to replace this data with something else entirely to get rid of
|
||||
these licensing terms.
|
||||
|
||||
|
||||
A copy of the GPLv2 is included in COPYING.GPL ; the MIT license may be found
|
||||
in COPYING.MIT.
|
339
COPYING.GPL
Normal file
339
COPYING.GPL
Normal file
|
@ -0,0 +1,339 @@
|
|||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 2, June 1991
|
||||
|
||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
License is intended to guarantee your freedom to share and change free
|
||||
software--to make sure the software is free for all its users. This
|
||||
General Public License applies to most of the Free Software
|
||||
Foundation's software and to any other program whose authors commit to
|
||||
using it. (Some other Free Software Foundation software is covered by
|
||||
the GNU Lesser General Public License instead.) You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
this service if you wish), that you receive source code or can get it
|
||||
if you want it, that you can change the software or use pieces of it
|
||||
in new free programs; and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
anyone to deny you these rights or to ask you to surrender the rights.
|
||||
These restrictions translate to certain responsibilities for you if you
|
||||
distribute copies of the software, or if you modify it.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must give the recipients all the rights that
|
||||
you have. You must make sure that they, too, receive or can get the
|
||||
source code. And you must show them these terms so they know their
|
||||
rights.
|
||||
|
||||
We protect your rights with two steps: (1) copyright the software, and
|
||||
(2) offer you this license which gives you legal permission to copy,
|
||||
distribute and/or modify the software.
|
||||
|
||||
Also, for each author's protection and ours, we want to make certain
|
||||
that everyone understands that there is no warranty for this free
|
||||
software. If the software is modified by someone else and passed on, we
|
||||
want its recipients to know that what they have is not the original, so
|
||||
that any problems introduced by others will not reflect on the original
|
||||
authors' reputations.
|
||||
|
||||
Finally, any free program is threatened constantly by software
|
||||
patents. We wish to avoid the danger that redistributors of a free
|
||||
program will individually obtain patent licenses, in effect making the
|
||||
program proprietary. To prevent this, we have made it clear that any
|
||||
patent must be licensed for everyone's free use or not licensed at all.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License applies to any program or other work which contains
|
||||
a notice placed by the copyright holder saying it may be distributed
|
||||
under the terms of this General Public License. The "Program", below,
|
||||
refers to any such program or work, and a "work based on the Program"
|
||||
means either the Program or any derivative work under copyright law:
|
||||
that is to say, a work containing the Program or a portion of it,
|
||||
either verbatim or with modifications and/or translated into another
|
||||
language. (Hereinafter, translation is included without limitation in
|
||||
the term "modification".) Each licensee is addressed as "you".
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running the Program is not restricted, and the output from the Program
|
||||
is covered only if its contents constitute a work based on the
|
||||
Program (independent of having been made by running the Program).
|
||||
Whether that is true depends on what the Program does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Program's
|
||||
source code as you receive it, in any medium, provided that you
|
||||
conspicuously and appropriately publish on each copy an appropriate
|
||||
copyright notice and disclaimer of warranty; keep intact all the
|
||||
notices that refer to this License and to the absence of any warranty;
|
||||
and give any other recipients of the Program a copy of this License
|
||||
along with the Program.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy, and
|
||||
you may at your option offer warranty protection in exchange for a fee.
|
||||
|
||||
2. You may modify your copy or copies of the Program or any portion
|
||||
of it, thus forming a work based on the Program, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) You must cause the modified files to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
b) You must cause any work that you distribute or publish, that in
|
||||
whole or in part contains or is derived from the Program or any
|
||||
part thereof, to be licensed as a whole at no charge to all third
|
||||
parties under the terms of this License.
|
||||
|
||||
c) If the modified program normally reads commands interactively
|
||||
when run, you must cause it, when started running for such
|
||||
interactive use in the most ordinary way, to print or display an
|
||||
announcement including an appropriate copyright notice and a
|
||||
notice that there is no warranty (or else, saying that you provide
|
||||
a warranty) and that users may redistribute the program under
|
||||
these conditions, and telling the user how to view a copy of this
|
||||
License. (Exception: if the Program itself is interactive but
|
||||
does not normally print such an announcement, your work based on
|
||||
the Program is not required to print an announcement.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Program,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Program, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Program.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Program
|
||||
with the Program (or with a work based on the Program) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may copy and distribute the Program (or a work based on it,
|
||||
under Section 2) in object code or executable form under the terms of
|
||||
Sections 1 and 2 above provided that you also do one of the following:
|
||||
|
||||
a) Accompany it with the complete corresponding machine-readable
|
||||
source code, which must be distributed under the terms of Sections
|
||||
1 and 2 above on a medium customarily used for software interchange; or,
|
||||
|
||||
b) Accompany it with a written offer, valid for at least three
|
||||
years, to give any third party, for a charge no more than your
|
||||
cost of physically performing source distribution, a complete
|
||||
machine-readable copy of the corresponding source code, to be
|
||||
distributed under the terms of Sections 1 and 2 above on a medium
|
||||
customarily used for software interchange; or,
|
||||
|
||||
c) Accompany it with the information you received as to the offer
|
||||
to distribute corresponding source code. (This alternative is
|
||||
allowed only for noncommercial distribution and only if you
|
||||
received the program in object code or executable form with such
|
||||
an offer, in accord with Subsection b above.)
|
||||
|
||||
The source code for a work means the preferred form of the work for
|
||||
making modifications to it. For an executable work, complete source
|
||||
code means all the source code for all modules it contains, plus any
|
||||
associated interface definition files, plus the scripts used to
|
||||
control compilation and installation of the executable. However, as a
|
||||
special exception, the source code distributed need not include
|
||||
anything that is normally distributed (in either source or binary
|
||||
form) with the major components (compiler, kernel, and so on) of the
|
||||
operating system on which the executable runs, unless that component
|
||||
itself accompanies the executable.
|
||||
|
||||
If distribution of executable or object code is made by offering
|
||||
access to copy from a designated place, then offering equivalent
|
||||
access to copy the source code from the same place counts as
|
||||
distribution of the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
4. You may not copy, modify, sublicense, or distribute the Program
|
||||
except as expressly provided under this License. Any attempt
|
||||
otherwise to copy, modify, sublicense or distribute the Program is
|
||||
void, and will automatically terminate your rights under this License.
|
||||
However, parties who have received copies, or rights, from you under
|
||||
this License will not have their licenses terminated so long as such
|
||||
parties remain in full compliance.
|
||||
|
||||
5. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Program or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Program (or any work based on the
|
||||
Program), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Program or works based on it.
|
||||
|
||||
6. Each time you redistribute the Program (or any work based on the
|
||||
Program), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute or modify the Program subject to
|
||||
these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties to
|
||||
this License.
|
||||
|
||||
7. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Program at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Program by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Program.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under
|
||||
any particular circumstance, the balance of the section is intended to
|
||||
apply and the section as a whole is intended to apply in other
|
||||
circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system, which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
8. If the distribution and/or use of the Program is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Program under this License
|
||||
may add an explicit geographical distribution limitation excluding
|
||||
those countries, so that distribution is permitted only in or among
|
||||
countries not thus excluded. In such case, this License incorporates
|
||||
the limitation as if written in the body of this License.
|
||||
|
||||
9. The Free Software Foundation may publish revised and/or new versions
|
||||
of the General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Program
|
||||
specifies a version number of this License which applies to it and "any
|
||||
later version", you have the option of following the terms and conditions
|
||||
either of that version or of any later version published by the Free
|
||||
Software Foundation. If the Program does not specify a version number of
|
||||
this License, you may choose any version ever published by the Free Software
|
||||
Foundation.
|
||||
|
||||
10. If you wish to incorporate parts of the Program into other free
|
||||
programs whose distribution conditions are different, write to the author
|
||||
to ask for permission. For software which is copyrighted by the Free
|
||||
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||
make exceptions for this. Our decision will be guided by the two goals
|
||||
of preserving the free status of all derivatives of our free software and
|
||||
of promoting the sharing and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||
REPAIR OR CORRECTION.
|
||||
|
||||
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License along
|
||||
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program is interactive, make it output a short notice like this
|
||||
when it starts in an interactive mode:
|
||||
|
||||
Gnomovision version 69, Copyright (C) year name of author
|
||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, the commands you use may
|
||||
be called something other than `show w' and `show c'; they could even be
|
||||
mouse-clicks or menu items--whatever suits your program.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1989
|
||||
Ty Coon, President of Vice
|
||||
|
||||
This General Public License does not permit incorporating your program into
|
||||
proprietary programs. If your program is a subroutine library, you may
|
||||
consider it more useful to permit linking proprietary applications with the
|
||||
library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License.
|
17
COPYING.MIT
Normal file
17
COPYING.MIT
Normal file
|
@ -0,0 +1,17 @@
|
|||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
96
README
Normal file
96
README
Normal file
|
@ -0,0 +1,96 @@
|
|||
Legacy Worlds Beta 5 source code
|
||||
---------------------------------
|
||||
|
||||
|
||||
1. Introduction
|
||||
|
||||
This file contains information regarding the source code release for Legacy
|
||||
Worlds Beta 5 - how the source code is organised and how it may be used.
|
||||
|
||||
For licensing information, please read the COPYING file. For the list of
|
||||
contributors, please read the AUTHORS file. For stuff that could be done
|
||||
considering one had a lot of time to waste, please read the TODO file.
|
||||
|
||||
The official SVN repository for the LWB5 code can be found at:
|
||||
* https://lwb5.svn.deepclone.co.uk (IPv6 users)
|
||||
* https://secure.nocternity.net/deepclone.co.uk/svn/lwb5/ (IPv4 users)
|
||||
|
||||
|
||||
2. Organisation of the source code
|
||||
|
||||
... admin/ Administration interface scripts
|
||||
... ircbot/ IRC bot
|
||||
... ircbot/modules/lw/ LWB5-specific code for the IRC bot
|
||||
... manual/ Source code (as XML) of the LWB5 manual
|
||||
... misc/ Various optional elements
|
||||
... planetgen/ Planet generator source code
|
||||
... scripts/ Scripts that implement most of the game
|
||||
... scripts/game/ Back-end scripts
|
||||
... scripts/lib/ Core library
|
||||
... scripts/site/ Web front-end
|
||||
... site/ Root directory of the public part of the site
|
||||
... site/static/ Images, CSS and JavaScript elements
|
||||
... sql/ Database creation scripts
|
||||
|
||||
|
||||
3. Requirements
|
||||
|
||||
In order to run Legacy Worlds, you will need the following software:
|
||||
|
||||
* Apache + PHP 5.2
|
||||
* (optional) a PHP opcode cache
|
||||
* PostgreSQL 8.3 or higher
|
||||
* the POVRay raytracer (used for planet generation)
|
||||
|
||||
|
||||
4. Installing and running LWB5
|
||||
|
||||
These instructions may be erroneous on some points, as I didn't bother to try
|
||||
and re-install it myself.
|
||||
|
||||
* Set the database users' passwords in sql/00-init.sql
|
||||
|
||||
* (optional) Modify sql/30-beta5.sql to select the games that will be created
|
||||
on initialisation.
|
||||
|
||||
* Create the database by running sql/INSTALL.sql
|
||||
|
||||
* Create an administrative user in the main.account table
|
||||
|
||||
* Create some system users for the various parts of the LWB5 backend:
|
||||
** user "lwbot"; when su'd to, this user should start the IRC bot,
|
||||
** user "lwticks"; when su'd to, this user should start scripts/ticks.php
|
||||
** user "lwproxy"; when su'd to, this user should start scripts/proxycheck.php
|
||||
|
||||
* In addition to the above users, the planet picture generator should run with
|
||||
privileges allowing it to write to subdirectories of site/static/beta5/pics/pl/
|
||||
|
||||
* Modify scripts/config.inc and scripts/legacyworlds.xml
|
||||
** Also modify ircbot/bot.conf to have the bot connect to a server
|
||||
|
||||
* Set up the web server:
|
||||
** the main site should use the site/ directory,
|
||||
** the administration interface should use the admin/ directory; it should be
|
||||
protected using HTTP authentication.
|
||||
|
||||
Once the installation is complete, it is possible to start (most of) the game
|
||||
by running scripts/control.pl with the --start command line argument. However,
|
||||
the planet generator script has to be started manually.
|
||||
|
||||
|
||||
5. The misc/ subdirectory
|
||||
|
||||
The misc/ subdirectory contains two things:
|
||||
* the source code of the MacOS dashboard widget,
|
||||
* the "forums branch" patch.
|
||||
|
||||
The forums branch patch has been created by doing a very quick and dirty merge
|
||||
of an old development branch that was mostly abandoned; it contains some
|
||||
improvements on the core library - notably a class to prepare database queries
|
||||
and some other improvements in the DB query API. Of course, it also includes an
|
||||
incomplete rewrite of the in-game forums.
|
||||
|
||||
Because I had to merge the branches to generate the patch, and because I didn't
|
||||
bother with testing it, the patch is likely to break a lot of things. However
|
||||
it may be a good starting point for improving the LWB5 code. See the TODO file
|
||||
for more information.
|
47
TODO
Normal file
47
TODO
Normal file
|
@ -0,0 +1,47 @@
|
|||
This file lists stuff that could be done to improve the current LWB5 source
|
||||
code. It's mostly stuff that I had the intention of doing at some point but
|
||||
didn't have the time to work on or finish. Of course, this is just a list of
|
||||
ideas - feel free to ignore it altogether.
|
||||
|
||||
|
||||
Back-end clean up:
|
||||
|
||||
* A lot of the game and site functions use older APIs that are deprecated.
|
||||
** Calls to gameAction()
|
||||
** Calls to logText()
|
||||
** There's more, but I can't remember...
|
||||
|
||||
* Some of the improvements to the core library found in the forums branch
|
||||
patch should be included - most importantly the SQL query stuff. Of course
|
||||
this also implies modifying a lot of the code that actually uses SQL queries.
|
||||
|
||||
* While some of it has been removed, there is still a lot of SQL in the
|
||||
various web handlers; it should be moved to the library.
|
||||
|
||||
* Internal messages are sent by inserting into the database directly in many
|
||||
of the game's functions; this should be changed as there is an API for that.
|
||||
|
||||
|
||||
Front-end clean up:
|
||||
|
||||
* When LWB5 was first written, I hadn't planned on using that much JavaScript.
|
||||
In addition, JS libraries were not as common then as they are now. Therefore
|
||||
most of the JS code is a terrible, ugly heap of spaghetti code and copy pasta.
|
||||
It should be rewritten.
|
||||
|
||||
|
||||
Improvements and missing features:
|
||||
|
||||
* Finishing the forums rewrite (started in the forums branch patch).
|
||||
|
||||
* Rewrite fleet handling - the database structure is brain dead, normalisation
|
||||
is clearly required, and it'd reduce the various checks performed wherever
|
||||
fleets are accessed.
|
||||
|
||||
* Fleet trajectory is buggy, it contains a relatively easily exploitable bug.
|
||||
Needs redesign.
|
||||
|
||||
* Probes never made it into the final version.
|
||||
|
||||
* The IRC bot's source code should be upgraded to the latest version of
|
||||
PHP-IRC.
|
20
admin/as_log.inc
Normal file
20
admin/as_log.inc
Normal file
|
@ -0,0 +1,20 @@
|
|||
<?php
|
||||
|
||||
/** This function writes an entry to the system log. */
|
||||
function __logAdmin($txt, $level = null) {
|
||||
static $logInit = false;
|
||||
if (!$logInit) {
|
||||
global $__logPrefix;
|
||||
|
||||
define_syslog_variables();
|
||||
openlog("lwControl", LOG_PID, LOG_USER);
|
||||
$logInit = true;
|
||||
}
|
||||
if (is_null($level)) {
|
||||
$level = LOG_INFO;
|
||||
}
|
||||
syslog($level, "*** ADMIN {$_SERVER['PHP_AUTH_USER']} $txt");
|
||||
}
|
||||
|
||||
|
||||
?>
|
24
admin/as_manager.inc
Normal file
24
admin/as_manager.inc
Normal file
|
@ -0,0 +1,24 @@
|
|||
<?php
|
||||
|
||||
function __isManagerRunning() {
|
||||
global $aConfig;
|
||||
|
||||
$fName = $aConfig['ctrlPath'] . "/tickManager.pid";
|
||||
if (!file_exists($fName)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$file = fopen($fName, "r");
|
||||
$line = rtrim(fgets($file));
|
||||
fclose($file);
|
||||
|
||||
list($pid, $time) = explode(" ", $line);
|
||||
if (time() - $time > 22) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return $pid;
|
||||
}
|
||||
|
||||
|
||||
?>
|
80
admin/bot.php
Normal file
80
admin/bot.php
Normal file
|
@ -0,0 +1,80 @@
|
|||
<?php
|
||||
|
||||
set_magic_quotes_runtime(false);
|
||||
|
||||
include('config.inc');
|
||||
include('../scripts/config.inc');
|
||||
include('as_manager.inc');
|
||||
include('as_log.inc');
|
||||
|
||||
function redirect() {
|
||||
?>
|
||||
<html>
|
||||
<head>
|
||||
<title>LegacyWorlds Beta 5 > Administration > IRC bot</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1><a href="index.html">LWB5 > Administration</a> > IRC bot</h1>
|
||||
<h2>Operation in progress...</h2>
|
||||
<p>
|
||||
A system operation is in progress. Please wait, the page will update in a few seconds.
|
||||
</p>
|
||||
<script language="JavaScript">
|
||||
window.setTimeout('window.location="bot.php"', 1000);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
<?php
|
||||
exit(0);
|
||||
}
|
||||
|
||||
function sendCommand($cmd) {
|
||||
global $aConfig;
|
||||
|
||||
$fName = $aConfig['ctrlFifo'];
|
||||
if (!file_exists($fName)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$fifo = fopen($fName, "w");
|
||||
fwrite($fifo, "$cmd\n");
|
||||
fclose($fifo);
|
||||
redirect();
|
||||
}
|
||||
|
||||
|
||||
if ($_GET['c'] == 'kb') {
|
||||
__logAdmin("is stopping the IRC bot");
|
||||
sendCommand("BOTOFF");
|
||||
} elseif ($_GET['c'] == 'sb') {
|
||||
__logAdmin("is starting the IRC bot");
|
||||
sendCommand("BOTON");
|
||||
}
|
||||
|
||||
$running = file_exists($config['cs_path'] . "/ircbot.pid");
|
||||
|
||||
?>
|
||||
<html>
|
||||
<head>
|
||||
<title>LegacyWorlds Beta 5 > Administration > IRC bot</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1><a href="index.html">LWB5 > Administration</a> > IRC bot</h1>
|
||||
<?php
|
||||
|
||||
if ($running) {
|
||||
?>
|
||||
<p>
|
||||
IRC bot is (probably) running. <a href="?c=kb">Kill bot</a>
|
||||
</p>
|
||||
<?php
|
||||
} else {
|
||||
?>
|
||||
<p>
|
||||
IRC bot is not running. <a href="?c=sb">Start bot</a>
|
||||
</p>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
</body>
|
||||
</html>
|
56
admin/cg_done.php
Normal file
56
admin/cg_done.php
Normal file
|
@ -0,0 +1,56 @@
|
|||
<?php
|
||||
|
||||
set_magic_quotes_runtime(false);
|
||||
|
||||
session_start();
|
||||
|
||||
?>
|
||||
<html>
|
||||
<head>
|
||||
<title>Legacy Worlds Beta 5 > Administration > Create game</title>
|
||||
</head>
|
||||
<body style="background-color: #dfdfff">
|
||||
<table style="margin: 50px 0; padding: 0px;width:100%" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td width="33%"> </td>
|
||||
<td width="34%"><table style="border: 4px solid blue; background-color:white; padding: 5px;width: 100%">
|
||||
<tr>
|
||||
<td colspan="3" style="padding: 2px 0px;font-size:150%;color:blue;text-align:center">LegacyWorlds Beta 5</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="3" style="padding: 2px 0px;font-size:150%;color:red;text-align:center"><?=$_SESSION['lw_new_game']['name']?></td>
|
||||
</tr>
|
||||
<tr><td colspan="3" style="height:5px;font-size:1pt"> </td></tr>
|
||||
<tr><td colspan="3" style="padding: 2px 0px;color:#3f3fff;text-align:center">Game creation complete!</td></tr>
|
||||
<tr>
|
||||
<td style="width:10%"> </td>
|
||||
<td><table style="border: 1px solid black; padding: 1px; margin: 0px; width: 100%; height: 16px"><tr>
|
||||
<td style='font-size:1pt;background-color:#00007f'> </td>
|
||||
</tr></table></td>
|
||||
<td style="width:10%"> </td>
|
||||
</tr>
|
||||
<tr><td colspan="3" style="padding: 2px 0px;color:#ff3f3f;text-align:center">100% complete</td></tr>
|
||||
<tr><td colspan="3"> </td></tr>
|
||||
</table></td>
|
||||
<td width="33%"> </td>
|
||||
<tr><td colspan="3"> </td></tr>
|
||||
<tr>
|
||||
<td> </td>
|
||||
<td style="text-align:center">
|
||||
The new game has been created; however, it is not visible from the interface yet, you will have to
|
||||
<a href="game_status.php">make it visible</a><br/>
|
||||
<br/>
|
||||
The server is still in <a href="maintenance.php">maintenance mode</a>, you will have to disable it manually.<br/>
|
||||
<br/>
|
||||
<a href="index.html">Main admin page</a>
|
||||
</td>
|
||||
<td> </td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
<?php
|
||||
|
||||
$_SESSION['lw_new_game']['started'] = false;
|
||||
|
||||
?>
|
45
admin/cg_operation.inc
Normal file
45
admin/cg_operation.inc
Normal file
|
@ -0,0 +1,45 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>Legacy Worlds Beta 5 > Administration > Create game</title>
|
||||
</head>
|
||||
<body style="background-color: #ffdfdf">
|
||||
<table style="margin: 50px 0; padding: 0px;width:100%" cellspacing="0" cellpadding="0">
|
||||
<tr>
|
||||
<td width="33%"> </td>
|
||||
<td width="34%"><table style="border: 4px solid red; background-color:white; padding: 5px;width: 100%">
|
||||
<tr>
|
||||
<td colspan="3" style="padding: 2px 0px;font-size:150%;color:red;text-align:center">LegacyWorlds Beta 5</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="3" style="padding: 2px 0px;font-size:150%;color:red;text-align:center">Game creation in progress</td>
|
||||
</tr>
|
||||
<tr><td colspan="3" style="height:5px;font-size:1pt"> </td></tr>
|
||||
<tr><td colspan="3" style="padding: 2px 0px;color:#ff3f3f;text-align:center"><?=$op['text']?></td></tr>
|
||||
<tr>
|
||||
<td style="width:10%"> </td>
|
||||
<td><table style="border: 1px solid black; padding: 1px; margin: 0px; width: 100%; height: 16px"><tr>
|
||||
<?php
|
||||
|
||||
if ($op['pc'] == 0) {
|
||||
print "<td style='font-size:1pt'> </td>";
|
||||
} elseif ($op['pc'] == 100) {
|
||||
print "<td style='font-size:1pt;background-color:#7f0000'> </td>";
|
||||
} else {
|
||||
print "<td style='font-size:1pt;background-color:#7f0000;width:" . $op['pc'] . "%'> </td>"
|
||||
. "<td style='font-size:1pt'> </td>";
|
||||
}
|
||||
|
||||
?>
|
||||
</tr></table></td>
|
||||
<td style="width:10%"> </td>
|
||||
</tr>
|
||||
<tr><td colspan="3" style="padding: 2px 0px;color:#ff3f3f;text-align:center"><?=$op['pc']?>% complete</td></tr>
|
||||
<tr><td colspan="3"> </td></tr>
|
||||
</table></td>
|
||||
<td width="33%"> </td>
|
||||
</table>
|
||||
<script language="JavaScript">
|
||||
window.setTimeout('window.location="<?=$op['to']?>"', <?=$op['delay']*1000?>);
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
24
admin/cg_step0.php
Normal file
24
admin/cg_step0.php
Normal file
|
@ -0,0 +1,24 @@
|
|||
<?php
|
||||
|
||||
set_magic_quotes_runtime(false);
|
||||
|
||||
session_start();
|
||||
if (!is_array($_SESSION['lw_new_game']) || !$_SESSION['lw_new_game']['do_it_now'] || $_SESSION['lw_new_game']['started']) {
|
||||
echo "Sorry, can't do that.";
|
||||
exit(0);
|
||||
}
|
||||
$_SESSION['lw_new_game']['started'] = true;
|
||||
|
||||
include("as_log.inc");
|
||||
__logAdmin("is creating game {$_SESSION['lw_new_game']['name']}");
|
||||
|
||||
$op = array(
|
||||
"pc" => 0,
|
||||
"text" => "Initialising ...",
|
||||
"delay" => 1,
|
||||
"to" => "cg_step1.php"
|
||||
);
|
||||
|
||||
include('cg_operation.inc');
|
||||
|
||||
?>
|
30
admin/cg_step1.php
Normal file
30
admin/cg_step1.php
Normal file
|
@ -0,0 +1,30 @@
|
|||
<?php
|
||||
|
||||
set_magic_quotes_runtime(false);
|
||||
|
||||
session_start();
|
||||
if (!is_array($_SESSION['lw_new_game']) || !$_SESSION['lw_new_game']['do_it_now'] || !$_SESSION['lw_new_game']['started']) {
|
||||
echo "Sorry, can't do that.";
|
||||
exit(0);
|
||||
}
|
||||
$_SESSION['lw_new_game']['started'] = true;
|
||||
|
||||
include("../scripts/config.inc");
|
||||
if (is_null($config['maintenance'])) {
|
||||
$text = "Enabling maintenance mode";
|
||||
$next = "cg_step2.php";
|
||||
} else {
|
||||
$text = "Checking existing IDs";
|
||||
$next = "cg_step4.php";
|
||||
}
|
||||
|
||||
$op = array(
|
||||
"pc" => 5,
|
||||
"text" => $text,
|
||||
"delay" => 1,
|
||||
"to" => $next
|
||||
);
|
||||
|
||||
include('cg_operation.inc');
|
||||
|
||||
?>
|
28
admin/cg_step10.php
Normal file
28
admin/cg_step10.php
Normal file
|
@ -0,0 +1,28 @@
|
|||
<?php
|
||||
|
||||
set_magic_quotes_runtime(false);
|
||||
|
||||
session_start();
|
||||
if (!is_array($_SESSION['lw_new_game']) || !$_SESSION['lw_new_game']['do_it_now'] || !$_SESSION['lw_new_game']['started']) {
|
||||
echo "Sorry, can't do that.";
|
||||
exit(0);
|
||||
}
|
||||
|
||||
|
||||
/* Execute an universe tick manually */
|
||||
$ns = $_SESSION['lw_new_game']['found_id'];
|
||||
$__runFromAdmin = true;
|
||||
$__adminParams = array($ns, 'universe');
|
||||
include("../scripts/ticks.php");
|
||||
|
||||
|
||||
$op = array(
|
||||
"pc" => 85,
|
||||
"text" => "Adding silent admins",
|
||||
"delay" => 1,
|
||||
"to" => "cg_step11.php"
|
||||
);
|
||||
|
||||
include('cg_operation.inc');
|
||||
|
||||
?>
|
60
admin/cg_step11.php
Normal file
60
admin/cg_step11.php
Normal file
|
@ -0,0 +1,60 @@
|
|||
<?php
|
||||
|
||||
set_magic_quotes_runtime(false);
|
||||
|
||||
session_start();
|
||||
if (!is_array($_SESSION['lw_new_game']) || !$_SESSION['lw_new_game']['do_it_now'] || !$_SESSION['lw_new_game']['started']) {
|
||||
echo "Sorry, can't do that.";
|
||||
exit(0);
|
||||
}
|
||||
|
||||
|
||||
include("config.inc");
|
||||
include('as_manager.inc');
|
||||
|
||||
/* Insert "silent admins" into the new game's player table */
|
||||
$cnx = __dbConnect();
|
||||
if (!$cnx) {
|
||||
$argh = "Could not connect to the database";
|
||||
} else {
|
||||
$ns = $_SESSION['lw_new_game']['found_id'];
|
||||
$error = false;
|
||||
foreach ($_SESSION['lw_new_game']['silent'] as $aId) {
|
||||
if (!pg_query($cnx, "INSERT INTO \"{$ns}\".player (userid, first_planet, hidden) VALUES ($aId, 1, TRUE)")) {
|
||||
$error = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if ($error) {
|
||||
$argh = "Failed to insert silent admin data";
|
||||
} else {
|
||||
$argh = null;
|
||||
}
|
||||
pg_close($cnx);
|
||||
}
|
||||
|
||||
if (!is_null($argh)) {
|
||||
include('cg_argh.inc');
|
||||
exit(0);
|
||||
}
|
||||
|
||||
|
||||
if (__isManagerRunning()) {
|
||||
$op = array(
|
||||
"pc" => 90,
|
||||
"text" => "Restarting ticks",
|
||||
"delay" => 1,
|
||||
"to" => "cg_step12.php"
|
||||
);
|
||||
} else {
|
||||
$op = array(
|
||||
"pc" => 100,
|
||||
"text" => "Cleaning up",
|
||||
"delay" => 1,
|
||||
"to" => "cg_done.php"
|
||||
);
|
||||
}
|
||||
|
||||
include('cg_operation.inc');
|
||||
|
||||
?>
|
35
admin/cg_step12.php
Normal file
35
admin/cg_step12.php
Normal file
|
@ -0,0 +1,35 @@
|
|||
<?php
|
||||
|
||||
set_magic_quotes_runtime(false);
|
||||
|
||||
session_start();
|
||||
if (!is_array($_SESSION['lw_new_game']) || !$_SESSION['lw_new_game']['do_it_now'] || !$_SESSION['lw_new_game']['started']) {
|
||||
echo "Sorry, can't do that.";
|
||||
exit(0);
|
||||
}
|
||||
|
||||
include("config.inc");
|
||||
include("as_manager.inc");
|
||||
include("../scripts/config.inc");
|
||||
|
||||
if (!__isManagerRunning() || !file_exists($config['cachedir'] . "/ticks_stopped")) {
|
||||
$op = array(
|
||||
"pc" => 100,
|
||||
"text" => "Cleaning up",
|
||||
"delay" => 1,
|
||||
"to" => "cg_done.php"
|
||||
);
|
||||
} else {
|
||||
touch($config['cachedir'] . "/start_ticks");
|
||||
|
||||
$op = array(
|
||||
"pc" => 95,
|
||||
"text" => "Waiting for ticks to restart",
|
||||
"delay" => 1,
|
||||
"to" => "cg_step13.php"
|
||||
);
|
||||
}
|
||||
|
||||
include('cg_operation.inc');
|
||||
|
||||
?>
|
33
admin/cg_step13.php
Normal file
33
admin/cg_step13.php
Normal file
|
@ -0,0 +1,33 @@
|
|||
<?php
|
||||
|
||||
set_magic_quotes_runtime(false);
|
||||
|
||||
session_start();
|
||||
if (!is_array($_SESSION['lw_new_game']) || !$_SESSION['lw_new_game']['do_it_now'] || !$_SESSION['lw_new_game']['started']) {
|
||||
echo "Sorry, can't do that.";
|
||||
exit(0);
|
||||
}
|
||||
|
||||
include("config.inc");
|
||||
include("as_manager.inc");
|
||||
include("../scripts/config.inc");
|
||||
|
||||
if (__isManagerRunning() && file_exists($config['cachedir'] . "/ticks_stopped")) {
|
||||
$op = array(
|
||||
"pc" => 95,
|
||||
"text" => "Waiting for ticks to restart",
|
||||
"delay" => 1,
|
||||
"to" => "cg_step13.php"
|
||||
);
|
||||
} else {
|
||||
$op = array(
|
||||
"pc" => 100,
|
||||
"text" => "Cleaning up",
|
||||
"delay" => 1,
|
||||
"to" => "cg_done.php"
|
||||
);
|
||||
}
|
||||
|
||||
include('cg_operation.inc');
|
||||
|
||||
?>
|
31
admin/cg_step2.php
Normal file
31
admin/cg_step2.php
Normal file
|
@ -0,0 +1,31 @@
|
|||
<?php
|
||||
|
||||
set_magic_quotes_runtime(false);
|
||||
|
||||
session_start();
|
||||
if (!is_array($_SESSION['lw_new_game']) || !$_SESSION['lw_new_game']['do_it_now'] || !$_SESSION['lw_new_game']['started']) {
|
||||
echo "Sorry, can't do that.";
|
||||
exit(0);
|
||||
}
|
||||
|
||||
$maintenance = array(
|
||||
"until" => time() + 15 * 60,
|
||||
"reason" => "Creating game " . $_SESSION['lw_new_game']['name']
|
||||
);
|
||||
|
||||
include("../scripts/config.inc");
|
||||
$f = fopen($config['cachedir'] . '/maintenance.ser', "w");
|
||||
fwrite($f, serialize($maintenance));
|
||||
fclose($f);
|
||||
|
||||
$_SESSION['lw_new_game']['menable'] = time();
|
||||
$op = array(
|
||||
"pc" => 10,
|
||||
"text" => "Waiting ...",
|
||||
"delay" => 1,
|
||||
"to" => "cg_step3.php"
|
||||
);
|
||||
|
||||
include('cg_operation.inc');
|
||||
|
||||
?>
|
29
admin/cg_step3.php
Normal file
29
admin/cg_step3.php
Normal file
|
@ -0,0 +1,29 @@
|
|||
<?php
|
||||
|
||||
set_magic_quotes_runtime(false);
|
||||
|
||||
session_start();
|
||||
if (!is_array($_SESSION['lw_new_game']) || !$_SESSION['lw_new_game']['do_it_now'] || !$_SESSION['lw_new_game']['started']) {
|
||||
echo "Sorry, can't do that.";
|
||||
exit(0);
|
||||
}
|
||||
|
||||
$t = time() - $_SESSION['lw_new_game']['menable'];
|
||||
if ($t < 20) {
|
||||
$text = "Waiting ...";
|
||||
$next = "cg_step3.php";
|
||||
} else {
|
||||
$text = "Checking existing IDs";
|
||||
$next = "cg_step4.php";
|
||||
}
|
||||
|
||||
$op = array(
|
||||
"pc" => 10 + floor($t/2),
|
||||
"text" => $text,
|
||||
"delay" => 1,
|
||||
"to" => $next
|
||||
);
|
||||
|
||||
include('cg_operation.inc');
|
||||
|
||||
?>
|
41
admin/cg_step4.php
Normal file
41
admin/cg_step4.php
Normal file
|
@ -0,0 +1,41 @@
|
|||
<?php
|
||||
|
||||
set_magic_quotes_runtime(false);
|
||||
|
||||
session_start();
|
||||
if (!is_array($_SESSION['lw_new_game']) || !$_SESSION['lw_new_game']['do_it_now'] || !$_SESSION['lw_new_game']['started']) {
|
||||
echo "Sorry, can't do that.";
|
||||
exit(0);
|
||||
}
|
||||
|
||||
include("config.inc");
|
||||
$cnx = __dbConnect();
|
||||
|
||||
$minId = 1;
|
||||
$gameType = "b5" . ($_SESSION['lw_new_game']['game_type'] == 'r' ? 'r' : 'm');
|
||||
|
||||
do {
|
||||
$minId ++;
|
||||
$q = pg_query($cnx, "SELECT nspname FROM pg_namespace WHERE nspname='{$gameType}{$minId}'");
|
||||
} while ($q && pg_num_rows($q) == 1);
|
||||
pg_close($cnx);
|
||||
|
||||
if (!$q) {
|
||||
$argh = "Error while accessing the database";
|
||||
include('cg_argh.inc');
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
$_SESSION['lw_new_game']['found_id'] = $gameType . $minId;
|
||||
|
||||
$op = array(
|
||||
"pc" => 25,
|
||||
"text" => "Inserting data for ID $gameType$minId",
|
||||
"delay" => 1,
|
||||
"to" => "cg_step5.php"
|
||||
);
|
||||
|
||||
include('cg_operation.inc');
|
||||
|
||||
?>
|
205
admin/cg_step5.php
Normal file
205
admin/cg_step5.php
Normal file
|
@ -0,0 +1,205 @@
|
|||
<?php
|
||||
|
||||
set_magic_quotes_runtime(false);
|
||||
|
||||
session_start();
|
||||
if (!is_array($_SESSION['lw_new_game']) || !$_SESSION['lw_new_game']['do_it_now'] || !$_SESSION['lw_new_game']['started']) {
|
||||
echo "Sorry, can't do that.";
|
||||
exit(0);
|
||||
}
|
||||
|
||||
include("config.inc");
|
||||
include("as_manager.inc");
|
||||
|
||||
class dbParser {
|
||||
|
||||
static private $instructions = array();
|
||||
static private $aConnection;
|
||||
static private $uConnection;
|
||||
static private $cConnection = null;
|
||||
|
||||
static public function parse($contents) {
|
||||
$all = explode("\n", $contents);
|
||||
$state = 0;
|
||||
|
||||
foreach ($all as $line) {
|
||||
// print "PARSING LINE: $line<br/>\n";
|
||||
if ($state == 0) {
|
||||
// Remove comments
|
||||
$line = preg_replace('/\s*--.*$/', '', $line);
|
||||
if ($line == '') {
|
||||
continue;
|
||||
}
|
||||
|
||||
// \c ?
|
||||
if (preg_match('/^\\\\c\s+[^\s]+\s([^\s]+)\s*$/', $line, $match)) {
|
||||
if ($match[1] == "legacyworlds_admin") {
|
||||
//echo "<b>CONNECT AS ADMIN</b><br/>";
|
||||
array_push(self::$instructions, array("CADM"));
|
||||
} else {
|
||||
//echo "<b>CONNECT AS USER</b><br/>";
|
||||
array_push(self::$instructions, array("CUSR"));
|
||||
}
|
||||
}
|
||||
// \i ?
|
||||
elseif (preg_match('/^\\\\i\s+([^\s]+)\s*$/', $line, $match)) {
|
||||
self::parseFile($match[1]);
|
||||
}
|
||||
// COPY table FROM STDIN ?
|
||||
elseif (preg_match('/^COPY\s+([^\s]+)\s+FROM\s+STDIN\s*;\s*$/i', $line, $match)) {
|
||||
//echo "<b>COPY DATA</b> INTO {$match[1]}: ";
|
||||
array_push(self::$instructions, array("COPY", $match[1]));
|
||||
$state = 1;
|
||||
$copyArray = array();
|
||||
}
|
||||
// Other commands
|
||||
else {
|
||||
$rv = self::parseCommand($line);
|
||||
if ($rv[0]) {
|
||||
//echo "<b>EXECUTE QUERY</b> " . htmlentities($rv[1]) . "<br/>\n";
|
||||
array_push(self::$instructions, array("QUERY", $rv[1]));
|
||||
} else {
|
||||
$buffer = $rv[1];
|
||||
$state = 2;
|
||||
}
|
||||
}
|
||||
} elseif ($state == 1) {
|
||||
if ($line == "\\.") {
|
||||
//echo count($copyArray) . " LINE(S) OF DATA<br/>\n";
|
||||
self::$instructions[count(self::$instructions) - 1][2] = $copyArray;
|
||||
$state = 0;
|
||||
} else {
|
||||
array_push($copyArray, "$line\n");
|
||||
}
|
||||
} elseif ($state == 2) {
|
||||
$rv = self::parseCommand($line, $buffer);
|
||||
if ($rv[0]) {
|
||||
//echo "<b>EXECUTE QUERY</b> " . htmlentities($rv[1]) . "<br/>\n";
|
||||
array_push(self::$instructions, array("QUERY", $rv[1]));
|
||||
$state = 0;
|
||||
} else {
|
||||
$buffer = $rv[1];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static function parseFile($fileName) {
|
||||
$file = fopen("../sql/$fileName", "r");
|
||||
$text = "";
|
||||
while (($line = fgets($file)) !== FALSE) {
|
||||
$text .= $line;
|
||||
}
|
||||
fclose($file);
|
||||
self::parse($text);
|
||||
}
|
||||
|
||||
private static function parseCommand($line, $buffer = "") {
|
||||
$state = 0;
|
||||
for ($i = 0; $i < strlen($line); $i ++) {
|
||||
if ($state == 0) {
|
||||
if ($line{$i} == ';') {
|
||||
return array(true, $buffer);
|
||||
}
|
||||
$buffer .= $line{$i};
|
||||
if ($line{$i} == "'") {
|
||||
$state = 1;
|
||||
}
|
||||
} else {
|
||||
$buffer .= $line{$i};
|
||||
if ($line{$i} == "'") {
|
||||
$state = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
return array(false, "$buffer ");
|
||||
}
|
||||
|
||||
public static function connect() {
|
||||
self::$uConnection = __dbConnect(false);
|
||||
if (!self::$uConnection) {
|
||||
$argh = "Error while accessing the database in user mode";
|
||||
include('cg_argh.inc');
|
||||
exit(1);
|
||||
}
|
||||
|
||||
self::$aConnection = __dbConnect(true);
|
||||
if (!self::$aConnection) {
|
||||
$argh = "Error while accessing the database in admin mode";
|
||||
include('cg_argh.inc');
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
public static function execute($schema) {
|
||||
foreach (self::$instructions as $instr) {
|
||||
$iType = array_shift($instr);
|
||||
|
||||
if ($iType == 'CADM') {
|
||||
self::setConnection(self::$aConnection);
|
||||
} elseif ($iType == 'CUSR') {
|
||||
self::setConnection(self::$aConnection);
|
||||
} elseif ($iType == 'QUERY') {
|
||||
if (!pg_query(self::$cConnection, $instr[0])) {
|
||||
$argh = "Could not execute query {$instr[0]}";
|
||||
pg_query(self::$aConnection, "DROP SCHEMA \"$schema\" CASCADE");
|
||||
include('cg_argh.inc');
|
||||
exit(1);
|
||||
}
|
||||
} elseif ($iType == 'COPY') {
|
||||
if (!pg_copy_from(self::$cConnection, $instr[0], $instr[1])) {
|
||||
$argh = "Copy failed for table {$instr[0]}";
|
||||
pg_query(self::$aConnection, "DROP SCHEMA \"$schema\" CASCADE");
|
||||
include('cg_argh.inc');
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static function setConnection($cnx) {
|
||||
self::$cConnection = $cnx;
|
||||
}
|
||||
}
|
||||
|
||||
$gtData = array(
|
||||
"r" => array('round', 'r'),
|
||||
"m" => array('match', 'm'),
|
||||
"c" => array('ctf', 'm'),
|
||||
);
|
||||
$gData = $gtData[$_SESSION['lw_new_game']['game_type']];
|
||||
|
||||
$substStr = "b5" . $gData[1] . "X";
|
||||
|
||||
// Load base match script
|
||||
$fileName = "../sql/beta5/beta5-" . $gData[0] . ".sql";
|
||||
$baseFile = fopen($fileName, "r");
|
||||
$base = "";
|
||||
while (($line = fgets($baseFile)) !== FALSE) {
|
||||
$base .= preg_replace("/$substStr/", $_SESSION['lw_new_game']['found_id'], $line);
|
||||
}
|
||||
fclose($baseFile);
|
||||
|
||||
dbParser::parse($base);
|
||||
dbParser::connect();
|
||||
dbParser::execute($_SESSION['lw_new_game']['found_id']);
|
||||
|
||||
if (__isManagerRunning()) {
|
||||
$op = array(
|
||||
"pc" => 50,
|
||||
"text" => "Stopping all ticks",
|
||||
"delay" => 1,
|
||||
"to" => "cg_step6.php"
|
||||
);
|
||||
} else {
|
||||
$op = array(
|
||||
"pc" => 60,
|
||||
"text" => "Generating configuration",
|
||||
"delay" => 1,
|
||||
"to" => "cg_step8.php"
|
||||
);
|
||||
}
|
||||
|
||||
include('cg_operation.inc');
|
||||
|
||||
?>
|
35
admin/cg_step6.php
Normal file
35
admin/cg_step6.php
Normal file
|
@ -0,0 +1,35 @@
|
|||
<?php
|
||||
|
||||
set_magic_quotes_runtime(false);
|
||||
|
||||
session_start();
|
||||
if (!is_array($_SESSION['lw_new_game']) || !$_SESSION['lw_new_game']['do_it_now'] || !$_SESSION['lw_new_game']['started']) {
|
||||
echo "Sorry, can't do that.";
|
||||
exit(0);
|
||||
}
|
||||
|
||||
include("config.inc");
|
||||
include("as_manager.inc");
|
||||
include("../scripts/config.inc");
|
||||
|
||||
if (!__isManagerRunning() || file_exists($config['cachedir'] . "/ticks_stopped")) {
|
||||
$op = array(
|
||||
"pc" => 60,
|
||||
"text" => "Generating configuration",
|
||||
"delay" => 1,
|
||||
"to" => "cg_step8.php"
|
||||
);
|
||||
} else {
|
||||
touch($config['cachedir'] . "/stop_ticks");
|
||||
|
||||
$op = array(
|
||||
"pc" => 55,
|
||||
"text" => "Waiting for ticks to stop",
|
||||
"delay" => 1,
|
||||
"to" => "cg_step7.php"
|
||||
);
|
||||
}
|
||||
|
||||
include('cg_operation.inc');
|
||||
|
||||
?>
|
33
admin/cg_step7.php
Normal file
33
admin/cg_step7.php
Normal file
|
@ -0,0 +1,33 @@
|
|||
<?php
|
||||
|
||||
set_magic_quotes_runtime(false);
|
||||
|
||||
session_start();
|
||||
if (!is_array($_SESSION['lw_new_game']) || !$_SESSION['lw_new_game']['do_it_now'] || !$_SESSION['lw_new_game']['started']) {
|
||||
echo "Sorry, can't do that.";
|
||||
exit(0);
|
||||
}
|
||||
|
||||
include("config.inc");
|
||||
include("as_manager.inc");
|
||||
include("../scripts/config.inc");
|
||||
|
||||
if (__isManagerRunning() && !file_exists($config['cachedir'] . "/ticks_stopped")) {
|
||||
$op = array(
|
||||
"pc" => 55,
|
||||
"text" => "Waiting for ticks to stop",
|
||||
"delay" => 1,
|
||||
"to" => "cg_step7.php"
|
||||
);
|
||||
} else {
|
||||
$op = array(
|
||||
"pc" => 60,
|
||||
"text" => "Generating configuration",
|
||||
"delay" => 1,
|
||||
"to" => "cg_step8.php"
|
||||
);
|
||||
}
|
||||
|
||||
include('cg_operation.inc');
|
||||
|
||||
?>
|
109
admin/cg_step8.php
Normal file
109
admin/cg_step8.php
Normal file
|
@ -0,0 +1,109 @@
|
|||
<?php
|
||||
|
||||
set_magic_quotes_runtime(false);
|
||||
|
||||
session_start();
|
||||
if (!is_array($_SESSION['lw_new_game']) || !$_SESSION['lw_new_game']['do_it_now'] || !$_SESSION['lw_new_game']['started']) {
|
||||
echo "Sorry, can't do that.";
|
||||
exit(0);
|
||||
}
|
||||
|
||||
require_once("config.inc");
|
||||
|
||||
function makeCTFParams() {
|
||||
$cnx = __dbConnect();
|
||||
if (!$cnx) {
|
||||
print "<b>DATABASE CONNECTION ERROR</b>";
|
||||
exit(1);
|
||||
}
|
||||
$query = pg_query("SELECT * FROM main.ctf_map_def ORDER BY name");
|
||||
if (!$query) {
|
||||
print "<b>DATABASE ERROR</b>";
|
||||
exit(1);
|
||||
}
|
||||
|
||||
$ctfMaps = array();
|
||||
while ($r = pg_fetch_assoc($query)) {
|
||||
$ctfMaps[$r['id']] = $r;
|
||||
$query2 = pg_query("SELECT COUNT(*) FROM main.ctf_map_layout WHERE map={$r['id']} AND spawn_here");
|
||||
if (!$query2) {
|
||||
print "<b>DATABASE ERROR</b>";
|
||||
exit(1);
|
||||
}
|
||||
list($ctfMaps[$r['id']]['players']) = pg_fetch_array($query2);
|
||||
pg_free_result($query2);
|
||||
}
|
||||
pg_free_result($query);
|
||||
pg_close($cnx);
|
||||
|
||||
$map = $ctfMaps[$_SESSION['lw_new_game']['ctfmap']];
|
||||
$cParams = $_SESSION['lw_new_game']['ctfparams'];
|
||||
|
||||
$params = array(
|
||||
'usemap' => $map['id'],
|
||||
'maxplayers' => $map['players'],
|
||||
'norealloc' => 1,
|
||||
'partialtechs' => 0,
|
||||
'lockalliances' => $map['alliances'],
|
||||
'alliancecap' => 0,
|
||||
'victory' => 2,
|
||||
'novacation' => 1
|
||||
);
|
||||
|
||||
foreach ($cParams as $p => $v) {
|
||||
$params[$p] = $v;
|
||||
}
|
||||
|
||||
return $params;
|
||||
}
|
||||
|
||||
|
||||
$ns = $_SESSION['lw_new_game']['found_id'];
|
||||
$newConfig = "\t\t<!-- Game added automatically by the game creation tool -->\n"
|
||||
. "\t\t<Game id=\"$ns\" version=\"beta5\" namespace=\"$ns\" text=\""
|
||||
. $_SESSION['lw_new_game']['name'] . "\" public=\"0\" canjoin=\"0\">\n"
|
||||
. "\t\t\t<!-- Game parameters -->\n";
|
||||
|
||||
if ($_SESSION['lw_new_game']['game_type'] == 'c') {
|
||||
$_SESSION['lw_new_game']['params'] = makeCTFParams();
|
||||
}
|
||||
|
||||
foreach ($_SESSION['lw_new_game']['params'] as $p => $v) {
|
||||
$newConfig .= "\t\t\t<Param name=\"$p\" value=\"$v\" />\n";
|
||||
}
|
||||
$newConfig .= "\n"
|
||||
. "\t\t\t<!-- Description -->\n"
|
||||
. "\t\t\t<Description lang=\"en\">\n"
|
||||
. "\t\t\t\t" . $_SESSION['lw_new_game']['descr'] . "\n"
|
||||
. "\t\t\t</Description>\n\n"
|
||||
. "\t\t\t<!-- Ticks -->\n\n";
|
||||
|
||||
require_once("cg_ticks_schedule.inc");
|
||||
$ticks = __computeTicks($_SESSION['lw_new_game']['ft_y'],
|
||||
$_SESSION['lw_new_game']['ft_m'], $_SESSION['lw_new_game']['ft_d'],
|
||||
$_SESSION['lw_new_game']['speed'], $_SESSION['lw_new_game']['shift_ticks']);
|
||||
|
||||
foreach ($ticks as $tid => $data) {
|
||||
$time = $data[1];
|
||||
$time = ($time - ($secs = $time % 60)) / 60;
|
||||
$time = ($time - ($mins = $time % 60)) / 60;
|
||||
$newConfig .= "\t\t\t<!-- \"$tid\" tick: first tick " . gmstrftime("%H:%M:%S on %Y-%m-%d", $data[0])
|
||||
. ", interval {$time}h, {$mins}min, {$secs}s -->\n"
|
||||
. "\t\t\t<Tick script=\"$tid\" first=\"{$data[0]}\" interval=\"{$data[1]}\" />\n";
|
||||
}
|
||||
$newConfig .= "\t\t</Game>\n";
|
||||
|
||||
$file = fopen($aConfig['ctrlPath'] . "/config.$ns.xml", "w");
|
||||
fwrite($file, $newConfig);
|
||||
fclose($file);
|
||||
|
||||
$op = array(
|
||||
"pc" => 70,
|
||||
"text" => "Merging configuration",
|
||||
"delay" => 1,
|
||||
"to" => "cg_step9.php"
|
||||
);
|
||||
|
||||
include('cg_operation.inc');
|
||||
|
||||
?>
|
27
admin/cg_step9.php
Normal file
27
admin/cg_step9.php
Normal file
|
@ -0,0 +1,27 @@
|
|||
<?php
|
||||
|
||||
set_magic_quotes_runtime(false);
|
||||
|
||||
session_start();
|
||||
if (!is_array($_SESSION['lw_new_game']) || !$_SESSION['lw_new_game']['do_it_now'] || |