From: <dav...@us...> - 2007-04-20 06:13:13
|
Revision: 7200 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7200&view=rev Author: davidfancella Date: 2007-04-19 23:13:11 -0700 (Thu, 19 Apr 2007) Log Message: ----------- Removed web interface completely. It should be replaced ultimately with a ruby script. Modified Paths: -------------- armagetronad/trunk/armagetronad/config/Makefile.am armagetronad/trunk/armagetronad/config/settings_dedicated.cfg armagetronad/trunk/armagetronad/configure.ac armagetronad/trunk/armagetronad/src/Makefile.am armagetronad/trunk/armagetronad/src/thirdparty/Makefile.am armagetronad/trunk/armagetronad/src/tron/gGame.cpp Removed Paths: ------------- armagetronad/trunk/armagetronad/batch/armagetronad-password.py armagetronad/trunk/armagetronad/config/settings_web.cfg armagetronad/trunk/armagetronad/config/web_password.cfg armagetronad/trunk/armagetronad/src/thirdparty/shttpd/ armagetronad/trunk/armagetronad/src/ui/uWebinterface.cpp armagetronad/trunk/armagetronad/src/ui/uWebinterface.h Deleted: armagetronad/trunk/armagetronad/batch/armagetronad-password.py =================================================================== --- armagetronad/trunk/armagetronad/batch/armagetronad-password.py 2007-04-18 19:30:26 UTC (rev 7199) +++ armagetronad/trunk/armagetronad/batch/armagetronad-password.py 2007-04-20 06:13:11 UTC (rev 7200) @@ -1,33 +0,0 @@ -#!/usr/bin/env python - -# this program makes password files for the web server - -import md5 - -print "Armagetron Advanced Password Generator" -print - -def get_input(prompt, defaultvalue): - inputt = raw_input(prompt + " " + defaultvalue + ": ") - if len(inputt) < 1: - inputt = defaultvalue - - return inputt - -user = get_input("User", "guest") -domain = get_input("Domain", "mydomain.com") -password = get_input("Password", "guest") -passwordfile = get_input("Password file", "/etc/armagetronad-dedicated/web_password.cfg") - -passwordline = user + ":" + domain + ":" + password -passwordhash = md5.md5(passwordline).hexdigest() - -passwordlinehashed = user + ":" + domain + ":" + passwordhash - -print passwordlinehashed - -fp = open(passwordfile, "a") -fp.write(passwordlinehashed + "\n") -fp.close() - -print "Done. Don't forget to change server_name in settings_web.cfg to match the domain you just gave me!" Modified: armagetronad/trunk/armagetronad/config/Makefile.am =================================================================== --- armagetronad/trunk/armagetronad/config/Makefile.am 2007-04-18 19:30:26 UTC (rev 7199) +++ armagetronad/trunk/armagetronad/config/Makefile.am 2007-04-20 06:13:11 UTC (rev 7200) @@ -6,7 +6,6 @@ nobase_config_DATA=default.cfg master.srv settings.cfg\ settings_dedicated.cfg aiplayers.cfg rc.config\ settings_visual.cfg\ - web_password.cfg\ settings_dedicated.cfg aiplayers.cfg rc.config\ examples/breakfast_in_hell.cfg examples/single_use_turbo.cfg\ examples/fortress_soccer.cfg examples/death_zone.cfg\ Modified: armagetronad/trunk/armagetronad/config/settings_dedicated.cfg =================================================================== --- armagetronad/trunk/armagetronad/config/settings_dedicated.cfg 2007-04-18 19:30:26 UTC (rev 7199) +++ armagetronad/trunk/armagetronad/config/settings_dedicated.cfg 2007-04-20 06:13:11 UTC (rev 7200) @@ -207,24 +207,6 @@ ############################################################################################ # -# Web Server -# -############################################################################################ - -WEB_USE_INTERNAL 1 # use internal web server? Recommended if you intend to serve your own resources - # 1 = yes, 0 = no. - -WEB_REMOTE_ADMIN 0 # Allow to use the server administration pages in the web interface. The pages - # themselves are password protected, but the default password is very insecure. - # Make sure you change the username and password before enabling this! -WEB_PORT 4550 # port the web server should run on -WEB_SERVER_DNS mydomain.com # dns for the webserver, should be used in authentication, will also be used to generate links - # in the web pages served -WEB_INDEX_FILES index.html,index.cgi # index file names, served when the last path component is a directory - - -############################################################################################ -# # Game settings # ############################################################################################ Deleted: armagetronad/trunk/armagetronad/config/settings_web.cfg =================================================================== --- armagetronad/trunk/armagetronad/config/settings_web.cfg 2007-04-18 19:30:26 UTC (rev 7199) +++ armagetronad/trunk/armagetronad/config/settings_web.cfg 2007-04-20 06:13:11 UTC (rev 7200) @@ -1,66 +0,0 @@ -# Configuration file for internal web server - -# Which directory to serve. -# By default, current directory is used -# Currently has no effect, it will be overridden, kept here for reference -#document_root C:\ - -# Authentication realm. -# By default, it is "mydomain.com" -#server_name mydomain.com - -# Listening port -# By default, 80 or 443 if SSL is used -#listen_port 4550 - -# Comma-separated list of index files. -# No spaces allowed between them. -# By default, index.html,index.cgi -#index_files index.html,index.cgi - -# CGI file extention. -# By default, .cgi -# cgi currently disabled in build -#cgi_extention .cgi - -# Access log file. -# By default, it is "access.log" -#access_log access.log - -# Error log file. -# By default, no error log is created, errors are written to stderr -#error_log error.log - -# Mime types file. -# By default, none. Built-in mime types are used. -#mime_types /etc/mime.types - -# Global .htpasswd file, one for all directories. -# This one overrides any per-directory .htpasswd file. -# By default, none -#global_htpasswd /etc/htpasswd - -# Show all debug messages. Very noisy. By default, off -#debug 0 - -# SSL certificate file location. -# Enabling this directive force switch to SSL mode, listening port 443. -# By default, not enabled -#ssl_certificate shttpd.pem - -# Operate in SSL mode -# By default, no -#use_ssl 0 - -# Inetd mode. Exit after serving one document. -# Assume client socket already connected on stdin/stdout -# By default, no -#inetd_mode 0 - -# Switch directory listing on/off -# By default, yes -#list_directories 1 - -# For UNIX only. If started by root, switch uid to specified one. -# By default, not specified. -#runtime_uid nobody Deleted: armagetronad/trunk/armagetronad/config/web_password.cfg =================================================================== --- armagetronad/trunk/armagetronad/config/web_password.cfg 2007-04-18 19:30:26 UTC (rev 7199) +++ armagetronad/trunk/armagetronad/config/web_password.cfg 2007-04-20 06:13:11 UTC (rev 7200) @@ -1 +0,0 @@ -guest:mydomain.com:485264dcc977a1925370b89d516a1477 Modified: armagetronad/trunk/armagetronad/configure.ac =================================================================== --- armagetronad/trunk/armagetronad/configure.ac 2007-04-18 19:30:26 UTC (rev 7199) +++ armagetronad/trunk/armagetronad/configure.ac 2007-04-20 06:13:11 UTC (rev 7200) @@ -849,8 +849,10 @@ dnl SWIG -AC_PROG_SWIG(1.3.29) -SWIG_ENABLE_CXX +if test "x$enable_ruby" = "xyes"; then + AC_PROG_SWIG(1.3.29) + SWIG_ENABLE_CXX +fi dnl RUBY and SWIG end @@ -1048,7 +1050,6 @@ src/thirdparty/Makefile src/thirdparty/particles/Makefile src/thirdparty/mathexpr/Makefile -src/thirdparty/shttpd/Makefile src/swig/Makefile resource/Makefile config/Makefile Modified: armagetronad/trunk/armagetronad/src/Makefile.am =================================================================== --- armagetronad/trunk/armagetronad/src/Makefile.am 2007-04-18 19:30:26 UTC (rev 7199) +++ armagetronad/trunk/armagetronad/src/Makefile.am 2007-04-20 06:13:11 UTC (rev 7200) @@ -155,8 +155,7 @@ tron/cockpit/cGauges.h tron/cockpit/cGauges.cpp \ tron/cockpit/cRectangle.h tron/cockpit/cRectangle.cpp -libui_a_SOURCES=ui/uInput.cpp ui/uInput.h ui/uInputQueue.cpp ui/uInputQueue.h ui/uMenu.cpp ui/uMenu.h\ - ui/uWebinterface.cpp ui/uWebinterface.h +libui_a_SOURCES=ui/uInput.cpp ui/uInput.h ui/uInputQueue.cpp ui/uInputQueue.h ui/uMenu.cpp ui/uMenu.h endif # library include dependency structure. Watch out, don't create circular include dependencies. Modified: armagetronad/trunk/armagetronad/src/thirdparty/Makefile.am =================================================================== --- armagetronad/trunk/armagetronad/src/thirdparty/Makefile.am 2007-04-18 19:30:26 UTC (rev 7199) +++ armagetronad/trunk/armagetronad/src/thirdparty/Makefile.am 2007-04-20 06:13:11 UTC (rev 7200) @@ -2,10 +2,10 @@ SUBDIRS= else if BUILDDEDICATED -SUBDIRS=shttpd mathexpr +SUBDIRS=mathexpr else if BUILDREGULAR -SUBDIRS=shttpd particles mathexpr +SUBDIRS=particles mathexpr endif endif endif Modified: armagetronad/trunk/armagetronad/src/tron/gGame.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gGame.cpp 2007-04-18 19:30:26 UTC (rev 7199) +++ armagetronad/trunk/armagetronad/src/tron/gGame.cpp 2007-04-20 06:13:11 UTC (rev 7200) @@ -70,7 +70,7 @@ #include "tXmlParser.h" #include "gParser.h" -#include "uWebinterface.h" +//#include "uWebinterface.h" #include "gRotation.h" @@ -1336,8 +1336,6 @@ //#ifndef DEBUG #ifdef DEDICATED - if ( !tRecorder::IsPlayingBack() ) - uWebInterface::Initialize(); static double startTime=tSysTimeFloat(); if ( sg_NumUsers() == 0) @@ -1353,7 +1351,6 @@ while(numPlayers == 0 && (ded_idle<.0001 || tSysTimeFloat()<startTime + ded_idle * 3600 ) && !uMenu::quickexit ){ sr_Read_stdin(); - uWebInterface::PollNetwork(200); gGame::NetSyncIdle(); sn_BasicNetworkSystem.Select( 1.0f ); @@ -1395,10 +1392,6 @@ //wrap up the stats delete gStats; - -#ifdef DEDICATED - uWebInterface::Shutdown(); -#endif } static tString sg_roundCenterMessage(""); @@ -3826,7 +3819,7 @@ while (bool(sg_currentGame) && goon && sn_GetNetState()==enter_state){ #ifdef DEDICATED // read input sr_Read_stdin(); - uWebInterface::PollNetwork(200); + if ( sn_BasicNetworkSystem.Select( 1.0 / ( sg_dedicatedFPSIdleFactor * sg_dedicatedFPS ) ) ) { // new network data arrived, do the most urgent work now Deleted: armagetronad/trunk/armagetronad/src/ui/uWebinterface.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/ui/uWebinterface.cpp 2007-04-18 19:30:26 UTC (rev 7199) +++ armagetronad/trunk/armagetronad/src/ui/uWebinterface.cpp 2007-04-20 06:13:11 UTC (rev 7200) @@ -1,260 +0,0 @@ -/* - -************************************************************************* - -ArmageTron -- Just another Tron Lightcycle Game in 3D. -Copyright (C) 2000 Manuel Moos (ma...@mo...) -Copyright (C) 2004 Armagetron Advanced Team (http://sourceforge.net/projects/armagetronad/) - -************************************************************************** - -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. - -*************************************************************************** - -uWebInterface by Dave Fancella - -*/ - -#include "aa_config.h" - -#ifdef DEDICATED - -#include "uWebinterface.h" -#include "tSysTime.h" -#ifdef _WIN32 -#include <winsock.h> -#ifndef __MINGW32__ -#define snprintf _snprintf -#endif -// #pragma comment(lib,"ws2_32") -#else -#include <sys/types.h> -#include <sys/select.h> -#endif - -// Needed so the shttpd header will know we're using multi-threaded -#define MT - -#include <stdio.h> -#include <stdlib.h> -#include <time.h> -#include "shttpd.h" -#include <sstream> - -#define TRUE 1 -#define FALSE 0 - -#include "tConfiguration.h" -#include "tString.h" -#include "tDirectories.h" - -int allowRemoteAdmin=0; -static tSettingItem<int> wira("WEB_REMOTE_ADMIN",allowRemoteAdmin); - -int useWebInterface=0; -static tSettingItem<int> wiwa("WEB_USE_INTERNAL",useWebInterface); - -int webPort=4550; -static tSettingItem<int> wip("WEB_PORT",webPort); - -tString webDNSname("mydomain.com"); -static tSettingItem<tString> widns("WEB_SERVER_DNS", webDNSname); - -tString webIndexFiles("index.html,index.cgi"); -static tConfItemLine wiif("WEB_INDEX_FILES", webIndexFiles); - -extern tString sn_serverName; - -int uWebInterface::mSocket; -bool uWebInterface::isInited = FALSE; -#if 0 -// Reference callback from MT example -static int -index_html(struct shttpd_callback_arg *arg) -{ - int i; - - /* Output HTTP headers */ - shttpd_printf(arg->connection, "%s\r\n", "HTTP/1.1 200 OK"); - shttpd_printf(arg->connection, "%s\r\n", "Content-Type: text/plain"); - shttpd_printf(arg->connection, "%s\r\n", ""); - - sleep(2); - - /* Output large chunk of binary data */ - for (i = 0; i < 100000; i++) - shttpd_printf(arg->connection, "%s\n", "ABCDEFGHIJKLMNOP"); - - return (0); /* Not used */ -} -#endif - -uWebInterface::uWebInterface() { -} - -void uWebInterface::Initialize() { - if( ! isInited && useWebInterface == 1 ) { - // Initialize the web server, giving it the path to its config file - //shttpd_init(tDirectories::Config().GetReadPath("settings_web.cfg")); - shttpd_init(""); - - // Set configuration parameters -#ifdef DEDICATED - std::cout << tDirectories::Webroot().GetDirPath() << std::endl; - shttpd_setopt("document_root", tDirectories::Webroot().GetDirPath() ); - shttpd_setopt("server_name", webDNSname ); - shttpd_setopt("index_files", webIndexFiles ); - shttpd_setopt("debug", "0" ); - shttpd_setopt("list_directories", "1" ); - // access and error log name changes don't work for some reason - shttpd_setopt("access_log", "armagetronad-web.log" ); - shttpd_setopt("error_log", "armagetronad-web-error.log" ); -#endif - shttpd_register_mountpoint("/resource", tDirectories::Resource().GetDirPath()); - - // Setup extra mimetypes for armagetron - shttpd_addmimetype("xml", "text/xml"); - - // Setup cgi handlers - // path isn't currently implemented in shttpd, but the extension is - //shttpd_addcgihandler(".py", "/usr/bin/python"); - - // Setup callbacks - // The front of the admin interface - shttpd_register_url("/admin", &uWebInterface::admin_html, NULL); - // The admin callback for executing a console command on the server - shttpd_register_url("/actions/doconsole", &uWebInterface::set_console, NULL); - // First protect the admin directory - shttpd_protect_url("/admin", tDirectories::Config().GetReadPath("web_password.cfg") ); - shttpd_protect_url("/actions", tDirectories::Config().GetReadPath("web_password.cfg") ); - - // Open port, get socket so we can poll - mSocket = shttpd_open_port(webPort); - isInited = TRUE; - } -} - -void uWebInterface::PollNetwork(unsigned milliseconds) { - if( isInited && useWebInterface == 1 ) - shttpd_poll(mSocket, milliseconds); -} - -void uWebInterface::Shutdown() { - if( isInited ) - shttpd_fini(); -} - -int uWebInterface::admin_disabled(struct shttpd_callback_arg *arg) -{ - shttpd_printf(arg->connection, GetHeaders(), "" ); - shttpd_printf(arg->connection, "%s\r\n", ""); - - shttpd_printf(arg->connection, "%s\r\n", "<html><head><title>Armagetron Advanced Server Administration</title></head>"); - shttpd_printf(arg->connection, "%s\r\n", "<body><h1>Administration of this server through the web interface is disabled!</h1></body></html>"); - - return 0; -} - -tString uWebInterface::GetHeaders() { - tString returnHeaders; - - returnHeaders << "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n"; - return returnHeaders; -} - -bool uWebInterface::AllowAdmin() { - if( allowRemoteAdmin == 1 ) { - return true; - } else { - return false; - } -} - -int uWebInterface::admin_html(struct shttpd_callback_arg *arg) -{ - if( AllowAdmin() ) { - shttpd_printf(arg->connection, GetHeaders(), ""); - shttpd_printf(arg->connection, "\r\n", ""); - shttpd_printf(arg->connection, GetPageHeader(sn_serverName) ); - tString body; - - body << "<h1>Armagetron Advanced Server Administration</h1>\n"; - body << "<form method=\"get\" action=\"/actions/doconsole\">\n"; - body << "<div class=\"mainContent\" />\n"; - body << "<p>Command: <input type=\"text\" class=\"consoleName\" name=\"cmd\" />"; - body << " Value: <input type=\"text\" class=\"consoleValue\" name=\"value\" />"; - body << "</p>\n"; - body << "<p><input type=\"submit\" /></p>\n"; - body << "</div>\n"; - body << "</form>\n"; - shttpd_printf(arg->connection, body); - - shttpd_printf(arg->connection, GetPageFooter() ); - } else { - return admin_disabled(arg); - } - - return 0; -} - -int uWebInterface::set_console(struct shttpd_callback_arg *arg) -{ - if( AllowAdmin() ) { - tString command; - command << shttpd_get_var(arg->connection, "cmd") << " " << - shttpd_get_var(arg->connection, "value"); - std::stringstream s; - s << command; - std::cout << command << std::endl; - tConfItemBase::LoadAll(s); - - /* Output HTTP headers */ - shttpd_printf(arg->connection, "HTTP/1.1 200 OK\r\n" ); - shttpd_printf(arg->connection, "%s: %s", "Location", "/admin"); - shttpd_printf(arg->connection, "\r\n\r\n"); - tDelay(2); - } else { - admin_disabled(arg); - } - - return 0; -} - -tString uWebInterface::GetPageHeader(const char* title) { - tString header; - - header << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n"; - header << "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\" dir=\"ltr\">\n"; - header << "\n<head>\n"; - header << "<link rel=\"shortcut icon\" href=\"/favicon.ico\" />\n"; - header << "<title>" << title << " Administration</title>\n"; - header << "<link href=\"/css/admin.css\" type=\"text/css\" />\n"; - header << "</head>\n<body>\n"; - header << "<p><a href=\"/admin\">Administration Home</a></p>\n"; - - return header; -} - -tString uWebInterface::GetPageFooter() { - tString footer; - - footer << "</body>\n</html>\n"; - - return footer; -} - -#endif // DEDICATED - Deleted: armagetronad/trunk/armagetronad/src/ui/uWebinterface.h =================================================================== --- armagetronad/trunk/armagetronad/src/ui/uWebinterface.h 2007-04-18 19:30:26 UTC (rev 7199) +++ armagetronad/trunk/armagetronad/src/ui/uWebinterface.h 2007-04-20 06:13:11 UTC (rev 7200) @@ -1,76 +0,0 @@ -/* - -************************************************************************* - -ArmageTron -- Just another Tron Lightcycle Game in 3D. -Copyright (C) 2000 Manuel Moos (ma...@mo...) -Copyright (C) 2004 Armagetron Advanced Team (http://sourceforge.net/projects/armagetronad/) - -************************************************************************** - -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. - -*************************************************************************** - -uWebInterface by Dave Fancella - -*/ - -#ifndef ArmageTron_WEBINTERFACE_H -#define ArmageTron_WEBINTERFACE_H - -#ifdef DEDICATED - -#include "tString.h" - -class uWebInterface { - -public: - // Initialize initializes the class and starts the server - static void Initialize(); - // PollNetwork is the polling method, should be called - // at least once per game loop and also when the server is idling - static void PollNetwork(unsigned milliseconds); - // Shutdown shuts down the web server - static void Shutdown(); - - // Callbacks for the web server - static int set_console(struct shttpd_callback_arg *arg); - static int admin_html(struct shttpd_callback_arg *arg); - static int admin_disabled(struct shttpd_callback_arg *arg); - - static int mSocket; -private: - static bool isInited; - static tString GetHeaders(); - - static tString GetPageHeader(const char* title); - - static tString GetPageFooter(); - - static bool AllowAdmin(); - - uWebInterface(); - ~uWebInterface(); -}; - -#endif // DEDICATED - -#endif // ArmageTron_WEBINTERFACE_H - - - - - This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <z-...@us...> - 2007-05-07 11:41:44
|
Revision: 7216 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7216&view=rev Author: z-man Date: 2007-05-07 04:40:16 -0700 (Mon, 07 May 2007) Log Message: ----------- Added support for VSync setting changes via SDL (Note: this seems to be a bit buggy and does not work in Linux at all due to driver limitations, investigate) and the special motion blur mode where VSync is disabled and the current rendering is blended with the last frame. Modified Paths: -------------- armagetronad/trunk/armagetronad/config/settings_visual.cfg armagetronad/trunk/armagetronad/language/english_base.txt armagetronad/trunk/armagetronad/src/render/rScreen.cpp armagetronad/trunk/armagetronad/src/render/rScreen.h armagetronad/trunk/armagetronad/src/render/rSysdep.cpp armagetronad/trunk/armagetronad/src/tron/gMenus.cpp Modified: armagetronad/trunk/armagetronad/config/settings_visual.cfg =================================================================== --- armagetronad/trunk/armagetronad/config/settings_visual.cfg 2007-05-02 10:37:35 UTC (rev 7215) +++ armagetronad/trunk/armagetronad/config/settings_visual.cfg 2007-05-07 11:40:16 UTC (rev 7216) @@ -26,3 +26,4 @@ #FLOOR_GREEN .2 # floor color (without moviepack) #FLOOR_BLUE .3 # floor color (without moviepack) +MOTION_BLUR_TIME .01 # time over which the last rendered frames are blurred together in motion blur mode Modified: armagetronad/trunk/armagetronad/language/english_base.txt =================================================================== --- armagetronad/trunk/armagetronad/language/english_base.txt 2007-05-02 10:37:35 UTC (rev 7215) +++ armagetronad/trunk/armagetronad/language/english_base.txt 2007-05-07 11:40:16 UTC (rev 7216) @@ -691,7 +691,10 @@ armagetron_screenmode_help Screen resolution armagetron_last_screenmode_help Last screen resolution armagetron_windowsize_help Window size -armagetron_last_windowsize_help Last Window size +armagetron_last_windowsize_help Last Window sizea +motion_blur_time_help Time over which the last rendered frames are blended together +armagetron_vsync_help What to do with the monitor's vertical sync +rmagetron_vsync_last_help What to do with the monitor's vertical sync fullscreen_help Fullscreen or windowed mode? last_fullscreen_help Fullscreen or windowed mode, last successful init check_errors_help Listen to errors claiming a video mode does not exist @@ -1792,6 +1795,21 @@ screen_use_sdl_text Use SDL OpenGL: screen_use_sdl_help Toggles use of the clean OpenGL initialisation routines; if disabled, \g will use the dirty method that was neccesary with SDL 1.0. +screen_vsync_text VSync: +screen_vsync_help What to do with the monitor's vertical sync signal. + +screen_vsync_on_text Wait +screen_vsync_on_help Wait for it every frame. This usually results in very smooth animations at a frame rate limited by your monitor's refresh rate, and is the only way to make this game not use 100% CPU time. Recommended. + +screen_vsync_default_text Default +screen_vsync_default_help Do not touch the system defaults. + +screen_vsync_off_text Don't wait +screen_vsync_off_help Ignore the signal. This results in higher frame rates, but you won't see most of these frames; your monitor can't display them all. Usually a waste of resources and causes tearing artefacts. + +screen_vsync_motionblur_text Motion Blur +screen_vsync_motionblur_help Ignore it and make use of the additional frames for motion blurring, which makes the tearing artefacts less prominent. Recommended for power gamers. + screen_grab_mouse_text Grab Mouse: screen_grab_mouse_help If activated, the mouse pointer is centered after every move; thus, it is unable to leave the window. This option is only useful when you play \g in a window. Modified: armagetronad/trunk/armagetronad/src/render/rScreen.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/render/rScreen.cpp 2007-05-02 10:37:35 UTC (rev 7215) +++ armagetronad/trunk/armagetronad/src/render/rScreen.cpp 2007-05-07 11:40:16 UTC (rev 7216) @@ -63,6 +63,7 @@ tCONFIG_ENUM( rResolution ); tCONFIG_ENUM( rColorDepth ); +tCONFIG_ENUM( rVSync ); SDL_Surface *sr_screen=NULL; // our window @@ -124,6 +125,9 @@ static tConfItem<rResolution> winsize("ARMAGETRON_WINDOWSIZE",currentScreensetting.windowSize.res); static tConfItem<rResolution> winsizeLast("ARMAGETRON_LAST_WINDOWSIZE",lastSuccess.windowSize.res); +static tConfItem<rVSync> vSync("ARMAGETRON_VSYNC",currentScreensetting.vSync); +static tConfItem<rVSync> vSyncLast("ARMAGETRON_VSYNC_LAST",lastSuccess.vSync); + static tConfItem<int> screenres_w("ARMAGETRON_SCREENMODE_W",currentScreensetting.res.width); static tConfItem<int> screenresLast_w("ARMAGETRON_LAST_SCREENMODE_W", lastSuccess.res.width); @@ -331,7 +335,7 @@ // ******************************************************************************************* rScreenSettings::rScreenSettings( rResolution r, bool fs, rColorDepth cd, bool sdl, bool ce ) - :res(r), windowSize(r), fullscreen(fs), colorDepth(cd), zDepth( ArmageTron_ColorDepth_Desktop ), useSDL(sdl), checkErrors(true), aspect (1) + :res(r), windowSize(r), fullscreen(fs), colorDepth(cd), zDepth( ArmageTron_ColorDepth_Desktop ), useSDL(sdl), checkErrors(true), vSync( ArmageTron_VSync_Default ), aspect (1) { } @@ -378,6 +382,34 @@ } #endif +static void sr_SetGLAttributes( int rDepth, int gDepth, int bDepth, int zDepth ) +{ + // SDL 1.1 required +#ifdef SDL_OPENGL + SDL_GL_SetAttribute( SDL_GL_RED_SIZE, rDepth ); + SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, gDepth ); + SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, bDepth ); + SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, zDepth ); + SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); + +#if SDL_VERSION_ATLEAST(1, 2, 10) + // requires SDL 1.2.10 + switch (currentScreensetting.vSync) + { + case ArmageTron_VSync_On: + SDL_GL_SetAttribute( SDL_GL_SWAP_CONTROL, 1 ); + break; + case ArmageTron_VSync_Off: + case ArmageTron_VSync_MotionBlur: + SDL_GL_SetAttribute( SDL_GL_SWAP_CONTROL, 1 ); + break; + case ArmageTron_VSync_Default: + break; + } +#endif +#endif +} + static bool lowlevel_sr_InitDisplay(){ #ifndef DEDICATED rScreenSize & res = currentScreensetting.fullscreen ? currentScreensetting.res : currentScreensetting.windowSize; @@ -435,12 +467,7 @@ #ifdef SDL_OPENGL if (currentScreensetting.useSDL) { - // SDL 1.1 required - SDL_GL_SetAttribute( SDL_GL_RED_SIZE, singleCD_R ); - SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, singleCD_G ); - SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, singleCD_B ); - SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, zDepth ); - SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); + sr_SetGLAttributes( singleCD_R, singleCD_G, singleCD_B, zDepth ); } #else currentScreensetting.useSDL = false; @@ -519,12 +546,7 @@ #ifdef SDL_OPENGL if (currentScreensetting.useSDL) { - // SDL 1.1 required - SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 5 ); - SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 5 ); - SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 5 ); - SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 16 ); - SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 ); + sr_SetGLAttributes( 5, 5, 5, 16 ); } #endif } Modified: armagetronad/trunk/armagetronad/src/render/rScreen.h =================================================================== --- armagetronad/trunk/armagetronad/src/render/rScreen.h 2007-05-02 10:37:35 UTC (rev 7215) +++ armagetronad/trunk/armagetronad/src/render/rScreen.h 2007-05-07 11:40:16 UTC (rev 7216) @@ -47,6 +47,12 @@ } rColorDepth; +typedef enum { + ArmageTron_VSync_On, ArmageTron_VSync_Default, ArmageTron_VSync_Off, + ArmageTron_VSync_MotionBlur +} +rVSync; + struct rScreenSize { rResolution res; @@ -72,6 +78,7 @@ rColorDepth zDepth; bool useSDL; bool checkErrors; + rVSync vSync; // whether to wait for vsync REAL aspect; // aspect ratio of pixels ( width/height ) rScreenSettings(rResolution r, Modified: armagetronad/trunk/armagetronad/src/render/rSysdep.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/render/rSysdep.cpp 2007-05-02 10:37:35 UTC (rev 7215) +++ armagetronad/trunk/armagetronad/src/render/rSysdep.cpp 2007-05-07 11:40:16 UTC (rev 7216) @@ -589,6 +589,90 @@ } } +void sr_MotionBlur( REAL alpha ) +{ + if ( alpha < 0 ) + return; + +#if 0 + GLenum error = glGetError(); + if ( error != GL_NO_ERROR ) + con << "GL error " << error << "\n"; +#endif + + // determine best texture dimensions, fitting the screen resolution + int tWidth = 128; + while ( tWidth < sr_screenWidth ) + tWidth *= 2; + + int tHeight = 128; + while ( tHeight < sr_screenHeight ) + tHeight *= 2; + + // Read the current front buffer into a texture + GLenum target; + glGenTextures(1, &target ); + glBindTexture(GL_TEXTURE_2D,target); + +#if 0 + error = glGetError(); + if ( error != GL_NO_ERROR ) + con << "GL error2 " << error << "\n"; +#endif + + glReadBuffer( GL_FRONT ); + + glCopyTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, + 0, 0, + tWidth, tHeight, 0 ); + +#if 0 + error = glGetError(); + if ( error != GL_NO_ERROR ) + con << "GL error3 " << error << "\n"; +#endif + + // determine the texture coordinates of the lower right corner + REAL maxu = REAL(sr_screenWidth)/tWidth; + REAL maxv = REAL(sr_screenHeight)/tHeight; + + glEnable(GL_TEXTURE_2D); + + + // blend the last frame and the current frame with the specified alpha value + glDisable( GL_DEPTH_TEST ); + glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, + GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, + GL_NEAREST); + + glDisable(GL_ALPHA_TEST); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); + + glBegin( GL_QUADS ); + glColor4f( 1,1,1,alpha ); + + glTexCoord2f( 0, 0 ); + glVertex2f( -1, -1 ); + + glTexCoord2f( maxu, 0 ); + glVertex2f( 1, -1 ); + + glTexCoord2f( maxu, maxv ); + glVertex2f( 1, 1 ); + + glTexCoord2f( 0, maxv ); + glVertex2f( -1, 1 ); + glEnd(); + + glDeleteTextures(1, &target ); +} + +static REAL sr_motionBlurTime = .01; +static tSettingItem<REAL> c_mb( "MOTION_BLUR_TIME", + sr_motionBlurTime ); + void rSysDep::SwapGL(){ if ( s_benchmark ) { @@ -599,6 +683,25 @@ double time = tSysTimeFloat(); double realTime = tRealSysTimeFloat(); + if ( currentScreensetting.vSync == ArmageTron_VSync_MotionBlur ) + { + static bool active = true; + + static double lastTime = time; + + REAL frameTime = time - lastTime; + + if ( frameTime * 3 < sr_motionBlurTime ) + active = true; + else if ( frameTime > sr_motionBlurTime ) + active = false; + + if ( active ) + sr_MotionBlur( 1 - frameTime / sr_motionBlurTime ); + + lastTime = time; + } + bool next_glOut = sr_glOut; /* static double mytime = time; //ljr Modified: armagetronad/trunk/armagetronad/src/tron/gMenus.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gMenus.cpp 2007-05-02 10:37:35 UTC (rev 7215) +++ armagetronad/trunk/armagetronad/src/tron/gMenus.cpp 2007-05-07 11:40:16 UTC (rev 7216) @@ -313,9 +313,22 @@ "$screen_use_sdl_text", "$screen_use_sdl_help", currentScreensetting.useSDL); -#endif -#endif +#endif // dirty +#if SDL_VERSION_ATLEAST(1, 2, 10) + uMenuItemSelection<rVSync> zvs_t + (&screen_menu_mode, + "$screen_vsync_text", + "$screen_vsync_help", + currentScreensetting.vSync); + + uSelectEntry<rVSync> zvs_on(zvs_t,"$screen_vsync_on_text","$screen_vsync_on_help",ArmageTron_VSync_On); + uSelectEntry<rVSync> zvs_d(zvs_t,"$screen_vsync_default_text","$screen_vsync_default_help",ArmageTron_VSync_Default); + uSelectEntry<rVSync> zvs_off(zvs_t,"$screen_vsync_off_text","$screen_vsync_off_help",ArmageTron_VSync_Off); + uSelectEntry<rVSync> zvs_blur(zvs_t,"$screen_vsync_motionblur_text","$screen_vsync_motionblur_help",ArmageTron_VSync_MotionBlur); +#endif // SDL_GL_SWAP_CONTROL +#endif // SDL_OPENGL + uMenuItemToggle gm( &screen_menu_mode, "$screen_grab_mouse_text", This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <z-...@us...> - 2007-05-07 14:45:36
|
Revision: 7217 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7217&view=rev Author: z-man Date: 2007-05-07 07:43:06 -0700 (Mon, 07 May 2007) Log Message: ----------- Motion blurring now also affects the UI, which fixes the too bright fonts and HUD map. Modified Paths: -------------- armagetronad/trunk/armagetronad/config/settings_visual.cfg armagetronad/trunk/armagetronad/src/render/rSysdep.cpp Modified: armagetronad/trunk/armagetronad/config/settings_visual.cfg =================================================================== --- armagetronad/trunk/armagetronad/config/settings_visual.cfg 2007-05-07 11:40:16 UTC (rev 7216) +++ armagetronad/trunk/armagetronad/config/settings_visual.cfg 2007-05-07 14:43:06 UTC (rev 7217) @@ -26,4 +26,4 @@ #FLOOR_GREEN .2 # floor color (without moviepack) #FLOOR_BLUE .3 # floor color (without moviepack) -MOTION_BLUR_TIME .01 # time over which the last rendered frames are blurred together in motion blur mode +MOTION_BLUR_TIME .015 # time over which the last rendered frames are blurred together in motion blur mode Modified: armagetronad/trunk/armagetronad/src/render/rSysdep.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/render/rSysdep.cpp 2007-05-07 11:40:16 UTC (rev 7216) +++ armagetronad/trunk/armagetronad/src/render/rSysdep.cpp 2007-05-07 14:43:06 UTC (rev 7217) @@ -589,10 +589,10 @@ } } -void sr_MotionBlur( REAL alpha ) +void sr_MotionBlurCore( REAL alpha ) { if ( alpha < 0 ) - return; + alpha = 0; #if 0 GLenum error = glGetError(); @@ -622,7 +622,7 @@ glReadBuffer( GL_FRONT ); - glCopyTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, + glCopyTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, 0, 0, tWidth, tHeight, 0 ); @@ -638,18 +638,22 @@ glEnable(GL_TEXTURE_2D); - + // blend the last frame and the current frame with the specified alpha value glDisable( GL_DEPTH_TEST ); + glDepthMask(0); + glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, - GL_NEAREST); + GL_NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, - GL_NEAREST); - + GL_NEAREST); + glDisable(GL_ALPHA_TEST); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); - + + glDisable(GL_LIGHTING); + glBegin( GL_QUADS ); glColor4f( 1,1,1,alpha ); @@ -666,42 +670,73 @@ glVertex2f( -1, 1 ); glEnd(); + // clean up: destroy the texture glDeleteTextures(1, &target ); } +// frames from about this far apart get blended together static REAL sr_motionBlurTime = .01; static tSettingItem<REAL> c_mb( "MOTION_BLUR_TIME", sr_motionBlurTime ); -void rSysDep::SwapGL(){ - if ( s_benchmark ) +// blurs the motion, time is the current time +void sr_MotionBlur( double time ) +{ + if ( currentScreensetting.vSync == ArmageTron_VSync_MotionBlur ) { - static PerformanceCounter counter; - counter.Count(); - } + // measure frame rendering time + static double lastTime = time; + REAL frameTime = time - lastTime; - double time = tSysTimeFloat(); - double realTime = tRealSysTimeFloat(); - if ( currentScreensetting.vSync == ArmageTron_VSync_MotionBlur ) - { + // use hysteresis to autodisable motion blurring if rendering gets + // far too slow and reenable it if rendering gets fast enough again + static int hyster = 0; + static int thresh = 100; static bool active = true; - static double lastTime = time; + if ( frameTime * 5 < sr_motionBlurTime ) + { + if ( ++hyster > thresh ) + { + active = true; + hyster = thresh; + } + } + else if ( frameTime > sr_motionBlurTime * 2 ) + { + if ( --hyster < -thresh ) + { + active = false; + hyster = -thresh; + } + } + else + { + if ( hyster < 0 ) + ++hyster; + else + --hyster; + } - REAL frameTime = time - lastTime; - - if ( frameTime * 3 < sr_motionBlurTime ) - active = true; - else if ( frameTime > sr_motionBlurTime ) - active = false; - + // really blur. if ( active ) - sr_MotionBlur( 1 - frameTime / sr_motionBlurTime ); + sr_MotionBlurCore( 1 - frameTime / sr_motionBlurTime ); lastTime = time; } +} +void rSysDep::SwapGL(){ + if ( s_benchmark ) + { + static PerformanceCounter counter; + counter.Count(); + } + + double time = tSysTimeFloat(); + double realTime = tRealSysTimeFloat(); + bool next_glOut = sr_glOut; /* static double mytime = time; //ljr @@ -792,6 +827,9 @@ SDL_mutexV( sr_netLock ); sr_LockSDL(); + // actiate motion blur (does not use the game state, so it's OK to call here ) + sr_MotionBlur( time ); + switch( swapMode_ ) { case rSwap_Fastest: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <phi...@us...> - 2007-05-26 07:41:37
|
Revision: 7268 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7268&view=rev Author: philippeqc Date: 2007-05-26 00:38:55 -0700 (Sat, 26 May 2007) Log Message: ----------- Moved the shapes development into the trunk (3rd attempt, now on the new location) Modified Paths: -------------- armagetronad/trunk/armagetronad/src/Makefile.am armagetronad/trunk/armagetronad/src/tron/cockpit/cMap.cpp armagetronad/trunk/armagetronad/src/tron/gGame.cpp armagetronad/trunk/armagetronad/src/tron/gParser.cpp armagetronad/trunk/armagetronad/src/tron/gParser.h armagetronad/trunk/armagetronad/src/tron/zone/zEffectGroup.cpp armagetronad/trunk/armagetronad/src/tron/zone/zEffectGroup.h armagetronad/trunk/armagetronad/src/tron/zone/zEffector.cpp armagetronad/trunk/armagetronad/src/tron/zone/zMonitor.cpp armagetronad/trunk/armagetronad/src/tron/zone/zMonitor.h armagetronad/trunk/armagetronad/src/tron/zone/zSelector.cpp armagetronad/trunk/armagetronad/src/tron/zone/zSelector.h armagetronad/trunk/armagetronad/src/tron/zone/zValidator.cpp armagetronad/trunk/armagetronad/src/tron/zone/zValidator.h armagetronad/trunk/armagetronad/src/tron/zone/zZone.cpp armagetronad/trunk/armagetronad/src/tron/zone/zZone.h armagetronad/trunk/armagetronad/src/tron/zone/zZoneInfluence.cpp armagetronad/trunk/armagetronad/src/tron/zone/zZoneInfluence.h Added Paths: ----------- armagetronad/trunk/armagetronad/resource/proto/philippeqc/ armagetronad/trunk/armagetronad/resource/proto/philippeqc/quadFortress.aamap.xml armagetronad/trunk/armagetronad/src/tron/zone/zShape.cpp armagetronad/trunk/armagetronad/src/tron/zone/zShape.hpp Removed Paths: ------------- armagetronad/trunk/armagetronad/resource/proto/philippeqc/quadFortress.aamap.xml Copied: armagetronad/trunk/armagetronad/resource/proto/philippeqc (from rev 7243, armagetronad/branches/zone-v2-02-shape/armagetronad/resource/proto/philippeqc) Deleted: armagetronad/trunk/armagetronad/resource/proto/philippeqc/quadFortress.aamap.xml =================================================================== --- armagetronad/branches/zone-v2-02-shape/armagetronad/resource/proto/philippeqc/quadFortress.aamap.xml 2007-05-21 19:28:15 UTC (rev 7243) +++ armagetronad/trunk/armagetronad/resource/proto/philippeqc/quadFortress.aamap.xml 2007-05-26 07:38:55 UTC (rev 7268) @@ -1,133 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!DOCTYPE Resource SYSTEM "map-0.3.1-a.dtd"> -<!-- -<Resource type="aamap" name="square" version="1.0.1" author="Anonymous" category="polygon/regular"> ---> -<Resource type="aamap" version="a" name="quadFortress" author="philippeqc" category="fortress"> - <Map version="2"> - <World> - <Field> - <Axes number="4" /> -<!-- - <Axes number="4" > - <Axis xdir="-1" ydir="-1"/> - <Axis xdir="-1" ydir="1"/> - <Axis xdir="1" ydir="1"/> - <Axis xdir="1" ydir="-1"/> - </Axes> ---> - - <Ownership> - <TeamOwnership teamId="blue" playerId="azure,cobalt,midnight,royal"/> - <TeamOwnership teamId="red" playerId="cerise,mauve,rust,sangria"/> - <TeamOwnership teamId="green" playerId="emerald,jade,lime,olive"/> - <TeamOwnership teamId="yellow" playerId="amber,goldenrod,lemon,navajowhite"/> - </Ownership> - - <Spawn x="50" y="50" angle="45"/> - <Spawn x="450" y="50" angle="135"/> - <Spawn x="450" y="450" angle="225"/> - <Spawn x="50" y="450" angle="315"/> - - - - <Wall> - <Point x="0" y="0"/> - <Point x="500" y="0"/> - <Point x="500" y="500"/> - <Point x="0" y="500"/> - <Point x="0" y="0"/> - </Wall> - - - <Zone name="forAzurePlayer"> - <ShapeCircle scale="50"> - <Point x="100" y="100"/> - <Color red="0.0" green="0.027" blue="1.0"/> - </ShapeCircle> - <Enter> - <EffectGroup owners="azure,cobalt"> - <User user="owner"> - <Target target="self"> - <Effect effect="point" score="3" count="4"/> - </Target> - </User> - </EffectGroup> - </Enter> - </Zone> - - <Zone name="forBlueTeam"> - <ShapeCircle scale="50"> - <Point x="200" y="200"/> - <Color red="0.0" green="0.0" blue="1.0"/> - </ShapeCircle> - <Enter> - <EffectGroup teamOwners="blue"> - <User user="ownerTeam"> - <Target target="self"> - <Effect effect="point" score="3" count="4"/> - </Target> - </User> - </EffectGroup> - </Enter> - </Zone> - -<!-- - <Zone name="BigSquare"> - <ShapePolygon scale="50" rotation="time()*3.14*2/5"> - <Point x="250+50*cos(time()*3.14*2/5)" - y="250+50*sin(time()*3.14*2/5)"/> - <Point x="250" - y="250"/> - <Color red="0.5" green="0.0" blue="0.0"/> - <Point x= "0.5" y= "0.5" /> - <Point x="-0.5" y= "0.5" /> - <Point x="-0.5" y="-0.5" /> - <Point x= "0.5" y="-0.5" /> - <Point x= "0.5" y="-0.55" /> - <Point x="-0.5" y="-0.55" /> - <Point x="-0.5" y="0.55" /> - <Point x= "0.5" y="0.55" /> - - </ShapePolygon> - <Enter> - <EffectGroup owners=""> - <User user="all"> - <Target target="self"> - <Effect effect="death"/> - </Target> - </User> - </EffectGroup> - </Enter> - </Zone> ---> - - <!-- Experiment: A rotating zone. Totally unsynchronized when used over the network --> -<!-- - <Zone name="RotatingZone"> - <ShapePolygon scale="50" rotation="time()*3.14*2/5"> - <Point x="250" - y="250"/> - <Color red="0.5" green="0.0" blue="0.0"/> - <Point x= "0.05" y= "0.0" /> - <Point x= "0.05" y= "0.5" /> - <Point x="-0.05" y= "0.5" /> - <Point x="-0.05" y= "0.0" /> - - </ShapePolygon> - <Enter> - <EffectGroup owners=""> - <User user="all"> - <Target target="self"> - <Effect effect="death"/> - </Target> - </User> - </EffectGroup> - </Enter> - </Zone> ---> - - </Field> - </World> - </Map> -</Resource> Copied: armagetronad/trunk/armagetronad/resource/proto/philippeqc/quadFortress.aamap.xml (from rev 7243, armagetronad/branches/zone-v2-02-shape/armagetronad/resource/proto/philippeqc/quadFortress.aamap.xml) =================================================================== --- armagetronad/trunk/armagetronad/resource/proto/philippeqc/quadFortress.aamap.xml (rev 0) +++ armagetronad/trunk/armagetronad/resource/proto/philippeqc/quadFortress.aamap.xml 2007-05-26 07:38:55 UTC (rev 7268) @@ -0,0 +1,133 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!DOCTYPE Resource SYSTEM "map-0.3.1-a.dtd"> +<!-- +<Resource type="aamap" name="square" version="1.0.1" author="Anonymous" category="polygon/regular"> +--> +<Resource type="aamap" version="a" name="quadFortress" author="philippeqc" category="fortress"> + <Map version="2"> + <World> + <Field> + <Axes number="4" /> +<!-- + <Axes number="4" > + <Axis xdir="-1" ydir="-1"/> + <Axis xdir="-1" ydir="1"/> + <Axis xdir="1" ydir="1"/> + <Axis xdir="1" ydir="-1"/> + </Axes> +--> + + <Ownership> + <TeamOwnership teamId="blue" playerId="azure,cobalt,midnight,royal"/> + <TeamOwnership teamId="red" playerId="cerise,mauve,rust,sangria"/> + <TeamOwnership teamId="green" playerId="emerald,jade,lime,olive"/> + <TeamOwnership teamId="yellow" playerId="amber,goldenrod,lemon,navajowhite"/> + </Ownership> + + <Spawn x="50" y="50" angle="45"/> + <Spawn x="450" y="50" angle="135"/> + <Spawn x="450" y="450" angle="225"/> + <Spawn x="50" y="450" angle="315"/> + + + + <Wall> + <Point x="0" y="0"/> + <Point x="500" y="0"/> + <Point x="500" y="500"/> + <Point x="0" y="500"/> + <Point x="0" y="0"/> + </Wall> + + + <Zone name="forAzurePlayer"> + <ShapeCircle scale="50"> + <Point x="100" y="100"/> + <Color red="0.0" green="0.027" blue="1.0"/> + </ShapeCircle> + <Enter> + <EffectGroup owners="azure,cobalt"> + <User user="owner"> + <Target target="self"> + <Effect effect="point" score="3" count="4"/> + </Target> + </User> + </EffectGroup> + </Enter> + </Zone> + + <Zone name="forBlueTeam"> + <ShapeCircle scale="50"> + <Point x="200" y="200"/> + <Color red="0.0" green="0.0" blue="1.0"/> + </ShapeCircle> + <Enter> + <EffectGroup teamOwners="blue"> + <User user="ownerTeam"> + <Target target="self"> + <Effect effect="point" score="3" count="4"/> + </Target> + </User> + </EffectGroup> + </Enter> + </Zone> + +<!-- + <Zone name="BigSquare"> + <ShapePolygon scale="50" rotation="time()*3.14*2/5"> + <Point x="250+50*cos(time()*3.14*2/5)" + y="250+50*sin(time()*3.14*2/5)"/> + <Point x="250" + y="250"/> + <Color red="0.5" green="0.0" blue="0.0"/> + <Point x= "0.5" y= "0.5" /> + <Point x="-0.5" y= "0.5" /> + <Point x="-0.5" y="-0.5" /> + <Point x= "0.5" y="-0.5" /> + <Point x= "0.5" y="-0.55" /> + <Point x="-0.5" y="-0.55" /> + <Point x="-0.5" y="0.55" /> + <Point x= "0.5" y="0.55" /> + + </ShapePolygon> + <Enter> + <EffectGroup owners=""> + <User user="all"> + <Target target="self"> + <Effect effect="death"/> + </Target> + </User> + </EffectGroup> + </Enter> + </Zone> +--> + + <!-- Experiment: A rotating zone. Totally unsynchronized when used over the network --> +<!-- + <Zone name="RotatingZone"> + <ShapePolygon scale="50" rotation="time()*3.14*2/5"> + <Point x="250" + y="250"/> + <Color red="0.5" green="0.0" blue="0.0"/> + <Point x= "0.05" y= "0.0" /> + <Point x= "0.05" y= "0.5" /> + <Point x="-0.05" y= "0.5" /> + <Point x="-0.05" y= "0.0" /> + + </ShapePolygon> + <Enter> + <EffectGroup owners=""> + <User user="all"> + <Target target="self"> + <Effect effect="death"/> + </Target> + </User> + </EffectGroup> + </Enter> + </Zone> +--> + + </Field> + </World> + </Map> +</Resource> Modified: armagetronad/trunk/armagetronad/src/Makefile.am =================================================================== --- armagetronad/trunk/armagetronad/src/Makefile.am 2007-05-26 07:23:51 UTC (rev 7267) +++ armagetronad/trunk/armagetronad/src/Makefile.am 2007-05-26 07:38:55 UTC (rev 7268) @@ -116,6 +116,7 @@ engine/sound/sdl_mixer/eChannelSDLMixer.h \ engine/sound/sdl_mixer/eMusicTrackSDLMixer.cpp \ engine/sound/sdl_mixer/eMusicTrackSDLMixer.h \ + engine/eEventNotification.h engine/eEventNotification.cpp \ engine/eLagCompensation.cpp engine/eLagCompensation.h \ engine/eSoundMixer.h engine/eSoundMixer.cpp \ engine/eEventNotification.h engine/eEventNotification.cpp @@ -135,6 +136,7 @@ tron/gSpawn.cpp tron/gSpawn.h tron/gStuff.cpp tron/gStuff.h tron/gTeam.cpp tron/gTeam.h tron/gWall.cpp\ tron/gWall.h\ tron/zone/zZone.cpp tron/zone/zZone.h\ + tron/zone/zShape.cpp tron/zone/zShape.hpp\ tron/zone/zMonitor.h tron/zone/zMonitor.cpp\ tron/zone/zEffectGroup.cpp tron/zone/zEffectGroup.h\ tron/zone/zMisc.h\ Modified: armagetronad/trunk/armagetronad/src/tron/cockpit/cMap.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/cockpit/cMap.cpp 2007-05-26 07:23:51 UTC (rev 7267) +++ armagetronad/trunk/armagetronad/src/tron/cockpit/cMap.cpp 2007-05-26 07:38:55 UTC (rev 7268) @@ -299,7 +299,7 @@ for(std::deque<zZone *>::const_iterator i = sg_Zones.begin(); i != sg_Zones.end(); ++i) { tASSERT(*i); tCoord const &position = (*i)->GetPosition(); - const float radius = (*i)->GetRadius(); + const float radius = (*i)->GetScale(); dist2 = (position-pl_CurPos).Norm(); if (dist2<min_dist2) { min_dist2 = dist2; @@ -479,9 +479,9 @@ tCoord const &rotation = (*i)->GetRotation(); tCoord const &position = (*i)->GetPosition(); rColor const &color = (*i)->GetColor(); - const float radius = (*i)->GetRadius(); + const float scale = (*i)->GetScale(); - tCoord currentPos = rotation*radius; + tCoord currentPos = rotation*scale; const int steps=20; Modified: armagetronad/trunk/armagetronad/src/tron/gGame.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gGame.cpp 2007-05-26 07:23:51 UTC (rev 7267) +++ armagetronad/trunk/armagetronad/src/tron/gGame.cpp 2007-05-26 07:38:55 UTC (rev 7268) @@ -26,6 +26,7 @@ */ #include "eEventNotification.h" +#include "eEventNotification.h" #include "gStuff.h" #include "eSoundMixer.h" #include "eGrid.h" Modified: armagetronad/trunk/armagetronad/src/tron/gParser.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gParser.cpp 2007-05-26 07:23:51 UTC (rev 7267) +++ armagetronad/trunk/armagetronad/src/tron/gParser.cpp 2007-05-26 07:38:55 UTC (rev 7268) @@ -43,7 +43,17 @@ typedef std::map< string, zZonePtr > zoneMap; zoneMap mapZones; +#include "nNetObject.h" +typedef std::map< string, nNetObjectID > MapIdToGameId; +MapIdToGameId teamAsso; // mapping between map's teamId and in-game team +MapIdToGameId playerAsso; // mapping between map's playerId and in-game player +#include "nConfig.h" +#define DEFAULT_POLYGONAL_SHAPE_USED "FALSE" +static tString polygonal_shape_used(DEFAULT_POLYGONAL_SHAPE_USED); +static nSettingItemWatched<tString> safetymecanism_polygonal_shapeused("POLYGONAL_SHAPE_USED",polygonal_shape_used, nConfItemVersionWatcher::Group_Breaking, 21 ); + + //! Warn about deprecated map format static void sg_Deprecated() { @@ -52,6 +62,31 @@ con << "\n\n" << tColoredString::ColorString(1,.3,.3) << "WARNING: You are loading a map that is written in a deprecated format. It should work for now, but will stop to do so in one of the next releases. Have the map upgraded to an up-to-date version as soon as possible.\n\n"; } +#ifdef DEBUG_ZONE_SYNC +// This code is to attempt to synchronize moving zones on the client and server +// It just doesnt work ATM, nor it is close to any solution. +static bool newGameRound; // Indicate that a round has just started when true (no not really, a bad approximation) + +// the following crash on the server as soon as the player being monitored dies!!!! +float tSysTimeHack2(float x) +{ + int playerID = sr_viewportBelongsToPlayer[ 0 ]; + // get the player + ePlayer* player = ePlayer::PlayerConfig( playerID ); + + float asdf = player->netPlayer->ping; + + static float basePing; + // preserve basePing only at the start of a new round + if (newGameRound == true) { + newGameRound = false; + basePing = asdf; + } + + return static_cast<float> (tSysTimeFloat() /*+ (player->netPlayer->ping*2)*/ + basePing/2); +} +#endif // DEBUG_ZONE_SYNC + gParser::gParser(gArena *anArena, eGrid *aGrid): theArena(anArena), theGrid(aGrid), @@ -59,6 +94,21 @@ sizeMultiplier(0.0) { m_Doc = NULL; + + // HACK - philippeqc + // This seems as inconvenient as any other place to load the + // static tables of variables and functions available. + // It's run once per map loading, between round, so its basically + // cost less vs the real structural mess that it cause ;) + + // vars[tString("sizeMultiplier")] = &sizeMultiplier; // BAD dont use other than as an example, non static content + + // tValue::Expr::functions[tString("time")] = &tSysTimeHack; +#ifdef DEBUG_ZONE_SYNC + tValue::Expr::functions[tString("time2")] = &tSysTimeHack2; +#endif //DEBUG_ZONE_SYNC + // tValue::Expr::functions[tString("sizeMultiplier")] = &gArena::GetSizeMultiplierHack; // static + } bool @@ -423,6 +473,11 @@ endElementAlternative(grid, cur, keyword); } +/* + Extract all the color codes and build a rColor object. + Return: a rColor object. + + */ rColor gParser::parseColor(eGrid *grid, xmlNodePtr cur, const xmlChar * keyword) { @@ -435,24 +490,133 @@ return color; } +zShapePtr +gParser::parseShapeCircle(eGrid *grid, xmlNodePtr cur, unsigned short idZone, const xmlChar * keyword) +{ + zShapePtr shape = zShapePtr( new zShapeCircle(grid, idZone) ); + parseShape(grid, cur, keyword, shape); + + return shape; +} + +zShapePtr +gParser::parseShapePolygon(eGrid *grid, xmlNodePtr cur, unsigned short idZone, const xmlChar * keyword) +{ + // Polygon shapes are not supported by older clients. + std::stringstream ss; + /* Yes it is ackward to generate a string that will be decifered on the other end*/ + ss << "POLYGONAL_SHAPE_USED TRUE"; + tConfItemBase::LoadLine(ss); + + zShapePtr shape = zShapePtr( new zShapePolygon(grid, idZone) ); + parseShape(grid, cur, keyword, shape); + + return shape; +} + +#ifndef DADA +// Quick stub to allow to operate on tFunction +// Remove when all that is variant has been ported to ruby +void gParser::myCheapParameterSplitter(const string &str, tFunction &tf, bool addSizeMultiplier) +{ + REAL param[2] = {0.0, 0.0}; + int bPos; + if( (bPos = str.find(',')) != -1) + { + param[0] = atof(str.substr(0, bPos).c_str()); + param[1] = atof(str.substr(bPos + 1, str.length()).c_str()); + } + else + { + param[0] = atof(str.c_str()); + } + + if(addSizeMultiplier) + { + param[0] = param[0] * sizeMultiplier; + param[1] = param[1] * sizeMultiplier; + } + tf.SetOffset(param[0]); + tf.SetSlope(param[1]); +} +#endif void -gParser::parseShapeCircle(eGrid *grid, xmlNodePtr cur, float &x, float &y, float &radius, float &growth, rColor & color, const xmlChar * keyword) +gParser::parseShape(eGrid *grid, xmlNodePtr cur, const xmlChar * keyword, zShapePtr &shape) { - radius = myxmlGetPropFloat(cur, "radius"); - growth = myxmlGetPropFloat(cur, "growth"); + tValue::BasePtr xp; + tValue::BasePtr yp; + bool centerLocationFound = false; + if (myxmlHasProp(cur, "scale")) { +#ifdef DADA + tString str = tString("(") + tString(myxmlGetProp(cur, "scale")) + tString(")*sizeMultiplier()"); + shape->setScale( tValue::BasePtr( new tValue::Expr (str, tValue::Expr::vars, tValue::Expr::functions)), str ); +#else + string str = string(myxmlGetProp(cur, "scale")); + tFunction tfScale; + myCheapParameterSplitter(str, tfScale, false); + shape->setScale( tfScale ); +#endif + } + + if (myxmlHasProp(cur, "rotation")) { +#ifdef DADA + tString str = tString(myxmlGetProp(cur, "rotation")); + shape->setRotation( tValue::BasePtr( new tValue::Expr (str, tValue::Expr::vars, tValue::Expr::functions)), str ); +#else + string str = string(myxmlGetProp(cur, "rotation")); + tFunction tfRotation; + myCheapParameterSplitter(str, tfRotation, false); + shape->setRotation( tfRotation ); +#endif + } + cur = cur->xmlChildrenNode; while( cur != NULL) { if (!xmlStrcmp(cur->name, (const xmlChar *)"text") || !xmlStrcmp(cur->name, (const xmlChar *)"comment")) {} else if (isElement(cur->name, (const xmlChar *)"Point", keyword)) { /* We need to multipy by sizeMultiper so the item are properly placed*/ - x = myxmlGetPropFloat(cur, "x") *sizeMultiplier; - y = myxmlGetPropFloat(cur, "y") *sizeMultiplier; +#ifdef DADA + tString strX = tString("(" + tString(myxmlGetProp(cur, "x")) + ")*sizeMultiplier()"); + xp = tValue::BasePtr( new tValue::Expr (strX, tValue::Expr::vars, tValue::Expr::functions) ); + tString strY = tString("(" + tString(myxmlGetProp(cur, "y")) + ")*sizeMultiplier()"); + yp = tValue::BasePtr( new tValue::Expr (strY, tValue::Expr::vars, tValue::Expr::functions) ); + if(centerLocationFound == false) { + shape->setPosX( xp, strX ); + shape->setPosY( yp, strY ); + centerLocationFound = true; + } + else { + zShapePolygon *tmpShapePolygon = dynamic_cast<zShapePolygon *>( shape.get() ); + if (tmpShapePolygon) + tmpShapePolygon->addPoint( myPoint( xp, yp ), std::pair<tString, tString>(strX, strY) ); + } +#else + string strX = string(myxmlGetProp(cur, "x")); + tFunction tfX; + myCheapParameterSplitter(strX, tfX, true); + string strY = string(myxmlGetProp(cur, "y")); + tFunction tfY; + myCheapParameterSplitter(strY, tfY, true); + + if(centerLocationFound == false) { + shape->setPosX( tfX ); + shape->setPosY( tfY ); + centerLocationFound = true; + } + else { + zShapePolygon *tmpShapePolygon = dynamic_cast<zShapePolygon *>( (zShape*)shape ); + if (tmpShapePolygon) + tmpShapePolygon->addPoint( myPoint( tfX, tfY ) ); + } +#endif + endElementAlternative(grid, cur, keyword); } + else if (isElement(cur->name, (const xmlChar *)"Color", keyword)) { - color = parseColor(grid, cur, keyword); + shape->setColor( parseColor(grid, cur, keyword) ); endElementAlternative(grid, cur, keyword); } @@ -480,7 +644,9 @@ else { // make an empty zone and store under the right label // It should be populated later - refZone = zZonePtr(new zZone(grid)); + + // refZone = zZonePtr(new zZone(grid)); + refZone = tNEW(zZone)(grid); if (!zoneName.empty()) mapZones[zoneName] = refZone; } @@ -494,9 +660,9 @@ b->set(myxmlGetPropFloat(cur, "rotationSpeed"), myxmlGetPropFloat(cur, "rotationAcceleration")); infl->addZoneInfluenceRule(zZoneInfluenceItemPtr(b)); } - else if (isElement(cur->name, (const xmlChar *)"Radius", keyword)) { - zZoneInfluenceItemRadius *b = new zZoneInfluenceItemRadius(refZone); - b->set(myxmlGetPropFloat(cur, "radius") *sizeMultiplier); + else if (isElement(cur->name, (const xmlChar *)"Scale", keyword)) { + zZoneInfluenceItemScale *b = new zZoneInfluenceItemScale(refZone); + b->set(myxmlGetPropFloat(cur, "scale") *sizeMultiplier); infl->addZoneInfluenceRule(zZoneInfluenceItemPtr(b)); } else if (isElement(cur->name, (const xmlChar *)"Color", keyword)) { @@ -578,7 +744,7 @@ /* effectors[tString("event")] = zEffectorEvent::create; - effectors[tString("cleartrace")] = zEffectorClearTrace::create; + effectors[tString("cleartrace")] = zEffectorClearrace::create; effectors[tString("teleport")] = zEffectorTeleport::create; */ effectors[tString("spawnplayer")] = zEffectorSpawnPlayer::create; @@ -765,7 +931,7 @@ /* Store the owner information */ - gVectorExtra< ePlayerNetID * > owners; + gVectorExtra< nNetObjectID > nidPlayerOwners; if(xmlHasProp(cur, (const xmlChar*)"owners")) { @@ -779,11 +945,12 @@ /* * Map from map descriptor to in-game ids */ + /* for (int i=0; i<se_PlayerNetIDs.Len(); i++) { // TODO: change this to a call to Joda's code tString str(*iter); if ( se_PlayerNetIDs(i)->GetName() == str ) { - owners.push_back( se_PlayerNetIDs(i) ); + nidPlayerOwners.push_back( se_PlayerNetIDs(i) ); } //Hack to support referring to players without knowing their names. int id; @@ -793,13 +960,47 @@ } } } + */ + MapIdToGameId::iterator asdf = playerAsso.find(*iter); + if(asdf != playerAsso.end()) { + std::cout << "********** player matching " << (*iter) << std::endl; + nidPlayerOwners.push_back( (*asdf).second ); + } + else { + std::cout << "********** player not matching " << (*iter) << " ***" <<std::endl; + } } } /* + * Store the teamOwners information + */ + gVectorExtra< nNetObjectID > nidTeamOwners; + + if(xmlHasProp(cur, (const xmlChar*)"teamOwners")) + { + string ownersDesc( myxmlGetProp(cur, "teamOwners")); + boost::tokenizer<> tok(ownersDesc); + + for(boost::tokenizer<>::iterator iter=tok.begin(); + iter!=tok.end(); + ++iter) + { + MapIdToGameId::iterator asdf = teamAsso.find(*iter); + if(asdf != teamAsso.end()) { + std::cout << "********** team matching " << (*iter) << std::endl; + nidTeamOwners.push_back( (*asdf).second ); + } + else { + std::cout << "********** team not matching " << (*iter) << " ***" <<std::endl; + } + } + } + + /* * Prepare a new EffectGroup */ - zEffectGroupPtr currentZoneEffect = zEffectGroupPtr(new zEffectGroup(owners, gVectorExtra<eTeam *>())); + zEffectGroupPtr currentZoneEffect = zEffectGroupPtr(new zEffectGroup(nidPlayerOwners, nidTeamOwners)); cur = cur->xmlChildrenNode; @@ -823,7 +1024,6 @@ void gParser::parseZone(eGrid * grid, xmlNodePtr cur, const xmlChar * keyword) { - float x=0.0, y=0.0, radius=0.0, growth=0.0; string zoneName = ""; if(myxmlHasProp(cur, "name")) @@ -853,8 +1053,11 @@ while(cur != NULL) { if (!xmlStrcmp(cur->name, (const xmlChar *)"text") || !xmlStrcmp(cur->name, (const xmlChar *)"comment")) {} else if (isElement(cur->name, (const xmlChar *)"ShapeCircle", keyword)) { - parseShapeCircle(grid, cur, x, y, radius, growth, color, keyword); + zone->setShape( parseShapeCircle(grid, cur, zone->ID(), keyword) ); } + else if (isElement(cur->name, (const xmlChar *)"ShapePolygon", keyword)) { + zone->setShape( parseShapePolygon(grid, cur, zone->ID(), keyword) ); + } else if (isElement(cur->name, (const xmlChar *)"Enter", keyword)) { xmlNodePtr cur2 = cur->xmlChildrenNode; while(cur2 != NULL) { @@ -906,11 +1109,6 @@ // leaving zone undeleted is no memory leak here, the grid takes control of it if ( zone ) { - zone->SetColor(color); - zone->SetPosition( eCoord(x, y) ); - zone->SetRadius( radius * sizeMultiplier ); - zone->SetExpansionSpeed( growth*sizeMultiplier ); - zone->SetRotationSpeed( .3f ); zone->RequestSync(); } } @@ -1251,6 +1449,10 @@ else if (isElement(cur->name, (const xmlChar *)"Axes", keyword)) { parseAxes(grid, cur, keyword); } + // Introduced in version 2, but no extra logic is required for it. + else if (isElement(cur->name, (const xmlChar *)"Ownership", keyword)) { + parseOwnership(grid, cur, keyword); + } else if (isElement(cur->name, (const xmlChar *)"Spawn", keyword)) { parseSpawn(grid, cur, keyword); } @@ -1281,9 +1483,119 @@ } } +/** + * + */ +const char * TEAM_ID_STR = "teamId"; +const char * PLAYER_ID_STR = "playerId"; + void +gParser::parseOwnership(eGrid *grid, xmlNodePtr cur, const xmlChar * keyword) +{ + // Prepare the structures to store the ownership information + TeamOwnershipInfo mapIdOfTeamOwners; + std::cout << "############ about to clean" << std::endl; + playerAsso.erase(playerAsso.begin(), playerAsso.end()); + teamAsso.erase(teamAsso.begin(), teamAsso.end()); + + cur = cur->xmlChildrenNode; + while (cur != NULL) { + if (!xmlStrcmp(cur->name, (const xmlChar *)"text") || !xmlStrcmp(cur->name, (const xmlChar *)"comment")) {} + else if (isElement(cur->name, (const xmlChar *)"TeamOwnership", keyword)) { + parseTeamOwnership(grid, cur, keyword, mapIdOfTeamOwners); + } + cur = cur->next; + } + + // BOP + // The association between teamId and in-game teams should be moved to its own class + + std::cout << "###################" << std::endl; + std::cout << "number of teams " << eTeam::teams.Len() << std::endl; + + TeamOwnershipInfo::iterator iterTeamOwnership = mapIdOfTeamOwners.begin(); + for(int index=0; index<eTeam::teams.Len() && iterTeamOwnership != mapIdOfTeamOwners.end(); ) { + eTeam* ee = eTeam::teams[index]; + string teamId = (*iterTeamOwnership).first; + std::cout << "associating " << teamId << " with " << ee->Name() << " net ID:" << ee->ID() << std::endl; + MapIdToGameId::value_type asdf(teamId, ee->ID()); + + // Store the association between the map id and the in-game id + teamAsso.insert(asdf); + + std::set<string> playerIdForThisTeam = (*iterTeamOwnership).second; + int indexPlayer=0; + for(std::set<string>::iterator iter = playerIdForThisTeam.begin(); + iter != playerIdForThisTeam.end() && indexPlayer<ee->NumPlayers(); + ++iter, ++indexPlayer) { + ePlayerNetID *aa = ee->Player(indexPlayer); + string playerId = (*iter); + // TODO + // HACK + // BOP + // The following might produce unexpected results should the same playerId be associated in many team + MapIdToGameId::value_type jj(playerId, aa->ID()); + std::cout << "associating in team " << teamId << " player: " << playerId << " with: " << aa->GetName() << std::endl; + playerAsso.insert(jj); + } + ++index; ++iterTeamOwnership; + } + // EOP +} + +void +gParser::parseTeamOwnership(eGrid *grid, xmlNodePtr cur, const xmlChar * keyword, TeamOwnershipInfo & mapIdOfTeamOwners) +{ + // Explore the teamId attribute + if(myxmlHasProp(cur, TEAM_ID_STR )) { + string tOwnersDesc( myxmlGetProp(cur, TEAM_ID_STR)); + boost::tokenizer<> tokTeam(tOwnersDesc); + + for(boost::tokenizer<>::iterator tokTeamIter=tokTeam.begin(); + tokTeamIter!=tokTeam.end(); + ++tokTeamIter) { + tString aTeamId = tString(*tokTeamIter); + TeamOwnershipInfo::iterator teamIter = mapIdOfTeamOwners.find(aTeamId); + // Add the teamId to the list if abscent + if(teamIter == mapIdOfTeamOwners.end()) { + // teamIter = team.insert(std::pair<string, std::set<string> >( aTeamId, std::set<string> )); + std::pair<string, std::set<string> > asdf( aTeamId, std::set<string>() ); + teamIter = mapIdOfTeamOwners.insert(teamIter, asdf); + } + + // Should the team receive playerId + if(myxmlHasProp(cur, PLAYER_ID_STR)) { + // Extract all the playerId for this team + string plOwnersDesc( myxmlGetProp(cur, PLAYER_ID_STR) ); + boost::tokenizer<> tokPlayer(plOwnersDesc); + for(boost::tokenizer<>::iterator tokPlayerIter=tokPlayer.begin(); + tokPlayerIter!=tokPlayer.end(); + ++tokPlayerIter) { + tString aPlayerId = tString(*tokPlayerIter); + + std::set<string> aa = (*teamIter).second; + aa.insert(aPlayerId); + (*teamIter).second = aa; + } + } + } + } + else { + // TeamId is #REQUIRED, this should not happen + } +} + +void gParser::parseWorld(eGrid *grid, xmlNodePtr cur, const xmlChar * keyword) { + // Polygon shapes are not supported by older clients. + // This mechanism assume that no polygonal shapes are used until one is found. + // Hopefully someone will come with a better solution. + std::stringstream ss; + /* Yes it is ackward to generate a string that will be decifered on the other end*/ + ss << "POLYGONAL_SHAPE_USED FALSE"; + tConfItemBase::LoadLine(ss); + cur = cur->xmlChildrenNode; while (cur != NULL) { if (!xmlStrcmp(cur->name, (const xmlChar *)"text") || !xmlStrcmp(cur->name, (const xmlChar *)"comment")) {} @@ -1341,6 +1653,8 @@ void gParser::parseMap(eGrid *grid, xmlNodePtr cur, const xmlChar * keyword) { + + cur = cur->xmlChildrenNode; while (cur != NULL) { if (!xmlStrcmp(cur->name, (const xmlChar *)"text") || !xmlStrcmp(cur->name, (const xmlChar *)"comment")) {} @@ -1375,7 +1689,9 @@ cur = xmlDocGetRootElement(m_Doc); monitors.clear(); - mapZones.clear(); +#ifdef DEBUG_ZONE_SYNC + newGameRound = true; +#endif //DEBUG_ZONE_SYNC if (cur == NULL) { con << "ERROR: Map file is blank\n"; @@ -1426,6 +1742,8 @@ } } + mapZones.clear(); + // fprintf(stderr,"ERROR: Map file is missing root \'Resources\' node"); } Modified: armagetronad/trunk/armagetronad/src/tron/gParser.h =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gParser.h 2007-05-26 07:23:51 UTC (rev 7267) +++ armagetronad/trunk/armagetronad/src/tron/gParser.h 2007-05-26 07:38:55 UTC (rev 7268) @@ -6,6 +6,8 @@ #include "tXmlParser.h" #include "eCoord.h" #include "tValue.h" +#include <map> +#include <string> class eGrid; class gArena; @@ -69,7 +71,9 @@ rColor parseColor(eGrid *grid, xmlNodePtr cur, const xmlChar * keyword); - void parseShapeCircle(eGrid *grid, xmlNodePtr cur, float &x, float &y, float &radius, float &growth, rColor &color, const xmlChar * keyword); + zShapePtr parseShapeCircle(eGrid *grid, xmlNodePtr cur, short unsigned int idZone, const xmlChar * keyword); + zShapePtr parseShapePolygon(eGrid *grid, xmlNodePtr cur, short unsigned int idZone, const xmlChar * keyword); + void parseShape(eGrid *grid, xmlNodePtr cur, const xmlChar * keyword, zShapePtr &shape); void parseMonitor(eGrid * grid, xmlNodePtr cur, const xmlChar * keyword); zEffectGroupPtr parseZoneEffectGroup(eGrid *grid, xmlNodePtr cur, const xmlChar * keyword); @@ -80,6 +84,10 @@ zZoneInfluencePtr parseZoneEffectGroupZone(eGrid * grid, xmlNodePtr cur, const xmlChar * keyword); + typedef std::map<string, std::set<string> > TeamOwnershipInfo; + typedef std::map<string, std::set<string> >::value_type TeamOwnershipInfoType; + void parseOwnership(eGrid *grid, xmlNodePtr cur, const xmlChar * keyword); + void parseTeamOwnership(eGrid *grid, xmlNodePtr cur, const xmlChar * keyword, TeamOwnershipInfo & team); void parseField(eGrid *grid, xmlNodePtr cur, const xmlChar * keyword); void parseWorld(eGrid *grid, xmlNodePtr cur, const xmlChar * keyword = NULL); void parseMap(eGrid *grid, xmlNodePtr cur, const xmlChar * keyword = NULL); @@ -93,8 +101,16 @@ void parseWallRect(eGrid *grid, xmlNodePtr cur, const xmlChar * keyword); void parseObstacleWall(eGrid *grid, xmlNodePtr cur, const xmlChar * keyword); +#ifndef DADA + void myCheapParameterSplitter(const string &str, tFunction &tf, bool addSizeMultiplier=false); +#endif + /* This is a hack that will bring shame to my decendants for many generations: */ float sizeMultiplier; + int currentFormat; // Store the format version of the map currently being parsed. Used to support different format. + public: + tValue::Expr::varmap_t vars; + tValue::Expr::funcmap_t functions; }; #endif //ArmageTron_PARSER_H Modified: armagetronad/trunk/armagetronad/src/tron/zone/zEffectGroup.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/zone/zEffectGroup.cpp 2007-05-26 07:23:51 UTC (rev 7267) +++ armagetronad/trunk/armagetronad/src/tron/zone/zEffectGroup.cpp 2007-05-26 07:38:55 UTC (rev 7268) @@ -27,7 +27,7 @@ #include "zone/zEffectGroup.h" -zEffectGroup::zEffectGroup(gVectorExtra<ePlayerNetID *> const owners, gVectorExtra<eTeam *> const teamOwners): +zEffectGroup::zEffectGroup(gVectorExtra< nNetObjectID > const owners, gVectorExtra< nNetObjectID > const teamOwners): validators(), d_owners(owners), d_teamOwners(teamOwners), Modified: armagetronad/trunk/armagetronad/src/tron/zone/zEffectGroup.h =================================================================== --- armagetronad/trunk/armagetronad/src/tron/zone/zEffectGroup.h 2007-05-26 07:23:51 UTC (rev 7267) +++ armagetronad/trunk/armagetronad/src/tron/zone/zEffectGroup.h 2007-05-26 07:38:55 UTC (rev 7268) @@ -41,7 +41,7 @@ { public: zEffectGroup(); - zEffectGroup(gVectorExtra<ePlayerNetID *> const owners, gVectorExtra<eTeam *> const teamOwners); + zEffectGroup(gVectorExtra< nNetObjectID > const owners, gVectorExtra< nNetObjectID > const teamOwners); zEffectGroup(zEffectGroup const &other); ~zEffectGroup(); void operator=(zEffectGroup const &other); @@ -55,15 +55,15 @@ //callback functions gCycle * cb_PossibleUser(void); //!< Gets the used rubber for the currently watched cycle - gVectorExtra<ePlayerNetID *> cb_Owners(void); - gVectorExtra<eTeam *> cb_TeamOwners(void); + gVectorExtra< nNetObjectID > cb_Owners(void); + gVectorExtra< nNetObjectID > cb_TeamOwners(void); gVectorExtra<ePlayerNetID *> cb_Targets(void); protected: std::vector<zValidatorPtr> validators; - gVectorExtra<ePlayerNetID *> d_owners; - gVectorExtra<eTeam *> d_teamOwners; + gVectorExtra< nNetObjectID > d_owners; + gVectorExtra< nNetObjectID > d_teamOwners; gVectorExtra<ePlayerNetID *> d_calculatedTargets; Modified: armagetronad/trunk/armagetronad/src/tron/zone/zEffector.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/zone/zEffector.cpp 2007-05-26 07:23:51 UTC (rev 7267) +++ armagetronad/trunk/armagetronad/src/tron/zone/zEffector.cpp 2007-05-26 07:38:55 UTC (rev 7268) @@ -101,7 +101,6 @@ void zEffectorDeath::effect(gVectorExtra<ePlayerNetID *> &d_calculatedTargets) { - if (count == -1 || count > 0) { gVectorExtra<ePlayerNetID *>::iterator iter; for(iter = d_calculatedTargets.begin(); iter != d_calculatedTargets.end(); @@ -109,9 +108,6 @@ { static_cast<gCycle *>((*iter)->Object())->Kill(); } - if (count > 0) - count --; - } } // @@ -120,7 +116,6 @@ void zEffectorPoint::effect(gVectorExtra<ePlayerNetID *> &d_calculatedTargets) { - if (count == -1 || count > 0) { gVectorExtra<ePlayerNetID *>::iterator iter; for(iter = d_calculatedTargets.begin(); iter != d_calculatedTargets.end(); @@ -129,9 +124,6 @@ // (*iter)->AddScore(d_score, tOutput(), "$player_lose_suicide"); (*iter)->AddScore(d_score, tOutput(), message); } - if (count > 0) - count --; - } } // @@ -140,7 +132,6 @@ void zEffectorCycleRubber::effect(gVectorExtra<ePlayerNetID *> &d_calculatedTargets) { - if (count == -1 || count > 0) { gVectorExtra<ePlayerNetID *>::iterator iter; for(iter = d_calculatedTargets.begin(); iter != d_calculatedTargets.end(); @@ -148,9 +139,6 @@ { static_cast<gCycle *>((*iter)->Object())->SetRubber(0.0); } - if (count > 0) - count --; - } } @@ -160,7 +148,6 @@ void zEffectorCycleBrake::effect(gVectorExtra<ePlayerNetID *> &d_calculatedTargets) { - if (count == -1 || count > 0) { gVectorExtra<ePlayerNetID *>::iterator iter; for(iter = d_calculatedTargets.begin(); iter != d_calculatedTargets.end(); @@ -168,9 +155,6 @@ { static_cast<gCycle *>((*iter)->Object())->SetBrakingReservoir(1.0); } - if (count > 0) - count --; - } } // @@ -179,7 +163,6 @@ void zEffectorSpawnPlayer::effect(gVectorExtra<ePlayerNetID *> &d_calculatedTargets) { - if (count == -1 || count > 0) { gVectorExtra<ePlayerNetID *>::iterator iter; for(iter = d_calculatedTargets.begin(); iter != d_calculatedTargets.end(); @@ -187,21 +170,14 @@ { sg_RespawnPlayer(grid, arena, (*iter)); } - if (count > 0) - count --; - } } void zEffectorSetting::effect(gVectorExtra<ePlayerNetID *> &d_calculatedTargets) { - if (count == -1 || count > 0) { std::stringstream ss; ss << settingName << " " << settingValue; tConfItemBase::LoadAll(ss); - if (count > 0) - count --; - } } Modified: armagetronad/trunk/armagetronad/src/tron/zone/zMonitor.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/zone/zMonitor.cpp 2007-05-26 07:23:51 UTC (rev 7267) +++ armagetronad/trunk/armagetronad/src/tron/zone/zMonitor.cpp 2007-05-26 07:38:55 UTC (rev 7268) @@ -175,7 +175,7 @@ } void -zMonitorInfluence::apply(gVectorExtra<ePlayerNetID *> &owners, gVectorExtra<eTeam *> &teamOwners, gCycle * user) { +zMonitorInfluence::apply(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, gCycle * user) { // Currently, we discard ownership information if (influenceSlideAvailable == true) monitor->affectSlide(user, influenceSlide, marked); Modified: armagetronad/trunk/armagetronad/src/tron/zone/zMonitor.h =================================================================== --- armagetronad/trunk/armagetronad/src/tron/zone/zMonitor.h 2007-05-26 07:23:51 UTC (rev 7267) +++ armagetronad/trunk/armagetronad/src/tron/zone/zMonitor.h 2007-05-26 07:38:55 UTC (rev 7268) @@ -174,7 +174,7 @@ { }; ~zMonitorInfluence() { }; - void apply(gVectorExtra<ePlayerNetID *> &owners, gVectorExtra<eTeam *> &teamOwners, gCycle* triggerer); + void apply(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, gCycle* triggerer); void setMarked(Triad mark) {marked = mark;}; void setInfluenceSlide(REAL infl) {influenceSlide = infl; influenceSlideAvailable=true;}; Modified: armagetronad/trunk/armagetronad/src/tron/zone/zSelector.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/zone/zSelector.cpp 2007-05-26 07:23:51 UTC (rev 7267) +++ armagetronad/trunk/armagetronad/src/tron/zone/zSelector.cpp 2007-05-26 07:38:55 UTC (rev 7268) @@ -78,14 +78,14 @@ return new zSelector(*this); } -gVectorExtra<ePlayerNetID *> zSelector::select(gVectorExtra<ePlayerNetID *> &owners, gVectorExtra<eTeam *> &teamOwners, gCycle * triggerer) +gVectorExtra<ePlayerNetID *> zSelector::select(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, gCycle * triggerer) { gVectorExtra<ePlayerNetID *> empty; return empty; } void -zSelector::apply(gVectorExtra<ePlayerNetID *> &owners, gVectorExtra<eTeam *> &teamOwners, gCycle * triggerer) +zSelector::apply(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, gCycle * triggerer) { if (count == -1 || count > 0) { @@ -128,7 +128,7 @@ return new zSelectorSelf(*this); } -gVectorExtra<ePlayerNetID *> zSelectorSelf::select(gVectorExtra<ePlayerNetID *> &owners, gVectorExtra<eTeam *> &teamOwners, gCycle * triggerer) +gVectorExtra<ePlayerNetID *> zSelectorSelf::select(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, gCycle * triggerer) { gVectorExtra<ePlayerNetID *> self; ePlayerNetID* triggererPlayer = triggerer->Player(); @@ -165,7 +165,7 @@ return new zSelectorTeammate(*this); } -gVectorExtra<ePlayerNetID *> zSelectorTeammate::select(gVectorExtra<ePlayerNetID *> &owners, gVectorExtra<eTeam *> &teamOwners, gCycle * triggerer) +gVectorExtra<ePlayerNetID *> zSelectorTeammate::select(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, gCycle * triggerer) { // A single, randomly selected player that is member of the team of // the player that triggered the Zone receives the effect. This @@ -213,7 +213,7 @@ return new zSelectorTeam(*this); } -gVectorExtra<ePlayerNetID *> zSelectorTeam::select(gVectorExtra<ePlayerNetID *> &owners, gVectorExtra<eTeam *> &teamOwners, gCycle * triggerer) +gVectorExtra<ePlayerNetID *> zSelectorTeam::select(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, gCycle * triggerer) { // All the members of the team of the player triggering the // Zone will receive its effect. @@ -254,7 +254,7 @@ return new zSelectorAll(*this); } -gVectorExtra<ePlayerNetID *> zSelectorAll::select(gVectorExtra<ePlayerNetID *> &owners, gVectorExtra<eTeam *> &teamOwners, gCycle * triggerer) +gVectorExtra<ePlayerNetID *> zSelectorAll::select(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, gCycle * triggerer) { // Everybody in the game receives the effect. gVectorExtra<ePlayerNetID *> everybody; @@ -294,7 +294,7 @@ return new zSelectorAllButSelf(*this); } -gVectorExtra<ePlayerNetID *> zSelectorAllButSelf::select(gVectorExtra<ePlayerNetID *> &owners, gVectorExtra<eTeam *> &teamOwners, gCycle * triggerer) +gVectorExtra<ePlayerNetID *> zSelectorAllButSelf::select(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, gCycle * triggerer) { // Everybody in the game but the player who triggered the // Zone receives the effect. This excludes the player @@ -344,7 +344,7 @@ return new zSelectorAllButTeam(*this); } -gVectorExtra<ePlayerNetID *> zSelectorAllButTeam::select(gVectorExtra<ePlayerNetID *> &owners, gVectorExtra<eTeam *> &teamOwners, gCycle * triggerer) +gVectorExtra<ePlayerNetID *> zSelectorAllButTeam::select(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, gCycle * triggerer) { @@ -394,7 +394,7 @@ return new zSelectorAnother(*this); } -gVectorExtra<ePlayerNetID *> zSelectorAnother::select(gVectorExtra<ePlayerNetID *> &owners, gVectorExtra<eTeam *> &teamOwners, gCycle * triggerer) +gVectorExtra<ePlayerNetID *> zSelectorAnother::select(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, gCycle * triggerer) { // Another single, randomly selected player that is the the one that // triggered the Zone receive the effect. This excludes the player @@ -448,12 +448,24 @@ return new zSelectorOwner(*this); } -gVectorExtra<ePlayerNetID *> zSelectorOwner::select(gVectorExtra<ePlayerNetID *> &owners, gVectorExtra<eTeam *> &teamOwners, gCycle * triggerer) +gVectorExtra<ePlayerNetID *> zSelectorOwner::select(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, gCycle * triggerer) { // The owner of the Zone receives the effect upon trigger, // irrelevantly of the user who triggers it. + gVectorExtra<ePlayerNetID *> owningPlayers; - return owners; + for(gVectorExtra< nNetObjectID >::const_iterator iter=owners.begin(); + iter!=owners.end(); + ++iter) { + // Is the object still there + if(bool(sn_netObjects[(*iter)])) + { + ePlayerNetID * anOwner = static_cast< ePlayerNetID* >( static_cast< nNetObject* >( sn_netObjects[ (*iter) ] ) ) ; + if(anOwner != 0) + owningPlayers.push_back( anOwner ); + } + } + return owningPlayers; } // @@ -483,19 +495,26 @@ return new zSelectorOwnerTeam(*this); } -gVectorExtra<ePlayerNetID *> zSelectorOwnerTeam::select(gVectorExtra<ePlayerNetID *> &owners, gVectorExtra<eTeam *> &teamOwners, gCycle * triggerer) +gVectorExtra<ePlayerNetID *> zSelectorOwnerTeam::select(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, gCycle * triggerer) { // The members of the team that owns the Zone receives the // effect upon trigger, irrelevantly of the user who triggers it. // Pick all the members of the teams gVectorExtra <ePlayerNetID *> allOwnerTeamMembers; - gVectorExtra<eTeam *>::const_iterator iter; + gVectorExtra< nNetObjectID >::const_iterator iter; for(iter = teamOwners.begin(); iter != teamOwners.end(); ++iter) { - allOwnerTeamMembers.insertAll((*iter)->GetAllMembers()); + // Is the object still there + if(bool(sn_netObjects[(*iter)])) + { + eTeam * aTeam = static_cast< eTeam* >( static_cast< nNetObject* >( sn_netObjects[ (*iter) ] ) ) ; + if(aTeam != 0) + allOwnerTeamMembers.insertAll(aTeam->GetAllMembers()); + + } } // Keep only the valid ones @@ -532,16 +551,22 @@ return new zSelectorOwnerTeamTeammate(*this); } -gVectorExtra<ePlayerNetID *> zSelectorOwnerTeamTeammate::select(gVectorExtra<ePlayerNetID *> &owners, gVectorExtra<eTeam *> &teamOwners, gCycle * triggerer) +gVectorExtra<ePlayerNetID *> zSelectorOwnerTeamTeammate::select(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, gCycle * triggerer) { // Pick all the members of the teams gVectorExtra <ePlayerNetID *> allTeammates; - gVectorExtra<eTeam *>::const_iterator iter; + gVectorExtra< nNetObjectID >::const_iterator iter; for(iter = teamOwners.begin(); iter != teamOwners.end(); ++iter) { - allTeammates.insertAll((*iter)->GetAllMembers()); + // Is the object still there + if(bool(sn_netObjects[(*iter)])) + { + eTeam * aTeam = static_cast< eTeam* >( static_cast< nNetObject* >( sn_netObjects[ (*iter) ] ) ) ; + if(aTeam != 0) + allTeammates.insertAll(aTeam->GetAllMembers()); + } } // Keep only the valid ones @@ -581,7 +606,7 @@ return new zSelectorAnyDead(*this); } -gVectorExtra<ePlayerNetID *> zSelectorAnyDead::select(gVectorExtra<ePlayerNetID *> &owners, gVectorExtra<eTeam *> &teamOwners, gCycle * triggerer) +gVectorExtra<ePlayerNetID *> zSelectorAnyDead::select(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, gCycle * triggerer) { // A single, randomly selected dead player receives the // effect. @@ -627,7 +652,7 @@ return new zSelectorAllDead(*this); } -gVectorExtra<ePlayerNetID *> zSelectorAllDead::select(gVectorExtra<ePlayerNetID *> &owners, gVectorExtra<eTeam *> &teamOwners, gCycle * triggerer) +gVectorExtra<ePlayerNetID *> zSelectorAllDead::select(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, gCycle * triggerer) { // All dead players receives the effect. @@ -668,17 +693,32 @@ return new zSelectorSingleDeadOwner(*this); } -gVectorExtra<ePlayerNetID *> zSelectorSingleDeadOwner::select(gVectorExtra<ePlayerNetID *> &owners, gVectorExtra<eTeam *> &teamOwners, gCycle * triggerer) +gVectorExtra<ePlayerNetID *> zSelectorSingleDeadOwner::select(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, gCycle * triggerer) { // A single, randomly selected dead member of // the team of the player that triggered the Zone receives the // effect. + gVectorExtra <ePlayerNetID *> owningPlayers; gVectorExtra <ePlayerNetID *> deadOwners; gVectorExtra <ePlayerNetID *> singleDeadOwner; - getAllValid(deadOwners, owners, _dead); + // Transform the list of owners' id into a list of ePlayer + for(gVectorExtra< nNetObjectID >::const_iterator iter=owners.begin(); + iter!=owners.end(); + ++iter) { + // Is the object still there + if(bool(sn_netObjects[(*iter)])) + { + ePlayerNetID * aPlayer = static_cast< ePlayerNetID* >( static_cast< nNetObject* >( sn_netObjects[ (*iter) ] ) ) ; + if(aPlayer != 0) + owningPlayers.push_back( aPlayer ); + } + } + // Preserve only the dead players + getAllValid(deadOwners, owningPlayers, _dead); + // Who is our lucky candidate ? if(deadOwners.size() != 0) singleDeadOwner.push_back(pickOne(deadOwners)); @@ -714,7 +754,7 @@ return new zSelectorAnotherTeammateDead(*this); } -gVectorExtra<ePlayerNetID *> zSelectorAnotherTeammateDead::select(gVectorExtra<ePlayerNetID *> &owners, gVectorExtra<eTeam *> &teamOwners, gCycle * triggerer) +gVectorExtra<ePlayerNetID *> zSelectorAnotherTeammateDead::select(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, gCycle * triggerer) { // A single, randomly selected dead member of // the team of the player that triggered the Zone receives the @@ -764,7 +804,7 @@ return new zSelectorAnotherNotTeammateDead(*this); } -gVectorExtra<ePlayerNetID *> zSelectorAnotherNotTeammateDead::select(gVectorExtra<ePlayerNetID *> &owners, gVectorExtra<eTeam *> &teamOwners, gCycle * triggerer) +gVectorExtra<ePlayerNetID *> zSelectorAnotherNotTeammateDead::select(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, gCycle * triggerer) { // A single, randomly selected dead player receives the // effect. Modified: armagetronad/trunk/armagetronad/src/tron/zone/zSelector.h =================================================================== --- armagetronad/trunk/armagetronad/src/tron/zone/zSelector.h 2007-05-26 07:23:51 UTC (rev 7267) +++ armagetronad/trunk/armagetronad/src/tron/zone/zSelector.h 2007-05-26 07:38:55 UTC (rev 7268) @@ -58,12 +58,12 @@ virtual zSelector *copy(void) const; virtual ~zSelector() {}; - void apply(gVectorExtra<ePlayerNetID *> &owners, gVectorExtra<eTeam *> &teamOwners, gCycle * triggerer); + void apply(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, gCycle * triggerer); void setCount(int _count) {count = _count;}; void addEffector(zEffectorPtr newEffector) {effectors.push_back( newEffector );}; protected: - virtual gVectorExtra<ePlayerNetID *> select(gVectorExtra<ePlayerNetID *> &owners, gVectorExtra<eTeam *> &teamOwners, gCycle * triggerer); + virtual gVectorExtra<ePlayerNetID *> select(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, gCycle * triggerer); protected: zEffectorPtrs effectors; int count; @@ -89,7 +89,7 @@ virtual zSelectorSelf *copy(void) const; virtual ~zSelectorSelf() {}; - gVectorExtra<ePlayerNetID *> select(gVectorExtra<ePlayerNetID *> &owners, gVectorExtra<eTeam *> &teamOwners, gCycle * triggerer); + gVectorExtra<ePlayerNetID *> select(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, gCycle * triggerer); }; /* @@ -105,7 +105,7 @@ virtual zSelectorTeammate *copy(void) const; virtual ~zSelectorTeammate() {}; - gVectorExtra<ePlayerNetID *> select(gVectorExtra<ePlayerNetID *> &owners, gVectorExtra<eTeam *> &teamOwners, gCycle * triggerer); + gVectorExtra<ePlayerNetID *> select(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, gCycle * triggerer); }; /* @@ -121,7 +121,7 @@ virtual zSelectorTeam *copy(void) const; virtual ~zSelectorTeam() {}; - gVectorExtra<ePlayerNetID *> select(gVectorExtra<ePlayerNetID *> &owners, gVectorExtra<eTeam *> &teamOwners, gCycle * triggerer); + gVectorExtra<ePlayerNetID *> select(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, gCycle * triggerer); }; /* @@ -137,7 +137,7 @@ virtual zSelectorAll *copy(void) const; virtual ~zSelectorAll() {}; - gVectorExtra<ePlayerNetID *> select(gVectorExtra<ePlayerNetID *> &owners, gVectorExtra<eTeam *> &teamOwners, gCycle * triggerer); + gVectorExtra<ePlayerNetID *> select(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, gCycle * triggerer); }; /* @@ -153,7 +153,7 @@ virtual zSelectorAllButSelf *copy(void) const; virtual ~zSelectorAllButSelf() {}; - gVectorExtra<ePlayerNetID *> select(gVectorExtra<ePlayerNetID *> &owners, gVectorExtra<eTeam *> &teamOwners, gCycle * triggerer); + gVectorExtra<ePlayerNetID *> select(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, gCycle * triggerer); }; /* @@ -170,7 +170,7 @@ virtual zSelectorAllButTeam *copy(void) const; virtual ~zSelectorAllButTeam() {}; - gVectorExtra<ePlayerNetID *> select(gVectorExtra<ePlayerNetID *> &owners, gVectorExtra<eTeam *> &teamOwners, gCycle * triggerer); + gVectorExtra<ePlayerNetID *> select(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, gCycle * triggerer); }; */ @@ -187,7 +187,7 @@ virtual zSelectorAnother *copy(void) const; virtual ~zSelectorAnother() {}; - gVectorExtra<ePlayerNetID *> select(gVectorExtra<ePlayerNetID *> &owners, gVectorExtra<eTeam *> &teamOwners, gCycle * triggerer); + gVectorExtra<ePlayerNetID *> select(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, gCycle * triggerer); }; @@ -210,7 +210,7 @@ virtual zSelectorOwner *copy(void) const; virtual ~zSelectorOwner() {}; - gVectorExtra<ePlayerNetID *> select(gVectorExtra<ePlayerNetID *> &owners, gVectorExtra<eTeam *> &teamOwners, gCycle * triggerer); + gVectorExtra<ePlayerNetID *> select(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, gCycle * triggerer); }; /* @@ -226,7 +226,7 @@ virtual zSelectorOwnerTeam *copy(void) const; virtual ~zSelectorOwnerTeam() {}; - gVectorExtra<ePlayerNetID *> select(gVectorExtra<ePlayerNetID *> &owners, gVectorExtra<eTeam *> &teamOwners, gCycle * triggerer); + gVectorExtra<ePlayerNetID *> select(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, gCycle * triggerer); }; @@ -246,7 +246,7 @@ virtual zSelectorOwnerTeamTeammate *copy(void) const; virtual ~zSelectorOwnerTeamTeammate() {}; - gVectorExtra<ePlayerNetID *> select(gVectorExtra<ePlayerNetID *> &owners, gVectorExtra<eTeam *> &teamOwners, gCycle * triggerer); + gVectorExtra<ePlayerNetID *> select(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, gCycle * triggerer); }; /* @@ -263,7 +263,7 @@ virtual zSelectorAnyDead *copy(void) const; virtual ~zSelectorAnyDead() {}; - gVectorExtra<ePlayerNetID *> select(gVectorExtra<ePlayerNetID *> &owners, gVectorExtra<eTeam *> &teamOwners, gCycle * triggerer); + gVectorExtra<ePlayerNetID *> select(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, gCycle * triggerer); }; /* @@ -280,7 +280,7 @@ virtual zSelectorAllDead *copy(void) const; virtual ~zSelectorAllDead() {}; - gVectorExtra<ePlayerNetID *> select(gVectorExtra<ePlayerNetID *> &owners, gVectorExtra<eTeam *> &teamOwners, gCycle * triggerer); + gVectorExtra<ePlayerNetID *> select(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, gCycle * triggerer); }; /* @@ -297,7 +297,7 @@ virtual zSelectorSingleDeadOwner *copy(void) const; virtual ~zSelectorSingleDeadOwner() {}; - gVectorExtra<ePlayerNetID *> select(gVectorExtra<ePlayerNetID *> &owners, gVectorExtra<eTeam *> &teamOwners, gCycle * triggerer); + gVectorExtra<ePlayerNetID *> select(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, gCycle * triggerer); }; @@ -315,7 +315,7 @@ virtual zSelectorAnotherTeammateDead *copy(void) const; virtual ~zSelectorAnotherTeammateDead() {}; - gVectorExtra<ePlayerNetID *> select(gVectorExtra<ePlayerNetID *> &owners, gVectorExtra<eTeam *> &teamOwners, gCycle * triggerer); + gVectorExtra<ePlayerNetID *> select(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, gCycle * triggerer); }; /* @@ -332,7 +332,7 @@ virtual zSelectorAnotherNotTeammateDead *copy(void) const; virtual ~zSelectorAnotherNotTeammateDead() {}; - gVectorExtra<ePlayerNetID *> select(gVectorExtra<ePlayerNetID *> &owners, gVectorExtra<eTeam *> &teamOwners, gCycle * triggerer); + gVectorExtra<ePlayerNetID *> select(gVectorExtra< nNetObjectID > &owners, gVectorExtra< nNetObjectID > &teamOwners, gCycle * triggerer); }; Copied: armagetronad/trunk/armagetronad/src/tron/zone/zShape.cpp (from rev 7243, armagetronad/branches/zone-v2-02-shape/armagetronad/src/tron/zone/zShape.cpp) =================================================================== --- armagetronad/trunk/armagetronad/src/tron/zone/zShape.cpp (rev 0) +++ armagetronad/trunk/armagetronad/src/tron/zone/zShape.cpp 2007-05-26 07:38:55 UTC (rev 7268) @@ -0,0 +1,581 @@ +#include "zShape.hpp" +#include "gCycle.h" +#include "zZone.h" + +zShape::zShape(eGrid* grid, unsigned short idZone) + :eNetGameObject( grid, eCoord(0,0), eCoord(0,0), NULL, true ), + posx_(), + posy_(), + scale_(), + rotation_(), + color_(), +#ifdef DADA + posxExpr(), + posyExpr(), + scaleExpr(), + rotationExpr(), +#endif + createdtime_(0.0), + lasttime_(0.0), + idZone_(idZone) +{} + +zShape::zShape(nMessage &m):eNetGameObject(m) +{ + tString name; + m >> name; + + REAL time; + m >> time; + ... [truncated message content] |
From: <phi...@us...> - 2007-06-09 13:29:06
|
Revision: 7291 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7291&view=rev Author: philippeqc Date: 2007-06-09 06:29:05 -0700 (Sat, 09 Jun 2007) Log Message: ----------- Rotation info was incorrectly scaled according to map size. Rules for zone monitors now can have ZoneInfluence and MonitorInfluence inside them directly. No longer need to have them in and effectGroup. The init value of a monitor is now set. Behavior is still unexpected! Shape rotation speed is now properly updated. Modified Paths: -------------- armagetronad/trunk/armagetronad/resource/proto/map-0.3.1-a.dtd armagetronad/trunk/armagetronad/src/tron/gParser.cpp armagetronad/trunk/armagetronad/src/tron/zone/zMonitor.cpp armagetronad/trunk/armagetronad/src/tron/zone/zMonitor.h armagetronad/trunk/armagetronad/src/tron/zone/zShape.cpp Modified: armagetronad/trunk/armagetronad/resource/proto/map-0.3.1-a.dtd =================================================================== --- armagetronad/trunk/armagetronad/resource/proto/map-0.3.1-a.dtd 2007-06-08 21:59:34 UTC (rev 7290) +++ armagetronad/trunk/armagetronad/resource/proto/map-0.3.1-a.dtd 2007-06-09 13:29:05 UTC (rev 7291) @@ -67,17 +67,17 @@ <!ATTLIST Monitor low CDATA "0.0"> <!ATTLIST Monitor high CDATA "1.0"> -<!ELEMENT OnOver (EffectGroup+) > +<!ELEMENT OnOver (EffectGroup | ZoneInfluence | MonitorInfluence)+ > <!ATTLIST OnOver value CDATA #REQUIRED> -<!ELEMENT OnUnder (EffectGroup+) > +<!ELEMENT OnUnder (EffectGroup | ZoneInfluence | MonitorInfluence)+ > <!ATTLIST OnUnder value CDATA #REQUIRED> -<!ELEMENT InRange (EffectGroup+) > +<!ELEMENT InRange (EffectGroup | ZoneInfluence | MonitorInfluence)+ > <!ATTLIST InRange low CDATA #REQUIRED> <!ATTLIST InRange high CDATA #REQUIRED> -<!ELEMENT OutsideRange (EffectGroup+) > +<!ELEMENT OutsideRange (EffectGroup | ZoneInfluence | MonitorInfluence)+ > <!ATTLIST OutsideRange low CDATA #REQUIRED> <!ATTLIST OutsideRange high CDATA #REQUIRED> Modified: armagetronad/trunk/armagetronad/src/tron/gParser.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gParser.cpp 2007-06-08 21:59:34 UTC (rev 7290) +++ armagetronad/trunk/armagetronad/src/tron/gParser.cpp 2007-06-09 13:29:05 UTC (rev 7291) @@ -771,11 +771,11 @@ string str = string(myxmlGetProp(cur, "rotationAngle")); tFunction tfRotationAngle; - myCheapParameterSplitter(str, tfRotationAngle, true); + myCheapParameterSplitter(str, tfRotationAngle, false); str = string(myxmlGetProp(cur, "rotationSpeed")); tFunction tfRotationSpeed; - myCheapParameterSplitter(str, tfRotationSpeed, true); + myCheapParameterSplitter(str, tfRotationSpeed, false); b->set(tfRotationAngle, tfRotationSpeed); infl->addZoneInfluenceRule(zZoneInfluenceItemPtr(b)); @@ -1433,62 +1433,50 @@ if (sn_GetNetState() != nCLIENT ) { zMonitorRulePtr rule; + bool ruleFound = false; while(cur != NULL) { if (!xmlStrcmp(cur->name, (const xmlChar *)"text") || !xmlStrcmp(cur->name, (const xmlChar *)"comment")) {} else if (isElement(cur->name, (const xmlChar *)"OnOver", keyword)) { rule = zMonitorRulePtr(new zMonitorRuleOver(myxmlGetPropFloat(cur, "value"))); - xmlNodePtr cur2 = cur->xmlChildrenNode; - while(cur2 != NULL) { - if (!xmlStrcmp(cur2->name, (const xmlChar *)"text") || !xmlStrcmp(cur2->name, (const xmlChar *)"comment")) {} - else if (isElement(cur2->name, (const xmlChar *)"EffectGroup", keyword)) { - rule->addEffectGroup(parseZoneEffectGroup(grid, cur2, keyword)); - } - cur2 = cur2->next; - } - monitor->addRule(rule); - } + ruleFound = true; + } else if (isElement(cur->name, (const xmlChar *)"OnUnder", keyword)) { rule = zMonitorRulePtr(new zMonitorRuleUnder(myxmlGetPropFloat(cur, "value"))); - xmlNodePtr cur2 = cur->xmlChildrenNode; - while(cur2 != NULL) { - if (!xmlStrcmp(cur2->name, (const xmlChar *)"text") || !xmlStrcmp(cur2->name, (const xmlChar *)"comment")) {} - else if (isElement(cur2->name, (const xmlChar *)"EffectGroup", keyword)) { - rule->addEffectGroup(parseZoneEffectGroup(grid, cur2, keyword)); - } - cur2 = cur2->next; - } - monitor->addRule(rule); + ruleFound = true; } else if (isElement(cur->name, (const xmlChar *)"InRange", keyword)) { rule = zMonitorRulePtr(new zMonitorRuleInRange(myxmlGetPropFloat(cur, "low"), myxmlGetPropFloat(cur, "high"))); - xmlNodePtr cur2 = cur->xmlChildrenNode; - while(cur2 != NULL) { - if (!xmlStrcmp(cur2->name, (const xmlChar *)"text") || !xmlStrcmp(cur2->name, (const xmlChar *)"comment")) {} - else if (isElement(cur2->name, (const xmlChar *)"EffectGroup", keyword)) { - rule->addEffectGroup(parseZoneEffectGroup(grid, cur2, keyword)); - } - cur2 = cur2->next; - } - monitor->addRule(rule); + ruleFound = true; } else if (isElement(cur->name, (const xmlChar *)"OutsideRange", keyword)) { rule = zMonitorRulePtr(new zMonitorRuleOutsideRange(myxmlGetPropFloat(cur, "low"), myxmlGetPropFloat(cur, "high"))); + ruleFound = true; + } + else if (isElement(cur->name, (const xmlChar *)"Alternative", keyword)) { + if (isValidAlternative(cur, keyword)) { + parseAlternativeContent(grid, cur); + } + } + if (ruleFound == true ) { xmlNodePtr cur2 = cur->xmlChildrenNode; while(cur2 != NULL) { if (!xmlStrcmp(cur2->name, (const xmlChar *)"text") || !xmlStrcmp(cur2->name, (const xmlChar *)"comment")) {} else if (isElement(cur2->name, (const xmlChar *)"EffectGroup", keyword)) { rule->addEffectGroup(parseZoneEffectGroup(grid, cur2, keyword)); } + else if (isElement(cur2->name, (const xmlChar *)"ZoneInfluence", keyword)) { + rule->addZoneInfluence(parseZoneEffectGroupZone(grid, cur2, keyword)); + } + else if (isElement(cur2->name, (const xmlChar *)"MonitorInfluence", keyword)) { + rule->addMonitorInfluence(parseZoneEffectGroupMonitor(grid, cur2, keyword)); + } cur2 = cur2->next; } + ruleFound = false; monitor->addRule(rule); } - else if (isElement(cur->name, (const xmlChar *)"Alternative", keyword)) { - if (isValidAlternative(cur, keyword)) { - parseAlternativeContent(grid, cur); - } - } + cur = cur->next; } } Modified: armagetronad/trunk/armagetronad/src/tron/zone/zMonitor.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/zone/zMonitor.cpp 2007-06-08 21:59:34 UTC (rev 7290) +++ armagetronad/trunk/armagetronad/src/tron/zone/zMonitor.cpp 2007-06-09 13:29:05 UTC (rev 7291) @@ -55,7 +55,7 @@ bool zMonitor::Timestep( REAL time ) { // Do we need to reset the value? - if (contributorsSet.size()!=0) + if (contributorsSet.size()!=0) value = totalInfluenceSet; // Compute the sliding influence, ie: proportional to time @@ -136,6 +136,25 @@ (*iter)->apply(*iter2, time, value); } } + + gVectorExtra< nNetObjectID > owners; + gVectorExtra< nNetObjectID > teamOwners; + + zMonitorInfluencePtrs::const_iterator iterMonitorInfluence; + for(iterMonitorInfluence=monitorInfluences.begin(); + iterMonitorInfluence!=monitorInfluences.end(); + ++iterMonitorInfluence) + { + (*iterMonitorInfluence)->apply(owners, teamOwners, (gCycle*)0, _value); + } + + zZoneInfluencePtrs::const_iterator iterZoneInfluence; + for(iterZoneInfluence=zoneInfluences.begin(); + iterZoneInfluence!=zoneInfluences.end(); + ++iterZoneInfluence) + { + (*iterZoneInfluence)->apply(_value); + } } /* Modified: armagetronad/trunk/armagetronad/src/tron/zone/zMonitor.h =================================================================== --- armagetronad/trunk/armagetronad/src/tron/zone/zMonitor.h 2007-06-08 21:59:34 UTC (rev 7290) +++ armagetronad/trunk/armagetronad/src/tron/zone/zMonitor.h 2007-06-09 13:29:05 UTC (rev 7291) @@ -10,6 +10,7 @@ #include "zone/zMisc.h" #include "zone/zEffectGroup.h" #include "tFunction.h" +#include "zone/zZoneInfluence.h" class zMonitorRule; class zMonitor; @@ -33,7 +34,6 @@ contributorsSet(), rules(), value(0.0), - initialValue(0.0), drift(0.0), minValue(0.0), maxValue(1.0) @@ -54,7 +54,7 @@ void setName(string name) {this->name = name;}; void addRule(zMonitorRulePtr aRule); - void setInit(REAL v) {initialValue = v;}; + void setInit(REAL v) {value = v;}; void setDrift(REAL d) {drift = d;}; void setClampLow(REAL l) {minValue = l;}; void setClampHigh(REAL h) {maxValue = h;}; @@ -77,7 +77,6 @@ zMonitorRulePtrs rules; REAL value; // The current value of the monitor - REAL initialValue; // When the monitor is instantiated, it should start at this value REAL drift; // How much the value of the monitor changes per second REAL minValue; //!< Low bound that value can take @@ -96,9 +95,13 @@ void addEffectGroup(zEffectGroupPtr anEffectGroupPtr) {effectGroupList.push_back(anEffectGroupPtr);}; void applyRule(triggerers &contributors, REAL time, REAL value) ; + void addMonitorInfluence(zMonitorInfluencePtr newInfluence) {monitorInfluences.push_back( newInfluence );}; + void addZoneInfluence(zZoneInfluencePtr aZoneInfluencePtr) {zoneInfluences.push_back(aZoneInfluencePtr);}; protected: zEffectGroupPtrs effectGroupList; + zMonitorInfluencePtrs monitorInfluences; + zZoneInfluencePtrs zoneInfluences; }; /* Modified: armagetronad/trunk/armagetronad/src/tron/zone/zShape.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/zone/zShape.cpp 2007-06-08 21:59:34 UTC (rev 7290) +++ armagetronad/trunk/armagetronad/src/tron/zone/zShape.cpp 2007-06-09 13:29:05 UTC (rev 7291) @@ -69,11 +69,6 @@ m >> idZone_; - /* - zZone *aZone= static_cast<zZone *>(Object(idZone_)); - aZone->setShape(zShapePtr(this)); - std::cout << "zone for shape in constructor is " << (aZone==0?"found":"not found") << std::endl; - */ } @@ -159,7 +154,10 @@ } void zShape::setRotation(const tFunction & r){ - rotation_ = r; + float pos = rotation_.Evaluate(lasttime_ - referencetime_); + rotation_.SetSlope(r.GetSlope() ); + rotation_.SetOffset( pos + rotation_.GetSlope() * ( referencetime_ - lasttime_ ) ); + // rotation_ = r; } void zShape::setScale(const tFunction & s){ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <phi...@us...> - 2007-06-09 15:31:58
|
Revision: 7292 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7292&view=rev Author: philippeqc Date: 2007-06-09 08:31:35 -0700 (Sat, 09 Jun 2007) Log Message: ----------- Quick hack to the color element to be able to use a hex code directly. Modified Paths: -------------- armagetronad/trunk/armagetronad/resource/proto/map-0.3.1-a.dtd armagetronad/trunk/armagetronad/src/tron/gParser.cpp armagetronad/trunk/armagetronad/src/tron/gParser.h Modified: armagetronad/trunk/armagetronad/resource/proto/map-0.3.1-a.dtd =================================================================== --- armagetronad/trunk/armagetronad/resource/proto/map-0.3.1-a.dtd 2007-06-09 13:29:05 UTC (rev 7291) +++ armagetronad/trunk/armagetronad/resource/proto/map-0.3.1-a.dtd 2007-06-09 15:31:35 UTC (rev 7292) @@ -97,7 +97,10 @@ <!ATTLIST Color green CDATA "0.0"> <!ATTLIST Color blue CDATA "0.0"> <!ATTLIST Color alpha CDATA "1.0"> +<!ATTLIST Color hexCode CDATA #IMPLIED> +<!ATTLIST Color name CDATA #IMPLIED> + <!ELEMENT Enter (EffectGroup+) > <!ELEMENT Inside (EffectGroup+) > <!ELEMENT Leave (EffectGroup+) > Modified: armagetronad/trunk/armagetronad/src/tron/gParser.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gParser.cpp 2007-06-09 13:29:05 UTC (rev 7291) +++ armagetronad/trunk/armagetronad/src/tron/gParser.cpp 2007-06-09 15:31:35 UTC (rev 7292) @@ -138,6 +138,32 @@ return r; } +rColor +gParser::myxmlGetPropColorFromHex(xmlNodePtr cur, const char *name) { + char *v = myxmlGetProp(cur, name); + if (v == NULL) return rColor(); + int r = strtoul(v, NULL, 0); + rColor aColor; + if (strlen(v) >= 9) { + aColor.a_ = ((REAL)(r & 255)) / 255.0; + r /= 256; + if (aColor.a_ > 0.7) + aColor.a_ = 0.7; + } + else { + aColor.a_ = 0.7; + } + aColor.b_ = ((REAL)(r & 255)) / 255.0; + r /= 256; + aColor.g_ = ((REAL)(r & 255)) / 255.0; + r /= 256; + aColor.r_ = ((REAL)(r & 255)) / 255.0; + r /= 256; + + xmlFree(v); + return aColor; +} + float gParser::myxmlGetPropFloat(xmlNodePtr cur, const char *name) { char *v = myxmlGetProp(cur, name); @@ -487,15 +513,28 @@ rColor gParser::parseColor(eGrid *grid, xmlNodePtr cur, const xmlChar * keyword) { - rColor color; - color.r_ = myxmlGetPropFloat(cur, "red"); - color.g_ = myxmlGetPropFloat(cur, "green"); - color.b_ = myxmlGetPropFloat(cur, "blue"); - color.a_ = myxmlGetPropFloat(cur, "alpha"); + rColor color; + color.r_ = myxmlGetPropFloat(cur, "red"); + color.g_ = myxmlGetPropFloat(cur, "green"); + color.b_ = myxmlGetPropFloat(cur, "blue"); + color.a_ = myxmlGetPropFloat(cur, "alpha"); + + + if(myxmlHasProp(cur, "hexCode")) + { + color = myxmlGetPropColorFromHex(cur, "hexCode"); + } - /* + /* + if(myxmlHasProp(cur, "name") { string colorName = myxmlGetProp(cur, "name"); + } + */ + + + /* + // Blue Modified: armagetronad/trunk/armagetronad/src/tron/gParser.h =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gParser.h 2007-06-09 13:29:05 UTC (rev 7291) +++ armagetronad/trunk/armagetronad/src/tron/gParser.h 2007-06-09 15:31:35 UTC (rev 7292) @@ -54,6 +54,7 @@ bool myxmlGetPropBool(xmlNodePtr cur, const char *name); Triad myxmlGetPropTriad(xmlNodePtr cur, const char *name); void myxmlGetDirection(xmlNodePtr cur, float &x, float &y); + rColor myxmlGetPropColorFromHex(xmlNodePtr cur, const char *name); // bool isElement(const xmlChar *elementName, const xmlChar *searchedElement); bool isElement(const xmlChar *elementName, const xmlChar *searchedElement, const xmlChar * keyword = NULL); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <phi...@us...> - 2007-06-10 09:40:24
|
Revision: 7294 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7294&view=rev Author: philippeqc Date: 2007-06-10 02:40:25 -0700 (Sun, 10 Jun 2007) Log Message: ----------- zShapeCircle now have a radius. Modified Paths: -------------- armagetronad/trunk/armagetronad/resource/proto/map-0.3.1-a.dtd armagetronad/trunk/armagetronad/src/tron/gGame.cpp armagetronad/trunk/armagetronad/src/tron/gParser.cpp armagetronad/trunk/armagetronad/src/tron/zone/zShape.cpp armagetronad/trunk/armagetronad/src/tron/zone/zShape.hpp Modified: armagetronad/trunk/armagetronad/resource/proto/map-0.3.1-a.dtd =================================================================== --- armagetronad/trunk/armagetronad/resource/proto/map-0.3.1-a.dtd 2007-06-10 08:10:34 UTC (rev 7293) +++ armagetronad/trunk/armagetronad/resource/proto/map-0.3.1-a.dtd 2007-06-10 09:40:25 UTC (rev 7294) @@ -83,12 +83,13 @@ <!ELEMENT ShapeCircle (Point, Color)> -<!ATTLIST ShapeCircle scale CDATA #REQUIRED> +<!ATTLIST ShapeCircle scale CDATA "1.0"> <!ATTLIST ShapeCircle growth CDATA "0.0"> <!ATTLIST ShapeCircle rotation CDATA "0.0"> +<!ATTLIST ShapeCircle radius CDATA "1.0"> <!ELEMENT ShapePolygon (Point, Color, Point+)> -<!ATTLIST ShapePolygon scale CDATA #REQUIRED> +<!ATTLIST ShapePolygon scale CDATA "1.0"> <!ATTLIST ShapePolygon growth CDATA "0.0"> <!ATTLIST ShapePolygon rotation CDATA "0.0"> Modified: armagetronad/trunk/armagetronad/src/tron/gGame.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gGame.cpp 2007-06-10 08:10:34 UTC (rev 7293) +++ armagetronad/trunk/armagetronad/src/tron/gGame.cpp 2007-06-10 09:40:25 UTC (rev 7294) @@ -4180,7 +4180,7 @@ if (other ) { - eTeam * otherTeam = other->Player()->CurrentTeam(); + // eTeam * otherTeam = other->Player()->CurrentTeam(); eCoord otherpos = other->Position() - zone->GetPosition(); REAL distance = otherpos.NormSquared(); if ( !closest || distance < closestDistance ) Modified: armagetronad/trunk/armagetronad/src/tron/gParser.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gParser.cpp 2007-06-10 08:10:34 UTC (rev 7293) +++ armagetronad/trunk/armagetronad/src/tron/gParser.cpp 2007-06-10 09:40:25 UTC (rev 7294) @@ -643,7 +643,22 @@ zShapePtr gParser::parseShapeCircleBachus(eGrid *grid, xmlNodePtr cur, unsigned short idZone, const xmlChar * keyword) { - zShapePtr shape = zShapePtr( new zShapeCircle(grid, idZone) ); + zShapeCircle *shapePtr = new zShapeCircle(grid, idZone) ; + + // The radius need to be handled separatly + tFunction tfRadius; + if (myxmlHasProp(cur, "radius")) { + string str = string(myxmlGetProp(cur, "radius")); + myCheapParameterSplitter(str, tfRadius, true); + } + else { + tfRadius.SetOffset( 1.0 * sizeMultiplier ); + tfRadius.SetSlope( 0.0 ); + } + shapePtr->setRadius( tfRadius ); + + zShapePtr shape = zShapePtr( shapePtr ); + parseShape(grid, cur, keyword, shape); return shape; @@ -704,6 +719,7 @@ #else string str = string(myxmlGetProp(cur, "scale")); tFunction tfScale; + myCheapParameterSplitter(str, tfScale, false); shape->setScale( tfScale ); #endif @@ -716,6 +732,7 @@ #else string str = string(myxmlGetProp(cur, "rotation")); tFunction tfRotation; + myCheapParameterSplitter(str, tfRotation, false); shape->setRotation( tfRotation ); #endif Modified: armagetronad/trunk/armagetronad/src/tron/zone/zShape.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/zone/zShape.cpp 2007-06-10 08:10:34 UTC (rev 7293) +++ armagetronad/trunk/armagetronad/src/tron/zone/zShape.cpp 2007-06-10 09:40:25 UTC (rev 7294) @@ -223,13 +223,14 @@ { if ( prey->Player() && prey->Alive() ) { + REAL effectiveRadius; #ifdef DADA - REAL r = scale_->GetFloat(); + effectiveRadius = scale_->GetFloat() * radius.Evaluate(lasttime_ - referencetime_); #else - REAL r = scale_.Evaluate(lasttime_ - referencetime_); + effectiveRadius = scale_.Evaluate(lasttime_ - referencetime_) * radius.Evaluate(lasttime_ - referencetime_); #endif // Is the player inside or outside the zone - if ( (r >= 0.0) && ( prey->Position() - Position() ).NormSquared() < r*r ) + if ( (effectiveRadius >= 0.0) && ( prey->Position() - Position() ).NormSquared() < effectiveRadius*effectiveRadius ) { interact = true; } @@ -299,22 +300,23 @@ color_.Apply(); + REAL effectiveRadius; #ifdef DADA - REAL r = scale_->GetFloat(); + effectiveRadius = scale_->GetFloat() * radius.Evaluate(lasttime_ - referencetime_); #else - REAL r = scale_.Evaluate(lasttime_ - referencetime_); + effectiveRadius = scale_.Evaluate(lasttime_ - referencetime_) * radius.Evaluate(lasttime_ - referencetime_); #endif - if (r >= 0.0) + if (effectiveRadius >= 0.0) { for ( int i = sg_segments - 1; i>=0; --i ) { REAL a = i * 2 * 3.14159 / REAL( sg_segments ); REAL b = a + seglen; - REAL sa = r * sin(a); - REAL ca = r * cos(a); - REAL sb = r * sin(b); - REAL cb = r * cos(b); + REAL sa = effectiveRadius * sin(a); + REAL ca = effectiveRadius * cos(a); + REAL sb = effectiveRadius * sin(b); + REAL cb = effectiveRadius * cos(b); glVertex3f(sa, ca, bot); glVertex3f(sa, ca, top); Modified: armagetronad/trunk/armagetronad/src/tron/zone/zShape.hpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/zone/zShape.hpp 2007-06-10 08:10:34 UTC (rev 7293) +++ armagetronad/trunk/armagetronad/src/tron/zone/zShape.hpp 2007-06-10 09:40:25 UTC (rev 7294) @@ -101,6 +101,11 @@ bool isEmulatingOldZone() {return emulatingOldZone_;}; bool emulatingOldZone_; + + void setRadius(tFunction radius) {this->radius = radius;}; +protected: + tFunction radius; + private: virtual nDescriptor& CreatorDescriptor() const; //!< returns the descriptor to recreate this object over the network }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <phi...@us...> - 2007-06-17 19:05:15
|
Revision: 7303 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7303&view=rev Author: philippeqc Date: 2007-06-17 12:05:14 -0700 (Sun, 17 Jun 2007) Log Message: ----------- Basic network update of the shapes Modified Paths: -------------- armagetronad/trunk/armagetronad/resource/proto/map-0.3.1-a.dtd armagetronad/trunk/armagetronad/src/tools/tColor.h armagetronad/trunk/armagetronad/src/tron/gParser.cpp armagetronad/trunk/armagetronad/src/tron/zone/zMonitor.cpp armagetronad/trunk/armagetronad/src/tron/zone/zMonitor.h armagetronad/trunk/armagetronad/src/tron/zone/zShape.cpp armagetronad/trunk/armagetronad/src/tron/zone/zShape.hpp armagetronad/trunk/armagetronad/src/tron/zone/zZone.cpp armagetronad/trunk/armagetronad/src/tron/zone/zZoneInfluence.cpp armagetronad/trunk/armagetronad/src/tron/zone/zZoneInfluence.h Modified: armagetronad/trunk/armagetronad/resource/proto/map-0.3.1-a.dtd =================================================================== --- armagetronad/trunk/armagetronad/resource/proto/map-0.3.1-a.dtd 2007-06-17 09:54:50 UTC (rev 7302) +++ armagetronad/trunk/armagetronad/resource/proto/map-0.3.1-a.dtd 2007-06-17 19:05:14 UTC (rev 7303) @@ -97,7 +97,7 @@ <!ATTLIST Color red CDATA "1.0"> <!ATTLIST Color green CDATA "0.0"> <!ATTLIST Color blue CDATA "0.0"> -<!ATTLIST Color alpha CDATA "1.0"> +<!ATTLIST Color alpha CDATA "0.7"> <!ATTLIST Color hexCode CDATA #IMPLIED> <!ATTLIST Color name CDATA #IMPLIED> Modified: armagetronad/trunk/armagetronad/src/tools/tColor.h =================================================================== --- armagetronad/trunk/armagetronad/src/tools/tColor.h 2007-06-17 09:54:50 UTC (rev 7302) +++ armagetronad/trunk/armagetronad/src/tools/tColor.h 2007-06-17 19:05:14 UTC (rev 7303) @@ -41,6 +41,7 @@ // the colors are public because they are independent of each other REAL r_, g_, b_, a_; //!< Color values + protected: private: }; @@ -50,5 +51,13 @@ return s; } +inline bool operator==(const tColor &lColor, const tColor &rColor) { + return ( (lColor.r_ == rColor.r_) && (lColor.g_ == rColor.g_) && (lColor.b_ == rColor.b_) && (lColor.a_ == rColor.a_)); +} + +inline bool operator!=(const tColor &lColor, const tColor &rColor) { + return !operator==(lColor, rColor); +} + #endif Modified: armagetronad/trunk/armagetronad/src/tron/gParser.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gParser.cpp 2007-06-17 09:54:50 UTC (rev 7302) +++ armagetronad/trunk/armagetronad/src/tron/gParser.cpp 2007-06-17 19:05:14 UTC (rev 7303) @@ -519,12 +519,17 @@ color.b_ = myxmlGetPropFloat(cur, "blue"); color.a_ = myxmlGetPropFloat(cur, "alpha"); - if(myxmlHasProp(cur, "hexCode")) { color = myxmlGetPropColorFromHex(cur, "hexCode"); } + if (color.a_ > 0.7) + color.a_ = 0.7; + if (color.a_ < 0.0) + color.a_ = 0.0; + + /* if(myxmlHasProp(cur, "name") { string colorName = myxmlGetProp(cur, "name"); Modified: armagetronad/trunk/armagetronad/src/tron/zone/zMonitor.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/zone/zMonitor.cpp 2007-06-17 09:54:50 UTC (rev 7302) +++ armagetronad/trunk/armagetronad/src/tron/zone/zMonitor.cpp 2007-06-17 19:05:14 UTC (rev 7303) @@ -3,6 +3,7 @@ #include "zMonitor.h" #include "tMath.h" +#include "defs.h" /* * Keep track of everybody contributing to the monitor (for a tic atm) @@ -55,7 +56,7 @@ bool zMonitor::Timestep( REAL time ) { // Do we need to reset the value? - if (contributorsSet.size()!=0) + if (contributorsSet.size()!=0) value = totalInfluenceSet; // Compute the sliding influence, ie: proportional to time @@ -83,21 +84,23 @@ totalInfluenceAdd = 0.0; totalInfluenceSet = 0.0; - // go through all the rules and find the ones to apply - zMonitorRulePtrs::const_iterator iter; - for(iter = rules.begin(); - iter != rules.end(); - ++iter) - { - // Go through all the rules of the monitor and see wich need to be activated - if ((*iter)->isValid(value)) { - (*iter)->applyRule(contributors, time, value); - } - } - // bound the value clamp(value, minValue, maxValue); + // Only update if value has changed enough + if( value < previousValue - EPS || previousValue + EPS < value) { + // go through all the rules and find the ones to apply + zMonitorRulePtrs::const_iterator iter; + for(iter = rules.begin(); + iter != rules.end(); + ++iter) + { + // Go through all the rules of the monitor and see wich need to be activated + if ((*iter)->isValid(value)) { + (*iter)->applyRule(contributors, time, value); + } + } + } // update time lastTime = time; @@ -136,25 +139,25 @@ (*iter)->apply(*iter2, time, value); } } - + gVectorExtra< nNetObjectID > owners; gVectorExtra< nNetObjectID > teamOwners; zMonitorInfluencePtrs::const_iterator iterMonitorInfluence; for(iterMonitorInfluence=monitorInfluences.begin(); - iterMonitorInfluence!=monitorInfluences.end(); - ++iterMonitorInfluence) - { - (*iterMonitorInfluence)->apply(owners, teamOwners, (gCycle*)0, _value); - } + iterMonitorInfluence!=monitorInfluences.end(); + ++iterMonitorInfluence) + { + (*iterMonitorInfluence)->apply(owners, teamOwners, (gCycle*)0, _value); + } zZoneInfluencePtrs::const_iterator iterZoneInfluence; for(iterZoneInfluence=zoneInfluences.begin(); - iterZoneInfluence!=zoneInfluences.end(); - ++iterZoneInfluence) - { - (*iterZoneInfluence)->apply(_value); - } + iterZoneInfluence!=zoneInfluences.end(); + ++iterZoneInfluence) + { + (*iterZoneInfluence)->apply(_value); + } } /* Modified: armagetronad/trunk/armagetronad/src/tron/zone/zMonitor.h =================================================================== --- armagetronad/trunk/armagetronad/src/tron/zone/zMonitor.h 2007-06-17 09:54:50 UTC (rev 7302) +++ armagetronad/trunk/armagetronad/src/tron/zone/zMonitor.h 2007-06-17 19:05:14 UTC (rev 7303) @@ -36,7 +36,10 @@ value(0.0), drift(0.0), minValue(0.0), - maxValue(1.0) + maxValue(1.0), + previousValue(0.0), + previousTotalInfluenceSlide(0.0), + previousTotalInfluenceAdd(0.0) { // add to game grid this->AddToList(); @@ -83,6 +86,12 @@ REAL maxValue; //!< High bound that value can take string name; + + // values used to reduce the update transmitted + REAL previousValue; + REAL previousTotalInfluenceSlide; + REAL previousTotalInfluenceAdd; + }; Modified: armagetronad/trunk/armagetronad/src/tron/zone/zShape.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/zone/zShape.cpp 2007-06-17 09:54:50 UTC (rev 7302) +++ armagetronad/trunk/armagetronad/src/tron/zone/zShape.cpp 2007-06-17 19:05:14 UTC (rev 7303) @@ -21,61 +21,23 @@ idZone_(idZone), newIdZone_(false) { - joinWithZone(); + joinWithZone(); } zShape::zShape(nMessage &m):eNetGameObject(m) { - tString name; - m >> name; - REAL time; m >> time; setCreatedTime(time); - m >> time; - setReferenceTime(time); -#ifdef DADA - tString str; - m >> str; - setPosX(BasePtr(new tValue::Expr(str, tValue::Expr::vars, tValue::Expr::functions)) , str); + networkRead(m); - m >> str; - setPosY(BasePtr(new tValue::Expr(str, tValue::Expr::vars, tValue::Expr::functions)) , str); - - m >> str; - setScale(BasePtr(new tValue::Expr(str, tValue::Expr::vars, tValue::Expr::functions)) , str); - - m >> str; - setRotation(BasePtr(new tValue::Expr(str, tValue::Expr::vars, tValue::Expr::functions)) , str); -#else - tFunction tFunc; - m >> tFunc; - setPosX( tFunc ); - - m >> tFunc; - setPosY( tFunc ); - - m >> tFunc; - setScale( tFunc ); - - m >> tFunc; - setRotation( tFunc ); -#endif - - rColor c; - m >> c.r_; - m >> c.g_; - m >> c.b_; - m >> c.a_; - setColor(c); - unsigned short anIdZone; m >> anIdZone; if(anIdZone != idZone_) { - idZone_ = anIdZone; - newIdZone_ = true; - joinWithZone(); + idZone_ = anIdZone; + newIdZone_ = true; + joinWithZone(); } } @@ -115,11 +77,39 @@ m << color_.g_; m << color_.b_; m << color_.a_; +} - m << idZone_; +void zShape::networkRead(nMessage &m) +{ + REAL time; + m >> time; + setReferenceTime(time); +#ifdef DADA + tString str; + m >> str; + setPosX(BasePtr(new tValue::Expr(str, tValue::Expr::vars, tValue::Expr::functions)) , str); + + m >> str; + setPosY(BasePtr(new tValue::Expr(str, tValue::Expr::vars, tValue::Expr::functions)) , str); + + m >> str; + setScale(BasePtr(new tValue::Expr(str, tValue::Expr::vars, tValue::Expr::functions)) , str); + + m >> str; + setRotation(BasePtr(new tValue::Expr(str, tValue::Expr::vars, tValue::Expr::functions)) , str); +#else + m >> posx_; + m >> posy_; + m >> scale_; + m >> rotation_; +#endif + + m >> color_.r_; + m >> color_.g_; + m >> color_.b_; + m >> color_.a_; } - /* * to create a shape on the clients */ @@ -127,12 +117,23 @@ { eNetGameObject::WriteCreate(m); - m << tString("none"); m << createdtime_; networkWrite(m); + + m << idZone_; } +void zShape::WriteSync(nMessage &m) +{ + networkWrite(m); +} + +void zShape::ReadSync(nMessage &m) +{ + networkRead(m); +} + #ifdef DADA void zShape::setPosX(const BasePtr & x, tString &exprStr){ posx_ = x; @@ -163,10 +164,18 @@ } void zShape::setRotation(const tFunction & r){ + rotation_ = r; + if (sn_GetNetState()!=nCLIENT) + RequestSync(); +} + +void zShape::setRotationNow(const tFunction & r){ float pos = rotation_.Evaluate(lasttime_ - referencetime_); rotation_.SetSlope(r.GetSlope() ); rotation_.SetOffset( pos + rotation_.GetSlope() * ( referencetime_ - lasttime_ ) ); // rotation_ = r; + if (sn_GetNetState()!=nCLIENT) + RequestSync(); } void zShape::setScale(const tFunction & s){ @@ -175,9 +184,18 @@ #endif void zShape::setColor(const rColor &c){ - color_ = c; + if(color_ != c) { + color_ = c; + if (sn_GetNetState()!=nCLIENT) + RequestSync(); + } } +void zShape::setColorNow(const rColor &c){ + // TODO: make color slide with some fancy tFunc or something. + setColor(c); +} + void zShape::animate( REAL time ) { // Is this needed as the items are already animated? } @@ -208,23 +226,23 @@ {} void zShape::joinWithZone() { - if(sn_netObjects[idZone_]) { - zZone *asdf = dynamic_cast<zZone*>(&*sn_netObjects[idZone_]); - asdf->setShape(zShapePtr(this)); - newIdZone_ = false; - } + if(sn_netObjects[idZone_]) { + zZone *asdf = dynamic_cast<zZone*>(&*sn_netObjects[idZone_]); + asdf->setShape(zShapePtr(this)); + newIdZone_ = false; + } } zShapeCircle::zShapeCircle(eGrid *grid, unsigned short idZone): zShape(grid, idZone), emulatingOldZone_(false), - radius(1.0, 0.0) + radius(1.0, 0.0) {} zShapeCircle::zShapeCircle(nMessage &m): zShape(m), emulatingOldZone_(false), - radius(1.0, 0.0) + radius(1.0, 0.0) { m >> radius; } @@ -234,16 +252,23 @@ */ void zShapeCircle::WriteCreate( nMessage & m ) { - eNetGameObject::WriteCreate(m); + zShape::WriteCreate(m); - m << tString("circle"); - m << createdtime_; + m << radius; +} - networkWrite(m); - +void zShapeCircle::WriteSync(nMessage &m) +{ + zShape::WriteSync(m); m << radius; } +void zShapeCircle::ReadSync(nMessage &m) +{ + zShape::ReadSync(m); + m >> radius; +} + bool zShapeCircle::isInteracting(eGameObject * target) { bool interact = false; @@ -436,7 +461,7 @@ glVertex2f(sb, cb); } } - RenderEnd(); + RenderEnd(); glPopMatrix(); #endif } @@ -486,13 +511,8 @@ */ void zShapePolygon::WriteCreate( nMessage & m ) { - eNetGameObject::WriteCreate(m); + zShape::WriteCreate(m); - m << tString("polygon"); - m << createdtime_; - - networkWrite(m); - int numPoints; numPoints = points.size(); m << numPoints; @@ -516,6 +536,8 @@ m << (*iter).second; } #endif + + // WriteSync( m ); } bool zShapePolygon::isInside(eCoord anECoord) { Modified: armagetronad/trunk/armagetronad/src/tron/zone/zShape.hpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/zone/zShape.hpp 2007-06-17 09:54:50 UTC (rev 7302) +++ armagetronad/trunk/armagetronad/src/tron/zone/zShape.hpp 2007-06-17 19:05:14 UTC (rev 7303) @@ -19,11 +19,13 @@ zShape(nMessage &m); virtual ~zShape() {}; virtual void WriteCreate( nMessage & m ); + virtual void WriteSync(nMessage &m); //!< writes sync data + virtual void ReadSync(nMessage &m); //!< reads sync data void animate( REAL time ); virtual bool isInteracting(eGameObject * target); virtual void render(const eCamera * cam ); - virtual void render2d(tCoord scale) const; + virtual void render2d(tCoord scale) const; #ifdef DADA void setPosX(const BasePtr & x, tString &exprStr); @@ -38,6 +40,9 @@ void setScale(const tFunction &s); void setColor(const rColor &c); + void setRotationNow(const tFunction &r); + void setColorNow(const rColor &c); + tFunction getPosX() {return posx_;}; tFunction getPosY() {return posy_;}; tFunction getScale() {return scale_;}; @@ -75,7 +80,7 @@ eCoord Position() { return eCoord(posx_(lasttime_ - referencetime_), posy_(lasttime_ - referencetime_) ); }; #endif - static void networkRead(nMessage &m, zShape *aShape); + void networkRead(nMessage &m); void networkWrite(nMessage &m); void setCreatedTime(REAL time); @@ -99,6 +104,8 @@ zShapeCircle(nMessage &m); ~zShapeCircle() {}; void WriteCreate( nMessage & m ); + void WriteSync(nMessage &m); //!< writes sync data + void ReadSync(nMessage &m); //!< reads sync data bool isInteracting(eGameObject * target); void render(const eCamera * cam ); @@ -127,6 +134,8 @@ zShapePolygon(nMessage &n); ~zShapePolygon() {}; void WriteCreate( nMessage & m ); + // void WriteSync(nMessage &m); //!< writes sync data + // void ReadSync(nMessage &m); //!< reads sync data bool isInteracting(eGameObject * target); void render(const eCamera * cam ); Modified: armagetronad/trunk/armagetronad/src/tron/zone/zZone.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/zone/zZone.cpp 2007-06-17 09:54:50 UTC (rev 7302) +++ armagetronad/trunk/armagetronad/src/tron/zone/zZone.cpp 2007-06-17 19:05:14 UTC (rev 7303) @@ -410,18 +410,18 @@ { bool b; - // while(!m.End() ) { m >> b;} - - int count=44-16; + // while(!m.End() ) { m >> b;} + + int count=44-16; // Discard the information while(!m.End() && count-->0) { m >> b;} - unsigned short shapeID; - m >> shapeID; - if(sn_netObjects[shapeID]) { - zShape *asdf = dynamic_cast<zShape*>(&*sn_netObjects[shapeID]); - shape = zShapePtr( dynamic_cast<zShape*>(&*sn_netObjects[shapeID]) ); - } - + unsigned short shapeID; + m >> shapeID; + if(sn_netObjects[shapeID]) { + zShape *asdf = dynamic_cast<zShape*>(&*sn_netObjects[shapeID]); + shape = zShapePtr( dynamic_cast<zShape*>(&*sn_netObjects[shapeID]) ); + } + } } @@ -666,8 +666,8 @@ void zZone::Render( const eCamera * cam ) { - if (shape) - shape->render(cam); + if (shape) + shape->render(cam); } void zZone::Render2D( tCoord scale ) const { Modified: armagetronad/trunk/armagetronad/src/tron/zone/zZoneInfluence.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/zone/zZoneInfluence.cpp 2007-06-17 09:54:50 UTC (rev 7302) +++ armagetronad/trunk/armagetronad/src/tron/zone/zZoneInfluence.cpp 2007-06-17 19:05:14 UTC (rev 7303) @@ -34,7 +34,7 @@ tFunction tfRotation; tfRotation.SetOffset( rotationAngle(value) ); tfRotation.SetSlope( rotationSpeed(value*value) ); - zone->getShape()->setRotation( tfRotation ); + zone->getShape()->setRotationNow( tfRotation ); } zZoneInfluenceItemScale::zZoneInfluenceItemScale(zZonePtr aZone): @@ -74,6 +74,6 @@ void zZoneInfluenceItemColor::apply(REAL value) { - zone->getShape()->setColor( color ); + zone->getShape()->setColorNow( color ); } Modified: armagetronad/trunk/armagetronad/src/tron/zone/zZoneInfluence.h =================================================================== --- armagetronad/trunk/armagetronad/src/tron/zone/zZoneInfluence.h 2007-06-17 09:54:50 UTC (rev 7302) +++ armagetronad/trunk/armagetronad/src/tron/zone/zZoneInfluence.h 2007-06-17 19:05:14 UTC (rev 7303) @@ -49,8 +49,8 @@ virtual ~zZoneInfluenceItemRotation() {}; void set(tFunction rotAngle, tFunction rotSpeed) { - rotationAngle = rotAngle; - rotationSpeed = rotSpeed; + rotationAngle = rotAngle; + rotationSpeed = rotSpeed; }; virtual void apply(REAL value); }; @@ -84,7 +84,10 @@ zZoneInfluenceItemColor(zZonePtr aZone); virtual ~zZoneInfluenceItemColor() {}; - void set(rColor const & col) {color = col;}; + void set(rColor const & col) { + color = col; + color.a_ = color.a_ < 0.0?0.0:(color.a_>0.7?0.7:color.a_); + }; virtual void apply(REAL value); }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <phi...@us...> - 2007-06-22 09:08:34
|
Revision: 7307 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7307&view=rev Author: philippeqc Date: 2007-06-22 02:06:47 -0700 (Fri, 22 Jun 2007) Log Message: ----------- Forgot to update the dtd to support acceleration Modified Paths: -------------- armagetronad/trunk/armagetronad/resource/proto/map-0.3.1-a.dtd armagetronad/trunk/armagetronad/src/tron/gParser.cpp Modified: armagetronad/trunk/armagetronad/resource/proto/map-0.3.1-a.dtd =================================================================== --- armagetronad/trunk/armagetronad/resource/proto/map-0.3.1-a.dtd 2007-06-21 16:51:02 UTC (rev 7306) +++ armagetronad/trunk/armagetronad/resource/proto/map-0.3.1-a.dtd 2007-06-22 09:06:47 UTC (rev 7307) @@ -135,14 +135,14 @@ <!ELEMENT Effect EMPTY> <!ATTLIST Effect effect (win | death | point | brakerecharge | -rubberrecharge | spawnplayer | setting ) "death" > +rubberrecharge | acceleration | spawnplayer | setting ) "death" > <!ATTLIST Effect count CDATA "-1"> <!ATTLIST Effect description CDATA #IMPLIED> <!ATTLIST Effect score CDATA "1"> <!-- only for point --> <!ATTLIST Effect settingName CDATA #IMPLIED> <!-- only for setting --> <!ATTLIST Effect settingValue CDATA #IMPLIED><!-- only for setting --> +<!ATTLIST Effect value CDATA "0"> <!-- only for acceleration atm, but should be for nearly all --> - <!ELEMENT MonitorInfluence EMPTY> <!ATTLIST MonitorInfluence name CDATA #IMPLIED> <!ATTLIST MonitorInfluence marked (true | false | ignore) "ignore"> Modified: armagetronad/trunk/armagetronad/src/tron/gParser.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gParser.cpp 2007-06-21 16:51:02 UTC (rev 7306) +++ armagetronad/trunk/armagetronad/src/tron/gParser.cpp 2007-06-22 09:06:47 UTC (rev 7307) @@ -986,7 +986,7 @@ effectorSpawnPlayer->setArena(sg_GetArena()); } - // Should we set the grid and arena for respawning + // Should we set the setting name and value zEffectorSetting *effectorSetting; effectorSetting = dynamic_cast<zEffectorSetting *>(effector.get()); if (effectorSetting) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wrt...@us...> - 2007-08-06 12:28:21
|
Revision: 7320 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7320&view=rev Author: wrtlprnft Date: 2007-08-06 05:28:17 -0700 (Mon, 06 Aug 2007) Log Message: ----------- >From NEWS: - Red/Green or Red/Cyan 3D rendering. Activate it by setting CAMERA_EYE_DISTANCE to something != 0. Modified Paths: -------------- armagetronad/trunk/armagetronad/NEWS armagetronad/trunk/armagetronad/config/settings.cfg armagetronad/trunk/armagetronad/language/english_base.txt armagetronad/trunk/armagetronad/src/engine/eCamera.cpp Modified: armagetronad/trunk/armagetronad/NEWS =================================================================== --- armagetronad/trunk/armagetronad/NEWS 2007-08-04 15:43:10 UTC (rev 7319) +++ armagetronad/trunk/armagetronad/NEWS 2007-08-06 12:28:17 UTC (rev 7320) @@ -14,7 +14,9 @@ Match winner, and New match. Note that not all notifications are enabled by default — you can toggle notifications and do many more things in the Growl System Preferences panel. - +- Red/Green or Red/Cyan 3D rendering. Activate it by setting + CAMERA_EYE_DISTANCE to something ≠ 0. + Changes since 0.3.0_alpha4941 ============================= Modified: armagetronad/trunk/armagetronad/config/settings.cfg =================================================================== --- armagetronad/trunk/armagetronad/config/settings.cfg 2007-08-04 15:43:10 UTC (rev 7319) +++ armagetronad/trunk/armagetronad/config/settings.cfg 2007-08-06 12:28:17 UTC (rev 7320) @@ -648,6 +648,15 @@ CAMERA_SMART_DISTANCESCALE .2 # distance scale measured relative to cycle speed CAMERA_SMART_MIN_DISTANCESCALE 5.0 # minimal distance scale in meters +# red/green 3D rendering settings +# you need red/green or red/cyan 3D glasses to see anything meaningful if you use these +CAMERA_EYE_DISTANCE 0 # The distance between the two eyes of the camera. Meaninful values lie between 0.1 and 0.5 +CAMERA_EYE_1_COLOR 1 # The color mask of the first eye of the camera. 1 is red, 2 is green, 4 is blue, any sum of these values means more than one color +CAMERA_EYE_1_COLOR 6 # The color mask of the second eye of the camera +#CAMERA_EYE_1_COLOR 2 # for red/green glasses +CAMERA_IN_MAX_FOCUS_DISTANCE .5 # This, multiplied by the current speed, determines the maximum distance of the focus of the two eyes unless a wall is closer + + # server browser query settings BROWSER_QUERY_FILTER 1 # query filter. Set to 0 to poll all servers, 1 to query servers with nonnegative score bias, 2 to query only those with positive bias and 3 to not query at all. Non-queried servers will appear to have ping 999; the player info comes indirectly from the master server. Modified: armagetronad/trunk/armagetronad/language/english_base.txt =================================================================== --- armagetronad/trunk/armagetronad/language/english_base.txt 2007-08-04 15:43:10 UTC (rev 7319) +++ armagetronad/trunk/armagetronad/language/english_base.txt 2007-08-06 12:28:17 UTC (rev 7320) @@ -547,6 +547,12 @@ bug_transparency_help Unsupported: make all rim walls semi-transparent by rendering them without occlusion tests bug_transparency_demand_help Unsupported: use transparency instead of lowering walls +#red/green 3D rendering settings +camera_eye_distance_help The distance between the two eyes of the camera. Set this to 0 to disable 3D rendering +camera_eye_1_color_help The color mask of the first eye of the camera. 1 is red, 2 is green, 4 is blue, any sum of these values means more than one color +camera_eye_2_color_help The color mask of the second eye of the camera. 1 is red, 2 is green, 4 is blue, any sum of these values means more than one color +camera_in_max_focus_distance_help This, multiplied by the current speed, determines the maximum distance of the focus of the two eyes unless a wall is closer + #******************************************** #******************************************** # Modified: armagetronad/trunk/armagetronad/src/engine/eCamera.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/engine/eCamera.cpp 2007-08-04 15:43:10 UTC (rev 7319) +++ armagetronad/trunk/armagetronad/src/engine/eCamera.cpp 2007-08-06 12:28:17 UTC (rev 7320) @@ -1340,6 +1340,20 @@ static tSettingItem< REAL > se_confCameraSmart( "CAMERA_SMART", se_cameraSmart ); */ +static float se_cameraEyeDistance = 0; // .1 to .5 appear to be good values +static tConfItem<float> secced("CAMERA_EYE_DISTANCE", se_cameraEyeDistance); + +static int se_cameraEye1Color = 1; // 001b (bgR) +static tConfItem<int> sece1ca("CAMERA_EYE_1_COLOR", se_cameraEye1Color); +static tConfItem<int> sece1cb("CAMERA_EYE_1_COLOUR", se_cameraEye1Color); + +static int se_cameraEye2Color = 6; // 110b (BGr) +static tConfItem<int> sece2ca("CAMERA_EYE_2_COLOR", se_cameraEye2Color); +static tConfItem<int> sece2cb("CAMERA_EYE_2_COLOUR", se_cameraEye2Color); + +static float se_cameraInMaxFocusDistance = .5; //factor of the current speed +static tConfItem<float> secimfd("CAMERA_IN_MAX_FOCUS_DISTANCE", se_cameraInMaxFocusDistance); + #ifndef DEDICATED bool displaying=false; @@ -1433,19 +1447,6 @@ if(CenterCockpitFixedBefore()){ vp->Perspective(fov,zNear,1E+20); - /* - gluLookAt(pos.x, - pos.y, - z, - - pos.x+dir.x, - pos.y+dir.y, - z+rise, - - top.x,top.y, - 1); - */ - gluLookAt(0, 0, 0, @@ -1471,6 +1472,9 @@ if (zNear < -.1 ) zNear = .1; + if(se_cameraEyeDistance) { + glColorMask(se_cameraEye1Color & 1, se_cameraEye1Color & 2, se_cameraEye1Color & 4, GL_TRUE); + } grid->Render( this, id, zNear ); zNear *= .3f; @@ -1479,6 +1483,66 @@ zNear = 0.0001f; } + if(se_cameraEyeDistance) { + glClear(GL_DEPTH_BUFFER_BIT); + glColorMask(se_cameraEye2Color & 1, se_cameraEye2Color & 2, se_cameraEye2Color & 4, GL_TRUE); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + vp->Perspective(fov,zNear,1E+20); + + float offset = 0; + if(mode == CAMERA_IN) { + eSensor test(Center(), Center()->Position(), Center()->Direction()); + test.detect(se_cameraInMaxFocusDistance*Center()->Speed()); + offset = test.hit; + } + + tCoord unnormalzed_dir = dir * ((centerPosSmooth - pos).Norm() + offset); + + tCoord perp = dir.Turn(tCoord(0,1))*se_cameraEyeDistance; + tCoord dir2 = unnormalzed_dir - perp; + dir2.Normalize(); + + gluLookAt(0, + 0, + 0, + + dir2.x, + dir2.y, + rise, + + top.x,top.y, + 1); + + perp += pos; + + glTranslatef(-perp.x,-perp.y,-z); + glMatrixMode(GL_MODELVIEW); + + draw_center=((CenterPos()-pos).NormSquared()>1 || + fabs(CenterZ() - z)>1); + + tJUST_CONTROLLED_PTR< eGameObject > c=Center(); + if (!draw_center && c) c->RemoveFromList(); + + eCoord poscopy = pos; + zNear = - eWallRim::Bound( poscopy, 0.0f ); + if (zNear < -.1 ) + zNear = .1; + + grid->Render( this, id, zNear ); + + zNear *= .3f; + if ( zNear < 0.0001f ) + { + zNear = 0.0001f; + } + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + } + if (c) c->RenderCockpitVirtual(); if (!draw_center && c) c->AddToList(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <z-...@us...> - 2007-11-12 19:47:35
|
Revision: 7382 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7382&view=rev Author: z-man Date: 2007-11-12 11:47:33 -0800 (Mon, 12 Nov 2007) Log Message: ----------- Merging branch 0.2.8 from revision 7180 to 7381: ------------------------------------------------------------------------ r7381 | z-man | 2007-11-12 19:27:58 +0100 (Mon, 12 Nov 2007) | 2 lines Removed deprecated/wrong entries. ------------------------------------------------------------------------ r7380 | z-man | 2007-11-12 17:07:45 +0100 (Mon, 12 Nov 2007) | 2 lines Minor corrections. ------------------------------------------------------------------------ r7379 | z-man | 2007-11-12 17:07:21 +0100 (Mon, 12 Nov 2007) | 2 lines Translated. Phew. Work. ------------------------------------------------------------------------ r7378 | z-man | 2007-11-12 15:38:30 +0100 (Mon, 12 Nov 2007) | 2 lines Added CYCLE_SPEED_MAX. ------------------------------------------------------------------------ r7377 | z-man | 2007-11-12 15:37:35 +0100 (Mon, 12 Nov 2007) | 2 lines Fixed client compilation. Intercept_Commands is only supposed to work on the server, right? ------------------------------------------------------------------------ r7376 | luke-jr | 2007-11-12 11:21:07 +0100 (Mon, 12 Nov 2007) | 1 line allow intercepting of /-commands (configurable) ------------------------------------------------------------------------ r7375 | luke-jr | 2007-11-12 09:51:57 +0100 (Mon, 12 Nov 2007) | 1 line rewrite of epsys PLAYER_MESSAGE ------------------------------------------------------------------------ r7374 | luke-jr | 2007-11-12 09:12:22 +0100 (Mon, 12 Nov 2007) | 1 line hack to send ladderlog to stdout (default disabled, of course) ------------------------------------------------------------------------ r7373 | z-man | 2007-11-12 00:50:44 +0100 (Mon, 12 Nov 2007) | 1 line Whoops, fixed server compilation. ------------------------------------------------------------------------ r7372 | z-man | 2007-11-12 00:38:54 +0100 (Mon, 12 Nov 2007) | 2 lines Fixed blank screen error when user reverts to an older SDL version. ------------------------------------------------------------------------ r7371 | z-man | 2007-11-12 00:32:12 +0100 (Mon, 12 Nov 2007) | 2 lines Added desktop size detection for SDL >= 1.2.10 and added desktop size as a choice for a screen resolution. ------------------------------------------------------------------------ r7370 | z-man | 2007-11-12 00:06:22 +0100 (Mon, 12 Nov 2007) | 2 lines Added desktop resolution text. ------------------------------------------------------------------------ r7369 | z-man | 2007-11-11 23:12:10 +0100 (Sun, 11 Nov 2007) | 1 line Well, the new timer code did the same as the old one, so instead of activating it, the high resolution timer is now dropped in favor of the old low resolution timer (which is then smoothed) if the high resolution timer is making trouble. ------------------------------------------------------------------------ r7368 | z-man | 2007-11-11 16:44:10 +0100 (Sun, 11 Nov 2007) | 2 lines Prepared potentially better system time code on Windows (to work around dual Athlon problems with QueryPerformanceCounter()). ------------------------------------------------------------------------ r7367 | z-man | 2007-11-09 18:07:24 +0100 (Fri, 09 Nov 2007) | 2 lines Fixed pedantic new warnings in GCC 4.1.3. ------------------------------------------------------------------------ r7366 | z-man | 2007-11-05 18:02:25 +0100 (Mon, 05 Nov 2007) | 2 lines hopefully fixed the rare teleport bugs. ------------------------------------------------------------------------ r7365 | luke-jr | 2007-11-04 04:21:24 +0100 (Sun, 04 Nov 2007) | 1 line um, we migrated from CVS to Svn, but missed this bit! ------------------------------------------------------------------------ r7358 | luke-jr | 2007-10-02 06:27:09 +0200 (Tue, 02 Oct 2007) | 1 line some of these should be translated? (ps, Im up for civ maybe) ------------------------------------------------------------------------ r7317 | wrtlprnft | 2007-07-27 17:02:08 +0200 (Fri, 27 Jul 2007) | 2 lines Sever -> Server ------------------------------------------------------------------------ r7313 | z-man | 2007-07-07 11:11:25 +0200 (Sat, 07 Jul 2007) | 2 lines Whoops, fixed server compilation. ------------------------------------------------------------------------ r7312 | z-man | 2007-07-07 11:11:08 +0200 (Sat, 07 Jul 2007) | 2 lines Added NOEXPIRE compile flag that disables expring of versions. ------------------------------------------------------------------------ r7311 | z-man | 2007-07-07 10:11:29 +0200 (Sat, 07 Jul 2007) | 2 lines No longer accept fullscreen toggles when the application is active. It's a mystery how they get through, but they trigger a bug in SDL_GetAppState() that makes the application marked as inactive when it gets restored. ------------------------------------------------------------------------ r7301 | wrtlprnft | 2007-06-10 23:32:02 +0200 (Sun, 10 Jun 2007) | 2 lines Yet another fix: The "you're not allowed to change your team" was sent to everyone if a player tried to create a new team, not just to the player. ------------------------------------------------------------------------ r7300 | wrtlprnft | 2007-06-10 23:19:41 +0200 (Sun, 10 Jun 2007) | 2 lines Stupid typo fix. And the setting is called ALLOW_TEAM_CHANGE ------------------------------------------------------------------------ r7299 | wrtlprnft | 2007-06-10 23:18:50 +0200 (Sun, 10 Jun 2007) | 2 lines Forgot to add ALLOW_TEAMCHANGE to settings_custom.cfg. ------------------------------------------------------------------------ r7274 | z-man | 2007-05-27 13:05:42 +0200 (Sun, 27 May 2007) | 2 lines New setting to enforce this ominous "open" play style by making all grinds non-sealing: CYCLE_RUBBER_MINDISTANCE_GAP* ------------------------------------------------------------------------ r7273 | z-man | 2007-05-27 13:04:57 +0200 (Sun, 27 May 2007) | 2 lines Removed obsolete IMGLib reference in error message. ------------------------------------------------------------------------ r7225 | wrtlprnft | 2007-05-18 23:30:24 +0200 (Fri, 18 May 2007) | 4 lines - Changed meaning of SILENCE_ALL on the server to work the same way as it does on the client. - Added ENABLE_CHAT to both server and client that does pretty much what its name suggests. See http://forums.armagetronad.net/viewtopic.php?p=172531#172531 ------------------------------------------------------------------------ r7210 | wrtlprnft | 2007-04-23 19:50:46 +0200 (Mon, 23 Apr 2007) | 4 lines - Added ALLOW_TEAM_CHANGES setting to lock the teams for tournaments and the like - Added (DIS)?ALLOW_TEAM_CHANGES_PLAYER command to specifically (dis)allow a player from switching teams - Localized the error message you get if you say /teamleave on a server with AUTO_TEAM 0 ------------------------------------------------------------------------ r7205 | z-man | 2007-04-21 10:37:28 +0200 (Sat, 21 Apr 2007) | 2 lines Added earlier "starting to lose contact" message to master server log. ------------------------------------------------------------------------ r7203 | z-man | 2007-04-21 00:42:06 +0200 (Sat, 21 Apr 2007) | 2 lines Master server log now contains server names (after one server setup support request too many where the admin is incapable of keeping his server up long enough or stating its IP) ------------------------------------------------------------------------ r7199 | wrtlprnft | 2007-04-18 21:30:26 +0200 (Wed, 18 Apr 2007) | 2 lines Don't stretch the floor image for screens with an aspect ratio != 4./3. ------------------------------------------------------------------------ r7193 | wrtlprnft | 2007-04-09 20:34:26 +0200 (Mon, 09 Apr 2007) | 2 lines minor spelling fix ------------------------------------------------------------------------ r7189 | luke-jr | 2007-04-04 23:10:09 +0200 (Wed, 04 Apr 2007) | 1 line close some fds left open ------------------------------------------------------------------------ r7185 | z-man | 2007-03-26 14:52:22 +0200 (Mon, 26 Mar 2007) | 2 lines Added an extra clearing of the grid before it is rebuild. Network messages coming in between rounds can seriously mess things up. ------------------------------------------------------------------------ r7183 | wrtlprnft | 2007-03-26 08:42:41 +0200 (Mon, 26 Mar 2007) | 3 lines Backporting r7182 because it won't work in the trunk, so it's sort of pointless there. Also added the file to the makefiles so it gets installed :) ------------------------------------------------------------------------ Revision Links: -------------- http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7180&view=rev Modified Paths: -------------- armagetronad/trunk/armagetronad/NEWS armagetronad/trunk/armagetronad/batch/make/sortresources armagetronad/trunk/armagetronad/config/Makefile.am armagetronad/trunk/armagetronad/config/settings.cfg armagetronad/trunk/armagetronad/config/settings_dedicated.cfg armagetronad/trunk/armagetronad/configure.ac armagetronad/trunk/armagetronad/desktop/armagetronad.desktop.in armagetronad/trunk/armagetronad/language/deutsch.txt armagetronad/trunk/armagetronad/language/english_base.txt armagetronad/trunk/armagetronad/language/english_base_notranslate.txt armagetronad/trunk/armagetronad/src/engine/eGameObject.cpp armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp armagetronad/trunk/armagetronad/src/engine/ePlayer.h armagetronad/trunk/armagetronad/src/engine/eTimer.cpp armagetronad/trunk/armagetronad/src/network/nConfig.cpp armagetronad/trunk/armagetronad/src/network/nConfig.h armagetronad/trunk/armagetronad/src/network/nNetwork.cpp armagetronad/trunk/armagetronad/src/network/nServerInfo.cpp armagetronad/trunk/armagetronad/src/render/rGLRender.cpp armagetronad/trunk/armagetronad/src/render/rScreen.cpp armagetronad/trunk/armagetronad/src/render/rScreen.h armagetronad/trunk/armagetronad/src/tools/tSysTime.cpp armagetronad/trunk/armagetronad/src/tron/gCycleMovement.cpp armagetronad/trunk/armagetronad/src/tron/gCycleMovement.h armagetronad/trunk/armagetronad/src/tron/gFloor.cpp armagetronad/trunk/armagetronad/src/tron/gMenus.cpp armagetronad/trunk/armagetronad/src/tron/gServerBrowser.cpp Modified: armagetronad/trunk/armagetronad/NEWS =================================================================== --- armagetronad/trunk/armagetronad/NEWS 2007-11-12 18:27:58 UTC (rev 7381) +++ armagetronad/trunk/armagetronad/NEWS 2007-11-12 19:47:33 UTC (rev 7382) @@ -91,7 +91,8 @@ New settings and commands: - If all clients support it, PING_CHARITY_MIN/MAX can be used to constrain ping charity. - SILENCE and VOICE allow to control chat of annoying players. -- SILENCE_ALL can be used on the server to inhibit all cross-team communication. +- SILENCE_ALL can be used on the server to inhibit all cross-team communication unless specifically voiced. +- ENABLE_CHAT can be set to 0 to disable all chat. If it is set on the server it only disables public chat and logged in players can still speak. - LAG_*: controls game level lag compensation. - FILTER_NAME_MIDDLE: collapses multiple whitespaces to one in player names. - FORTRESS_CONQEST_TIMEOUT: if an enemy contact with a zone happens longer ago than @@ -115,6 +116,8 @@ doublebinders get while not punishing players who press both left and right at the same time. - LAG_O_METER(TRESHOLD|BLEND|USE_OLD): Configure the minimal size of the Lag-O-Meter, its color and whether to scrap it all and stick with the old one. +- ALLOW_TEAM_CHANGE: if set to 0 players won't be able to join a team, create a new team or change to another team. +- ALLOW_TEAM_CHANGE_PLAYER/DISALLOW_TEAM_CHANGE_PLAYER: allow/disallow specific players to switch teams Featurelets ----------- Modified: armagetronad/trunk/armagetronad/batch/make/sortresources =================================================================== --- armagetronad/trunk/armagetronad/batch/make/sortresources 2007-11-12 18:27:58 UTC (rev 7381) +++ armagetronad/trunk/armagetronad/batch/make/sortresources 2007-11-12 19:47:33 UTC (rev 7382) @@ -23,6 +23,7 @@ # remove CVS directories and backup files find ${destination}/ -depth -type d -name CVS -exec rm -rf \{\} \; +find ${destination}/ -depth -type d -name .svn -exec rm -rf \{\} \; find ${destination}/ -name "*~" -exec rm -rf \{\} \; # rename them properly Modified: armagetronad/trunk/armagetronad/config/Makefile.am =================================================================== --- armagetronad/trunk/armagetronad/config/Makefile.am 2007-11-12 18:27:58 UTC (rev 7381) +++ armagetronad/trunk/armagetronad/config/Makefile.am 2007-11-12 19:47:33 UTC (rev 7382) @@ -11,6 +11,7 @@ examples/fortress_soccer.cfg examples/death_zone.cfg\ examples/cvs_test/fortress_physics.cfg examples/cvs_test/fortress_scoring.cfg\ examples/cvs_test/fortress_politics.cfg\ - examples/cvs_test/fortress_complete.cfg examples/cvs_test/sumo_complete.cfg + examples/cvs_test/fortress_complete.cfg examples/cvs_test/sumo_complete.cfg\ + examples/teamsumo.cfg EXTRA_DIST=${nobase_config_DATA} Modified: armagetronad/trunk/armagetronad/config/settings.cfg =================================================================== --- armagetronad/trunk/armagetronad/config/settings.cfg 2007-11-12 18:27:58 UTC (rev 7381) +++ armagetronad/trunk/armagetronad/config/settings.cfg 2007-11-12 19:47:33 UTC (rev 7382) @@ -150,6 +150,12 @@ CYCLE_RUBBER_WALL_SHRINK 0 # With finite length trails, the used rubber is multiplied with this value and subtracted from the wall length. A value of 1 lets the trail receed at constant speed. All values are supported, but negative values may degrade performance and cause false positives from the topology police if that is enabled. +# "open" vs "closed" play. To enforce "open" play, set the next value to something positive, +# values between .5 and .9 make most sense. If you choose to do so, increase CYCLE_RUBBER_MINDISTANCE +# for optimal effect; with normal speed settings, keep it between .2 and 2. +CYCLE_RUBBER_MINDISTANCE_GAP 0 # If > 0, CYCLE_RUBBER_MINDISTANCE effectively is never taken to be bigger than this value times the size of any detected gaps the cylce can squeeze through. +CYCLE_RUBBER_MINDISTANCE_GAP_SIDE .5 # Gap detection only sees gaps that the cycle may reach in no less than this many seconds. + # braking CYCLE_BRAKE_REFILL .1 # refill rate of brake reservoir CYCLE_BRAKE_DEPLETE 1.0 # depletion rate of brake reservoir ( set to 0 to reenable pre 0.2.5 behaviour of infinite brakes ) @@ -466,7 +472,8 @@ FILTER_NAME_MIDDLE 1 # Filter excess whitespace and other junk from the middle of player names. FILTER_COLOR_SERVER_NAMES 0 # Filter color codes from server names in the server browser. -SILENCE_ALL 0 # silence all chat messages? +SILENCE_ALL 0 # silence new players by default? +ENABLE_CHAT 1 # allow public messages? # ladder constants (outdated) Modified: armagetronad/trunk/armagetronad/config/settings_dedicated.cfg =================================================================== --- armagetronad/trunk/armagetronad/config/settings_dedicated.cfg 2007-11-12 18:27:58 UTC (rev 7381) +++ armagetronad/trunk/armagetronad/config/settings_dedicated.cfg 2007-11-12 19:47:33 UTC (rev 7382) @@ -262,6 +262,7 @@ AUTO_IQ 0 # flag indicating whether the IQ of the AIs should be automatically adapted to the player strength AUTO_AIS 0 # flag indicating whether the number of AIs should be automatically adapted to the player strength AUTO_TEAM 1 # flag indicating whether players should be put into a team automatically +ALLOW_TEAM_CHANGE 1 # flag indicating whether players should be allowed to join/leave teams AI_IQ 50 # IQ of the AIs MIN_PLAYERS 0 # minimum number of players; missing humans are filled up with AIs NUM_AIS 0 # minimum number of AIs Modified: armagetronad/trunk/armagetronad/configure.ac =================================================================== --- armagetronad/trunk/armagetronad/configure.ac 2007-11-12 18:27:58 UTC (rev 7381) +++ armagetronad/trunk/armagetronad/configure.ac 2007-11-12 19:47:33 UTC (rev 7382) @@ -789,7 +789,7 @@ AC_CHECK_LIB(SDL_image, IMG_Load,, dnl AC_CHECK_LIB(IMG, main,, -AC_MSG_ERROR([You need libIMG/SDL_image to compile Armagetron.] +AC_MSG_ERROR([You need the library SDL_image to compile Armagetron.] dnl ) )) Modified: armagetronad/trunk/armagetronad/desktop/armagetronad.desktop.in =================================================================== --- armagetronad/trunk/armagetronad/desktop/armagetronad.desktop.in 2007-11-12 18:27:58 UTC (rev 7381) +++ armagetronad/trunk/armagetronad/desktop/armagetronad.desktop.in 2007-11-12 19:47:33 UTC (rev 7382) @@ -1,13 +1,11 @@ [Desktop Entry] Type=Application -Version=@version@ -Encoding=UTF-8 Name=@progtitle@@progtitle_server@ Exec=@progname@ Comment=3d light cycle game Icon=@progname@.png Terminal=@build_dedicated@ Path=@prefix@/bin/@progname@ -Categories=Application;Game;ActionGame;GameAction;ActionGames;GamesAction; +Categories=Game;ActionGame; StartupNotify=@build_dedicated@ MimeType=application/x-armagetronad; Modified: armagetronad/trunk/armagetronad/language/deutsch.txt =================================================================== --- armagetronad/trunk/armagetronad/language/deutsch.txt 2007-11-12 18:27:58 UTC (rev 7381) +++ armagetronad/trunk/armagetronad/language/deutsch.txt 2007-11-12 19:47:33 UTC (rev 7382) @@ -55,6 +55,7 @@ cycle_speed_help Grundgeschwindigkeit der Vehikel im freien Raum cycle_speed_min_help Minimalgeschwindigkeit der Vehikel im Verh\xE4ltnis zu CYCLE_SPEED +cycle_speed_max_help Maximalgeschwindigkeit der Vehikel im Verh\xE4ltnis zu CYCLE_SPEED. 0 als Wert bedeutet keine Geschwindigkeitsbegrenzung. cycle_speed_decay_below_help Rate, mit der sich die Geschwindigkeit der Vehikel CYCLE_SPEED von unten n\xE4hert cycle_speed_decay_above_help Rate, mit der sich die Geschwindigkeit der Vehikel CYCLE_SPEED von oben n\xE4hert cycle_start_speed_help Startgeschwindigkeit der Vehikel @@ -66,25 +67,43 @@ cycle_accel_enemy_help Multiplikator f\xFCr CYCLE_ACCEL f\xFCr W\xE4nde von Feinden cycle_accel_rim_help Multiplikator f\xFCr CYCLE_ACCEL f\xFCr Arenaw\xE4nde cycle_accel_slingshot_help Multiplikator f\xFCr den Gesamteffekt von CYCLE_ACCEL, wenn sich das Vehikel zwischen einer eigenen und einer beliebigen anderen Wand befindet +cycle_accel_tunnel_help Multiplikator f\xFCr den Gesamteffekt von CYCLE_ACCEL, wenn sich das Vehikel zwischen zwei fremden W\xE4nded befindet cycle_accel_offset_help Minimaler effektiver Abstand zu einer Wand cycle_wall_near_help Bei diesem Abstand setzt die Beschleunigung durch W\xE4nde ein +cycle_boost_self_help Geschwindigkeitsboost, wenn man sich von einer eigenen Wand l\xF6st +cycle_boost_team_help Geschwindigkeitsboost, wenn man sich von einer Wand eines Teammitglieds l\xF6st +cycle_boost_enemy_help Geschwindigkeitsboost, wenn man sich von der Wand eines Gegners l\xF6st +cycle_boost_rim_help Geschwindigkeitsboost, wenn man sich vom Rand l\xF6st +cycle_boostfactor_self_help Geschwindigkeitsmultiplikator, wenn man sich von einer eigenen Wand l\xF6st +cycle_boostfactor_team_help Geschwindigkeitsmultiplikator, wenn man sich von einer Wand eines Teammitglieds l\xF6st +cycle_boostfactor_enemy_help Geschwindigkeitsmultiplikator, wenn man sich von der Wand eines Gegners l\xF6st +cycle_boostfactor_rim_help Geschwindigkeitsmultiplikator, wenn man sich vom Rand l\xF6st + cycle_turn_memory_help Zahl der noch nicht ausgef\xFChrten Lenkvorg\xE4nge, die sich ein Vehikel exakt vormerkt cycle_delay_help Pause zwischen zwei Lenkvorg\xE4ngen cycle_delay_bonus_help Extrafaktor, mit dem CYCLE_DELAY auf dem Server multipliziert wird. cycle_delay_timebased_help CYCLE_DELAY wird als Zeit interpretiert, wenn diese Variable 1 ist (Standard) und als L\xE4nge (gemessen an der Besisgeschwindigkeit) wenn dies 0 ist. Zwischenwerte und Werte au\xDFerhalb von 0 und 1 sind ebenfalls erlaubt. cycle_turn_speed_factor_help Faktor, mit dem die Geschwindigkeit der Vehikel bei jedem Abbiegen multipliziert wird. +cycle_delay_doublebind_bonus_help Faktor, mit dem CYCLE_DELAY f\xFCr zwei Lenkvorg\xE4ngen in dieselbe Richtung multipliziert wird. cycle_brake_help Effizienz der Bremsen +cycle_width_help Breite der Vehikel in der Kollisionserkennung. Man kann sich nur schadlos durch Tunnel quetschen, die schmaler als dieser Wert sind. +cycle_width_side_help Kommt man n\xE4her als dieser Wert an eine Wand, kann man Schaden nehmen. +cycle_width_rubber_min_help Bestimmt, wieviel Rubber bei leichten Kollisionen verbraucht wird. Ein Wert von 1 verbraucht genau soviel Rubber, als ob man direkt vor einer Wand stehen w\xFCrde. +cycle_width_rubber_max_help Bestimmt, wieviel Rubber bei schweren Kollisionen verbraucht wird. Ein Wert von 1 verbraucht genau soviel Rubber, als ob man direkt vor einer Wand stehen w\xFCrde. + cycle_rubber_help Toleranz bei Kollisionen mit W\xE4nden cycle_rubber_time_help Zeit, in der der Rubber-Vorrat aufgef\xFCllt wird. cycle_rubber_legacy_help Restauriert das alte, von der Darstellungsgeschwindigkeit der Clients abh\xE4ngige, Rubber-Verhalten wenn alte Clients mitspielen. Alt hei\xDFt hier <= 0.2.7.0. cycle_rubber_timebased_help Die Rate, mit der sich das Rubber-Meter f\xFCllt, wird von der Geschwindigkeit des Vehikels bestimmt, wenn diese Variable 0 ist. Bei einem Wert von 0 ist ist die Rate konstant. Zwischenwerte und Werte au\xDFerhalb von 0 und 1 sind ebenfalls erlaubt. cycle_rubber_speed_help Maximale logarithmische Ann\xE4herungsgeschwindigket an W\xE4nde, wenn Kollisionstoleranz aktiv ist (pro Sekunde kann das Vehikel der Wand nur um den Faktor ca. 0.4^{dieser Wert} n\xE4her kommen) cycle_rubber_mindistance_help Die Kollisionstoleranz h\xE4lt Vehikel mindestens in diesem Abstand zu W\xE4nden +cycle_rubber_mindistance_gap_help Wenn dies auf einen positiven Wert gesetzt wird, dann wirkt es als maximalwert f\xFCr CYCLE_RUBBER_MINDISTANCE: Wenn ein kleines Loch der Breite x sichtbar ist, wird der effektive Wert von _MINDISTANCE nicht gr\xF6\xDFer als x * CYCLE_RUBBER_MINDISTANCE_GAP. N\xFCtzlich f\xFCr "offenes" Spiel. +cycle_rubber_mindistance_gap_side_help L\xF6cher f\xFCr CYCLE_RUBBER_MINDISTANCE_GAP werden links und rechts in diesem Abstand gesucht. cycle_rubber_mindistance_ratio_help Zusatzwert zu CYCLE_RUBBER_MINDISTANCE, w\xE4chst mit der L\xE4nge der Wand an cycle_rubber_mindistance_reservoir_help Zusatzwert zu CYCLE_RUBBER_MINDISTANCE, der bei leerem Rubber-Meter voll und zum tragen kommt und mit steigendem F\xFCllstand langsam ausgeblendet wird. cycle_rubber_mindistance_unprepared_help Zusatzwert zu CYCLE_RUBBER_MINDISTANCE f\xFCr schlecht vorbereitete Ann\xE4herungen. Eine Ann\xE4herung z\xE4hlt als schleicht vorbereitet, wenn die letzte Richtungs\xE4nderung des Vehikels weniger als CYCLE_RUBBER_MINDISTANCE_PREPARATION her ist. @@ -106,6 +125,7 @@ cycle_sync_ff_help Geschwindigkeit der Simulation f\xFCr die Extrapolation: bei kleineren Werten sinkt die Prozessorlast, aber daf\xFCr steigt die effektive Netzverz\xF6gerung. cycle_sync_ff_steps_help Zahl der Extrapolationszeitschritte in jedem echten Zeitschritt: je mehr, desto genauer ist die Extrapolation topology_police_help Die Topologiepolizei analysiert das Spielgeschehen im nachhinein und f\xE4ngt verletzungen der Regeln ab. 1 hier aktiviert sie. +topology_police_parallel_help Flag, das, wen aktiviert, der Topologiepolizei sagt, sie soll auch F\xE4lle von exakt parallellen W\xE4nden als Kollisionen melden. cycle_smooth_time_help Zeitskala f\xFCr Positionsgl\xE4ttungen. H\xF6here Werte lassen die animationen glatter aussehen, sind aber weniger genau. Zu niedrige Werte bewirken Spr\xFCnge in der Netzwerksynchronisation. cycle_smooth_min_speed_help Minimale Geschwindigketi f\xFCr Netzwerk-Positionskorrekturen (relativ zur Vehikelgeschwindigkeit angegeben) cycle_smooth_threshold_help Nur Positonsupdates, die das Vehikel um mehr als diesen Wert (gemessen relativ zur Geschwindigkeit) korrigieren, werden gegl\xE4ttet, gr\xF6ssere Korrekturen werden direkt \xFCbernommen. @@ -184,6 +204,42 @@ allow_team_name_color_help Erlaubt es, ein Team nach einer Farbe zu benennen allow_team_name_player_help Erlaubt es, ein Team nach dem Anf\xFChrer zu benennen +team_name_1_help Name f\xFCr Team 1 +team_name_2_help Name f\xFCr Team 2 +team_name_3_help Name f\xFCr Team 3 +team_name_4_help Name f\xFCr Team 4 +team_name_5_help Name f\xFCr Team 5 +team_name_6_help Name f\xFCr Team 6 +team_name_7_help Name f\xFCr Team 7 +team_name_8_help Name f\xFCr Team 8 + +team_red_1_help Rot-Komponente der Farbe von Team 1 +team_red_2_help Rot-Komponente der Farbe von Team 2 +team_red_3_help Rot-Komponente der Farbe von Team 3 +team_red_4_help Rot-Komponente der Farbe von Team 4 +team_red_5_help Rot-Komponente der Farbe von Team 5 +team_red_6_help Rot-Komponente der Farbe von Team 6 +team_red_7_help Rot-Komponente der Farbe von Team 7 +team_red_8_help Rot-Komponente der Farbe von Team 8 + +team_green_1_help Gr\xFCn-Komponente der Farbe von Team 1 +team_green_2_help Gr\xFCn-Komponente der Farbe von Team 2 +team_green_3_help Gr\xFCn-Komponente der Farbe von Team 3 +team_green_4_help Gr\xFCn-Komponente der Farbe von Team 4 +team_green_5_help Gr\xFCn-Komponente der Farbe von Team 5 +team_green_6_help Gr\xFCn-Komponente der Farbe von Team 6 +team_green_7_help Gr\xFCn-Komponente der Farbe von Team 7 +team_green_8_help Gr\xFCn-Komponente der Farbe von Team 8 + +team_blue_1_help Blau-Komponente der Farbe von Team 1 +team_blue_2_help Blau-Komponente der Farbe von Team 2 +team_blue_3_help Blau-Komponente der Farbe von Team 3 +team_blue_4_help Blau-Komponente der Farbe von Team 4 +team_blue_5_help Blau-Komponente der Farbe von Team 5 +team_blue_6_help Blau-Komponente der Farbe von Team 6 +team_blue_7_help Blau-Komponente der Farbe von Team 7 +team_blue_8_help Blau-Komponente der Farbe von Team 8 + # wall length modification cycle_dist_wall_shrink_help Entfernungsmultiplikator bei der Wandl\xE4ngenberechnung. Genaue Anleitung in settings.cfg. cycle_dist_wall_shrink_offset_help Entfernungsoffset bei der Wandl\xE4ngenberechnung. Genaue Anleitung in settings.cfg. @@ -310,7 +366,15 @@ spam_maxlen_help Maximall\xE4nge f\xFCr die Chat-Nachrichten. spam_autokick_help Spamer-Wert, bei dem der Spieler automatisch vom Server geworfen wird. silence_all_help Wenn dieser Wert auf 1 gesetzt ist, dann wird aller Chat unterbunden. +enable_chat_help Wenn dies auf 0 gesetzt wird, dann werden alle \xF6ffentlichen Chat-Nachrichten unterdr\xFCckt (Auf dem Server sind Nachrichten von Administratoren und /msg und /team-Nachrichten Ausnahmen). +allow_team_change_help Nur wenn dieser Wert 1 ist d\xFCrfen Spieler irh Team beliebig w\xE4hlen. Wenn dieser Wert 0 ist, muss ein Administrator jeden Teamwechsel mit ALLOW_TEAM_CHANGE_PLAYER authorisieren. +# spam kick messages +spam_chat Du warst zu laut. +spam_teamchage Du hast zu oft das Team gewechselt. +spam_vote_kick_issue Du wolltest zu viele andere Spieler vom Server werfen. +spam_vote_rejected Zu viele deiner Abstimmungen sind fehlgeschlagen. + #******************************************** #******************************************** # @@ -330,6 +394,29 @@ #******************************************** #******************************************** # +# Lag compensation +# +#******************************************** +#******************************************** + +lag_max_speedup_timer_help Maximale Geschwindigkeitserh\xF6hung der Uhr zu Lag-Kompensationszwecken. +lag_slow_time_help Zeitskala, \xFCber die die langame Lag-Messung gemittelt wird +lag_fast_time_help Zeitskala, \xFCber die die schnelle Lag-Messung gemittelt wird +lag_slow_weight_help Gewicht, mit dem Lag-Reports vom Server die langsame Lag-Messung beeinflussen +lag_fast_weight_help Gewicht, mit dem Lag-Reports vom Server die schnelle Lag-Messung beeinflussen + +lag_credit_help Gesamtzeit des Lag-Kredits in Sekunden. +lag_credit_single_help Maximaler Lag-Kredits in Sekunden f\xFCr ein einzelnes Lag-Event. +lag_sweet_spot_help "Sweet Spot" des Lag-Kredits. Es wird versucht, den Lag-Kredit auf diesem F\xFCllstand zu halten. +lag_credit_time_help Zeitskala, auf der Lag-Kredit verf\xE4llt. + +lag_offset_client_help Auf dem Client w\xE4hlbar: Zusatzkompensation f\xFCr Lag. F\xFCr sehr schlechte Verbindungen. +lag_offset_server_help Auf dem Server w\xE4hlbar: Zusatzkompensation f\xFCr Lag. F\xFCr sehr schlechte Verbindungen. +lag_offset_legacy_help Auf dem Server w\xE4hlbar: Zusatzkompensation f\xFCr Lag f\xFCr Clients, die den Lag-Kredit-Automatismus noch nicht beherrschen. F\xFCr sehr schlechte Verbindungen. + +#******************************************** +#******************************************** +# # Banning # #******************************************** @@ -366,6 +453,7 @@ voting_spam_issue_help Es wird als so nevig angesehen, eine Abstimmung zu beginnen. voting_spam_reject_help Es wird als so nevig angesehen, wenn eine Abstimmung abgelehnt wird.. voting_kick_time_help Mindestzeit in Sekunden, die zwischen zwei Vertreibungsvorschl\xE4gen gegen denselben Spieler liegen muss. +voting_maturity_help Zeit in Sekunden, die ein Spieler auf dem Server anwesend sein muss, bevor er Abstimmungen starten darf. #******************************************** #******************************************** @@ -406,6 +494,10 @@ camera_forbid_custom_help Verbietet die Benutzung der einstellbaren Kamera f\xFCr alle Clients camera_forbid_server_custom_help Verbietet die Benutzung der serverbestimmten einstellbaren Kamera f\xFCr alle Clients +camera_forbid_custom_glance_help Verbieted die Benutzung der einstellbaren Kamera f\xFCr das Umsehen. +camera_override_custom_glance_help Ueberschreibt den Clientseitigen CAMERA_CUSTOM_GLANCE Wert. +camera_override_custom_glance_server_custom_help Ueberschreibt den Clientseitigen CAMERA_CUSTOM_GLANCE Wert, aber nur f\xFCr die serverbestimmte Kamera. + camera_follow_start_x_help Startposition der festen externen Kamera camera_follow_start_y_help Startposition der festen externen Kamera camera_follow_start_z_help Startposition der festen externen Kamera @@ -430,14 +522,26 @@ camera_custom_turn_speed_180_help Direkt nach einer Kehrtwende wird CAMERA_CUSTOM_TURN_SPEED mit diesem Wert multipliziert angewandt. camera_in_turn_speed_help Geschwindigkeit, mit der sich die interne Kamera dreht -camera_server_custom_back_help Position der einstellbaren Kamera: wie weit liegt sie hinter dem Vehikel? -camera_server_custom_rise_help Position der einstellbaren Kamera: wie weit liegt sie \xFCber dem Vehikel? +camera_server_custom_back_help Position der serverseitig einstellbaren Kamera: wie weit liegt sie hinter dem Vehikel? +camera_server_custom_rise_help Position der serverseitig einstellbaren Kamera: wie weit liegt sie \xFCber dem Vehikel? camera_server_custom_back_fromspeed_help Dieser Wert wird mit der Geschwindigkeit des Vehikels multipliziert und auf CAMERA_SERVER_CUSTOM_BACK aufgeschlagen. camera_server_custom_rise_fromspeed_help Dieser Wert wird mit der Geschwindigkeit des Vehikels multipliziert und auf CAMERA_SERVER_CUSTOM_RISE aufgeschlagen. -camera_server_custom_pitch_help Position der einstellbaren Kamera: wie weit sieht sie nach oben oder unten? +camera_server_custom_pitch_help Position der serverseitig einstellbaren Kamera: wie weit sieht sie nach oben oder unten? camera_server_custom_turn_speed_help Geschwindigkeit, mit der sich die serverseitig einstellbare Kamera dreht; der Wert wird von den clientseitigen Einstellungen \xFCbernommen, wenn dieser Wert negativ ist. camera_server_custom_turn_speed_180_help Direkt nach einer Kehrtwende wird CAMERA_SERVER_CUSTOM_TURN_SPEED mit diesem Wert multipliziert angewandt. +camera_glance_back_help Position der Umschau-Kamera: wie weit liegt sie hinter dem Vehikel? +camera_glance_rise_help Position der Umschau-Kamera: wie weit liegt sie \xFCber dem Vehikel? +camera_glance_back_fromspeed_help Dieser Wert wird mit der Geschwindigkeit des Vehikels multipliziert und auf CAMERA_GLANCE_BACK aufgeschlagen. +camera_glance_rise_fromspeed_help Dieser Wert wird mit der Geschwindigkeit des Vehikels multipliziert und auf CAMERA_GLANCE_RISE aufgeschlagen. +camera_glance_pitch_help Position der Umschau-Kamera: wie weit sieht sie nach oben oder unten? + +camera_server_glance_back_help Position der serverseitigen Umschau-Kamera: wie weit liegt sie hinter dem Vehikel? +camera_server_glance_rise_help Position der serverseitigen Umschau-Kamera: wie weit liegt sie \xFCber dem Vehikel? +camera_server_glance_back_fromspeed_help Dieser Wert wird mit der Geschwindigkeit des Vehikels multipliziert und auf CAMERA_SERVER_GLANCE_BACK aufgeschlagen. +camera_server_glance_rise_fromspeed_help Dieser Wert wird mit der Geschwindigkeit des Vehikels multipliziert und auf CAMERA_SERVER_GLANCE_RISE aufgeschlagen. +camera_server_glance_pitch_help Position der serverseitigen Umschau-Kamera: wie weit sieht sie nach oben oder unten? + camera_visibility_recovery_speed_help Die Geschwindigkeit, mit der die externen Kamera-Referenzpunkte sich nach au\xDFen bewegen camera_visibility_wall_distance_help Entfernung, die die Kamera-Referenzpunkte von W\xE4nden halten camera_visibility_clip_speed_help Geschwindigkeit, mit der die Kamera versucht, die Kamera-Referenzpunkte ins Blickfeld zu bringen @@ -459,10 +563,14 @@ custom_server_name_help Name des Servers, mit dem Verbindung aufgenommen werden soll dedicated_idle_help Nach dieser Zeit (in Stunden) beendet sich der Dedicated Server bei der n\xE4chsten Gelegenheit selbst. dedicated_fps_help Maximale Zahl der Simulationsschritte pro Sekunde, die der Server ausf\xFChren soll +dedicated_fps_idle_factor_help Maximale Zahl der Simulationsschritte pro Sekunde, die der Server ausf\xFChren soll, w\xE4hrent gerade kein eingehender Netzwerkverkehr vorliegt talk_to_master_help Soll dieser Server im Internet bekannt gemacht werden? max_out_rate_help Maximale Netzwerkbandbreite (Ausgabe) max_in_rate_help Maximale Netzwerkbandbreite (Eingabe) ping_charity_help Ping-Spende: Wieviel Ping m\xF6chtest Du gerne von deinen minderbemittelten Mitspielern \xFCbernehmen? +ping_charity_max_help Serverseitig einstellbar: Maximale Ping-Spende, wird nur aktiv, wenn alle Clients Version 0.2.8.3 oder h\xF6her sind. Ein Wert von 0 sollte die gef\xFCrchteten Instant-Kills vermeiden. +ping_charity_min_help Serverseitig einstellbar: Minimale Ping-Spende, wird nur aktiv, wenn alle Clients Version 0.2.8.3 oder h\xF6her sind. +ping_charity_server_help Nicht selbst ver\xE4ndern: Der Server benutzt diesen Wert, um die aktuelle Ping-Spende den Clients mitzuteilen. big_brother_help Wurde die Big-Brother information schon gesendet? server_name_help Name dieses Servers server_options_help Kurze Beschreibung der Einstellungen auf diesem Server. @@ -581,6 +689,7 @@ console_rows_max_help Anzahl der Zeilen der Textausgabe (maximal beim Hochscrollen) console_decorate_id_help Jede Ausgabezeile wird mit der ID-Nummer des Clients, der sie verursacht hat, dekoriert console_decorate_ip_help Jede Ausgabezeile wird mit der IP-Adresse des Clients, der sie verursacht hat, dekoriert +console_ladder_log_help Schickt das Ladder-Log auch an die Standardausgabe show_fps_help Aktiviert Performance-Anzeige floor_mirror_help Spiegelung des Bodens floor_detail_help Detail des Bodens @@ -592,6 +701,10 @@ infinity_plane_help Verwende unendlich ferne Punkte (funktionniert manchmal nicht) lag_o_meter_help Zeichne das Lag-O-Meter im Netzwerkspiel lag_o_meter_scale_help Gr\xF6\xDFenfaktor des Lag-O-Meters. 1.0 w\xE4re korrekt, aber \xE4ltere Versionen von AA waren durch einen Bug auf .5 fest eingestellt. +lag_o_meter_threshold_help Das Lag-O-Meter wird nur dann angezeigt, wenn es diese Gr\xF6\xDFe \xFCbersteigt. +lag_o_meter_blend_help Bestimmt, wie stark die Farbe eines Spielers sein Lag-O-Meter beinflusst. Bei 1 wird das Lag-O-Meter ganz wei\xDF, bei 0 nimmt es komplett die Farbe des Spielers an. +lag_o_meter_use_old_help Soll das alte, nicht wirklich korrekte Lag-O-Meter angezeigt werden? +axes_indicator_help Sollen Richtungshinweise gezeigt werden? predict_objects_help Vorhersage der Vehikelbewegungen im Netzwerkspiel textures_hi_help Verwende 32-Bit-Texturen sparks_help L\xE4sst die Funken fliegen @@ -602,12 +715,14 @@ filter_color_strings_help Entferne Farbcodierungen aus allen Texten, die \xFCber das Netwerk empfangen werden. filter_color_names_help Entferne Farbcodierungen aus Spielernamen. filter_name_ends_help Entferne Leerzeichen und anderen M\xFCll von Anfang und Ende der Spielernamen. +filter_name_middle_help Sollen extra-Freir\xE4ume und anderer M\xFCll aus Spielernamen entfernt werden? filter_color_server_names_help Entferne Farbcodierungen aus Servernamen im Browser. #screen mode custom_screen_height_help Benutzerdefinierte Bildschirmh\xF6he custom_screen_width_help Benutzerdefinierte Bildschirmbreite custom_screen_aspect_help Benutzerdefiniertes Verh\xE4ltnis Pixelbreite/Pixelh\xF6he +screen_size_desktop Desktop armagetron_screenmode_help Bildschirmaufl\xF6sung armagetron_last_screenmode_help letzte Bildschirmaufl\xF6sung armagetron_windowsize_help Fenstergr\xF6sse @@ -678,6 +793,8 @@ moviepack_help Verwende das Moviepack, wenn es installiert ist armagetron_version_help Aktuelle Version von \g message_of_day_help Begr\xFCssungstext f\xFCr neue Benutzer +title_of_day_help Titel \xFCber MESSAGE_OF_DAY f\xFCr Clients, die das unterst\xFCtzen. +message_of_day_timeout_help Zeit, die MESSAGE_OF_DAY angezeigt bleibt round_console_message_help Konsolennachricht, die jede Runde wiederholt wird round_center_message_help Zentralnachricht, die jede Runde wiederholt wird @@ -694,6 +811,10 @@ # manning and kicking commands players_help Gibt eine Liste der eingeloggten Spieler aus kill_help T\xF6tet den angegebenen Spieler (als Warnung vor einem Rausschmiss) +silence_help Verbietet einem bestimmten Spieler, \xF6ffentlich zu Reden +voice_help Kehrt SILENCE um +allow_team_change_player_help Erlaubt einem bestimmten Speiler, einmal das Team zu wechseln +disallow_team_change_player_help Kehrt ALLOW_TEAM_CHANGE_PLAYER um kick_help Wirft den angegebenen Spieler vom Server. ban_help Wirft den angegebenen Spieler vom Server und verbannt ihn f\xFCr eine variable Zeit in Minuten. ban_ip_help Verbannt spieler von der angegebenen IP-Adresse f\xFCr die angegebene Zeit in Minuten vom Server. @@ -703,6 +824,7 @@ # communication console_message_help Gibt eine Nachricht auf den Konsolen aller angeschlossenen Spieler aus. center_message_help Gibt eine Nachricht in der Bildschirmmitte aller angeschlossenen Spieler aus. +fullscreen_message_help Unterbricht das Spiel mit einer bildschirmf\xFCllenden Nachrict. say_help L\xE4sst den Server-Administrator etwas sagen. #******************************************** @@ -938,6 +1060,9 @@ system_settings_menu_text System konfigurieren system_settings_menu_help Einstellungen f\xFCr Sound, Graphik und allgemeines Erscheinungsbild +main_menu_about_text \xDCber \g +main_menu_about_help Displays detailed information about this game. + main_menu_exit_text Spiel verlassen main_menu_exit_help Auf Wiedersehen! @@ -961,7 +1086,24 @@ game_menu_disconnect_help Trennt die Verbindung zum Server und f\xFChrt wieder zum Hauptmen\xFC. +#******************************************** +#******************************************** +# +# Version Info screen +# +#******************************************** +#******************************************** +version_info_title \xDCber diese Installation von \g +version_info_version Version von \g: \1 +version_info_misc_stuff \n0xff8888Offizielle Website:0xRESETT http://armagetronad.net/\n0xff8888Offizielles Forum:0xRESETT http://forums.armagetronad.net/\n0xff8888Wiki (Strategie, Turniere, Dokumentation, ...):0xRESETT http://wiki.armagetronad.net/\n0xff8888Projektverwalter:0xRESETT z-man, Tank Program (guru3), Lucifer +path_info_user_cfg Pfad zu user.cfg: +path_info_config Konfigurationsverzeichnisse: +path_info_resource Resourcen: +path_info_data Daten-Verzeichnisse: +path_info_screenshot Screenshot-Verzeichnisse: +path_info_var Verzeichnisse f\xFCr Spieldaten: + #******************************************** #******************************************** # @@ -1183,6 +1325,8 @@ network_opts_lagometer_text Lag-O-Meter: network_opts_lagometer_help Zeichnet Umrisse dorthin, wo die Vehikel jetzt prinzipiell schon sein k\xF6nnten (basierend auf dem Lag). Sehr n\xFCtzlich! +network_opts_axesindicator_text Richtungs-Anzeiger: +network_opts_axesindicator_help Der Richtungsanzeiger gibt an, in welche Richtungen sich die Vehikel bewegen k\xF6nnen. Praktisch f\xFCr Server mit wechselnder Konfiguration. network_opts_predict_text Vorhersage: network_opts_predict_help Sagt die Bewegung der Vehikel im Spiel, basierend auf der Netzwerkverz\xF6gerung, voraus. Allerdings wirken die Bewegungen dadurch sehr eckig. Ich pers\xF6nlich verlasse mich lieber auf das Lag-O-Meter. @@ -1935,6 +2079,7 @@ player_kill_collapse \1 wurde von seiner kollabierenden Zone vernichtet.\n player_win_survive \1 bekam \2 Punkte f\xFCr das Halten der eigenen Basis.\n +zone_collapse_harmless \1s Zone verpufft harmlos wegen mangelden Feindkontakts.\n #******************************************** #******************************************** @@ -1944,9 +2089,18 @@ #******************************************** #******************************************** +player_teamleave_disallowed Sorry, /teamleave funktionniert nicht, wenn automatische Teamwahl aktiv ist. +player_teamchanges_disallowed Sorry, der Administrator hat Teamwechsel verboten.\n player_pingcharity_changed Ping-Spende ist nun \2 (vorher: \1).\n spam_protection_repeat SPAM PROTECTION: du sagsest bereits: \1\n spam_protection LABER-SCHUTZ: du bist f\xFCr die n\xE4chsten \1 Sekunden geknebelt.\n +spam_protection_silenceall LABER-SCHUTZ: \xF6ffentliches Reden ist verboten.\n +spam_protection_silenced LABER-SCHUTZ: du wurdest vom Administrator geknebelt.\n +spam_protection_silenced_default LABER-SCHUTZ: der Administrator hat dir dein Rederecht zur\xFCckgegeben. +player_silenced \10xff7777 wurde geknebelt.\n +player_voiced \10x77ff77 hat seine Stimme wieder.\n +player_allowed_teamchange \10x77ff77 darf nun das Team wechseln.\n +player_disallowed_teamchange \10xff7777 darf nicht mehr das Team wechseln.\n vote_spam_protection ABSTIMMUNGS-SPAMSCHUTZ: du darft die n\xE4chsten \1 Sekunden keine Abstimmung mehr initiieren.\n chat_title_text Sage: player_entered_game \1 0x7fff7fkommt ins Spiel.\n @@ -2023,6 +2177,8 @@ #******************************************** #******************************************** +fullscreen_message_title Nachricht vom Server + network_message_timeout_title Server antwortet nicht network_message_timeout_inter Der Server, mit dem Verbindung aufgebaut werden sollte, hat nicht geantwortet.\nDas k\xF6nnte daran liegen, dass er momentan nicht aktiv oder nicht erreichbar ist; oder Du hast dich beim "Manuellen Verbindungsaufbau" vertippt. @@ -2096,6 +2252,7 @@ network_login_sync2 Nochmal Synchronisieren...\n network_login_done Fertig!\n +network_kill_log User \1 vom Server geworfen, Grund: \2\n network_kill_preface Vom Server angegebener Grund: network_kill_maxidgrabber Keine ObjektIDs mehr frei; Dein Client hatte die meisten davon f\xFCr sich selbst belegt ( Bug? ). network_kill_maxiduser Keine ObjektIDs mehr frei; Dein Client hatte die meisten davon belegt ( Bug? ). @@ -2139,6 +2296,7 @@ vote_timeout Abstimmung "\1" wurde ohne Ergebnis beendet.\n vote_new Neuer Abstimmungsvorschlag: "\1". Gib deine Stimme im Hauptmenu ab.\n vote_redundant Vorschlag abgelehnt, ein identischer Vorschlag wurde bereits gemacht.\n +vote_maturity Vorschlag abgelehnt, du bist noch nicht alt genug, warte \1 Sekunden.\n vote_overflow Vorschlag abgelehnt, es sind bereits zu viele Vorschl\xE4ge aktiv.\n vote_disabled Abstimmungen wurden leider von Serveradministrator abgeschaltet.\n vote_disabled_spectator Vorschlag abgelehnt, Zuschauer sind hier nicht Wahlberechtigt.\n @@ -2336,6 +2494,6 @@ # Outdated: +team_max_imbalance_perm_help H\xF6chste tolerierte Ungleichheit der Teams, dauerhaft +player_joins_team_now \1 0x7fff7fspielt nun f\xFCr \2.\n sp_team_max_imbalance_perm_help H\xF6chste tolerierte Ungleichheit der Teams, dauerhaft -player_joins_team_now \1 0x7fff7fspielt nun f\xFCr \2.\n -team_max_imbalance_perm_help H\xF6chste tolerierte Ungleichheit der Teams, dauerhaft Modified: armagetronad/trunk/armagetronad/language/english_base.txt =================================================================== --- armagetronad/trunk/armagetronad/language/english_base.txt 2007-11-12 18:27:58 UTC (rev 7381) +++ armagetronad/trunk/armagetronad/language/english_base.txt 2007-11-12 19:47:33 UTC (rev 7382) @@ -49,6 +49,7 @@ cycle_speed_help Basic speed of your cycle if you drive straight and not close to walls cycle_speed_min_help Minimal speed of your cycle, measured relative to CYCLE_SPEED +cycle_speed_max_help Maximal speed of your cycle, measured relative to CYCLE_SPEED. A value of 0 means no top speed. cycle_speed_decay_below_help Rate of cycle speed approaching the value of CYCLE_SPEED from below cycle_speed_decay_above_help Rate of cycle speed approaching the value of CYCLE_SPEED from above cycle_start_speed_help Initial cycle speed @@ -64,7 +65,7 @@ cycle_accel_offset_help Minimum numeric wall distance, must be positive cycle_wall_near_help Maximum accelerating wall distance -Cycle_boost_self_help Speed boost when breaking from your own wall +cycle_boost_self_help Speed boost when breaking from your own wall cycle_boost_team_help Speed boost when breaking from a teammate's wall cycle_boost_enemy_help Speed boost when breaking from an enemy wall cycle_boost_rim_help Speed boost when breaking from the rim wall @@ -78,7 +79,6 @@ cycle_delay_help Minimum time between turns (must be greater than 0) cycle_delay_bonus_help Extra fudge factor to CYCLE_DELAY applied on the dedicated server only. cycle_delay_timebased_help Turn delays will be based on the time since the last turn if this is 1 (default) and the distance if this is 0. Intermediate values and values out of these bounds are supported as well. -cycle_delay_help_doublebind_bonus Factor to CYCLE_DELAY for two consecutive turns in the same direction cycle_turn_speed_factor_help Factor the speed of a lightcycle is multiplied with when turning cycle_delay_doublebind_bonus_help Factor CYCLE_DELAY is multiplied with for consecutive turns in the same direction @@ -96,6 +96,8 @@ cycle_rubber_timebased_help Rubber usage is based on distance travelled if this is 0 (default) and the time passed if this is 1. Intermediate values and values out of these bounds are supported as well. cycle_rubber_speed_help Logarithmic speed of wall approximation when rubber is in effect (every second, you get closer to the wall by a factor of ~0.4^{this value}) cycle_rubber_mindistance_help The minimal distance rubber code keeps you from the wall in front of you +cycle_rubber_mindistance_gap_help If > 0, CYCLE_RUBBER_MINDISTANCE effectively is never taken to be bigger than this value times the size of any detected gaps the cylce can squeeze through. For "Open" gameplay. +cycle_rubber_mindistance_gap_side_help Gap detection only sees gaps that the cycle may reach in no less than this many seconds. cycle_rubber_mindistance_ratio_help Additional distance to CYCLE_RUBBER_MINDISTANCE for every length unit of the wall you have in front of you cycle_rubber_mindistance_reservoir_help Addidional distance if you have an empty rubber meter (gets faded out gradually as you use up all your rubber) cycle_rubber_mindistance_unprepared_help Additional distance for unprepared grinds; it gets applied when the cycle's last turn was just a fraction of a second ago and faded out preparation times larger than CYCLE_RUBBER_MINDISTANCE_PREPARATION. @@ -224,14 +226,14 @@ team_green_7_help green portion of team 7's color team_green_8_help green portion of team 8's color -team_blue_1 blue portion of team 1's color -team_blue_2 blue portion of team 2's color -team_blue_3 blue portion of team 3's color -team_blue_4 blue portion of team 4's color -team_blue_5 blue portion of team 5's color -team_blue_6 blue portion of team 6's color -team_blue_7 blue portion of team 7's color -team_blue_8 blue portion of team 8's color +team_blue_1_help blue portion of team 1's color +team_blue_2_help blue portion of team 2's color +team_blue_3_help blue portion of team 3's color +team_blue_4_help blue portion of team 4's color +team_blue_5_help blue portion of team 5's color +team_blue_6_help blue portion of team 6's color +team_blue_7_help blue portion of team 7's color +team_blue_8_help blue portion of team 8's color # wall length modification cycle_dist_wall_shrink_help Distance multiplier in wall length calculation. All values are legal. See settings.cfg for full docs. @@ -360,7 +362,9 @@ spam_penalty_help Number of seconds to silence a spammer. spam_maxlen_help Maximal length of chat message. spam_autokick_help Spam score that causes you to get kicked instantly. -silence_all_help If set to 1, all chat messages will be omitted. +silence_all_help If set to 1, new players will be silenced +enable_chat_help If set to 0, all chat will be surpressed (if reset on the server, messages from logged in players and private/team messages are still shown) +allow_team_change_help If set to 1, all players can change teams. If set to 0, players can only change teams if they've been specifically allowed to by ALLOW_TEAM_CHANGE_PLAYER # spam kick messages spam_chat You chatted too much. @@ -662,6 +666,7 @@ console_rows_max_help Number of lines of console output when scrolling back console_decorate_id_help Decorates every line of console output with the client ID console_decorate_ip_help Decorates every line of console output with the client IP +console_ladder_log_help Sends ladder log output to the console show_fps_help Enable fps display floor_mirror_help Floor mirror mode floor_detail_help Floor detail settings @@ -694,6 +699,7 @@ custom_screen_height_help Custom screen size custom_screen_width_help Custom screen size custom_screen_aspect_help Custom screen aspect ratio ( pixel width/pixel height) +screen_size_desktop Desktop armagetron_screenmode_help Screen resolution armagetron_last_screenmode_help Last screen resolution armagetron_windowsize_help Window size @@ -787,6 +793,8 @@ kill_help Kill a specific player (as warning before a kick) silence_help Silence a specific player so he can't use public chat any more (/msg and /team still work) voice_help Reverse of SILENCE +allow_team_change_player_help Allow a specific player to change teams even if ALLOW_TEAM_CHANGE is disabled +disallow_team_change_player_help Reverse of ALLOW_TEAM_CHANGE_PLAYER kick_help Kicks the specified player from the server. ban_help Bans the specified player from the server (kicks him first) for a variable time in minutes. ban_ip_help Bans the spedified IP address from the server for a variable time. @@ -2119,13 +2127,18 @@ #******************************************** #******************************************** +player_teamleave_disallowed Sorry, does not work with automatic team assignment.\n +player_teamchanges_disallowed Sorry, the administrator disabled team changes.\n player_pingcharity_changed Ping charity changed from \1 to \2.\n spam_protection_repeat SPAM PROTECTION: you already said: \1\n spam_protection SPAM PROTECTION: you are silenced for the next \1 seconds.\n spam_protection_silenceall SPAM PROTECTION: public chat is disabled.\n spam_protection_silenced SPAM PROTECTION: you have been silenced by the server administrator.\n +spam_protection_silenced_default SPAM PROTECTION: you have to be given voice in order to chat publically.\n player_silenced \10xff7777 has been silenced.\n player_voiced \10x77ff77 has been given his voice back.\n +player_allowed_teamchange \10x77ff77 has been allowed to change his team.\n +player_disallowed_teamchange \10xff7777 cannot change teams anymore.\n vote_spam_protection VOTE SPAM PROTECTION: you are disallowed from issuing votes for the next \1 seconds.\n chat_title_text Say: player_entered_game \1 0x7fff7fentered the game.\n @@ -2206,7 +2219,7 @@ #******************************************** #******************************************** -fullscreen_message_title Sever Message +fullscreen_message_title Server Message network_message_timeout_title Server does not answer network_message_timeout_inter The server you wanted to connect to did not answer for ten seconds.\nIt is probably down or unreachable, or you mistyped its name in the "custom connect" menu. @@ -2329,7 +2342,7 @@ vote_overflow Poll rejected, too many pending polls.\n vote_disabled Poll rejected, disabled by server admin.\n vote_disabled_spectator Poll/Vote rejected, disabled for spectators by server admin.\n -vote_toofew Poll rejected, to few possible voters online.\n +vote_toofew Poll rejected, too few possible voters online.\n vote_submitted Poll "\2" submitted by \1.\n vote_vote_for \1 voted for Poll "\2".\n vote_vote_against \1 voted against Poll "\2".\n Modified: armagetronad/trunk/armagetronad/language/english_base_notranslate.txt =================================================================== --- armagetronad/trunk/armagetronad/language/english_base_notranslate.txt 2007-11-12 18:27:58 UTC (rev 7381) +++ armagetronad/trunk/armagetronad/language/english_base_notranslate.txt 2007-11-12 19:47:33 UTC (rev 7382) @@ -175,3 +175,4 @@ cycle_first_spawn_protection_override_help UNDOCUMENTED cycle_invulnerable_time_override_help UNDOCUMENTED cycle_wall_time_override_help UNDOCUMENTED + Modified: armagetronad/trunk/armagetronad/src/engine/eGameObject.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/engine/eGameObject.cpp 2007-11-12 18:27:58 UTC (rev 7381) +++ armagetronad/trunk/armagetronad/src/engine/eGameObject.cpp 2007-11-12 19:47:33 UTC (rev 7382) @@ -129,7 +129,7 @@ if (w) Kill(); } -static int se_moveTimeout = 10; +static int se_moveTimeout = 100; static tSettingItem<int> se_moveTimeoutC("GAMEOBJECT_MOVE_TIMEOUT", se_moveTimeout); // data structures for storing temp wall collisions @@ -245,16 +245,20 @@ { timeout--; } - if ( lastDistance > 1E+29 ) - lastDistance = distance * 1.1; - lastDistance = .1 * lastDistance + distance * (.9 - EPS); + else + { + timeout = se_moveTimeout; + if ( lastDistance > 1E+29 ) + lastDistance = distance * 1.1; + lastDistance = .1 * lastDistance + distance * (.9 - EPS); - // check if the target has been reached within tolerance; it can only make matters - // worse then to continue, even if the current face claims we're not part of it. - if ( distance <= EPS * totalDistance ) - { - // st_Breakpoint(); - break; + // check if the target has been reached within tolerance; it can only make matters + // worse then to continue, even if the current face claims we're not part of it. + if ( distance <= EPS * totalDistance ) + { + // st_Breakpoint(); + break; + } } #ifdef DEBUG_X rerun: @@ -503,9 +507,28 @@ static bool recurse = true; if ( recurse ) { + class RecursionGuard + { + public: + RecursionGuard( bool& recursion ) + :recursion_( recursion ) + { + recursion = false; + } + + ~RecursionGuard() + { + recursion_ = true; + } + + private: + bool& recursion_; + }; + + RecursionGuard guard( recurse ); + // warp to the known good position and move back to where the // object should be - recurse = false; eCoord oldPos = pos; pos = center; #ifdef DEBUG @@ -518,7 +541,7 @@ catch( eDeath & ) // ignore death exceptions and leave object where it would have died { #ifdef DEBUG - // try again + // try again (yeah, this looks like a WTF, but it really helps in some cases because the situation has changed since the last try. /me blames floating points) try { pos = center; Modified: armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp 2007-11-12 18:27:58 UTC (rev 7381) +++ armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp 2007-11-12 19:47:33 UTC (rev 7382) @@ -65,6 +65,12 @@ bool se_assignTeamAutomatically = true; static tSettingItem< bool > se_assignTeamAutomaticallyConf( "AUTO_TEAM", se_assignTeamAutomatically ); +static bool se_all... [truncated message content] |
From: <z-...@us...> - 2007-11-12 21:02:17
|
Revision: 7385 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7385&view=rev Author: z-man Date: 2007-11-12 13:02:07 -0800 (Mon, 12 Nov 2007) Log Message: ----------- Added motion blurring (yay, after rotting on my hard drive for half a year) Modified Paths: -------------- armagetronad/trunk/armagetronad/config/settings_visual.cfg armagetronad/trunk/armagetronad/src/Makefile.am armagetronad/trunk/armagetronad/src/doc/install_linux.html.m4 armagetronad/trunk/armagetronad/src/engine/eDisplay.cpp armagetronad/trunk/armagetronad/src/engine/eGameObject.cpp armagetronad/trunk/armagetronad/src/render/rGL.h armagetronad/trunk/armagetronad/src/render/rSysdep.cpp armagetronad/trunk/armagetronad/src/render/rTexture.cpp armagetronad/trunk/armagetronad/src/render/rTexture.h armagetronad/trunk/armagetronad/src/tron/gArmagetron.cpp armagetronad/trunk/armagetronad/src/tron/gWall.cpp Added Paths: ----------- armagetronad/trunk/armagetronad/src/render/rGL.cpp armagetronad/trunk/armagetronad/src/render/rGLEW.h armagetronad/trunk/armagetronad/src/render/rGLuintObject.cpp armagetronad/trunk/armagetronad/src/render/rGLuintObject.h armagetronad/trunk/armagetronad/src/render/rTextureRenderTarget.cpp armagetronad/trunk/armagetronad/src/render/rTextureRenderTarget.h Modified: armagetronad/trunk/armagetronad/config/settings_visual.cfg =================================================================== --- armagetronad/trunk/armagetronad/config/settings_visual.cfg 2007-11-12 19:58:37 UTC (rev 7384) +++ armagetronad/trunk/armagetronad/config/settings_visual.cfg 2007-11-12 21:02:07 UTC (rev 7385) @@ -26,4 +26,4 @@ #FLOOR_GREEN .2 # floor color (without moviepack) #FLOOR_BLUE .3 # floor color (without moviepack) -MOTION_BLUR_TIME .015 # time over which the last rendered frames are blurred together in motion blur mode +MOTION_BLUR_TIME .0075 # time over which the last rendered frames are blurred together in motion blur mode Modified: armagetronad/trunk/armagetronad/src/Makefile.am =================================================================== --- armagetronad/trunk/armagetronad/src/Makefile.am 2007-11-12 19:58:37 UTC (rev 7384) +++ armagetronad/trunk/armagetronad/src/Makefile.am 2007-11-12 21:02:07 UTC (rev 7385) @@ -122,9 +122,10 @@ engine/eEventNotification.h engine/eEventNotification.cpp librender_a_SOURCES=render/rConsole.cpp render/rConsoleGraph.cpp render/rConsole.h render/rFont.cpp\ - render/rFont.h render/rGL.h render/rGLRender.cpp render/rModel.cpp render/rModel.h render/rRender.cpp\ + render/rFont.h render/rGL.cpp render/rGL.h render/rGLEW.h render/rGLRender.cpp render/rModel.cpp render/rModel.h render/rRender.cpp\ render/rRender.h render/rScreen.cpp render/rScreen.h render/rSDL.h render/rSysdep.cpp render/rSysdep.h\ - render/rTexture.cpp render/rTexture.h render/rViewport.cpp render/rViewport.h render/rColor.h render/rGradient.cpp render/rGradient.h + render/rTexture.cpp render/rTexture.h render/rViewport.cpp render/rViewport.h render/rColor.h render/rGradient.cpp render/rGradient.h \ + render/rTextureRenderTarget.cpp render/rTextureRenderTarget.h render/rGLuintObject.cpp render/rGLuintObject.h libtron_a_SOURCES=tron/gAIBase.cpp tron/gAIBase.h tron/gAICharacter.cpp tron/gAICharacter.h tron/gArena.cpp tron/gArena.h\ Modified: armagetronad/trunk/armagetronad/src/doc/install_linux.html.m4 =================================================================== --- armagetronad/trunk/armagetronad/src/doc/install_linux.html.m4 2007-11-12 19:58:37 UTC (rev 7384) +++ armagetronad/trunk/armagetronad/src/doc/install_linux.html.m4 2007-11-12 21:02:07 UTC (rev 7385) @@ -37,7 +37,6 @@ which itself needs the libs) ITEM(ELINK(www.libpng.org/pub/png/pngcode.html,pnglib and zlib) (they should be included in your distribution)) -ITEM(Optional: ELINK(www.libsdl.org/projects/SDL_mixer/,SDL_mixer)) ITEM([Binary versions only: libstdc++ 5.0.7 (any 5.x.y or whatever came with your System if it uses GCC 3.2 or higher should do). Use ELINK([rpmfind.net/linux/rpm2html/search.php?query=libstdc%2B%2B&submit=Search+...&system=&arch=],rpmfind) @@ -47,6 +46,10 @@ source packages instead.]) ]) +SECTION(Optional libraries,libs_opt) +ITEM(ELINK(www.libsdl.org/projects/SDL_mixer/,SDL_mixer)) +ITEM(ELINK(glew.sourceforge.net,GLEW)) + PARAGRAPH(,[ You may take a look at the ELINK(WEBBASE/compatibility.html,compatibility table) if you want to check how likely it is for Armagetron to work on your PC. Modified: armagetronad/trunk/armagetronad/src/engine/eDisplay.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/engine/eDisplay.cpp 2007-11-12 19:58:37 UTC (rev 7384) +++ armagetronad/trunk/armagetronad/src/engine/eDisplay.cpp 2007-11-12 21:02:07 UTC (rev 7385) @@ -298,6 +298,8 @@ REAL flooralpha, bool eWalls,bool gameObjects, REAL& zNear){ + sr_CheckGLError(); + /* static GLfloat S[]={1,0,0,0}; static GLfloat T[]={0,1,0,0}; @@ -505,6 +507,8 @@ else glEnable(GL_DEPTH_TEST); + sr_CheckGLError(); + if (eWalls){ glDisable(GL_CULL_FACE); draw_eWall(this,viewer,0,zNear,cameras(viewer)); @@ -536,6 +540,8 @@ } + sr_CheckGLError(); + if (gameObjects) eGameObject::RenderAll(this, cameras(viewer)); Modified: armagetronad/trunk/armagetronad/src/engine/eGameObject.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/engine/eGameObject.cpp 2007-11-12 19:58:37 UTC (rev 7384) +++ armagetronad/trunk/armagetronad/src/engine/eGameObject.cpp 2007-11-12 21:02:07 UTC (rev 7385) @@ -32,6 +32,7 @@ #include "eWall.h" #include "tConsole.h" #include "rScreen.h" +#include "rGL.h" #include "eSoundMixer.h" @@ -809,7 +810,9 @@ #ifdef DEBUG displayed_gameobject = grid->gameObjects(i); #endif + sr_CheckGLError(); grid->gameObjects(i)->Render(cam); + sr_CheckGLError(); #ifdef DEBUG displayed_gameobject = 0; #endif Added: armagetronad/trunk/armagetronad/src/render/rGL.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/render/rGL.cpp (rev 0) +++ armagetronad/trunk/armagetronad/src/render/rGL.cpp 2007-11-12 21:02:07 UTC (rev 7385) @@ -0,0 +1,53 @@ +/* + +************************************************************************* + +ArmageTron -- Just another Tron Lightcycle Game in 3D. +Copyright (C) 2006, Armagetron Advanced Development Team + +************************************************************************** + +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. + +*************************************************************************** + +*/ + +#include "rGL.h" +#include "tConsole.h" +#include "tError.h" +#include <sstream> +#include <iomanip> + +#ifdef DEBUG +void sr_CheckGLError() +{ +#ifndef DEDICATED + GLenum error = glGetError(); + if ( error != GL_NO_ERROR ) + { + std::stringstream s; + s << "GL error 0X" << std::hex << error << "\n"; + con << s.str(); + + // catch a breakpoint + static bool reported = false; + if ( !reported ) + st_Breakpoint(); + reported = true; + } +#endif +} +#endif Modified: armagetronad/trunk/armagetronad/src/render/rGL.h =================================================================== --- armagetronad/trunk/armagetronad/src/render/rGL.h 2007-11-12 19:58:37 UTC (rev 7384) +++ armagetronad/trunk/armagetronad/src/render/rGL.h 2007-11-12 21:02:07 UTC (rev 7385) @@ -1,3 +1,30 @@ +/* + +************************************************************************* + +ArmageTron -- Just another Tron Lightcycle Game in 3D. +Copyright (C) 2006, Armagetron Advanced Development Team + +************************************************************************** + +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. + +*************************************************************************** + +*/ + #ifndef AT_GL_H #define AT_GL_H @@ -7,30 +34,13 @@ #include <windows.h> #endif -#include <SDL_opengl.h> +// GLEW, if active, needs to be included before gl.h +#include "rGLEW.h" -/* -// include OpenGL header -#ifdef HAVE_SDL_OPENGL_H +// and we don't want the SDL extension definitions, they conflict with GLEW. +#define NO_SDL_GLEXT + #include <SDL_opengl.h> -#else -#ifdef HAVE_SDL_SDL_OPENGL_H -#include <SDL/SDL_opengl.h> -#else -#ifdef HAVE_OPENGL_GL_H -#include <OpenGL/gl.h> -#include <OpenGL/glu.h> -#else -#ifdef HAVE_GL_GL_H -#include <GL/gl.h> -#include <GL/glu.h> -#else -#error No suitable OpenGL header found by configure! -#endif -#endif -#endif -#endif -*/ #else @@ -40,4 +50,15 @@ typedef unsigned int GLenum; #endif +#ifndef DEBUG +inline #endif +//! for debugging purposes: checks for OpenGL errors and prints them to the console. +void sr_CheckGLError() +#ifdef DEBUG +; +#else // DEBUG +{} +#endif // DEBUG + +#endif Added: armagetronad/trunk/armagetronad/src/render/rGLEW.h =================================================================== --- armagetronad/trunk/armagetronad/src/render/rGLEW.h (rev 0) +++ armagetronad/trunk/armagetronad/src/render/rGLEW.h 2007-11-12 21:02:07 UTC (rev 7385) @@ -0,0 +1,21 @@ +#ifndef AT_GLEW_H +#define AT_GLEW_H + +#include "aa_config.h" + +// check whether GLEW is available +#ifndef DEDICATED +#ifdef HAVE_GL_GLEW_H +#ifdef HAVE_LIBGLEW + +// it is! define one handy macro indicating so +#define HAVE_GLEW + +// and include the headers +#include <GL/glew.h> + +#endif +#endif +#endif + +#endif Added: armagetronad/trunk/armagetronad/src/render/rGLuintObject.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/render/rGLuintObject.cpp (rev 0) +++ armagetronad/trunk/armagetronad/src/render/rGLuintObject.cpp 2007-11-12 21:02:07 UTC (rev 7385) @@ -0,0 +1,75 @@ +/* + +************************************************************************* + +ArmageTron -- Just another Tron Lightcycle Game in 3D. +Copyright (C) 2006, Armagetron Advanced Development Team + +************************************************************************** + +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. + +*************************************************************************** + +*/ + +#include "rGLuintObject.h" + +// heh, no parameters to document :) + +rGLuintObject::rGLuintObject() + : object_(0) +{ +} + +//! @return the GLUint representing the object, always guaranteed to be valid +rGLuintObject::operator GLuint() +{ + // auto-generate the object + Gen(); + return object_; +} + +//! @return true if the object is currently valid (meaning: Gen() has been called after Delete()) +bool rGLuintObject::IsValid() const +{ + return object_; +} + +rGLuintObject::~rGLuintObject() +{ +} + +void rGLuintObject::Gen() +{ + if ( !object_ ) + { + sr_CheckGLError(); + DoGen(); + sr_CheckGLError(); + } +} + +void rGLuintObject::Delete() +{ + if ( object_ ) + { + sr_CheckGLError(); + DoDelete(); + sr_CheckGLError(); + } + object_ = 0; +} + Added: armagetronad/trunk/armagetronad/src/render/rGLuintObject.h =================================================================== --- armagetronad/trunk/armagetronad/src/render/rGLuintObject.h (rev 0) +++ armagetronad/trunk/armagetronad/src/render/rGLuintObject.h 2007-11-12 21:02:07 UTC (rev 7385) @@ -0,0 +1,106 @@ +/* + +************************************************************************* + +ArmageTron -- Just another Tron Lightcycle Game in 3D. +Copyright (C) 2006, Armagetron Advanced Development Team + +************************************************************************** + +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. + +*************************************************************************** + +*/ + +#ifndef ArmageTron_GLUINTOBJECT_H +#define ArmageTron_GLUINTOBJECT_H + +#include "rGL.h" +#include "tError.h" + +//! safe wrapper for GL objects classifed by GLuints (textures, render buffers) +class rGLuintObject +{ +public: + rGLuintObject(); //!< default constructor + + operator GLuint(); //!< implicit conversion to GLuints, auto-creating the object + bool IsValid() const; //!< checks whether the object is valid + + virtual ~rGLuintObject(); //!< NOTE: the destructor of a derived class needs to call Delete() itself + + void Gen(); //!< reserve the object + void Delete(); //!< free the object +protected: + rGLuintObject( rGLuintObject const & ); //!< forbidden copy construcor + rGLuintObject & operator =( rGLuintObject const & ); //! forbidden copy operator + + GLuint object_; //!< the wrapped "object" +private: + virtual void DoGen() = 0; //!< really reserves the object + virtual void DoDelete() = 0; //!< really frees the object +}; + +//! unusable dummy wrapper +class rGluintObjectDummy: public rGLuintObject +{ +public: + ~rGluintObjectDummy(){ Delete(); } +private: + // the following operations are not supported, wrap your code in #ifdef HAVE_GLEW + virtual void DoGen(){ tASSERT(0); } + virtual void DoDelete(){ tASSERT(0); } +}; + +//! declare safe wrapper classes for GL objects handled by GLuints. +//! argument CLASS: the name of the wrapper class +//! FUNCTION: the name of the functions that hanlde the object; glGen resp. glDelete will be prepended. +#ifndef DEDICATED +#define rDEFINE_GLUINTOBJECT( CLASS, FUNCTION ) \ +class CLASS: public rGLuintObject \ +{ \ +public: \ + ~CLASS(){ Delete(); } \ +private: \ + virtual void DoGen(){ glGen##FUNCTION( 1, &object_ ); } \ + virtual void DoDelete(){ glDelete##FUNCTION( 1, &object_ ); } \ +} +#else // DEDICATED +// safe dummy +#define rDEFINE_GLUINTOBJECT( CLASS, FUNCTION ) typedef rGluintObjectDummy CLASS +#endif + +//! declare safe wrapper classes for GL objects handled by GLuints initialized by extensions +//! argument CLASS: the name of the wrapper class +//! FUNCTION: the name of the functions that hanlde the object; glGen resp. glDelete will be prepended. +#ifdef HAVE_GLEW +#define rDEFINE_GLUINTOBJECT_EXT(CLASS, FUNCTION ) rDEFINE_GLUINTOBJECT( CLASS, FUNCTION ) +#else // HAVE_GLEW, define unusable dummy object +#define rDEFINE_GLUINTOBJECT_EXT( CLASS, FUNCTION ) typedef rGluintObjectDummy CLASS +#endif // HAVE_GLEW + +//! declare safe wrapper for texturs +rDEFINE_GLUINTOBJECT( rGLuintObjectTexture, Textures ); + +//! declare safe wrapper for render buffers +rDEFINE_GLUINTOBJECT_EXT( rGLuintObjectRenderbuffer, RenderbuffersEXT ); + +//! declare safe wrapper for frame buffers +rDEFINE_GLUINTOBJECT_EXT( rGLuintObjectFramebuffer, FramebuffersEXT ); + +#endif + + Modified: armagetronad/trunk/armagetronad/src/render/rSysdep.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/render/rSysdep.cpp 2007-11-12 19:58:37 UTC (rev 7384) +++ armagetronad/trunk/armagetronad/src/render/rSysdep.cpp 2007-11-12 21:02:07 UTC (rev 7385) @@ -27,6 +27,9 @@ #include "defs.h" + +#include "rGL.h" + #ifndef DEDICATED #include "rSDL.h" #endif @@ -39,10 +42,11 @@ #include "aa_config.h" #include <iostream> #include "rScreen.h" -#include "rGL.h" +#include "rTexture.h" #include "tCommandLine.h" #include "tConfiguration.h" #include "tRecorder.h" +#include "rTextureRenderTarget.h" #ifndef DEDICATED #include "SDL_thread.h" @@ -589,11 +593,96 @@ } } -void sr_MotionBlurCore( REAL alpha ) +int NextPowerOfTwo( int in ) { + int x = 1; + while ( x * 32 <= in ) + x <<= 5; + while ( x < in ) + x <<= 1; + + return x; +} + +bool sr_MotionBlurCore( REAL alpha, rTextureRenderTarget & blurTarget ) +{ + sr_CheckGLError(); + if ( alpha < 0 ) alpha = 0; + { + if ( blurTarget.IsTarget() ) + { + blurTarget.Pop(); + + blurTarget.Select(); + + glDrawBuffer( GL_FRONT ); + + sr_CheckGLError(); + + // determine the texture coordinates of the lower right corner + REAL maxu = REAL(sr_screenWidth)/blurTarget.GetWidth(); + REAL maxv = REAL(sr_screenHeight)/blurTarget.GetHeight(); + + glEnable(GL_TEXTURE_2D); + + // blend the last frame and the current frame with the specified alpha value + glDisable( GL_DEPTH_TEST ); + glDepthMask(0); + + glMatrixMode( GL_PROJECTION ); + glLoadIdentity(); + glMatrixMode( GL_MODELVIEW ); + glLoadIdentity(); + glViewport(0,0,sr_screenWidth, sr_screenHeight); + + glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, + GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, + GL_NEAREST); + + glDisable(GL_ALPHA_TEST); + // glDisable(GL_BLEND); + glEnable(GL_BLEND); + glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA); + + glDisable(GL_LIGHTING); + + glBegin( GL_QUADS ); + glColor4f( 1,1,1,alpha ); + + glTexCoord2f( 0, 0 ); + glVertex2f( -1, -1 ); + + glTexCoord2f( maxu, 0 ); + glVertex2f( 1, -1 ); + + glTexCoord2f( maxu, maxv ); + glVertex2f( 1, 1 ); + + glTexCoord2f( 0, maxv ); + glVertex2f( -1, 1 ); + glEnd(); + + sr_CheckGLError(); + + // clean up + glDepthMask(1); + + glDrawBuffer( GL_BACK ); + } + + blurTarget.Push(); + + sr_CheckGLError(); + + return false; + } + + return true; + #if 0 GLenum error = glGetError(); if ( error != GL_NO_ERROR ) @@ -682,12 +771,12 @@ } // frames from about this far apart get blended together -static REAL sr_motionBlurTime = .01; +static REAL sr_motionBlurTime = .0075; static tSettingItem<REAL> c_mb( "MOTION_BLUR_TIME", sr_motionBlurTime ); // blurs the motion, time is the current time -void sr_MotionBlur( double time ) +bool sr_MotionBlur( double time, std::auto_ptr< rTextureRenderTarget > & blurTarget ) { if ( currentScreensetting.vSync == ArmageTron_VSync_MotionBlur ) { @@ -726,15 +815,43 @@ --hyster; } + lastTime = time; + // really blur. if ( active ) - sr_MotionBlurCore( 1 - frameTime / sr_motionBlurTime ); + { + // determine blur texture size + int blurWidth = NextPowerOfTwo( sr_screenWidth ); + int blurHeight = NextPowerOfTwo( sr_screenHeight ); - lastTime = time; + // destroy existing blur texture if it is too small + if ( blurTarget.get() && ( blurTarget->GetWidth() < blurWidth || blurTarget->GetHeight() < blurHeight ) ) + { + blurTarget = std::auto_ptr< rTextureRenderTarget >(); + } + + // create blur texture + if ( !blurTarget.get() ) + { + blurTarget = std::auto_ptr< rTextureRenderTarget >( new rTextureRenderTarget( blurWidth, blurHeight ) ); + } + + return sr_MotionBlurCore( 1 - frameTime / sr_motionBlurTime, *blurTarget ); + } } + + // no motion blur happened when we got here + if ( blurTarget.get() && blurTarget->IsTarget() ) + { + blurTarget->Pop(); + } + + return true; } void rSysDep::SwapGL(){ + static std::auto_ptr< rTextureRenderTarget > blurTarget(0); + if ( s_benchmark ) { static PerformanceCounter counter; @@ -835,7 +952,7 @@ sr_LockSDL(); // actiate motion blur (does not use the game state, so it's OK to call here ) - sr_MotionBlur( time ); + bool shouldSwap = sr_MotionBlur( time, blurTarget ); switch( swapMode_ ) { @@ -849,22 +966,25 @@ break; } + if ( shouldSwap ) + { #if defined(SDL_OPENGL) - if (lastSuccess.useSDL) - SDL_GL_SwapBuffers(); - //#elif defined(HAVE_FXMESA) - //fxMesaSwapBuffers(); + if (lastSuccess.useSDL) + SDL_GL_SwapBuffers(); + //#elif defined(HAVE_FXMESA) + //fxMesaSwapBuffers(); #endif #ifdef DIRTY - if (!lastSuccess.useSDL){ + if (!lastSuccess.useSDL){ #if defined(WIN32) - SwapBuffers( hDC ); + SwapBuffers( hDC ); #elif defined(unix) || defined(__unix__) - glXSwapBuffers(dpy,win); + glXSwapBuffers(dpy,win); #endif - } + } #endif + } if (sr_screenshotIsPlanned){ make_screenshot(); Modified: armagetronad/trunk/armagetronad/src/render/rTexture.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/render/rTexture.cpp 2007-11-12 19:58:37 UTC (rev 7384) +++ armagetronad/trunk/armagetronad/src/render/rTexture.cpp 2007-11-12 21:02:07 UTC (rev 7385) @@ -426,7 +426,7 @@ // ****************************************************************************************** rISurfaceTexture::rISurfaceTexture( int group, bool repx, bool repy, bool storeAlpha ) - : group_( group ), textureModeLast_( -1), tint_( 0 ), repx_( repx ), repy_( repy ), storeAlpha_( storeAlpha ) + : group_( group ), textureModeLast_( -1), repx_( repx ), repy_( repy ), storeAlpha_( storeAlpha ) { } @@ -441,13 +441,6 @@ rISurfaceTexture::~rISurfaceTexture( void ) { -#ifndef DEDICATED - if (tint_ > 0) - { - glDeleteTextures(1,&tint_); - tint_ = 0; - } -#endif } // ****************************************************************************************** @@ -535,15 +528,12 @@ if(textureModeLast_!=texmod) { // unload texture if the mode changed - if ( tint_ > 0 ) - Unload(); - tASSERT( tint_ == 0 ); + tint_.Delete(); // std::cerr << "loading texture " << fileName << ':' << tint << "\n"; if (texmod>0){ RenderEnd(true); - glGenTextures(1, &tint_); glBindTexture(GL_TEXTURE_2D,tint_); if (textureModeLast_<0) @@ -622,13 +612,7 @@ void rISurfaceTexture::OnUnload( void ) { #ifndef DEDICATED - if (tint_ > 0) - { - // std::cerr << "unloading texture " << fileName << ':' << tint_ << "\n"; - glDeleteTextures(1,&tint_); - tint_ = 0; - } - + tint_.Delete(); textureModeLast_=-100; rITexture::OnUnload(); #endif Modified: armagetronad/trunk/armagetronad/src/render/rTexture.h =================================================================== --- armagetronad/trunk/armagetronad/src/render/rTexture.h 2007-11-12 19:58:37 UTC (rev 7384) +++ armagetronad/trunk/armagetronad/src/render/rTexture.h 2007-11-12 21:02:07 UTC (rev 7385) @@ -31,6 +31,7 @@ #include "tString.h" #include "tList.h" #include "rGL.h" +#include "rGLuintObject.h" struct SDL_Surface; @@ -147,9 +148,9 @@ int textureModeLast_; //!< the last texture storage mode this texture was used with - GLuint tint_; //!< the OpenGL id of this texture - bool repx_,repy_; //!< flags indicating whether the texture repeats in x and y direction - bool storeAlpha_; //!< flag indicating whether the alpha value should be stored + rGLuintObjectTexture tint_; //!< the OpenGL id of this texture + bool repx_,repy_; //!< flags indicating whether the texture repeats in x and y direction + bool storeAlpha_; //!< flag indicating whether the alpha value should be stored }; // ****************************************************************************************** Added: armagetronad/trunk/armagetronad/src/render/rTextureRenderTarget.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/render/rTextureRenderTarget.cpp (rev 0) +++ armagetronad/trunk/armagetronad/src/render/rTextureRenderTarget.cpp 2007-11-12 21:02:07 UTC (rev 7385) @@ -0,0 +1,154 @@ +/* + +************************************************************************* + +ArmageTron -- Just another Tron Lightcycle Game in 3D. +Copyright (C) 2006, Armagetron Advanced Development Team + +************************************************************************** + +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. + +*************************************************************************** + +*/ + +#include "rTextureRenderTarget.h" + +// implementation +#include "rScreen.h" +#include "tException.h" + +rTextureRenderTarget * rTextureRenderTarget::anchor = 0; + +// **************************************************************** +// * +// * rTextureRenderTarget +// * +// **************************************************************** +//! +//! @param +//! @return +//! +// **************************************************************** + +//! texture that can be used as a target for rendering + +// clears the texture +void rTextureRenderTarget::Clear() +{ + tASSERT( !IsTarget() ); + + texture_.Delete(); + depthBuffer_.Delete(); + frameBuffer_.Delete(); +} + +rTextureRenderTarget::~rTextureRenderTarget() +{ + if ( IsTarget() ) + { + Pop(); + } + + Clear(); +} + +rTextureRenderTarget::rTextureRenderTarget( int width, int height ) +{ + sr_CheckGLError(); + + width_ = width; + height_ = height; + previous = 0; + + if ( GLEW_EXT_framebuffer_object ) + { + Push(); + sr_CheckGLError(); + + // generate texture + glBindTexture( GL_TEXTURE_2D, texture_ ); + sr_CheckGLError(); + + // make texture + glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB8, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL ); + sr_CheckGLError(); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + + glFramebufferTexture2DEXT( GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, texture_, 0 ); + sr_CheckGLError(); + + glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, depthBuffer_ ); + sr_CheckGLError(); + + glRenderbufferStorageEXT( GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT32, width, height ); + sr_CheckGLError(); + + glFramebufferRenderbufferEXT( GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depthBuffer_ ); + sr_CheckGLError(); + + GLenum status = glCheckFramebufferStatusEXT( GL_FRAMEBUFFER_EXT); + switch( status ) + { + case GL_FRAMEBUFFER_COMPLETE_EXT: + break; + case GL_FRAMEBUFFER_UNSUPPORTED_EXT: + throw tGenericException( "Unsupported frame buffer operation" ); + default: + tASSERT( 0 ); + } + + sr_CheckGLError(); + + Pop(); + + return; + } + + throw tGenericException( "frame buffer extension not supported" ); +} + +void rTextureRenderTarget::Push() +{ + previous = anchor; + anchor = this; + + sr_CheckGLError(); + + glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, frameBuffer_ ); + + sr_CheckGLError(); +} + +void rTextureRenderTarget::Pop() +{ + tASSERT( IsTarget() ); + + sr_CheckGLError(); + glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, previous ? previous->frameBuffer_ : 0 ); + sr_CheckGLError(); + + anchor = previous; +} + +void rTextureRenderTarget::OnSelect(bool) +{ + glBindTexture( GL_TEXTURE_2D, texture_ ); +} Added: armagetronad/trunk/armagetronad/src/render/rTextureRenderTarget.h =================================================================== --- armagetronad/trunk/armagetronad/src/render/rTextureRenderTarget.h (rev 0) +++ armagetronad/trunk/armagetronad/src/render/rTextureRenderTarget.h 2007-11-12 21:02:07 UTC (rev 7385) @@ -0,0 +1,88 @@ +/* + +************************************************************************* + +ArmageTron -- Just another Tron Lightcycle Game in 3D. +Copyright (C) 2006, Armagetron Advanced Development Team + +************************************************************************** + +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. + +*************************************************************************** + +*/ + +#ifndef ArmageTron_TEXTURERENDERTARGET_H +#define ArmageTron_TEXTURERENDERTARGET_H + +#include "rGLEW.h" +#include "rTexture.h" +#include "rGLuintObject.h" + +//! texture that can be used as a target for rendering +class rTextureRenderTarget: public rITexture +{ +public: + //! clears the texture + void Clear(); + + ~rTextureRenderTarget(); + + //! creates a render target texture of the specified dimensions + rTextureRenderTarget( int width, int height ); + + //! makes this texture the active render target + void Push(); + + //! removes this texture as the active render target + void Pop(); + + bool IsTarget() const + { + return anchor == this; + } + + int GetHeight() const + { + return height_; + } + + int GetWidth() const + { + return width_; + } +protected: + virtual void OnSelect(bool); + + // nothing special to do here + virtual void OnUnload(){} +private: + rGLuintObjectTexture texture_; //!< the texture render target + rGLuintObjectRenderbuffer depthBuffer_; //!< the depth buffer + rGLuintObjectFramebuffer frameBuffer_; //!< the frame buffer + + + static rTextureRenderTarget * anchor; + rTextureRenderTarget * previous; + + int width_, height_; + GLenum colorMode, depthMode; +public: +}; + +#endif + + Modified: armagetronad/trunk/armagetronad/src/tron/gArmagetron.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gArmagetron.cpp 2007-11-12 19:58:37 UTC (rev 7384) +++ armagetronad/trunk/armagetronad/src/tron/gArmagetron.cpp 2007-11-12 21:02:07 UTC (rev 7385) @@ -682,6 +682,19 @@ try { +#ifdef HAVE_GLEW + // initialize GLEW + { + GLenum err = glewInit(); + if (GLEW_OK != err) + { + // Problem: glewInit failed, something is seriously wrong + throw tGenericException( (const char *)glewGetErrorString(err), "GLEW Error" ); + } + con << "Status: Using GLEW " << glewGetString(GLEW_VERSION) << "\n"; + } +#endif // HAVE_GLEW + //std::cout << "init disp\n"; //std::cout << "init sound\n"; Modified: armagetronad/trunk/armagetronad/src/tron/gWall.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gWall.cpp 2007-11-12 19:58:37 UTC (rev 7384) +++ armagetronad/trunk/armagetronad/src/tron/gWall.cpp 2007-11-12 21:02:07 UTC (rev 7385) @@ -881,10 +881,12 @@ } #endif + sr_CheckGLError(); if (displayList_ && cycle_->Alive() && list) glCallList(displayList_); else { + sr_CheckGLError(); dir_eWall_select(); REAL r,g,b; @@ -981,24 +983,31 @@ glEndList(); } else */ + sr_CheckGLError(); RenderNormal(p1,p2,ta,te,r,g,b,a); + sr_CheckGLError(); } else{ // complicated if (ta+gBEG_LEN>=time){ + sr_CheckGLError(); RenderBegin(p1,p2,ta,te, 1+(ta-time)/gBEG_LEN, 1+(te-time)/gBEG_LEN, r,g,b,a); + sr_CheckGLError(); } else{ + sr_CheckGLError(); REAL s=((time-gBEG_LEN)-ta)/(te-ta); eCoord pm=p1+(p2-p1)*s; RenderBegin(pm,p2, ta+(te-ta)*s,te,0, 1+(te-time)/gBEG_LEN, r,g,b,a); + sr_CheckGLError(); RenderNormal(p1,pm,ta,ta+(te-ta)*s,r,g,b,a); + sr_CheckGLError(); } } } @@ -1007,6 +1016,7 @@ bool upperlinecolor(REAL r,REAL g,REAL b, REAL a){ + sr_CheckGLError(); if (rTextureGroups::TextureMode[rTextureGroups::TEX_WALL]<0) glColor4f(1,1,1,a); else{ @@ -1021,8 +1031,11 @@ */ //glDisable(GL_TEXTURE); glDisable(GL_TEXTURE_2D); + sr_CheckGLError(); glColor4f(r,g,b,a); } + + sr_CheckGLError(); return true; } @@ -1146,11 +1159,14 @@ eCoord ppos=cycle_->PredictPosition() - cycle_->dir*REAL(gCYCLE_LEN); if ( hfrac>0 ){ + sr_CheckGLError(); sr_DepthOffset(true); + sr_CheckGLError(); //REAL H=h*hfrac; #define segs 5 upperlinecolor(r,g,b,a);//a*afunc(rat)); BeginLineStrip(); + sr_CheckGLError(); for(int i=0;i<=segs;i++){ REAL frag=i/float(segs); @@ -1160,17 +1176,22 @@ REAL H=h*hfrac*hfunc(rat); upperlinecolor(r,g,b,a*afunc(rat)); + sr_CheckGLError(); glVertex3f(x+H*cycle_->skew*sfunc(rat)*cycle_->dir.y, y-H*cycle_->skew*sfunc(rat)*cycle_->dir.x, H);//+se_cameraZ*.005); + sr_CheckGLError(); } RenderEnd(); + sr_CheckGLError(); sr_DepthOffset(false); + sr_CheckGLError(); } dir_eWall_select(); + sr_CheckGLError(); BeginQuadStrip(); @@ -1186,22 +1207,30 @@ REAL y=(p1.y+frag*(p2.y-p1.y))*(1-xfunc(rat))+ppos.y*xfunc(rat); // bottom - glEdgeFlag(GL_FALSE); + sr_CheckGLError(); + glEdgeFlag(GL_FALSE); glColor4f(r+cfunc(rat),g+cfunc(rat),b+cfunc(rat),a*afunc(rat)); + sr_CheckGLError(); glTexCoord2f(ta+(te-ta)*frag,hfrac); + sr_CheckGLError(); glVertex3f(x,y,0); + sr_CheckGLError(); // top glEdgeFlag(GL_TRUE); //glTexCoord2f(ta+(te-ta)*frag,hfrac*(1-hfunc(rat))); + sr_CheckGLError(); glTexCoord2f(ta+(te-ta)*frag,0); + sr_CheckGLError(); REAL H=h*hfrac*hfunc(rat); glVertex3f(x+H*cycle_->skew*sfunc(rat)*cycle_->dir.y, y-H*cycle_->skew*sfunc(rat)*cycle_->dir.x, H); + sr_CheckGLError(); } RenderEnd(); + sr_CheckGLError(); } #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <z-...@us...> - 2007-11-14 10:11:03
|
Revision: 7393 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7393&view=rev Author: z-man Date: 2007-11-14 02:11:05 -0800 (Wed, 14 Nov 2007) Log Message: ----------- Actually use the results of the GLEW checks. Modified Paths: -------------- armagetronad/trunk/armagetronad/configure.ac armagetronad/trunk/armagetronad/language/english_base.txt armagetronad/trunk/armagetronad/src/render/rGLEW.h armagetronad/trunk/armagetronad/src/render/rSysdep.cpp armagetronad/trunk/armagetronad/src/render/rTextureRenderTarget.cpp armagetronad/trunk/armagetronad/src/tron/gMenus.cpp Modified: armagetronad/trunk/armagetronad/configure.ac =================================================================== --- armagetronad/trunk/armagetronad/configure.ac 2007-11-13 22:53:55 UTC (rev 7392) +++ armagetronad/trunk/armagetronad/configure.ac 2007-11-14 10:11:05 UTC (rev 7393) @@ -52,7 +52,6 @@ AC_PREREQ(2.50) build_regular=true -have_glew=true AC_ARG_ENABLE(glout, AC_HELP_STRING([--enable-glout], @@ -351,6 +350,16 @@ fi ) +dnl glew + +have_glew=true + +AC_ARG_WITH(glew, + AC_HELP_STRING([--with-glew], + [Use GLEW and the OpenGL extensions it provides]), + test "${withval}" == "yes" || have_glew=false +) + dnl dnl testing a nifty make feature: silent inclu[]des @@ -683,16 +692,18 @@ dnl GLEW dnl ************************************************* -AC_CHECK_LIB(GLEW,glewInit,, - AC_MSG_WARN([OpenGL Extension Wrangler (GLEW) library not found. No fancy effects for you.]) - have_glew=false -) +if test have_glew=true; then + AC_CHECK_LIB(GLEW,glewInit,, + AC_MSG_WARN([OpenGL Extension Wrangler (GLEW) library not found. No fancy effects for you.]) + have_glew=false + ) -if test ${have_glew} = true; then -AC_CHECK_HEADERS([GL/glew.h],, - AC_MSG_WARN([OpenGL Extension Wrangler (GLEW) headers not found. No fancy effects for you.]) - have_glew=false -) + if test ${have_glew} = true; then + AC_CHECK_HEADERS([GL/glew.h],, + AC_MSG_WARN([OpenGL Extension Wrangler (GLEW) headers not found. No fancy effects for you.]) + have_glew=false + ) + fi fi dnl ************************************************* Modified: armagetronad/trunk/armagetronad/language/english_base.txt =================================================================== --- armagetronad/trunk/armagetronad/language/english_base.txt 2007-11-13 22:53:55 UTC (rev 7392) +++ armagetronad/trunk/armagetronad/language/english_base.txt 2007-11-14 10:11:05 UTC (rev 7393) @@ -1824,6 +1824,8 @@ screen_vsync_motionblur_text Motion Blur screen_vsync_motionblur_help Ignore it and make use of the additional frames for motion blurring, which makes the tearing artefacts less prominent. Recommended for power gamers. +screen_vsync_motionblur_unsupported Motion Blur unsupported on your system, disabling it.\n + screen_grab_mouse_text Grab Mouse: screen_grab_mouse_help If activated, the mouse pointer is centered after every move; thus, it is unable to leave the window. This option is only useful when you play \g in a window. Modified: armagetronad/trunk/armagetronad/src/render/rGLEW.h =================================================================== --- armagetronad/trunk/armagetronad/src/render/rGLEW.h 2007-11-13 22:53:55 UTC (rev 7392) +++ armagetronad/trunk/armagetronad/src/render/rGLEW.h 2007-11-14 10:11:05 UTC (rev 7393) @@ -2,6 +2,8 @@ #define AT_GLEW_H #include "aa_config.h" +#include "tException.h" +#include "tString.h" // check whether GLEW is available #ifndef DEDICATED @@ -18,4 +20,19 @@ #endif #endif +//! Exception for GLEW (also defined when we don't have GLEW) +class rExceptionGLEW: public tException +{ +public: + rExceptionGLEW( char const * description ) + : description_( description ) + { + } +private: + virtual tString DoGetName() const { return tString("GLEW Exception"); } + + virtual tString DoGetDescription() const { return description_; } + tString description_; +}; + #endif Modified: armagetronad/trunk/armagetronad/src/render/rSysdep.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/render/rSysdep.cpp 2007-11-13 22:53:55 UTC (rev 7392) +++ armagetronad/trunk/armagetronad/src/render/rSysdep.cpp 2007-11-14 10:11:05 UTC (rev 7393) @@ -704,7 +704,7 @@ // blurs the motion, time is the current time bool sr_MotionBlur( double time, std::auto_ptr< rTextureRenderTarget > & blurTarget ) { - static bool lastActive = true; + static bool lastActive = false; bool active = false; // measure frame rendering time @@ -762,7 +762,20 @@ // create blur texture if ( !blurTarget.get() ) { - blurTarget = std::auto_ptr< rTextureRenderTarget >( new rTextureRenderTarget( blurWidth, blurHeight ) ); + try + { + blurTarget = std::auto_ptr< rTextureRenderTarget >( new rTextureRenderTarget( blurWidth, blurHeight ) ); + } + catch( rExceptionGLEW const & e ) + { + // unsupported. Disable motion blur. + currentScreensetting.vSync = ArmageTron_VSync_Off; + lastActive = false; + + con << tOutput("$screen_vsync_motionblur_unsupported"); + + return true; + } } // really blur Modified: armagetronad/trunk/armagetronad/src/render/rTextureRenderTarget.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/render/rTextureRenderTarget.cpp 2007-11-13 22:53:55 UTC (rev 7392) +++ armagetronad/trunk/armagetronad/src/render/rTextureRenderTarget.cpp 2007-11-14 10:11:05 UTC (rev 7393) @@ -75,6 +75,7 @@ height_ = height; previous = 0; +#ifdef HAVE_GLEW if ( GLEW_EXT_framebuffer_object ) { Push(); @@ -111,7 +112,7 @@ case GL_FRAMEBUFFER_COMPLETE_EXT: break; case GL_FRAMEBUFFER_UNSUPPORTED_EXT: - throw tGenericException( "Unsupported frame buffer operation" ); + throw rExceptionGLEW( "Unsupported frame buffer operation" ); default: tASSERT( 0 ); } @@ -122,8 +123,9 @@ return; } +#endif - throw tGenericException( "frame buffer extension not supported" ); + throw rExceptionGLEW( "frame buffer extension not supported" ); #endif } @@ -133,12 +135,14 @@ previous = anchor; anchor = this; +#ifdef HAVE_GLEW sr_CheckGLError(); glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, frameBuffer_ ); sr_CheckGLError(); #endif +#endif } void rTextureRenderTarget::Pop() @@ -155,10 +159,12 @@ void rTextureRenderTarget::Restore() { #ifndef DEDICATED +#ifdef HAVE_GLEW sr_CheckGLError(); glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, anchor ? anchor->frameBuffer_ : 0 ); sr_CheckGLError(); #endif +#endif } void rTextureRenderTarget::OnSelect(bool) Modified: armagetronad/trunk/armagetronad/src/tron/gMenus.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gMenus.cpp 2007-11-13 22:53:55 UTC (rev 7392) +++ armagetronad/trunk/armagetronad/src/tron/gMenus.cpp 2007-11-14 10:11:05 UTC (rev 7393) @@ -333,7 +333,9 @@ uSelectEntry<rVSync> zvs_on(zvs_t,"$screen_vsync_on_text","$screen_vsync_on_help",ArmageTron_VSync_On); uSelectEntry<rVSync> zvs_d(zvs_t,"$screen_vsync_default_text","$screen_vsync_default_help",ArmageTron_VSync_Default); uSelectEntry<rVSync> zvs_off(zvs_t,"$screen_vsync_off_text","$screen_vsync_off_help",ArmageTron_VSync_Off); +#ifdef HAVE_GLEW uSelectEntry<rVSync> zvs_blur(zvs_t,"$screen_vsync_motionblur_text","$screen_vsync_motionblur_help",ArmageTron_VSync_MotionBlur); +#endif // HAVE_GLEW #endif // SDL_GL_SWAP_CONTROL #endif // SDL_OPENGL This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <z-...@us...> - 2007-11-15 09:41:49
|
Revision: 7401 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7401&view=rev Author: z-man Date: 2007-11-15 01:41:53 -0800 (Thu, 15 Nov 2007) Log Message: ----------- Whoops, really should work without GLEW now. Modified Paths: -------------- armagetronad/trunk/armagetronad/configure.ac armagetronad/trunk/armagetronad/src/render/rTextureRenderTarget.cpp Modified: armagetronad/trunk/armagetronad/configure.ac =================================================================== --- armagetronad/trunk/armagetronad/configure.ac 2007-11-15 00:18:04 UTC (rev 7400) +++ armagetronad/trunk/armagetronad/configure.ac 2007-11-15 09:41:53 UTC (rev 7401) @@ -692,18 +692,18 @@ dnl GLEW dnl ************************************************* -if test have_glew=true; then +if test ${have_glew} = true; then AC_CHECK_LIB(GLEW,glewInit,, - AC_MSG_WARN([OpenGL Extension Wrangler (GLEW) library not found. No fancy effects for you.]) - have_glew=false + AC_MSG_WARN([OpenGL Extension Wrangler (GLEW) library not found. No fancy effects for you.]) + have_glew=false ) +fi - if test ${have_glew} = true; then - AC_CHECK_HEADERS([GL/glew.h],, - AC_MSG_WARN([OpenGL Extension Wrangler (GLEW) headers not found. No fancy effects for you.]) - have_glew=false +if test ${have_glew} = true; then + AC_CHECK_HEADERS([GL/glew.h],, + AC_MSG_WARN([OpenGL Extension Wrangler (GLEW) headers not found. No fancy effects for you.]) + have_glew=false ) - fi fi dnl ************************************************* Modified: armagetronad/trunk/armagetronad/src/render/rTextureRenderTarget.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/render/rTextureRenderTarget.cpp 2007-11-15 00:18:04 UTC (rev 7400) +++ armagetronad/trunk/armagetronad/src/render/rTextureRenderTarget.cpp 2007-11-15 09:41:53 UTC (rev 7401) @@ -75,7 +75,7 @@ height_ = height; previous = 0; -#ifdef GL_EXT_framebuffer_object +#ifdef GLEW_EXT_framebuffer_object if ( GLEW_EXT_framebuffer_object ) { Push(); @@ -123,7 +123,7 @@ return; } -#endif // GL_EXT_framebuffer_object +#endif // GLEW_EXT_framebuffer_object throw rExceptionGLEW( "frame buffer extension not supported" ); #endif @@ -135,7 +135,7 @@ previous = anchor; anchor = this; -#ifdef GL_EXT_framebuffer_object +#ifdef GLEW_EXT_framebuffer_object sr_CheckGLError(); glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, frameBuffer_ ); @@ -158,7 +158,7 @@ void rTextureRenderTarget::Restore() { -#ifdef GL_EXT_framebuffer_object +#ifdef GLEW_EXT_framebuffer_object sr_CheckGLError(); glBindFramebufferEXT( GL_FRAMEBUFFER_EXT, anchor ? anchor->frameBuffer_ : 0 ); sr_CheckGLError(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <z-...@us...> - 2007-12-10 11:04:54
|
Revision: 7408 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7408&view=rev Author: z-man Date: 2007-12-10 03:04:54 -0800 (Mon, 10 Dec 2007) Log Message: ----------- Merging branch 0.2.8 from revision 7396 to 7407: ------------------------------------------------------------------------ r7407 | z-man | 2007-12-10 11:33:30 +0100 (Mon, 10 Dec 2007) | 1 line r7406 | z-man | 2007-12-10 11:32:53 +0100 (Mon, 10 Dec 2007) | 2 lines More elaborate version of the last fix that does not break the master server. ------------------------------------------------------------------------ r7405 | z-man | 2007-12-10 10:42:12 +0100 (Mon, 10 Dec 2007) | 2 lines Fixed 100% cpu usage of the server when data was incoming on the control socket at the wrong time (any time it is not talking to the master servers). ------------------------------------------------------------------------ r7400 | z-man | 2007-11-15 01:18:04 +0100 (Thu, 15 Nov 2007) | 2 lines Fixed bugs when MAX_CLIENTS was lowered when players were already online. ------------------------------------------------------------------------ r7398 | z-man | 2007-11-14 19:28:21 +0100 (Wed, 14 Nov 2007) | 2 lines Sorry, bash required for now. ------------------------------------------------------------------------ Revision Links: -------------- http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7396&view=rev Modified Paths: -------------- armagetronad/trunk/armagetronad/batch/masterstarter.in armagetronad/trunk/armagetronad/src/network/master.cpp armagetronad/trunk/armagetronad/src/network/nNetwork.cpp armagetronad/trunk/armagetronad/src/network/nNetwork.h armagetronad/trunk/armagetronad/src/tron/gGame.cpp Modified: armagetronad/trunk/armagetronad/batch/masterstarter.in =================================================================== --- armagetronad/trunk/armagetronad/batch/masterstarter.in 2007-12-10 10:33:30 UTC (rev 7407) +++ armagetronad/trunk/armagetronad/batch/masterstarter.in 2007-12-10 11:04:54 UTC (rev 7408) @@ -1,4 +1,4 @@ -#!/bin/sh +#! /bin/bash # # starts the @progtitle@ master server from the installation directory Modified: armagetronad/trunk/armagetronad/src/network/master.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/network/master.cpp 2007-12-10 10:33:30 UTC (rev 7407) +++ armagetronad/trunk/armagetronad/src/network/master.cpp 2007-12-10 11:04:54 UTC (rev 7408) @@ -47,8 +47,6 @@ REAL master_idle = 2; static tSettingItem< REAL > mi( "MASTER_IDLE", master_idle ); -extern void sn_ReceiveFromControlSocket(); - // console with filter for better machine readable log format class nConsoleDateFilter:public tConsoleFilter{ private: Modified: armagetronad/trunk/armagetronad/src/network/nNetwork.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/network/nNetwork.cpp 2007-12-10 10:33:30 UTC (rev 7407) +++ armagetronad/trunk/armagetronad/src/network/nNetwork.cpp 2007-12-10 11:04:54 UTC (rev 7408) @@ -1429,7 +1429,7 @@ if ( reset ) { int count = 0; - for(int user2=1;user2<=sn_maxClients;++user2) + for(int user2=1;user2<=MAXCLIENTS;++user2) { if(!sn_Connections[user2].socket) continue; @@ -1450,7 +1450,7 @@ int CountSameConnection( int user ) { int count = 0; - for(int user2=1;user2<=sn_maxClients;++user2) + for(int user2=1;user2<=MAXCLIENTS;++user2) { if( NULL == sn_Connections[user2].socket ) continue; @@ -1470,39 +1470,26 @@ int user; // level 1: look for free slot - for(user=1;user<=sn_maxClients;++user) + if ( sn_NumUsers() < sn_maxClients ) { - // look for empty slot - if(!sn_Connections[user].socket) + for(user=1;user<=sn_maxClients;++user) { - return user; + // look for empty slot + if(!sn_Connections[user].socket) + { + return user; + } } } int best = -1; - // level 2: look for slot timing out anyway - // z-man: not a good idea after all, causes unjustified kicks... - /* - //int bestTimeout = kickOnDemandTimeout; + // level 2 kicked out users who were timing out and was not a good idea. - for(user=1;user<=sn_maxClients;++user) - { - int timeout = timeouts[user]; - if ( timeout > bestTimeout ) - { - bestTimeout = timeout; - best = user; - } - } - if ( best > 0 ) - return best; - */ - int bestCount = sn_allowSameIPCountSoft-1; // level 3: look for dublicate IPs - for(user=1;user<=sn_maxClients;++user) + for(user=1;user<=MAXCLIENTS;++user) { int count = CountSameIP( user ); if ( count > bestCount ) @@ -1752,8 +1739,10 @@ } nWaitForAck::AckAllPeer(id); - if (0<id && id<=sn_maxClients) + if (0<id && id<=MAXCLIENTS) + { sn_DisconnectUser(id, "$network_kill_logout"); + } } @@ -2311,12 +2300,26 @@ } } +// receives and processes data from control socket void sn_ReceiveFromControlSocket() { rec_peer(0); } +// discards data from control socket +void sn_DiscardFromControlSocket() +{ + // new facts: pending incoming data on the control socket causes the idle loops + // to use 100% CPU time, we need to fetch and discard the data instead of ignoring it. + if ( sn_Connections[0].socket ) + { + int8 buff[2]; + nAddress addrFrom; + sn_Connections[0].socket->Read( reinterpret_cast<int8 *>(buff),0, addrFrom); + } +} + nNetState sn_GetNetState(){ return current_state; } Modified: armagetronad/trunk/armagetronad/src/network/nNetwork.h =================================================================== --- armagetronad/trunk/armagetronad/src/network/nNetwork.h 2007-12-10 10:33:30 UTC (rev 7407) +++ armagetronad/trunk/armagetronad/src/network/nNetwork.h 2007-12-10 11:04:54 UTC (rev 7408) @@ -626,6 +626,12 @@ // process the messages from all hosts and send acks void sn_Receive(); +// receive and process data from control socket (used on master server to ping servers) +extern void sn_ReceiveFromControlSocket(); + +// receive and discard data from control socket (used on regular servers to keep the pipe clean) +extern void sn_DiscardFromControlSocket(); + // attempts to sync with server/all clients (<=> wait for all acks) // sync_netObjects: if set, network objects are synced as well // otherEnd: if set, the client instructs the server to send all packets and waits for completion. Modified: armagetronad/trunk/armagetronad/src/tron/gGame.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gGame.cpp 2007-12-10 10:33:30 UTC (rev 7407) +++ armagetronad/trunk/armagetronad/src/tron/gGame.cpp 2007-12-10 11:04:54 UTC (rev 7408) @@ -1446,6 +1446,18 @@ } }; +// receive network data +void sg_Receive() +{ + sn_Receive(); + if ( sn_GetNetState() == nSERVER ) + { + // servers should ignore data sent to the control socket. It probably would be better + // to close the socket altogether, but that opens another can of worms. + sn_DiscardFromControlSocket(); + } +} + void ConnectToServer(nServerInfoBase *server) { tASSERT( server ); @@ -1510,7 +1522,7 @@ con << tOutput("$network_connecting_gamestate"); while (!sg_currentGame && tSysTimeFloat()<endTime && (sn_GetNetState() != nSTANDALONE)){ tAdvanceFrame(); - sn_Receive(); + sg_Receive(); nNetObject::SyncAll(); tAdvanceFrame(); sn_SendPlanned(); @@ -1717,7 +1729,7 @@ virtual void Do() //!< do the work. { tAdvanceFrame(); - sn_Receive(); + sg_Receive(); tAdvanceFrame(); sn_SendPlanned(); } @@ -2279,7 +2291,7 @@ if (!sr_glOut && ePlayer::PlayerConfig(0)->cam) tERR_ERROR_INT("Someone messed with the camera!"); #endif - sn_Receive(); + sg_Receive(); nNetObject::SyncAll(); tAdvanceFrame(); sn_SendPlanned(); @@ -3797,7 +3809,7 @@ void gameloop_idle() { se_UserShowScores( false ); - sn_Receive(); + sg_Receive(); nNetObject::SyncAll(); sn_SendPlanned(); GameLoop(false); @@ -3834,7 +3846,7 @@ { // new network data arrived, do the most urgent work now tAdvanceFrame(); - sn_Receive(); + sg_Receive(); se_SyncGameTimer(); REAL time=se_GameTime(); sg_currentGame->StateUpdate(); @@ -3854,7 +3866,7 @@ // do the regular simulation tAdvanceFrame(); - sn_Receive(); + sg_Receive(); goon=GameLoop(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <z-...@us...> - 2008-01-05 00:35:15
|
Revision: 7463 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7463&view=rev Author: z-man Date: 2008-01-04 16:35:19 -0800 (Fri, 04 Jan 2008) Log Message: ----------- Forgot to enable joystick events :) Works fine otherwise, enabling joystick handling by default. Modified Paths: -------------- armagetronad/trunk/armagetronad/configure.ac armagetronad/trunk/armagetronad/src/ui/uInput.cpp Modified: armagetronad/trunk/armagetronad/configure.ac =================================================================== --- armagetronad/trunk/armagetronad/configure.ac 2008-01-05 00:11:33 UTC (rev 7462) +++ armagetronad/trunk/armagetronad/configure.ac 2008-01-05 00:35:19 UTC (rev 7463) @@ -136,8 +136,8 @@ AC_ARG_ENABLE(joystick, AC_HELP_STRING([--enable-joystick], - [enable joystick support (default=disabled)]),, -enable_joystick=no) + [enable joystick support (default=enabled)]),, +enable_joystick=yes) AC_ARG_ENABLE(respawn, AC_HELP_STRING([--enable-respawn], Modified: armagetronad/trunk/armagetronad/src/ui/uInput.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/ui/uInput.cpp 2008-01-05 00:11:33 UTC (rev 7462) +++ armagetronad/trunk/armagetronad/src/ui/uInput.cpp 2008-01-05 00:35:19 UTC (rev 7463) @@ -600,7 +600,7 @@ tString GetName( char const * type, int subID, char const * suffix = NULL ) const { std::ostringstream o; - o << name << " " << type << " " << subID; + o << name << " " << type << " " << subID+1; if ( suffix ) { o << " " << suffix; @@ -663,6 +663,7 @@ void su_JoystickInit() { su_GetJoystickInput(); + SDL_JoystickEventState( SDL_ENABLE ); } #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <z-...@us...> - 2008-01-05 10:53:38
|
Revision: 7466 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7466&view=rev Author: z-man Date: 2008-01-05 02:53:42 -0800 (Sat, 05 Jan 2008) Log Message: ----------- Added missing files to code::blocks project, activated joystick support. Modified Paths: -------------- armagetronad/trunk/armagetronad/src/render/rTexture.cpp armagetronad/trunk/armagetronad/src/win32/config_common.h armagetronad/trunk/armagetronad/win32/code_blocks/ArmagetronAd.workspace Modified: armagetronad/trunk/armagetronad/src/render/rTexture.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/render/rTexture.cpp 2008-01-05 01:19:09 UTC (rev 7465) +++ armagetronad/trunk/armagetronad/src/render/rTexture.cpp 2008-01-05 10:53:42 UTC (rev 7466) @@ -20,7 +20,7 @@ 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. - + *************************************************************************** */ @@ -81,6 +81,10 @@ #endif #endif +// MS OpenGL headers don't include this define +#ifndef GL_CLAMP_TO_EDGE +#define GL_CLAMP_TO_EDGE GL_CLAMP +#endif // ****************************************************************************************** // * Modified: armagetronad/trunk/armagetronad/src/win32/config_common.h =================================================================== --- armagetronad/trunk/armagetronad/src/win32/config_common.h 2008-01-05 01:19:09 UTC (rev 7465) +++ armagetronad/trunk/armagetronad/src/win32/config_common.h 2008-01-05 10:53:42 UTC (rev 7466) @@ -43,7 +43,7 @@ #endif // for now, no joystick support in Windows -#define NOJOYSTICK 1 +// #define NOJOYSTICK 1 // Define this for the particle library #define PARTICLEDLL_EXPORTS Modified: armagetronad/trunk/armagetronad/win32/code_blocks/ArmagetronAd.workspace =================================================================== --- armagetronad/trunk/armagetronad/win32/code_blocks/ArmagetronAd.workspace 2008-01-05 01:19:09 UTC (rev 7465) +++ armagetronad/trunk/armagetronad/win32/code_blocks/ArmagetronAd.workspace 2008-01-05 10:53:42 UTC (rev 7466) @@ -7,11 +7,11 @@ <Project filename="..\..\..\winlibs\win32\code_blocks\SDL.cbp"/> <Project filename="..\..\..\winlibs\win32\code_blocks\SDL_image.cbp"/> <Project filename="..\..\..\winlibs\win32\code_blocks\mikmod.cbp"/> - <Project filename="..\..\..\winlibs\win32\code_blocks\libogg.cbp" active="1"/> + <Project filename="..\..\..\winlibs\win32\code_blocks\libogg.cbp"/> <Project filename="..\..\..\winlibs\win32\code_blocks\libvorbis.cbp"/> <Project filename="..\..\..\winlibs\win32\code_blocks\libvorbisfile.cbp"/> <Project filename="..\..\..\winlibs\win32\code_blocks\FTGL.cbp"/> <Project filename="..\..\..\winlibs\win32\code_blocks\SDL_mixer.cbp"/> - <Project filename="ArmagetronAd.cbp"/> + <Project filename="ArmagetronAd.cbp" active="1"/> </Workspace> </CodeBlocks_workspace_file> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <z-...@us...> - 2008-01-05 16:28:54
|
Revision: 7471 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7471&view=rev Author: z-man Date: 2008-01-05 08:28:59 -0800 (Sat, 05 Jan 2008) Log Message: ----------- Added special joystick control mode for cycles. Modified Paths: -------------- armagetronad/trunk/armagetronad/language/english_base.txt armagetronad/trunk/armagetronad/src/Makefile.am armagetronad/trunk/armagetronad/src/tron/gArmagetron.cpp armagetronad/trunk/armagetronad/src/tron/gCycle.cpp armagetronad/trunk/armagetronad/src/tron/gCycle.h Added Paths: ----------- armagetronad/trunk/armagetronad/src/tron/gJoystick.cpp armagetronad/trunk/armagetronad/src/tron/gJoystick.h Modified: armagetronad/trunk/armagetronad/language/english_base.txt =================================================================== --- armagetronad/trunk/armagetronad/language/english_base.txt 2008-01-05 13:46:18 UTC (rev 7470) +++ armagetronad/trunk/armagetronad/language/english_base.txt 2008-01-05 16:28:59 UTC (rev 7471) @@ -934,7 +934,20 @@ input_cycle_turn_left_text Turn left input_cycle_turn_left_help Makes a 90 degrees turn to the left +input_cycle_turn_left_text Turn left +input_cycle_turn_left_help Makes a 90 degrees turn to the left +input_joy_left_text Joystick left +input_joy_left_help Lets the cycle drive left relative to the current view +input_joy_right_text Joystick right +input_joy_right_help Lets the cycle drive right relative to the current view +input_joy_up_text Joystick up +input_joy_up_help Lets the cycle drive up relative to the current view +input_joy_down_text Joystick down +input_joy_down_help Lets the cycle drive down relative to the current view +input_joy_glance_text Joystick glance +input_joy_glance_help When held, joystick motions will turn the camera and not the cyle + #******************************************** #******************************************** # Modified: armagetronad/trunk/armagetronad/src/Makefile.am =================================================================== --- armagetronad/trunk/armagetronad/src/Makefile.am 2008-01-05 13:46:18 UTC (rev 7470) +++ armagetronad/trunk/armagetronad/src/Makefile.am 2008-01-05 16:28:59 UTC (rev 7471) @@ -130,6 +130,7 @@ libtron_a_SOURCES=tron/gAIBase.cpp tron/gAIBase.h tron/gAICharacter.cpp tron/gAICharacter.h tron/gArena.cpp tron/gArena.h\ tron/gArmagetron.cpp tron/gCamera.cpp tron/gCamera.h tron/gCycle.cpp tron/gCycle.h tron/gCycleMovement.cpp\ + tron/gJoystick.h tron/gJoystick.cpp\ tron/gCycleMovement.h tron/gExplosion.cpp tron/gExplosion.h tron/gGame.cpp tron/gGame.h\ tron/gLanguageMenu.cpp tron/gLanguageMenu.h tron/gLogo.cpp tron/gLogo.h\ tron/gMenus.cpp tron/gMenus.h tron/gParser.cpp tron/gParser.h tron/gParticles.cpp tron/gParticles.h\ Modified: armagetronad/trunk/armagetronad/src/tron/gArmagetron.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gArmagetron.cpp 2008-01-05 13:46:18 UTC (rev 7470) +++ armagetronad/trunk/armagetronad/src/tron/gArmagetron.cpp 2008-01-05 16:28:59 UTC (rev 7471) @@ -584,7 +584,7 @@ else { #ifdef DEBUG - std::cout << "Joystick(s) initialized\n"; + // std::cout << "Joystick(s) initialized\n"; #endif // DEBUG su_JoystickInit(); } Modified: armagetronad/trunk/armagetronad/src/tron/gCycle.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gCycle.cpp 2008-01-05 13:46:18 UTC (rev 7470) +++ armagetronad/trunk/armagetronad/src/tron/gCycle.cpp 2008-01-05 16:28:59 UTC (rev 7471) @@ -38,6 +38,7 @@ #include "rScreen.h" #include "rFont.h" #include "gSensor.h" +#include "gJoystick.h" #include "ePlayer.h" #include "eSoundMixer.h" @@ -2052,6 +2053,12 @@ #endif void gCycle::MyInitAfterCreation(){ +#ifndef DEDICATED + joystick_ = tNEW( gJoystick( this ) ); +#else + joystick_ = NULL; +#endif + dropWallRequested_ = false; lastGoodPosition_ = pos; @@ -2318,6 +2325,9 @@ lastWall=NULL; gCycleMovement::RemoveFromGame(); + + delete joystick_; + joystick_ = NULL; } static inline void rotate(eCoord &r,REAL angle){ @@ -2664,6 +2674,12 @@ eCoord oldpos=pos; + // let the joystick execute delayed turns + if ( joystick_ ) + { + joystick_->Turn(); + } + // archive rubber speed for later comparison REAL rubberSpeedFactorBack = rubberSpeedFactor; @@ -3424,6 +3440,12 @@ if (!Alive() && sn_GetNetState()==nSERVER) RequestSync(false); + // delegate to joystick + if ( joystick_ && joystick_->Act( Act, x ) ) + { + return true; + } + if(se_turnLeft==*Act && x>.5){ //SendControl(lastTime,&se_turnLeft,1); Turn(-1); @@ -4527,7 +4549,30 @@ return dir.Turn(0,-skew); } +eCoord gCycle::CamDir() const +{ + if ( joystick_ && joystick_->cameraDirection_.NormSquared() > .25 ) + { + return joystick_->cameraDirection_; + } + else + { + return dir; + } +} +eCoord gCycle::Direction() const +{ + if ( joystick_ && joystick_->cameraDirection_.NormSquared() > .25 ) + { + return joystick_->cameraDirection_; + } + else + { + return dirDrive; + } +} + #ifdef POWERPAK_DEB void gCycle::PPDisplay(){ int R=int(r*255); Modified: armagetronad/trunk/armagetronad/src/tron/gCycle.h =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gCycle.h 2008-01-05 13:46:18 UTC (rev 7470) +++ armagetronad/trunk/armagetronad/src/tron/gCycle.h 2008-01-05 16:28:59 UTC (rev 7471) @@ -45,6 +45,7 @@ class gNetPlayerWall; class gPlayerWall; class eTempEdge; +class gJoystick; struct gPredictPositionData; // minimum time between two cycle turns @@ -281,6 +282,8 @@ virtual eCoord CamPos() const; virtual eCoord PredictPosition() const; virtual eCoord CamTop() const; + virtual eCoord CamDir() const; + virtual eCoord Direction() const; virtual void RightBeforeDeath( int numTries ); @@ -297,7 +300,7 @@ static REAL wallsStayUpDelay; //!< the time the cycle walls stay up ( negative values: they stay up forever ) static REAL wallsLength; //!< the maximum total length of the walls static REAL explosionRadius; //!< the radius of the holes blewn in by an explosion - + gJoystick * joystick_; //!< joystick control protected: virtual bool DoIsDestinationUsed ( const gDestination * dest ) const ; //!< returns whether the given destination is in active use }; Added: armagetronad/trunk/armagetronad/src/tron/gJoystick.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gJoystick.cpp (rev 0) +++ armagetronad/trunk/armagetronad/src/tron/gJoystick.cpp 2008-01-05 16:28:59 UTC (rev 7471) @@ -0,0 +1,172 @@ +/* + +************************************************************************* + +ArmageTron -- Just another Tron Lightcycle Game in 3D. +Copyright (C) 2005 by Manuel Moos +and the AA DevTeam (see the file AUTHORS(.txt) in the main source directory) + +************************************************************************** + +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. + +*************************************************************************** + +*/ + +#include "gJoystick.h" +#include "gCycleMovement.h" +#include "uInput.h" +#include "eGrid.h" + +static uActionPlayer sg_JoyLeft("JOY_LEFT", -4); +static uActionPlayer sg_JoyRight("JOY_RIGHT", -4); +static uActionPlayer sg_JoyUp("JOY_UP", -3); +static uActionPlayer sg_JoyDown("JOY_DOWN", -3); +static uActionPlayer sg_JoyGlance("JOY_GLANCE", -2); + +//! process input events +bool gJoystick::Act( uActionPlayer * act, REAL value ) +{ + if ( ActInternal( act, value ) ) + { + // fetch driving direction if required + if ( driveDirection_.NormSquared() < .25 ) + { + driveDirection_ = cycle_->Direction(); + driveDirection_.Normalize(); + } + + // fetch camera direction if required + if ( cameraDirection_.NormSquared() < .25 ) + { + cameraDirection_ = cycle_->CamDir(); + cameraDirection_.Normalize(); + } + + // update directions + if ( joyDirection_.NormSquared() > .25 ) + { + tCoord dir = joyDirection_; + dir.Normalize(); + if ( glance_ ) + { + // adapt viewing direction to driving direction + cameraDirection_ = driveDirection_.Turn( dir.Conj() ); + } + else + { + // adapt driving direction to view direction + driveDirection_ = cameraDirection_.Turn( dir ); + + // possibly turn + turnRequested_ = true; + Turn(); + } + } + else + { + // joystick was released, reeset driving direction and camera direction. + driveDirection_ = tCoord(); + cameraDirection_ = tCoord(); + } + + return true; + } + + return false; +} + +//! turn the cycle +void gJoystick::Turn() +{ + // nothing to do + if ( !turnRequested_ ) + { + return; + } + + // fetch current and possible turn driving directions + int winding = cycle_->WindingNumber(); + int windingLeft = winding, windingRight = winding; + eGrid * grid = cycle_->Grid(); + grid->Turn( windingLeft, -1 ); + grid->Turn( windingRight, +1 ); + eCoord leftTurn = grid->GetDirection( windingLeft ); + eCoord rightTurn = grid->GetDirection( windingRight ); + eCoord straightOn = grid->GetDirection( winding ); + + // normalize them (axes may be unnormalized) + leftTurn.Normalize(); + rightTurn.Normalize(); + straightOn.Normalize(); + + // calculate distances between desired and possible driving directions + REAL left = ( leftTurn - driveDirection_ ).NormSquared(); + REAL right = ( rightTurn - driveDirection_ ).NormSquared(); + REAL straight = ( straightOn - driveDirection_ ).NormSquared(); + + // possibly turn + if ( left < right && left < straight *.9 ) + { + if ( cycle_->CanMakeTurn( -1 ) ) + { + cycle_->Turn( -1 ); + } + } + else if ( left > right && right < straight * .9 ) + { + if( cycle_->CanMakeTurn( +1 ) ) + { + cycle_->Turn( +1 ); + } + } + else + { + // not much use repeating this calculation until new input arrives + turnRequested_ = false; + } +} + +bool gJoystick::ActInternal( uActionPlayer * act, REAL value ) +{ + if ( act == & sg_JoyUp ) + { + joyDirection_.x = value; + return true; + } + if ( act == & sg_JoyDown ) + { + joyDirection_.x = -value; + return true; + } + if ( act == & sg_JoyLeft ) + { + joyDirection_.y = value; + return true; + } + if ( act == & sg_JoyRight ) + { + joyDirection_.y = -value; + return true; + } + if ( act == & sg_JoyGlance ) + { + glance_ = ( value > .5 ); + return true; + } + + return false; +} Added: armagetronad/trunk/armagetronad/src/tron/gJoystick.h =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gJoystick.h (rev 0) +++ armagetronad/trunk/armagetronad/src/tron/gJoystick.h 2008-01-05 16:28:59 UTC (rev 7471) @@ -0,0 +1,66 @@ +/* + +************************************************************************* + +ArmageTron -- Just another Tron Lightcycle Game in 3D. +Copyright (C) 2005 by Manuel Moos +and the AA DevTeam (see the file AUTHORS(.txt) in the main source directory) + +************************************************************************** + +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. + +*************************************************************************** + +*/ + +#ifndef ArmageTron_gJoystick_H +#define ArmageTron_gJoystick_H + +class gCycleMovement; +class uActionPlayer; + +#include "tCoord.h" + +//! special joystick controls for the lightcycles. Simple left-right controls +// just don't cut it there. + +class gJoystick +{ + friend class gCycle; +public: + gJoystick( gCycleMovement * cycle ) + : cycle_( cycle ), glance_( false ), turnRequested_( false ) + { + } + + //! process input events + bool Act( uActionPlayer * act, REAL value ); + + //! turn the cycle + void Turn(); +private: + bool ActInternal( uActionPlayer * act, REAL value ); + + gCycleMovement * cycle_; //!< the cycle controlled by this joystick + tCoord cameraDirection_; //!< the direction the camera is supposed to look in + tCoord driveDirection_; //!< the direction the cycle is supposed to drive in + tCoord joyDirection_; //!< direction the joystick is currently pointing in + + bool glance_; //!< whether the glance button is pressed + bool turnRequested_; //!< internal flag indicating further turns may be required +}; + +#endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <lu...@us...> - 2008-01-14 10:42:19
|
Revision: 7518 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7518&view=rev Author: luke-jr Date: 2008-01-14 02:42:13 -0800 (Mon, 14 Jan 2008) Log Message: ----------- rename nAuthentification -- z-man made me do it :o Modified Paths: -------------- armagetronad/trunk/armagetronad/src/Makefile.am armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp armagetronad/trunk/armagetronad/src/network/nServerInfo.cpp armagetronad/trunk/armagetronad/win32/code_blocks/ArmagetronAd.cbp armagetronad/trunk/armagetronad/win32/code_blocks/Dedicated.cbp armagetronad/trunk/armagetronad/win32/code_blocks/Dedicated_Visual2003.cbp armagetronad/trunk/armagetronad/win32/code_blocks/Master.cbp Added Paths: ----------- armagetronad/trunk/armagetronad/src/network/nAuthentication.cpp armagetronad/trunk/armagetronad/src/network/nAuthentication.h Removed Paths: ------------- armagetronad/trunk/armagetronad/src/network/nAuthentification.cpp armagetronad/trunk/armagetronad/src/network/nAuthentification.h Modified: armagetronad/trunk/armagetronad/src/Makefile.am =================================================================== --- armagetronad/trunk/armagetronad/src/Makefile.am 2008-01-12 12:16:59 UTC (rev 7517) +++ armagetronad/trunk/armagetronad/src/Makefile.am 2008-01-14 10:42:13 UTC (rev 7518) @@ -92,8 +92,8 @@ tools/tRuby.h tools/tRuby.cpp #tools/tCommandLine.cpp tools/tCommandLine.h -libnetwork_a_SOURCES=network/md5.cpp network/md5.h network/nAuthentification.cpp\ - network/nAuthentification.h network/nConfig.cpp network/nConfig.h\ +libnetwork_a_SOURCES=network/md5.cpp network/md5.h network/nAuthentication.cpp\ + network/nAuthentication.h network/nConfig.cpp network/nConfig.h\ network/nKrawall.cpp network/nKrawall.h network/nKrawallPrivate.cpp\ network/nNetObject.cpp network/nNetObject.h network/nNetwork.cpp network/nNetwork.h\ network/nObserver.cpp network/nObserver.h network/nPriorizing.cpp network/nPriorizing.h\ Modified: armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp 2008-01-12 12:16:59 UTC (rev 7517) +++ armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp 2008-01-14 10:42:13 UTC (rev 7518) @@ -45,7 +45,7 @@ #include "rRender.h" #include "rFont.h" #include "rSysdep.h" -#include "nAuthentification.h" +#include "nAuthentication.h" #include "tDirectories.h" #include "eTeam.h" #include "eVoter.h" @@ -410,7 +410,7 @@ else { if (sn_GetNetState() == nSERVER && user != sn_myNetID ) - nAuthentification::RequestLogin(username, user, "$login_request_failed", true); + nAuthentication::RequestLogin(username, user, "$login_request_failed", true); } } @@ -590,8 +590,8 @@ } ePlayer::ePlayer():cockpit(0){ - nAuthentification::SetUserPasswordCallback(&PasswordCallback); - nAuthentification::SetLoginResultCallback (&ResultCallback); + nAuthentication::SetUserPasswordCallback(&PasswordCallback); + nAuthentication::SetLoginResultCallback (&ResultCallback); nameTeamAfterMe = false; favoriteNumberOfPlayersPerTeam = 3; @@ -2598,7 +2598,7 @@ bool ePlayerNetID::IsAuth() const{ #ifdef KRAWALL_SERVER if (!auth && sn_GetNetState() == nSERVER && Owner() != sn_myNetID ) - nAuthentification::RequestLogin(GetUserName(), Owner(), "$login_request_first"); + nAuthentication::RequestLogin(GetUserName(), Owner(), "$login_request_first"); #endif return auth; @@ -4823,7 +4823,7 @@ if (sn_GetNetState() == nSERVER && Owner() != sn_myNetID ) { auth = false; - nAuthentification::RequestLogin(GetUserName(), Owner(), "$login_request_first"); + nAuthentication::RequestLogin(GetUserName(), Owner(), "$login_request_first"); } #endif @@ -4851,7 +4851,7 @@ #ifdef KRAWALL_SERVER if (sn_GetNetState() == nSERVER && Owner() != sn_myNetID ) { - nAuthentification::RequestLogin(GetUserName(), Owner(), "$login_request_namechange"); + nAuthentication::RequestLogin(GetUserName(), Owner(), "$login_request_namechange"); auth = false; userName_ = oldUserName; // restore the old name until the new one is authenticated } Copied: armagetronad/trunk/armagetronad/src/network/nAuthentication.cpp (from rev 7517, armagetronad/trunk/armagetronad/src/network/nAuthentification.cpp) =================================================================== --- armagetronad/trunk/armagetronad/src/network/nAuthentication.cpp (rev 0) +++ armagetronad/trunk/armagetronad/src/network/nAuthentication.cpp 2008-01-14 10:42:13 UTC (rev 7518) @@ -0,0 +1,194 @@ +/* + +************************************************************************* + +ArmageTron -- Just another Tron Lightcycle Game in 3D. +Copyright (C) 2000 Manuel Moos (ma...@mo...) + +************************************************************************** + +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. + +*************************************************************************** + +*/ + +#include "nAuthentication.h" +#include "nNetwork.h" +#include "nNetObject.h" +#include "tMemManager.h" +#include "tToDo.h" +#include "tLocale.h" +#include "tSysTime.h" + +#include <memory> +#include <string> + +static nAuthentication::UserPasswordCallback* S_UserPasswordCallback = NULL; +static nAuthentication::LoginResultCallback* S_LoginResultCallback = NULL; + +// let the game register the callbacks +void nAuthentication::SetUserPasswordCallback(nAuthentication::UserPasswordCallback* callback) +{ + S_UserPasswordCallback = callback; +} + +void nAuthentication::SetLoginResultCallback (nAuthentication::LoginResultCallback* callback) +{ + S_LoginResultCallback = callback; +} + + + + + +static bool S_UserAuthActive [MAXCLIENTS+2]; +static tString S_UserAuthName [MAXCLIENTS+2]; + +#ifdef KRAWALL_SERVER +static nKrawall::nSalt S_UserAuthSalt [MAXCLIENTS+2]; +static REAL S_UserAuthStarted[MAXCLIENTS+2]; +#endif + +static void Reset() +{ + S_UserAuthActive[nCallbackLoginLogout::User()] = false; +} + +static nCallbackLoginLogout resetter(Reset); + + +// network handler declarations + +static nDescriptor nPasswordRequest(40, &nAuthentication::HandlePasswordRequest, "password_request"); + +static nDescriptor nPasswordAnswer(41, &nAuthentication::HandlePasswordAnswer, "password_answer"); + + +// on the server: request user authentification from login slot +void nAuthentication::RequestLogin(const tString& username, int user, const tOutput& message, bool failureOnLastTry) +{ +#ifdef KRAWALL_SERVER + + // do nothing if there is another login in process for that client + if (S_UserAuthActive[user]) + return; + + // create a random salt value + nSalt salt; + RandomSalt(salt); + + // save the login information + memcpy(S_UserAuthSalt[user],salt, sizeof(nSalt)); + S_UserAuthActive[user] = true; + S_UserAuthStarted[user] = tSysTimeFloat(); + S_UserAuthName[user] = username; + + // send the salt value and the username to the + nMessage *m = tNEW(nMessage)(nPasswordRequest); + WriteSalt(salt, *m); + *m << username; + *m << static_cast<tString>(message); + *m << failureOnLastTry; + m->Send(user); +#endif +} + +static tString S_username; +static tString S_message; +static nKrawall::nSalt S_salt; +static int S_user = -1; +static bool S_failureOnLastTry = false; + +// finish the request for username and password +static void FinishHandlePasswordRequest() +{ + nKrawall::nScrambledPassword scrambled, egg; + + // if the callback exists, get the scrambled password of the wanted user + if (S_UserPasswordCallback) + (*S_UserPasswordCallback)(S_username, S_message, scrambled, S_failureOnLastTry); + + // scramble it with the given salt + nKrawall::ScrambleWithSalt(scrambled, S_salt, egg); + + // destroy the original password + memset(scrambled, 0, sizeof(nKrawall::nScrambledPassword)); + + // and send it back + nMessage *ret = tNEW(nMessage)(nPasswordAnswer); + nKrawall::WriteScrambledPassword(egg, *ret); + *ret << S_username; + ret->Send(S_user); + + S_user = -1; +} + +// receive a password request +void nAuthentication::HandlePasswordRequest(nMessage& m) +{ + if (m.SenderID() > 0 || sn_GetNetState() != nCLIENT) + Cheater(m.SenderID()); + + // already in the process: return without answer + if (S_user >= 0) + return; + + // read salt and username from the message + ReadSalt(m, S_salt); + m >> S_username; + m >> S_message; + if (!m.End()) + m >> S_failureOnLastTry; + else + S_failureOnLastTry = true; + S_user = m.SenderID(); + + // postpone the answer for a better opportunity since it + // most likely involves opening a menu and waiting a while (and we + // are right now in the process of fetching network messages...) + st_ToDo(&FinishHandlePasswordRequest); +} + + +void nAuthentication::HandlePasswordAnswer(nMessage& m) +{ +#ifdef KRAWALL_SERVER + // do nothing if the authorisation was not requested + if (!S_UserAuthActive[m.SenderID()]) + return; + + S_UserAuthActive[m.SenderID()] = false; + + // read password and username from remote + nScrambledPassword scrambledRemote; + tString username; + ReadScrambledPassword(m, scrambledRemote); + m >> username; + + // get the password from the user database + nScrambledPassword temp, scrambledDatabase; + GetScrambledPassword(username, temp); + ScrambleWithSalt(temp, S_UserAuthSalt[m.SenderID()], scrambledDatabase); + + if (S_LoginResultCallback) + (*S_LoginResultCallback)(username, + S_UserAuthName[m.SenderID()], + m.SenderID(), + ArePasswordsEqual(scrambledRemote, scrambledDatabase)); +#endif +} + + Copied: armagetronad/trunk/armagetronad/src/network/nAuthentication.h (from rev 7517, armagetronad/trunk/armagetronad/src/network/nAuthentification.h) =================================================================== --- armagetronad/trunk/armagetronad/src/network/nAuthentication.h (rev 0) +++ armagetronad/trunk/armagetronad/src/network/nAuthentication.h 2008-01-14 10:42:13 UTC (rev 7518) @@ -0,0 +1,64 @@ +/* + +************************************************************************* + +ArmageTron -- Just another Tron Lightcycle Game in 3D. +Copyright (C) 2000 Manuel Moos (ma...@mo...) + +************************************************************************** + +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. + +*************************************************************************** + +*/ + +#ifndef ArmageTron_AUTHENTIFICATION_H +#define ArmageTron_AUTHENTIFICATION_H + +#include "nKrawall.h" + +class tOutput; + +class nAuthentication: public nKrawall +{ +public: + // callback where the game can register the password request/ + // lookup + typedef void UserPasswordCallback(tString& username, + const tString& message, + nScrambledPassword &scrambled, + bool failureOnLastTry); + + // callback where the game can register the login success + // lookup + typedef void LoginResultCallback(const tString& username, + const tString& origUsername, + int user, bool success); + + + // let the game register the callbacks + static void SetUserPasswordCallback(UserPasswordCallback* callback); + static void SetLoginResultCallback (LoginResultCallback* callback); + + // network handlers + static void HandlePasswordRequest(nMessage& m); + static void HandlePasswordAnswer (nMessage& m); + + // on the server: request user authentification from login slot + static void RequestLogin(const tString& username, int user, const tOutput& message, bool failureOnLastTry = false); +}; + +#endif Deleted: armagetronad/trunk/armagetronad/src/network/nAuthentification.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/network/nAuthentification.cpp 2008-01-12 12:16:59 UTC (rev 7517) +++ armagetronad/trunk/armagetronad/src/network/nAuthentification.cpp 2008-01-14 10:42:13 UTC (rev 7518) @@ -1,194 +0,0 @@ -/* - -************************************************************************* - -ArmageTron -- Just another Tron Lightcycle Game in 3D. -Copyright (C) 2000 Manuel Moos (ma...@mo...) - -************************************************************************** - -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. - -*************************************************************************** - -*/ - -#include "nAuthentification.h" -#include "nNetwork.h" -#include "nNetObject.h" -#include "tMemManager.h" -#include "tToDo.h" -#include "tLocale.h" -#include "tSysTime.h" - -#include <memory> -#include <string> - -static nAuthentification::UserPasswordCallback* S_UserPasswordCallback = NULL; -static nAuthentification::LoginResultCallback* S_LoginResultCallback = NULL; - -// let the game register the callbacks -void nAuthentification::SetUserPasswordCallback(nAuthentification::UserPasswordCallback* callback) -{ - S_UserPasswordCallback = callback; -} - -void nAuthentification::SetLoginResultCallback (nAuthentification::LoginResultCallback* callback) -{ - S_LoginResultCallback = callback; -} - - - - - -static bool S_UserAuthActive [MAXCLIENTS+2]; -static tString S_UserAuthName [MAXCLIENTS+2]; - -#ifdef KRAWALL_SERVER -static nKrawall::nSalt S_UserAuthSalt [MAXCLIENTS+2]; -static REAL S_UserAuthStarted[MAXCLIENTS+2]; -#endif - -static void Reset() -{ - S_UserAuthActive[nCallbackLoginLogout::User()] = false; -} - -static nCallbackLoginLogout resetter(Reset); - - -// network handler declarations - -static nDescriptor nPasswordRequest(40, &nAuthentification::HandlePasswordRequest, "password_request"); - -static nDescriptor nPasswordAnswer(41, &nAuthentification::HandlePasswordAnswer, "password_answer"); - - -// on the server: request user authentification from login slot -void nAuthentification::RequestLogin(const tString& username, int user, const tOutput& message, bool failureOnLastTry) -{ -#ifdef KRAWALL_SERVER - - // do nothing if there is another login in process for that client - if (S_UserAuthActive[user]) - return; - - // create a random salt value - nSalt salt; - RandomSalt(salt); - - // save the login information - memcpy(S_UserAuthSalt[user],salt, sizeof(nSalt)); - S_UserAuthActive[user] = true; - S_UserAuthStarted[user] = tSysTimeFloat(); - S_UserAuthName[user] = username; - - // send the salt value and the username to the - nMessage *m = tNEW(nMessage)(nPasswordRequest); - WriteSalt(salt, *m); - *m << username; - *m << static_cast<tString>(message); - *m << failureOnLastTry; - m->Send(user); -#endif -} - -static tString S_username; -static tString S_message; -static nKrawall::nSalt S_salt; -static int S_user = -1; -static bool S_failureOnLastTry = false; - -// finish the request for username and password -static void FinishHandlePasswordRequest() -{ - nKrawall::nScrambledPassword scrambled, egg; - - // if the callback exists, get the scrambled password of the wanted user - if (S_UserPasswordCallback) - (*S_UserPasswordCallback)(S_username, S_message, scrambled, S_failureOnLastTry); - - // scramble it with the given salt - nKrawall::ScrambleWithSalt(scrambled, S_salt, egg); - - // destroy the original password - memset(scrambled, 0, sizeof(nKrawall::nScrambledPassword)); - - // and send it back - nMessage *ret = tNEW(nMessage)(nPasswordAnswer); - nKrawall::WriteScrambledPassword(egg, *ret); - *ret << S_username; - ret->Send(S_user); - - S_user = -1; -} - -// receive a password request -void nAuthentification::HandlePasswordRequest(nMessage& m) -{ - if (m.SenderID() > 0 || sn_GetNetState() != nCLIENT) - Cheater(m.SenderID()); - - // already in the process: return without answer - if (S_user >= 0) - return; - - // read salt and username from the message - ReadSalt(m, S_salt); - m >> S_username; - m >> S_message; - if (!m.End()) - m >> S_failureOnLastTry; - else - S_failureOnLastTry = true; - S_user = m.SenderID(); - - // postpone the answer for a better opportunity since it - // most likely involves opening a menu and waiting a while (and we - // are right now in the process of fetching network messages...) - st_ToDo(&FinishHandlePasswordRequest); -} - - -void nAuthentification::HandlePasswordAnswer(nMessage& m) -{ -#ifdef KRAWALL_SERVER - // do nothing if the authorisation was not requested - if (!S_UserAuthActive[m.SenderID()]) - return; - - S_UserAuthActive[m.SenderID()] = false; - - // read password and username from remote - nScrambledPassword scrambledRemote; - tString username; - ReadScrambledPassword(m, scrambledRemote); - m >> username; - - // get the password from the user database - nScrambledPassword temp, scrambledDatabase; - GetScrambledPassword(username, temp); - ScrambleWithSalt(temp, S_UserAuthSalt[m.SenderID()], scrambledDatabase); - - if (S_LoginResultCallback) - (*S_LoginResultCallback)(username, - S_UserAuthName[m.SenderID()], - m.SenderID(), - ArePasswordsEqual(scrambledRemote, scrambledDatabase)); -#endif -} - - Deleted: armagetronad/trunk/armagetronad/src/network/nAuthentification.h =================================================================== --- armagetronad/trunk/armagetronad/src/network/nAuthentification.h 2008-01-12 12:16:59 UTC (rev 7517) +++ armagetronad/trunk/armagetronad/src/network/nAuthentification.h 2008-01-14 10:42:13 UTC (rev 7518) @@ -1,64 +0,0 @@ -/* - -************************************************************************* - -ArmageTron -- Just another Tron Lightcycle Game in 3D. -Copyright (C) 2000 Manuel Moos (ma...@mo...) - -************************************************************************** - -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. - -*************************************************************************** - -*/ - -#ifndef ArmageTron_AUTHENTIFICATION_H -#define ArmageTron_AUTHENTIFICATION_H - -#include "nKrawall.h" - -class tOutput; - -class nAuthentification: public nKrawall -{ -public: - // callback where the game can register the password request/ - // lookup - typedef void UserPasswordCallback(tString& username, - const tString& message, - nScrambledPassword &scrambled, - bool failureOnLastTry); - - // callback where the game can register the login success - // lookup - typedef void LoginResultCallback(const tString& username, - const tString& origUsername, - int user, bool success); - - - // let the game register the callbacks - static void SetUserPasswordCallback(UserPasswordCallback* callback); - static void SetLoginResultCallback (LoginResultCallback* callback); - - // network handlers - static void HandlePasswordRequest(nMessage& m); - static void HandlePasswordAnswer (nMessage& m); - - // on the server: request user authentification from login slot - static void RequestLogin(const tString& username, int user, const tOutput& message, bool failureOnLastTry = false); -}; - -#endif Modified: armagetronad/trunk/armagetronad/src/network/nServerInfo.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/network/nServerInfo.cpp 2008-01-12 12:16:59 UTC (rev 7517) +++ armagetronad/trunk/armagetronad/src/network/nServerInfo.cpp 2008-01-14 10:42:13 UTC (rev 7518) @@ -41,7 +41,7 @@ #include "nServerInfo.h" #include "nNetObject.h" #ifdef KRAWALL_SERVER -#include "nAuthentification.h" +#include "nAuthentication.h" #endif #include <fstream> @@ -132,7 +132,7 @@ sn_Transmitting[user] = nServerInfo::GetFirstServer(); } else - nAuthentification::RequestLogin(username, user, tOutput("$login_request_failed"), true); + nAuthentication::RequestLogin(username, user, tOutput("$login_request_failed"), true); } #endif // KRAWALL_SERVER @@ -1084,8 +1084,8 @@ sn_GetAdr(m.SenderID(), adr); if (nKrawall::RequireMasterLogin(adr, port)) { - nAuthentification::SetLoginResultCallback(&ResultCallback); - nAuthentification::RequestLogin(tString(""), m.SenderID(), tOutput("$login_request_master")); + nAuthentication::SetLoginResultCallback(&ResultCallback); + nAuthentication::RequestLogin(tString(""), m.SenderID(), tOutput("$login_request_master")); } else { Modified: armagetronad/trunk/armagetronad/win32/code_blocks/ArmagetronAd.cbp =================================================================== --- armagetronad/trunk/armagetronad/win32/code_blocks/ArmagetronAd.cbp 2008-01-12 12:16:59 UTC (rev 7517) +++ armagetronad/trunk/armagetronad/win32/code_blocks/ArmagetronAd.cbp 2008-01-14 10:42:13 UTC (rev 7518) @@ -565,13 +565,13 @@ <Option target="Win32 Debug"/> <Option target="Win32 Profile"/> </Unit> - <Unit filename="..\..\src\network\nAuthentification.cpp"> + <Unit filename="..\..\src\network\nAuthentication.cpp"> <Option compilerVar="CPP"/> <Option target="Win32 Release"/> <Option target="Win32 Debug"/> <Option target="Win32 Profile"/> </Unit> - <Unit filename="..\..\src\network\nAuthentification.h"> + <Unit filename="..\..\src\network\nAuthentication.h"> <Option compilerVar=""/> <Option compile="0"/> <Option link="0"/> Modified: armagetronad/trunk/armagetronad/win32/code_blocks/Dedicated.cbp =================================================================== --- armagetronad/trunk/armagetronad/win32/code_blocks/Dedicated.cbp 2008-01-12 12:16:59 UTC (rev 7517) +++ armagetronad/trunk/armagetronad/win32/code_blocks/Dedicated.cbp 2008-01-14 10:42:13 UTC (rev 7518) @@ -461,13 +461,13 @@ <Option target="Win32 Debug"/> <Option target="Win32 Profile"/> </Unit> - <Unit filename="..\..\src\network\nAuthentification.cpp"> + <Unit filename="..\..\src\network\nAuthentication.cpp"> <Option compilerVar="CPP"/> <Option target="Win32 Release"/> <Option target="Win32 Debug"/> <Option target="Win32 Profile"/> </Unit> - <Unit filename="..\..\src\network\nAuthentification.h"> + <Unit filename="..\..\src\network\nAuthentication.h"> <Option compilerVar=""/> <Option compile="0"/> <Option link="0"/> Modified: armagetronad/trunk/armagetronad/win32/code_blocks/Dedicated_Visual2003.cbp =================================================================== --- armagetronad/trunk/armagetronad/win32/code_blocks/Dedicated_Visual2003.cbp 2008-01-12 12:16:59 UTC (rev 7517) +++ armagetronad/trunk/armagetronad/win32/code_blocks/Dedicated_Visual2003.cbp 2008-01-14 10:42:13 UTC (rev 7518) @@ -258,11 +258,11 @@ <Option link="0"/> <Option target="Release"/> </Unit> - <Unit filename="..\..\src\network\nAuthentification.cpp"> + <Unit filename="..\..\src\network\nAuthentication.cpp"> <Option compilerVar="CPP"/> <Option target="Release"/> </Unit> - <Unit filename="..\..\src\network\nAuthentification.h"> + <Unit filename="..\..\src\network\nAuthentication.h"> <Option compilerVar=""/> <Option compile="0"/> <Option link="0"/> Modified: armagetronad/trunk/armagetronad/win32/code_blocks/Master.cbp =================================================================== --- armagetronad/trunk/armagetronad/win32/code_blocks/Master.cbp 2008-01-12 12:16:59 UTC (rev 7517) +++ armagetronad/trunk/armagetronad/win32/code_blocks/Master.cbp 2008-01-14 10:42:13 UTC (rev 7518) @@ -94,13 +94,13 @@ <Option target="Win32 Debug"/> <Option target="Win32 Profile"/> </Unit> - <Unit filename="..\..\src\network\nAuthentification.cpp"> + <Unit filename="..\..\src\network\nAuthentication.cpp"> <Option compilerVar="CPP"/> <Option target="Win32 Release"/> <Option target="Win32 Debug"/> <Option target="Win32 Profile"/> </Unit> - <Unit filename="..\..\src\network\nAuthentification.h"> + <Unit filename="..\..\src\network\nAuthentication.h"> <Option compilerVar=""/> <Option compile="0"/> <Option link="0"/> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <z-...@us...> - 2008-01-16 10:27:25
|
Revision: 7523 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7523&view=rev Author: z-man Date: 2008-01-16 02:27:25 -0800 (Wed, 16 Jan 2008) Log Message: ----------- Merging branch 0.2.8 from revision 7453 to 7520: ------------------------------------------------------------------------ r7520 | z-man | 2008-01-16 10:39:56 +0100 (Wed, 16 Jan 2008) | 2 lines Better ordering for the OnRender() call. ------------------------------------------------------------------------ r7519 | z-man | 2008-01-16 02:15:54 +0100 (Wed, 16 Jan 2008) | 2 lines Added OnRender() function that is called before the menuitems are rendered. ------------------------------------------------------------------------ r7504 | nemostultae | 2008-01-11 08:26:02 +0100 (Fri, 11 Jan 2008) | 2 lines Remove intermediate folder holding package files ------------------------------------------------------------------------ r7502 | nemostultae | 2008-01-11 08:06:39 +0100 (Fri, 11 Jan 2008) | 2 lines Fixed #determine_source_kind to correctly identify svn checkouts. Corrects problem of the version not showing up on the title screen. ------------------------------------------------------------------------ r7501 | nemostultae | 2008-01-11 03:13:14 +0100 (Fri, 11 Jan 2008) | 3 lines ?\226?\128?\162 Only build for native architecture in ?\226?\128?\156Debug?\226?\128?\157 builds ?\226?\128?\162?\194?\160Changed to a valid CFBundleSignature to silence a warning ------------------------------------------------------------------------ r7500 | nemostultae | 2008-01-11 02:41:32 +0100 (Fri, 11 Jan 2008) | 4 lines ?\226?\128?\162 Removed TextMate project ?\226?\128?\162 Edited some svn:ignore properties ?\226?\128?\162 Small change to project file by Xcode 3 so we stay compatible with 2.4 ------------------------------------------------------------------------ r7499 | z-man | 2008-01-11 00:19:36 +0100 (Fri, 11 Jan 2008) | 2 lines Switched continuous unblocking of stdin to only doing so when SIGCONT is received. That was easy :) ------------------------------------------------------------------------ r7498 | z-man | 2008-01-10 21:26:56 +0100 (Thu, 10 Jan 2008) | 2 lines Corrected conqueror log loop. ------------------------------------------------------------------------ r7497 | z-man | 2008-01-10 17:30:20 +0100 (Thu, 10 Jan 2008) | 2 lines Added redirection possibility for vote kicks. ------------------------------------------------------------------------ r7496 | z-man | 2008-01-10 17:08:24 +0100 (Thu, 10 Jan 2008) | 3 lines Added KICK_TO and MOVE_TO, redirecting a player to a different server. Fixed crash from one of the leak fixes. ------------------------------------------------------------------------ r7495 | z-man | 2008-01-10 11:48:46 +0100 (Thu, 10 Jan 2008) | 2 lines Unblocking stdin before every read. SIGSTOP signals cause it to get blocked, freezing the server. ------------------------------------------------------------------------ r7494 | z-man | 2008-01-10 11:46:42 +0100 (Thu, 10 Jan 2008) | 2 lines Not compensating hickups when playing back. Makes no sense. ------------------------------------------------------------------------ r7492 | z-man | 2008-01-10 10:27:21 +0100 (Thu, 10 Jan 2008) | 2 lines RINCLUDE command now actually calls the new RInclude function :) ------------------------------------------------------------------------ r7491 | z-man | 2008-01-10 03:04:27 +0100 (Thu, 10 Jan 2008) | 2 lines Fixed leak in machine decorators, forgot to delete this in Destroy(). ------------------------------------------------------------------------ r7490 | z-man | 2008-01-10 02:43:13 +0100 (Thu, 10 Jan 2008) | 6 lines Fixed memory leak caused by missing gParser destructor. The leakfinding memory manager missed it because all allocation was done through libxml2, and it passed casual code review because the corresponding delete operation did happen, just not always; a leak would occur every time a completely new game was started. (migrated to tXmlParser.cpp) ------------------------------------------------------------------------ r7489 | luke-jr | 2008-01-10 02:41:51 +0100 (Thu, 10 Jan 2008) | 1 line the rest of RInclude, since I just accidentally committed part of it; revert if you like ------------------------------------------------------------------------ r7488 | luke-jr | 2008-01-10 02:40:39 +0100 (Thu, 10 Jan 2008) | 1 line apparently I missed this a while ago ------------------------------------------------------------------------ r7487 | z-man | 2008-01-10 02:21:38 +0100 (Thu, 10 Jan 2008) | 2 lines Listening to console input while waiting for players (and only spectators are there). ------------------------------------------------------------------------ r7486 | z-man | 2008-01-07 19:51:55 +0100 (Mon, 07 Jan 2008) | 2 lines Added non-existing comment about TIME_FACTOR to non-existing documentation. ------------------------------------------------------------------------ r7461 | wrtlprnft | 2008-01-04 23:25:27 +0100 (Fri, 04 Jan 2008) | 2 lines adding PLAYER_MESSAGE (btw, I'm not the only one with commit access to NEWS IIRC) ------------------------------------------------------------------------ r7459 | wrtlprnft | 2008-01-04 21:51:54 +0100 (Fri, 04 Jan 2008) | 2 lines small fixes, thanks luke-jr ------------------------------------------------------------------------ r7458 | wrtlprnft | 2008-01-04 21:37:23 +0100 (Fri, 04 Jan 2008) | 2 lines Got rid of the spurious commit ;-) ------------------------------------------------------------------------ r7457 | wrtlprnft | 2008-01-04 21:29:28 +0100 (Fri, 04 Jan 2008) | 2 lines Added luke's new commands ------------------------------------------------------------------------ NOT MERGING, TOO MANY CONFLICTS: ------------------------------------------------------------------------ r7493 | z-man | 2008-01-10 10:30:18 +0100 (Thu, 10 Jan 2008) | 2 lines Fixed xmlGetProp memory leaks. ( There will likely be completely different leaks of this type in the trunk anyway ) ------------------------------------------------------------------------ r7503 | nemostultae | 2008-01-11 08:16:57 +0100 (Fri, 11 Jan 2008) | 13 lines ?\226?\128?\162 Only build for native architecture in dedicated ?\226?\128?\156Debug?\226?\128?\157 builds as well. ?\226?\128?\162 Remove package files build step from dedicated target ?\226?\128?\162 Pass in useful command-line arguments for dedicated target (--datadir, etc?\226?\128?\166) ?\226?\128?\162 Added ?\226?\128?\156Create Client Release?\226?\128?\157, ?\226?\128?\156Create Dedicated Release?\226?\128?\157, and ?\226?\128?\156Create Full Release?\226?\128?\157 targets. The disk images are placed in $BUILT_PRODUCTS_DIR (build/Release usually). The ?\226?\128?\156Create Client Release?\226?\128?\157 target checks to see if you have an $AA_RECORDER_APP environment variable set, and if you do the recorder app will be included in the disk image. For example I have in my .bash_profile: AA_RECORDER_APP="/Users/Shared/Applications/Games/Armagetron Advanced Recorder.app" ?\226?\128?\162 Changed a few svn:ignore properties to ignore generated files ?\226?\128?\162 dmg-convert, dmg-create ?\226?\134?\146 added ?\226?\128?\162 Updated README-Subversion with new information about targets Revision Links: -------------- http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7453&view=rev Modified Paths: -------------- armagetronad/trunk/armagetronad/NEWS armagetronad/trunk/armagetronad/README-Subversion armagetronad/trunk/armagetronad/config/settings.cfg armagetronad/trunk/armagetronad/config/settings_dedicated.cfg armagetronad/trunk/armagetronad/language/english_base.txt armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp armagetronad/trunk/armagetronad/src/engine/eVoter.cpp armagetronad/trunk/armagetronad/src/network/nNetwork.cpp armagetronad/trunk/armagetronad/src/network/nNetwork.h armagetronad/trunk/armagetronad/src/network/nServerInfo.cpp armagetronad/trunk/armagetronad/src/network/nServerInfo.h armagetronad/trunk/armagetronad/src/render/rConsoleCout.cpp armagetronad/trunk/armagetronad/src/tools/tConfiguration.cpp armagetronad/trunk/armagetronad/src/tools/tSysTime.cpp armagetronad/trunk/armagetronad/src/tools/tXmlParser.cpp armagetronad/trunk/armagetronad/src/tron/gCommandLineJumpStart.cpp armagetronad/trunk/armagetronad/src/tron/gCommandLineJumpStart.h armagetronad/trunk/armagetronad/src/tron/gGame.cpp armagetronad/trunk/armagetronad/src/tron/gServerFavorites.cpp armagetronad/trunk/armagetronad/src/tron/gServerFavorites.h armagetronad/trunk/armagetronad/src/ui/uMenu.cpp armagetronad/trunk/armagetronad/src/ui/uMenu.h Modified: armagetronad/trunk/armagetronad/NEWS =================================================================== --- armagetronad/trunk/armagetronad/NEWS 2008-01-16 09:59:51 UTC (rev 7522) +++ armagetronad/trunk/armagetronad/NEWS 2008-01-16 10:27:25 UTC (rev 7523) @@ -89,7 +89,11 @@ ------------ New settings and commands: +- KICK_TO and MOVE_TO: redirect a client to a different server +- DEFAULT_KICK(_TO)_MESSAGE: default reason given to players for a kick +- DEFAULT_KICK_TO_SERVER/PORT: default redirection target for KICK/MOVE_TO. - If all clients support it, PING_CHARITY_MIN/MAX can be used to constrain ping charity. +- VOTE_KICK_TO_SERVER/PORT: redirection target for vote kicks. - SILENCE and VOICE allow to control chat of annoying players. - SILENCE_ALL can be used on the server to inhibit all cross-team communication unless specifically voiced. - ENABLE_CHAT can be set to 0 to disable all chat. If it is set on the server it only disables public chat and logged in players can still speak. @@ -97,7 +101,7 @@ - FILTER_NAME_MIDDLE: collapses multiple whitespaces to one in player names. - FORTRESS_CONQEST_TIMEOUT: if an enemy contact with a zone happens longer ago than this value, it is discarded from zone memory. -- TOPOLOGY_POLICE_PARALLEL, extra topology police flag to control the checks +- TOPOLOGY_POLICE_PARALLEL, extra topology police flag to control the checks for walls getting copied into the grid in exactly the same place. - CAMERA_GLANCE_*: separate settings for the glancing camera, work like CAMERA_CUSTOM_*. Likewise, CAMERA_SERVER_GLANCE_* can replace CAMERA_SERVER_CUSTOM_* when glancing. @@ -115,9 +119,23 @@ for turns in the same direction. Can be used to limit the advantage doublebinders get while not punishing players who press both left and right at the same time. -- LAG_O_METER(TRESHOLD|BLEND|USE_OLD): Configure the minimal size of the Lag-O-Meter, its color and whether to scrap it all and stick with the old one. -- ALLOW_TEAM_CHANGE: if set to 0 players won't be able to join a team, create a new team or change to another team. -- ALLOW_TEAM_CHANGE_PLAYER/DISALLOW_TEAM_CHANGE_PLAYER: allow/disallow specific players to switch teams +- LAG_O_METER_(TRESHOLD|BLEND|USE_OLD): Configure the minimal size of the + Lag-O-Meter, its color and whether to scrap it all and stick with the old + one. +- ALLOW_TEAM_CHANGE: if set to 0 players won't be able to join a team, create + a new team or change to another team. +- ALLOW_TEAM_CHANGE_PLAYER/DISALLOW_TEAM_CHANGE_PLAYER: allow/disallow specific + players to switch teams +- INTERCEPT_COMMANDS is a space-delimited list of chat commands that shall be + intercepted by an external script. Example value: /login /admin /teamleave + /teamshuffle /shuffle /team +- INTERCEPT_UNKNOWN_COMMANDS is a boolean specifying if an external script + wishes to handle unrecognized chat commands. This would allow hooking + arbitrary things like /foobarz or /mode ctf +- CONSOLE_LADDER_LOG boolean places the ladderlog on stdout prefixed with + "[L] " +- PLAYER_MESSAGE <user ID or name> <Message>: Like /msg, but from the + console Featurelets ----------- @@ -158,8 +176,8 @@ message, <player> has been in the conquered zone - ONLINE_PLAYER <player> [<ping [<team>]]: At the beginning of the round, <player> had <ping> and was on <team>. This line is not printed for bots - - NUM_HUMANS <n>: There are <n> players that are not AIs and are part of - a team. + - NUM_HUMANS <n>: There are <n> players that are not AIs and are part of a + team. - ROUND_SCORE has the player's team's score appended. Bugfixes Modified: armagetronad/trunk/armagetronad/README-Subversion =================================================================== --- armagetronad/trunk/armagetronad/README-Subversion 2008-01-16 09:59:51 UTC (rev 7522) +++ armagetronad/trunk/armagetronad/README-Subversion 2008-01-16 10:27:25 UTC (rev 7523) @@ -66,10 +66,25 @@ Mac OS X ======== +This will only open in Xcode >= 2.1. It has these targets: +* Armagetron Advanced -- The client +* Armagetron Advanced 10.2.8 -- The client for Mac OS X 10.2.8 +* Armagetron Advanced Dedicated -- Dedicated Server +* Create Client Release -- Create a distributable disk image of the client. This target checks to see if you have an $AA_RECORDER_APP environment variable set, and if you do the recorder app will be included in the disk image. For example I have in my .bash_profile: Prerequisites ------------- + AA_RECORDER_APP="/Users/Shared/Applications/Games/Armagetron Advanced Recorder.app" +* Create Dedicated Release -- Create a distributable disk image of the dedicated server. +* Create Full Release -- Runs both "Create Client Release" and "Create Dedicated Release" + +Armagetron Advanced requires: +* SDL.framework +* SDL_mixer.framework +* SDL_image.framework +* libpng.framework + - Apple developer tools (http://developer.apple.com) - Xcode 2.4 or greater is required. - rake (http://rubyforge.org/projects/rake) Modified: armagetronad/trunk/armagetronad/config/settings.cfg =================================================================== --- armagetronad/trunk/armagetronad/config/settings.cfg 2008-01-16 09:59:51 UTC (rev 7522) +++ armagetronad/trunk/armagetronad/config/settings.cfg 2008-01-16 10:27:25 UTC (rev 7523) @@ -773,7 +773,8 @@ # cannot do anything about that, you can make ArmagetronAd multiply time measurements # with the following value. For example, if your system timer is about 10% too fast, you # can use the value 0.909 to compensate. Deviations of less than 1% are usually compensated -# by the network code. +# by the network code. NOTE: Do not change this while the program is running, this will cause +# huge hickups or freezes. TIME_FACTOR 1.0 # deprecated settings, they'll go away unless there are protests Modified: armagetronad/trunk/armagetronad/config/settings_dedicated.cfg =================================================================== --- armagetronad/trunk/armagetronad/config/settings_dedicated.cfg 2008-01-16 09:59:51 UTC (rev 7522) +++ armagetronad/trunk/armagetronad/config/settings_dedicated.cfg 2008-01-16 10:27:25 UTC (rev 7523) @@ -207,6 +207,17 @@ PING_FLOOD_TIME_100 100.0 # Minimum time for 100 ping packets to arrive. PING_FLOOD_GLOBAL .1 # The same times, multiplied by this value, count for all pings from all machines. Negative values disable global flood protection. +# default settings for MOVE/KICK(_TO) + +# default kick reason given for the KICK console command +#DEFAULT_KICK_REASON + +# default redirection kick/move reason given for the KICK/MOVE_TO console commands +#DEFAULT_KICK_TO_REASON + +DEFAULT_KICK_TO_SERVER # default server to kick/move to (IP or hostname) +DEFAULT_KICK_TO_PORT 4534 # default port of the server to kick/move to + ############################################################################################ # # Game settings Modified: armagetronad/trunk/armagetronad/language/english_base.txt =================================================================== --- armagetronad/trunk/armagetronad/language/english_base.txt 2008-01-16 09:59:51 UTC (rev 7522) +++ armagetronad/trunk/armagetronad/language/english_base.txt 2008-01-16 10:27:25 UTC (rev 7523) @@ -797,6 +797,15 @@ allow_team_change_player_help Allow a specific player to change teams even if ALLOW_TEAM_CHANGE is disabled disallow_team_change_player_help Reverse of ALLOW_TEAM_CHANGE_PLAYER kick_help Kicks the specified player from the server. +default_kick_reason_help The reason given to a player kicked by KICK if none is specified. +kick_to_help Kicks the specified player from the server and, if the client supports it, redirects him to a different server. +move_to_help Kicks the specified player from the server and, if the client supports it, redirects him to a different server. Does not imply an autoban penalty. +default_kick_to_reason_help The reason given to a player kicked by KICK_TO or MOVE_TO if none is specified. +default_kick_to_server Default server IP/name a player is redirected to by KICK_TO and MOVE_TO. +default_kick_to_port Default server port a player is redirected to by KICK_TO and MOVE_TO. +vote_kick_to_server Server IP/name a player is redirected to by vote kicks. +vote_kick_to_port Default server port a player is redirected to by vote kicks. + ban_help Bans the specified player from the server (kicks him first) for a variable time in minutes. ban_ip_help Bans the spedified IP address from the server for a variable time. ban_list_help Prints a list of currently banned IPs. @@ -2313,6 +2322,7 @@ network_login_done Done!\n network_kill_log User \1 kicked, reason given to him: \2\n +network_redirect \n\nYou will now be redirected to the server \1:\2.\n network_kill_preface Reason given by server: network_kill_maxidgrabber It ran out of IDs; your client was the one occupying most of them for himself. The reason for this can be a bug. network_kill_maxiduser It ran out of IDs; your client was the one occupying most of them. @@ -2488,6 +2498,7 @@ #******************************************** config_include_not_found Configuration file "\1" to be included not found.\n +config_rinclude_not_found Configuration resource "\1" to be included not found.\n config_command_unknown Command \1 unknown.\n config_command_other You probably want:\n config_command_more There are more commands containing your search string that were left out to avoid flooding your terminal.\n Modified: armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp 2008-01-16 09:59:51 UTC (rev 7522) +++ armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp 2008-01-16 10:27:25 UTC (rev 7523) @@ -4517,13 +4517,17 @@ static tConfItemFunc se_PlayerMessage_c("PLAYER_MESSAGE", &se_PlayerMessageConf); +static tString se_defaultKickReason(""); +static tConfItemLine se_defaultKickReasonConf( "DEFAULT_KICK_REASON", se_defaultKickReason ); + static void se_KickConf(std::istream &s) { // get user ID int num = se_ReadUser( s ); - tString reason; - reason.ReadLine(s); + tString reason = se_defaultKickReason; + if ( !s.eof() ) + reason.ReadLine(s); // and kick. if ( num > 0 && !s.good() ) @@ -4539,6 +4543,62 @@ static tConfItemFunc se_kickConf("KICK",&se_KickConf); +static tString se_defaultKickToServer(""); +static int se_defaultKickToPort = 4534; +static tString se_defaultKickToReason(""); + +static tSettingItem< tString > se_defaultKickToServerConf( "DEFAULT_KICK_TO_SERVER", se_defaultKickToServer ); +static tSettingItem< int > se_defaultKickToPortConf( "DEFAULT_KICK_TO_PORT", se_defaultKickToPort ); +static tConfItemLine se_defaultKickToReasonConf( "DEFAULT_KICK_TO_REASON", se_defaultKickToReason ); + +static void se_MoveToConf(std::istream &s, REAL severity ) +{ + // get user ID + int num = se_ReadUser( s ); + + // read redirection target + tString server = se_defaultKickToServer; + if ( !s.eof() ) + { + s >> server; + } + + int port = se_defaultKickToPort; + if ( !s.eof() ) + s >> port; + + nServerInfoRedirect redirect( server, port ); + + tString reason = se_defaultKickToReason; + if ( !s.eof() ) + reason.ReadLine(s); + + // and kick. + if ( num > 0 && !s.good() ) + { + sn_KickUser( num , reason.Len() > 1 ? static_cast< char const *>( reason ) : "$network_kill_kick", severity, &redirect ); + } + else + { + con << "Usage: KICK_TO <user ID or name> <server IP to kick to>:<server port to kick to> <Reason>\n"; + return; + } +} + +static void se_KickToConf(std::istream &s ) +{ + se_MoveToConf( s, 1 ); +} + +static tConfItemFunc se_kickToConf("KICK_TO",&se_KickToConf); + +static void se_MoveToConf(std::istream &s ) +{ + se_MoveToConf( s, 0 ); +} + +static tConfItemFunc se_moveToConf("MOVE_TO",&se_MoveToConf); + static void se_BanConf(std::istream &s) { // get user ID Modified: armagetronad/trunk/armagetronad/src/engine/eVoter.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/engine/eVoter.cpp 2008-01-16 09:59:51 UTC (rev 7522) +++ armagetronad/trunk/armagetronad/src/engine/eVoter.cpp 2008-01-16 10:27:25 UTC (rev 7523) @@ -35,6 +35,7 @@ #include "uMenu.h" #include "nConfig.h" +#include "nServerInfo.h" #include "rConsole.h" @@ -731,11 +732,32 @@ virtual void OnDestroy() { machine_ = 0; + + delete this; } private: nMachine * machine_; }; +static tString se_voteKickToServer(""); +static int se_voteKickToPort = 4534; +static tSettingItem< tString > se_voteKickToServerConf( "VOTE_KICK_TO_SERVER", se_voteKickToServer ); +static tSettingItem< int > se_voteKickToPortConf( "VOTE_KICK_TO_PORT", se_voteKickToPort ); + +void se_VoteKickUser( int user ) +{ + if ( se_voteKickToServer.Len() < 2 ) + { + sn_KickUser( user, tOutput("$voted_kill_kick") ); + } + else + { + // kick player to default destination + nServerInfoRedirect redirect( se_voteKickToServer, se_voteKickToPort ); + sn_KickUser( user, tOutput("$voted_kill_kick"), 1, &redirect ); + } +} + // something to vote on class eVoteItemKick: public virtual eVoteItem { @@ -842,7 +864,7 @@ // kick the player, he is online int user = player_->Owner(); if ( user > 0 ) - sn_KickUser( user, tOutput("$voted_kill_kick") ); + se_VoteKickUser( user ); } else if ( machine_ ) { @@ -856,7 +878,7 @@ { if ( &nMachine::GetMachine( user ) == machine ) { - sn_KickUser( user, tOutput("$voted_kill_kick") ); + se_VoteKickUser( user ); kick = true; } } @@ -987,7 +1009,7 @@ if(sn_GetNetState()==nSERVER) { // kill user directly - sn_KickUser( player_->Owner(), tOutput("$voted_kill_kick") ); + se_VoteKickUser( player_->Owner() ); } { // issue kick vote Modified: armagetronad/trunk/armagetronad/src/network/nNetwork.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/network/nNetwork.cpp 2008-01-16 09:59:51 UTC (rev 7522) +++ armagetronad/trunk/armagetronad/src/network/nNetwork.cpp 2008-01-16 10:27:25 UTC (rev 7523) @@ -30,6 +30,7 @@ #include "nSimulatePing.h" #include "nConfig.h" #include "nNetwork.h" +#include "nServerInfo.h" #include "tConsole.h" #include "tDirectories.h" #include "nSocket.h" @@ -95,7 +96,7 @@ static tConfItemLine sn_sbtip("SERVER_IP", net_hostip); -void sn_DisconnectUserNoWarn(int i, const tOutput& reason ); +void sn_DisconnectUserNoWarn(int i, const tOutput& reason, nServerInfoBase * redirectTo = 0 ); int sn_defaultDelay=10000; @@ -1315,7 +1316,18 @@ real_req_info_handler=handle; } +// the server we are redirected to +static std::auto_ptr< nServerInfoBase > sn_redirectTo; +std::auto_ptr< nServerInfoBase > sn_GetRedirectTo() +{ + return sn_redirectTo; +} +nServerInfoBase * sn_PeekRedirectTo() +{ + return sn_redirectTo.get(); +} + void login_deny_handler(nMessage &m){ if ( !m.End() ) { @@ -1329,6 +1341,21 @@ sn_DenyReason = tOutput( "$network_kill_unknown" ); } + if ( !m.End() ) + { + // read redirection data from message + tString connectionName; + m >> connectionName; + int port; + m >> port; + + if ( connectionName.Len() > 1 ) + { + // create server info and fill it with data + sn_redirectTo = std::auto_ptr< nServerInfoBase>( new nServerInfoRedirect( connectionName, port ) ); + } + } + if (!login_failed) con << tOutput("$network_login_denial"); if (sn_GetNetState()!=nSERVER){ @@ -2504,6 +2531,9 @@ nConnectError sn_Connect( nAddress const & server, nLoginType loginType, nSocket const * socket ){ sn_DenyReason = ""; + // reset redirection + sn_redirectTo.release(); + // pings in the beginning of the login are not really representative nPingAverager::SetWeight(.0001); @@ -3000,7 +3030,7 @@ */ } -void sn_KickUser(int i, const tOutput& reason, REAL severity ) +void sn_KickUser(int i, const tOutput& reason, REAL severity, nServerInfoBase * redirectTo ) { // print it con << tOutput( "$network_kill_log", i, reason ); @@ -3009,10 +3039,10 @@ nMachine::GetMachine(i).OnKick( severity ); // do it - sn_DisconnectUser( i, reason ); + sn_DisconnectUser( i, reason, redirectTo ); } -void sn_DisconnectUser(int i, const tOutput& reason ) +void sn_DisconnectUser(int i, const tOutput& reason, nServerInfoBase * redirectTo ) { // don't be daft and kill yourself, server! if ( i == 0 && sn_GetNetState() == nSERVER ) @@ -3034,10 +3064,10 @@ return; } - sn_DisconnectUserNoWarn( i, reason ); + sn_DisconnectUserNoWarn( i, reason, redirectTo ); } -void sn_DisconnectUserNoWarn(int i, const tOutput& reason ) +void sn_DisconnectUserNoWarn(int i, const tOutput& reason, nServerInfoBase * redirectTo ) { nCurrentSenderID senderID( i ); @@ -3060,6 +3090,18 @@ for(int j=2;j>=0;j--){ nMessage* mess = (new nMessage(login_deny)); *mess << tString( reason ); + + // write redirection + tString redirection; + int port; + if ( redirectTo ) + { + redirection = redirectTo->GetConnectionName(); + port = redirectTo->GetPort(); + } + *mess << redirection; + *mess << port; + mess->SendImmediately(i, false); nMessage::SendCollected(i); } Modified: armagetronad/trunk/armagetronad/src/network/nNetwork.h =================================================================== --- armagetronad/trunk/armagetronad/src/network/nNetwork.h 2008-01-16 09:59:51 UTC (rev 7522) +++ armagetronad/trunk/armagetronad/src/network/nNetwork.h 2008-01-16 10:27:25 UTC (rev 7523) @@ -40,6 +40,7 @@ class nSocket; class nAddress; class nBasicNetworkSystem; +class nServerInfoBase; extern nBasicNetworkSystem sn_BasicNetworkSystem; @@ -98,8 +99,8 @@ nConnectError sn_GetLastError(); nNetState sn_GetNetState(); void sn_SetNetState(nNetState x); -void sn_DisconnectUser(int i, const tOutput& reason ); //!< terminate connection with user i (peacefully) -void sn_KickUser(int i, const tOutput& reason, REAL severity = 1 ); //!< throw out user i (violently) +void sn_DisconnectUser(int i, const tOutput& reason, nServerInfoBase * redirectTo = 0 ); //!< terminate connection with user i (peacefully) +void sn_KickUser(int i, const tOutput& reason, REAL severity = 1, nServerInfoBase * redirectTo = 0 ); //!< throw out user i (violently) void sn_GetAdr(int user, tString& name); unsigned int sn_GetPort(int user); @@ -795,6 +796,13 @@ ~nSocketResetInhibitor(); }; +// on disconnection, this returns a server we should be redirected to (or NULL if we should not be redirected) +std::auto_ptr< nServerInfoBase > sn_GetRedirectTo(); + +// take a peek at the same info +nServerInfoBase * sn_PeekRedirectTo(); + + // ******************************************************************************************* // * // * GetWeight Modified: armagetronad/trunk/armagetronad/src/network/nServerInfo.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/network/nServerInfo.cpp 2008-01-16 09:59:51 UTC (rev 7522) +++ armagetronad/trunk/armagetronad/src/network/nServerInfo.cpp 2008-01-16 10:27:25 UTC (rev 7523) @@ -844,6 +844,8 @@ { if ( warned_ ) con << "Flood protection ban of " << GetIP() << " removed because machine is discarded.\n"; + + delete this; } void Block() Modified: armagetronad/trunk/armagetronad/src/network/nServerInfo.h =================================================================== --- armagetronad/trunk/armagetronad/src/network/nServerInfo.h 2008-01-16 09:59:51 UTC (rev 7522) +++ armagetronad/trunk/armagetronad/src/network/nServerInfo.h 2008-01-16 10:27:25 UTC (rev 7523) @@ -95,6 +95,18 @@ inline nServerInfoBase & SetPort( unsigned int port ); //!< Sets the network port the server listens on }; +//! server information, just to redirect and for other immediate applications +class nServerInfoRedirect: public nServerInfoBase +{ +public: + // construct a server directly with connection name and port + nServerInfoRedirect( tString const & connectionName, unsigned int port ) + { + nServerInfoBase::SetConnectionName( connectionName ); + nServerInfoBase::SetPort( port ); + }; +}; + //! Full server information class nServerInfo: public tListItem<nServerInfo>, public nServerInfoBase { Modified: armagetronad/trunk/armagetronad/src/render/rConsoleCout.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/render/rConsoleCout.cpp 2008-01-16 09:59:51 UTC (rev 7522) +++ armagetronad/trunk/armagetronad/src/render/rConsoleCout.cpp 2008-01-16 10:27:25 UTC (rev 7523) @@ -42,9 +42,10 @@ #include <windows.h> //#define fileno _fileno //#define fcntl _fcntl +#else +#include <signal.h> #endif - void rConsole::DoCenterDisplay(const tString &s,REAL timeout,REAL r,REAL g,REAL b){ std::cout << tColoredString::RemoveColors(s) << '\n'; DisplayAtNewline(); @@ -53,7 +54,20 @@ static int stdin_descriptor; static bool unblocked = false; +static void sr_HandleSigCont( int signal ) +{ + // con << "Continuing.\n"; + + // unblock stdin again + sr_Unblock_stdin(); +} + void sr_Unblock_stdin(){ + if ( !unblocked ) + { + signal( SIGCONT, &sr_HandleSigCont ); + } + unblocked = true; stdin_descriptor=fileno(stdin); #ifndef WIN32 @@ -66,6 +80,7 @@ } + #define MAXLINE 1000 static char line_in[MAXLINE+2]; static int currentIn=0; @@ -121,8 +136,9 @@ #else - while (read(stdin_descriptor,&line_in[currentIn],1)>0){ - if (line_in[currentIn]=='\n' || currentIn>=MAXLINE-1){ + while ( read(stdin_descriptor,&line_in[currentIn],1)>0){ + if (line_in[currentIn]=='\n' || currentIn>=MAXLINE-1) + { line_in[currentIn+1]='\0'; std::stringstream s(line_in); tConfItemBase::LoadAll(s); Modified: armagetronad/trunk/armagetronad/src/tools/tConfiguration.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tools/tConfiguration.cpp 2008-01-16 09:59:51 UTC (rev 7522) +++ armagetronad/trunk/armagetronad/src/tools/tConfiguration.cpp 2008-01-16 10:27:25 UTC (rev 7523) @@ -40,6 +40,7 @@ #include "tDirectories.h" #include "tRecorder.h" #include "tCommandLine.h" +#include "tResourceManager.h" #include <vector> @@ -678,6 +679,23 @@ static tConfItemFunc s_Include("INCLUDE", &Include); static tConfItemFunc s_SInclude("SINCLUDE", &SInclude); +static void RInclude(std::istream& s) +{ + tString file; + s >> file; + + tString rclcl = tResourceManager::locateResource(NULL, file); + if ( rclcl ) { + std::ifstream rc(rclcl); + tConfItemBase::LoadAll(rc); + return; + } + + con << tOutput( "$config_rinclude_not_found", file ); +} + +static tConfItemFunc s_RInclude("RINCLUDE", &RInclude); + // obsoleted settings that still are around in some distruted configuration files static void st_Dummy(std::istream &s){tString rest; rest.ReadLine(s);} static tConfItemFunc st_DummyMpHack("MOVIEPACK_HACK",&st_Dummy); Modified: armagetronad/trunk/armagetronad/src/tools/tSysTime.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tools/tSysTime.cpp 2008-01-16 09:59:51 UTC (rev 7522) +++ armagetronad/trunk/armagetronad/src/tools/tSysTime.cpp 2008-01-16 10:27:25 UTC (rev 7523) @@ -267,7 +267,7 @@ // detect and counter timer hickups tTime newRelative = time - start; tTime timeStep = newRelative - relative; - if ( timeStep.seconds < 0 || timeStep.seconds > 10 ) + if ( !tRecorder::IsPlayingBack() && ( timeStep.seconds < 0 || timeStep.seconds > 10 ) ) { static bool warn = true; if ( warn ) Modified: armagetronad/trunk/armagetronad/src/tools/tXmlParser.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tools/tXmlParser.cpp 2008-01-16 09:59:51 UTC (rev 7522) +++ armagetronad/trunk/armagetronad/src/tools/tXmlParser.cpp 2008-01-16 10:27:25 UTC (rev 7523) @@ -240,7 +240,11 @@ } tXmlParser::~tXmlParser() { - // do nothing + if (m_Doc) + { + xmlFreeDoc(m_Doc); + m_Doc=0; + } } void tXmlParser::cb_endElement(const xmlChar *name) { Modified: armagetronad/trunk/armagetronad/src/tron/gCommandLineJumpStart.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gCommandLineJumpStart.cpp 2008-01-16 09:59:51 UTC (rev 7522) +++ armagetronad/trunk/armagetronad/src/tron/gCommandLineJumpStart.cpp 2008-01-16 10:27:25 UTC (rev 7523) @@ -39,15 +39,8 @@ bool gCommandLineJumpStartAnalyzer::DoAnalyze( tCommandLineParser & parser ) { - tString raw; - tString server; - tString port; - - if ( parser.GetOption( raw, "--connect" ) ) + if ( parser.GetOption( _raw, "--connect" ) ) { - ExtractConnectionInformation( raw, server, port ); - _server.SetPort( port.ToInt() ); - _server.SetConnectionName( server ); _shouldConnect = true; return true; @@ -67,7 +60,14 @@ void gCommandLineJumpStartAnalyzer::Connect() { - ConnectToServer( &_server ); + tString server; + tString port; + + ExtractConnectionInformation( _raw, server, port ); + + nServerInfoRedirect connectTo( server, port.ToInt() ); + + ConnectToServer( &connectTo ); } // ***************************************************************************** Modified: armagetronad/trunk/armagetronad/src/tron/gCommandLineJumpStart.h =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gCommandLineJumpStart.h 2008-01-16 09:59:51 UTC (rev 7522) +++ armagetronad/trunk/armagetronad/src/tron/gCommandLineJumpStart.h 2008-01-16 10:27:25 UTC (rev 7523) @@ -54,7 +54,7 @@ void Connect(); private: bool _shouldConnect; - gServerInfoFavorite _server; + tString _raw; virtual bool DoAnalyze( tCommandLineParser & parser ); virtual void DoHelp( std::ostream & s ); }; Modified: armagetronad/trunk/armagetronad/src/tron/gGame.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gGame.cpp 2008-01-16 09:59:51 UTC (rev 7522) +++ armagetronad/trunk/armagetronad/src/tron/gGame.cpp 2008-01-16 10:27:25 UTC (rev 7523) @@ -873,6 +873,9 @@ // wait for network messages sn_BasicNetworkSystem.Select( 0.1f ); gGame::NetSyncIdle(); + + // handle console input + sr_Read_stdin(); } } @@ -1417,19 +1420,23 @@ static void sg_NetworkError( const tOutput& title, const tOutput& message, REAL timeout ) { + tOutput message2 ( message ); + if ( sn_DenyReason.Len() > 2 ) { - tOutput message2 ( message ); message2.AddLiteral("\n\n"); message2.AddLocale("network_kill_preface"); message2.AddLiteral("\n"); message2.AddLiteral(sn_DenyReason); - tConsole::Message( title, message2, timeout ); } - else + + nServerInfoBase * redirect = sn_PeekRedirectTo(); + if ( redirect ) { - tConsole::Message( title, message, timeout ); + message2.Append( tOutput( "$network_redirect", redirect->GetConnectionName(), (int)redirect->GetPort() ) ); } + + tConsole::Message( title, message2, timeout ); } // revert settings to defaults in the current scope @@ -1462,7 +1469,7 @@ } } -void ConnectToServer(nServerInfoBase *server) +void ConnectToServerCore(nServerInfoBase *server) { tASSERT( server ); @@ -1552,7 +1559,6 @@ } } - if (!sg_RequestedDisconnection && !uMenu::quickexit) switch (sn_GetLastError()) { @@ -1578,6 +1584,46 @@ sr_textOut=to; } +void ConnectToServer(nServerInfoBase *server) +{ + ConnectToServerCore( server ); + + REAL redirections = 0; + double lastTime = tSysTimeFloat(); + + // check for redirection + while( true ) + { + std::auto_ptr< nServerInfoBase > redirectTo( sn_GetRedirectTo() ); + + // abort loop + if ( !(&(*redirectTo)) ) + { + break; + } + + ConnectToServerCore( redirectTo.get() ); + + // redirection spam chain protection, allow one redirection every 30 seconds. Should + // be short enough to allow hacky applications (server-to-server teleport), but + // long enough to allow players to escape via the menu or at least shift-esc. + static const REAL timeout = 30; + static const REAL maxRedirections = 5; + + redirections = redirections + 1; + if ( redirections > maxRedirections ) + { + break; + } + + // decay spam protection + double newTime = tSysTimeFloat(); + REAL dt = newTime - lastTime; + lastTime = newTime; + redirections *= 1/(1 + dt * maxRedirections * timeout ); + } +} + static tConfItem<int> mor("MAX_OUT_RATE",sn_maxRateOut); static tConfItem<int> mir("MAX_IN_RATE",sn_maxRateIn); Modified: armagetronad/trunk/armagetronad/src/tron/gServerFavorites.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gServerFavorites.cpp 2008-01-16 09:59:51 UTC (rev 7522) +++ armagetronad/trunk/armagetronad/src/tron/gServerFavorites.cpp 2008-01-16 10:27:25 UTC (rev 7523) @@ -47,12 +47,17 @@ enum { NUM_FAVORITES = 10 }; +/* +//! favorite server information, just to connect gServerInfoFavorite::gServerInfoFavorite( tString const & connectionName, unsigned int port ) { nServerInfoBase::SetConnectionName( connectionName ); nServerInfoBase::SetPort( port ); } +*/ +typedef nServerInfoRedirect gServerInfoFavorite; + //******************************************************************************** //******************************************************************************** Modified: armagetronad/trunk/armagetronad/src/tron/gServerFavorites.h =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gServerFavorites.h 2008-01-16 09:59:51 UTC (rev 7522) +++ armagetronad/trunk/armagetronad/src/tron/gServerFavorites.h 2008-01-16 10:27:25 UTC (rev 7523) @@ -33,6 +33,7 @@ class nServerInfoBase; +/* //! favorite server information, just to connect class gServerInfoFavorite: public nServerInfoBase { @@ -43,6 +44,7 @@ void SetPort( unsigned int port ) { nServerInfoBase::SetPort( port ); } void SetConnectionName( tString const connectionName ) { nServerInfoBase::SetConnectionName( connectionName ); } }; +*/ class gServerFavorites { Modified: armagetronad/trunk/armagetronad/src/ui/uMenu.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/ui/uMenu.cpp 2008-01-16 09:59:51 UTC (rev 7522) +++ armagetronad/trunk/armagetronad/src/ui/uMenu.cpp 2008-01-16 10:27:25 UTC (rev 7523) @@ -178,9 +178,6 @@ st_DoToDo(); tAdvanceFrame(); - if (selected < 0 || selected >= items.Len()) - selected = items.Len()-1; - ts=tSysTimeFloat()-lastt; lastt=tSysTimeFloat(); if (ts>.2) ts=.2; @@ -226,6 +223,15 @@ nextrepeat = tSysTimeFloat() + repeatrate; } } + + // we're about to render, last chance to make changes to the menu + OnRender(); + + // clamp cursor + if (selected < 0 ) + selected = 0; + if ( selected >= items.Len()) + selected = items.Len()-1; #endif // quit shortcut if ( quickexit ) @@ -352,13 +358,13 @@ switch (event.key.keysym.sym){ case(SDLK_ESCAPE): - repeat = false; + repeat = false; lastkey=tSysTimeFloat(); Exit(); break; case(SDLK_UP): - lastkey=tSysTimeFloat(); + lastkey=tSysTimeFloat(); selected = GetNextSelectable(selected); break; case(SDLK_DOWN): @@ -505,6 +511,11 @@ exitFlag=1; } +//! called every frame before the menu is rendered +void uMenu::OnRender() +{ +} + // ***************************************************** // ******************************************************************************************* Modified: armagetronad/trunk/armagetronad/src/ui/uMenu.h =================================================================== --- armagetronad/trunk/armagetronad/src/ui/uMenu.h 2008-01-16 09:59:51 UTC (rev 7522) +++ armagetronad/trunk/armagetronad/src/ui/uMenu.h 2008-01-16 10:27:25 UTC (rev 7523) @@ -122,6 +122,9 @@ int GetNextSelectable(int start); int GetPrevSelectable(int start); + + //! called every frame before the menu is rendered + virtual void OnRender(); }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <z-...@us...> - 2008-01-17 19:01:43
|
Revision: 7534 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7534&view=rev Author: z-man Date: 2008-01-17 10:59:20 -0800 (Thu, 17 Jan 2008) Log Message: ----------- Merging branch 0.2.8 from revision 7526 to 7533: ------------------------------------------------------------------------ r7533 | z-man | 2008-01-17 16:35:34 +0100 (Thu, 17 Jan 2008) | 2 lines Applied 3.1 friends patch. ------------------------------------------------------------------------ r7532 | z-man | 2008-01-17 14:42:28 +0100 (Thu, 17 Jan 2008) | 2 lines Forgot those two. ------------------------------------------------------------------------ r7530 | z-man | 2008-01-17 14:26:51 +0100 (Thu, 17 Jan 2008) | 2 lines Committed version 3 of the friends patch by tank. Version 3.1 pending, I have problems applying it, and want to check what svn diff says. ------------------------------------------------------------------------ Revision Links: -------------- http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7526&view=rev Modified Paths: -------------- armagetronad/trunk/armagetronad/language/english_base.txt armagetronad/trunk/armagetronad/src/Makefile.am armagetronad/trunk/armagetronad/src/tron/gGame.cpp armagetronad/trunk/armagetronad/src/tron/gServerBrowser.cpp Added Paths: ----------- armagetronad/trunk/armagetronad/src/tron/gFriends.cpp armagetronad/trunk/armagetronad/src/tron/gFriends.h Modified: armagetronad/trunk/armagetronad/language/english_base.txt =================================================================== --- armagetronad/trunk/armagetronad/language/english_base.txt 2008-01-17 15:35:34 UTC (rev 7533) +++ armagetronad/trunk/armagetronad/language/english_base.txt 2008-01-17 18:59:20 UTC (rev 7534) @@ -1415,6 +1415,13 @@ bookmarks_menu_name_help The name of the server. This is used only for display, not functional purposes. bookmarks_menu_connect Connect to \1 +friends_menu Mates +friends_menu_help Edit your mates. +friends_enable Mates Enabled +friends_enable_help Turn on/off friends mates filtering. +friend_word Mate +friend_help If a server has this name on its players list, it will show when filtering is on. + #******************************************** #******************************************** # @@ -2392,7 +2399,7 @@ network_master_score Score network_master_users Users network_master_ping Ping -network_master_browserhelp Press "Enter" to connect to this server, "p" to refresh a single server, "r" to refresh the whole list, "+/-" to set the score bias for this server, "cursor left/right" to change the sorting key, or "b" to add the server to your bookmarks. +network_master_browserhelp Press "Enter" to connect to this server, "p" to refresh a single server, "r" to refresh the whole list, "+/-" to set the score bias for this server, "cursor left/right" to change the sorting key, or "b" to add the server to your bookmarks. "m" toggles mates filtering. network_master_connecting Connecting to \1...\n network_master_send Sending my server info...\n network_master_reqlist Requesting server list...\n Modified: armagetronad/trunk/armagetronad/src/Makefile.am =================================================================== --- armagetronad/trunk/armagetronad/src/Makefile.am 2008-01-17 15:35:34 UTC (rev 7533) +++ armagetronad/trunk/armagetronad/src/Makefile.am 2008-01-17 18:59:20 UTC (rev 7534) @@ -158,7 +158,8 @@ tron/cockpit/cMap.h tron/cockpit/cMap.cpp \ tron/cockpit/cLabel.h tron/cockpit/cLabel.cpp \ tron/cockpit/cGauges.h tron/cockpit/cGauges.cpp \ - tron/cockpit/cRectangle.h tron/cockpit/cRectangle.cpp + tron/cockpit/cRectangle.h tron/cockpit/cRectangle.cpp\ + tron/gFriends.h tron/gFriends.cpp libui_a_SOURCES=ui/uInput.cpp ui/uInput.h ui/uInputQueue.cpp ui/uInputQueue.h ui/uMenu.cpp ui/uMenu.h endif Copied: armagetronad/trunk/armagetronad/src/tron/gFriends.cpp (from rev 7533, armagetronad/branches/0.2.8/armagetronad/src/tron/gFriends.cpp) =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gFriends.cpp (rev 0) +++ armagetronad/trunk/armagetronad/src/tron/gFriends.cpp 2008-01-17 18:59:20 UTC (rev 7534) @@ -0,0 +1,80 @@ +/* + +************************************************************************* + +ArmageTron -- Just another Tron Lightcycle Game in 3D. +Copyright (C) 2008 Manuel Moos (ma...@mo...) + +************************************************************************** + +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. + +*************************************************************************** + +*/ + +#include "gFriends.h" +#include "uMenu.h" + +static bool sg_enableFriends = false; +static tConfItem< bool > sg_enableFriendsConf( "ENABLE_FRIENDS", sg_enableFriends ); + +static gFriends sg_friends; + +gFriends::gFriends() +{ + tString name; + for(int i = MAX_FRIENDS-1; i>=0; i--) + { + name = "FRIEND_"; + name << (i + 1); + confItems[i] = std::auto_ptr< tConfItemLine >( tNEW(tConfItemLine) (tConfItemLine(name, friends[i]))); + } +} + +void gFriends::FriendsMenu( void ) +{ + uMenu net_menu("$friends_menu"); + + uMenuItemToggle friends_enable (&net_menu, "$friends_enable", "$friends_enable_help", sg_enableFriends); + + tString name; + for (int i = MAX_FRIENDS-1; i>=0; i--) + { + name = tOutput("$friend_word"); + name << " " << (i + 1); + tNEW(uMenuItemString) (uMenuItemString(&net_menu, name, "$friend_help", sg_friends.friends[i])); + } + + net_menu.Enter(); +} + +bool getFriendsEnabled() +{ + return sg_enableFriends; +} + +void FriendsToggle() +{ + if (sg_enableFriends) + sg_enableFriends = false; + else + sg_enableFriends = true; +} + +tString* getFriends() +{ + return sg_friends.friends; +} Copied: armagetronad/trunk/armagetronad/src/tron/gFriends.h (from rev 7533, armagetronad/branches/0.2.8/armagetronad/src/tron/gFriends.h) =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gFriends.h (rev 0) +++ armagetronad/trunk/armagetronad/src/tron/gFriends.h 2008-01-17 18:59:20 UTC (rev 7534) @@ -0,0 +1,48 @@ +/* + +************************************************************************* + +ArmageTron -- Just another Tron Lightcycle Game in 3D. +Copyright (C) 2008 Manuel Moos (ma...@mo...) + +************************************************************************** + +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. + +*************************************************************************** + +*/ + +#include "tString.h" +#include "tList.h" +#include "tConfiguration.h" + +#define MAX_FRIENDS 10 + +class gFriends +{ +private: + +public: + tString friends[MAX_FRIENDS]; + std::auto_ptr< tConfItemLine > confItems[MAX_FRIENDS]; + + gFriends(); + static void FriendsMenu(); +}; + +bool getFriendsEnabled(); +void FriendsToggle(); +tString* getFriends(); Modified: armagetronad/trunk/armagetronad/src/tron/gGame.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gGame.cpp 2008-01-17 15:35:34 UTC (rev 7533) +++ armagetronad/trunk/armagetronad/src/tron/gGame.cpp 2008-01-17 18:59:20 UTC (rev 7534) @@ -57,6 +57,7 @@ #include "gCamera.h" #include "gServerBrowser.h" #include "gServerFavorites.h" +#include "gFriends.h" #include "gLogo.h" #include "gLanguageMenu.h" #include "nServerInfo.h" @@ -1799,6 +1800,10 @@ (&net_menu,"$bookmarks_menu", "$bookmarks_menu_help",&gServerFavorites::FavoritesMenu); + uMenuItemFunction bud + (&net_menu,"$friends_menu", + "$friends_menu_help",&gFriends::FriendsMenu); + uMenuItemFunction opt (&net_menu,"$network_opts_text", "$network_opts_help",&net_options); Modified: armagetronad/trunk/armagetronad/src/tron/gServerBrowser.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gServerBrowser.cpp 2008-01-17 15:35:34 UTC (rev 7533) +++ armagetronad/trunk/armagetronad/src/tron/gServerBrowser.cpp 2008-01-17 18:59:20 UTC (rev 7534) @@ -29,6 +29,7 @@ #include "gGame.h" #include "gLogo.h" #include "gServerFavorites.h" +#include "gFriends.h" #include "nServerInfo.h" #include "nNetwork.h" @@ -67,12 +68,24 @@ { public: gServerMenuItem *menuItem; + bool show; //for server browser hiding - gServerInfo():menuItem(NULL) + gServerInfo():menuItem(NULL), show(true) { }; virtual ~gServerInfo(); + + // during browsing, the whole server list consists of gServerInfos + static gServerInfo * GetFirstServer() + { + return dynamic_cast< gServerInfo * >( nServerInfo::GetFirstServer() ); + } + + gServerInfo * Next() + { + return dynamic_cast< gServerInfo * >( nServerInfo::Next() ); + } }; nServerInfo* CreateGServer() @@ -103,7 +116,7 @@ virtual void HandleEvent( SDL_Event event ); void Render(REAL y, - const tOutput &servername, const tOutput &score, + const tString &servername, const tOutput &score, const tOutput &users , const tOutput &ping); void Render(REAL y, @@ -285,15 +298,20 @@ switch (event.key.keysym.sym) { case(SDLK_LEFT): - sortKey_ = ( sortKey_ + nServerInfo::KEY_MAX-1 ) % nServerInfo::KEY_MAX; + sortKey_ = ( sortKey_ + nServerInfo::KEY_MAX-1 ) % nServerInfo::KEY_MAX; Update(); return; break; case(SDLK_RIGHT): - sortKey_ = ( sortKey_ + 1 ) % nServerInfo::KEY_MAX; + sortKey_ = ( sortKey_ + 1 ) % nServerInfo::KEY_MAX; Update(); return; break; + case(SDLK_m): + FriendsToggle(); + Update(); + return; + break; default: break; } @@ -322,29 +340,62 @@ // get currently selected server gServerMenuItem *item = NULL; if ( selected < items.Len() ) + { item = dynamic_cast<gServerMenuItem*>(items(selected)); + } gServerInfo* info = NULL; if ( item ) { info = item->GetServer(); } + // keep the cursor position relative to the top, if possible + int selectedFromTop = items.Len() - selected; + ReverseItems(); nServerInfo::CalcScoreAll(); nServerInfo::Sort( nServerInfo::PrimaryKey( sortKey_ ) ); int mi = 1; - nServerInfo *run = nServerInfo::GetFirstServer(); + gServerInfo *run = gServerInfo::GetFirstServer(); + bool oneFound = false; //so we can display all if none were found while (run) { - if (mi >= items.Len()) - tNEW(gServerMenuItem)(this); + //check friend filter + if (getFriendsEnabled()) + { + run->show = false; + int i; + tString userNames = run->UserNames(); + tString* friends = getFriends(); + for (i = MAX_FRIENDS; i>=0; i--) + { + if (run->Users() > 0 && friends[i].Len() > 1 && userNames.StrPos(friends[i]) >= 0) + { + oneFound = true; + run->show = true; + } + } + } + run = run->Next(); + } - gServerMenuItem *item = dynamic_cast<gServerMenuItem*>(items(mi)); - item->SetServer(run); - run = run->Next(); - mi ++; + run = gServerInfo::GetFirstServer(); + { + while (run) + { + if (run->show || oneFound == false) + { + if (mi >= items.Len()) + tNEW(gServerMenuItem)(this); + + gServerMenuItem *item = dynamic_cast<gServerMenuItem*>(items(mi)); + item->SetServer(run); + mi++; + } + run = run->Next(); + } } if (items.Len() == 1) @@ -358,7 +409,10 @@ ReverseItems(); - // set cursor to currently selected server + // keep the cursor position relative to the top, if possible ( calling function will handle the clamping ) + selected = items.Len() - selectedFromTop; + + // set cursor to currently selected server, if possible if ( info && info->menuItem ) { selected = info->menuItem->GetID(); @@ -430,7 +484,7 @@ } void gServerMenu::Render(REAL y, - const tOutput &servername, const tOutput &score, + const tString &servername, const tOutput &score, const tOutput &users , const tOutput &ping) { tColoredString highlight, normal; @@ -706,8 +760,12 @@ #ifndef DEDICATED rTextField::SetDefaultColor( tColor(.8,.3,.3,1) ); + tString sn2 = tString(tOutput("$network_master_servername")); + if (getFriendsEnabled()) //display that friends filter is on + sn2 << " - " << tOutput("$friends_enable"); + static_cast<gServerMenu*>(menu)->Render(.62, - tOutput("$network_master_servername"), + sn2, tOutput("$network_master_score"), tOutput("$network_master_users"), tOutput("$network_master_ping")); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <z-...@us...> - 2008-01-29 15:11:39
|
Revision: 7695 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7695&view=rev Author: z-man Date: 2008-01-29 07:11:45 -0800 (Tue, 29 Jan 2008) Log Message: ----------- Pippijn van Steenhoven's map rotation optimization (that's what you get when you rotate 1000 maps) plus some refactoring. Modified Paths: -------------- armagetronad/trunk/armagetronad/AUTHORS armagetronad/trunk/armagetronad/src/network/nConfig.h armagetronad/trunk/armagetronad/src/tools/tString.cpp armagetronad/trunk/armagetronad/src/tools/tString.h armagetronad/trunk/armagetronad/src/tron/gGame.cpp Modified: armagetronad/trunk/armagetronad/AUTHORS =================================================================== --- armagetronad/trunk/armagetronad/AUTHORS 2008-01-29 11:05:27 UTC (rev 7694) +++ armagetronad/trunk/armagetronad/AUTHORS 2008-01-29 15:11:45 UTC (rev 7695) @@ -43,6 +43,9 @@ Additional contributions from ============================= +Pippijn van Steenhoven + Map rotation optimization + Belenus OpenBSD support sniplets Modified: armagetronad/trunk/armagetronad/src/network/nConfig.h =================================================================== --- armagetronad/trunk/armagetronad/src/network/nConfig.h 2008-01-29 11:05:27 UTC (rev 7694) +++ armagetronad/trunk/armagetronad/src/network/nConfig.h 2008-01-29 15:11:45 UTC (rev 7695) @@ -279,6 +279,11 @@ , watcher_( setting_, group, min, max ) { } + + void Set( T const & value ) + { + this->setting_.Set( value ); + } private: nSettingItem< T > setting_; nConfItemVersionWatcher watcher_; Modified: armagetronad/trunk/armagetronad/src/tools/tString.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tools/tString.cpp 2008-01-29 11:05:27 UTC (rev 7694) +++ armagetronad/trunk/armagetronad/src/tools/tString.cpp 2008-01-29 15:11:45 UTC (rev 7695) @@ -675,6 +675,26 @@ return -1; } +int tString::StrPos( int start, const tString & tofind ) const +{ + if (tofind.Len() > Len()) { + return -1; + } + for (int i = start; i<Len()-1; i++) { + if ((*this)(i) == tofind(0)) { + bool found = true; + for (int j=0; j<tofind.Len()-1; j++) { + if ((*this)(i+j) != tofind(j)) + found = false; + } + if (found == true) + return i; + } + } + + return -1; +} + // ******************************************************************************* // * // * StrPos @@ -691,6 +711,11 @@ return StrPos( tString ( tofind ) ); } +int tString::StrPos( int start, const CHAR * tofind ) const +{ + return StrPos( start, tString ( tofind ) ); +} + // ******************************************************************************* // * // * SubStr Modified: armagetronad/trunk/armagetronad/src/tools/tString.h =================================================================== --- armagetronad/trunk/armagetronad/src/tools/tString.h 2008-01-29 11:05:27 UTC (rev 7694) +++ armagetronad/trunk/armagetronad/src/tools/tString.h 2008-01-29 15:11:45 UTC (rev 7695) @@ -109,7 +109,9 @@ tString Trim() const; //!< returns a copy with leading and trailing whitespace removed int StrPos( const tString &tofind ) const; //!< Get the position of a substring within this string. + int StrPos( int start, const tString &tofind ) const; //!< Get the position of a substring within this string. int StrPos( const CHAR * tofind ) const; //!< Get the position of a substring within this string. + int StrPos( int start, const CHAR * tofind ) const; //!< Get the position of a substring within this string. tString SubStr( int start, int len) const; //!< Get an arbitrary substring within this string. tString SubStr( int start ) const; //!< Get a substring within this string from the end. Modified: armagetronad/trunk/armagetronad/src/tron/gGame.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gGame.cpp 2008-01-29 11:05:27 UTC (rev 7694) +++ armagetronad/trunk/armagetronad/src/tron/gGame.cpp 2008-01-29 15:11:45 UTC (rev 7695) @@ -165,16 +165,81 @@ */ static nSettingItemWatched<tString> conf_mapfile("MAP_FILE",mapfile, nConfItemVersionWatcher::Group_Breaking, 8 ); -//it is a semi-colon deliminated list of maps, needs semi-colon at the end -//ie, original/map-1.0.1.xml;original/map-1.0.1.xml; -int maprotationpos = 0; -static tString maprotation(""); -static tSettingItem<tString> conf_maprotation("MAP_ROTATION",maprotation); +// config item for semi-colon deliminated list of maps/configs, needs semi-colon at the end +// ie, original/map-1.0.1.xml;original/map-1.0.1.xml; +class tSettingRotation: public tConfItemBase +{ +public: + tSettingRotation( char const * name ) + : tConfItemBase( name ), + current_(0) + { + } -int configrotationpos = 0; -static tString configrotation(""); -static tSettingItem<tString> conf_configrotation("CONFIG_ROTATION",configrotation); + // the number of items + int Size() const + { + return items_.Len(); + } + // returns the current value + tString const & Current() const + { + tASSERT( Size() > 0 && current_ >= 0 && current_ < Size() ); + + return items_[current_]; + } + + // rotates + void Rotate() + { + if ( ++current_ >= items_.Len() ) + { + current_ = 0; + } + } +private: + virtual void ReadVal( std::istream &is ) + { + tString mapsT; + mapsT.ReadLine (is); + items_.SetLen (0); + + int strpos = 0; + int nextsemicolon = mapsT.StrPos(";"); + + if (nextsemicolon != -1) + { + do + { + tString const &map = mapsT.SubStr(strpos, nextsemicolon - strpos); + + strpos = nextsemicolon + 1; + nextsemicolon = mapsT.StrPos(strpos, ";"); + + items_.Insert(map); + } + while ((nextsemicolon = mapsT.StrPos(strpos, ";")) != -1); + } + + // make sure the current value is correct + if ( current_ >= items_.Len() ) + { + current_ = 0; + } + } + + virtual void WriteVal(std::ostream &s){} + virtual bool Writable(){return false;} + virtual bool Save(){return false;} + + tArray<tString> items_; // the various values the rotating config can take + int current_; // the index of the current +}; + +static tSettingRotation sg_mapRotation("MAP_ROTATION"); +static tSettingRotation sg_configRotation("CONFIG_ROTATION"); + //0 = never, 1 = round, 2 = match static int rotationtype = 0; static tSettingItem<int> conf_rotationtype("ROTATION_TYPE",rotationtype); @@ -1795,7 +1860,6 @@ (&net_menu,"$network_custjoin_text", "$network_custjoin_help",&gServerFavorites::CustomConnectMenu); - uMenuItemFunction fav (&net_menu,"$bookmarks_menu", "$bookmarks_menu_help",&gServerFavorites::FavoritesMenu); @@ -2715,6 +2779,11 @@ se_UserShowScores(false); + // rotate, if rotate is once per round + if (rotationtype == 1) + rotate(); + gRotation::HandleNewRound(); + //con.autoDisplayAtNewline=true; sr_con.fullscreen=true; SetState(GS_DELETE_OBJECTS,GS_DELETE_GRID); @@ -3167,11 +3236,6 @@ tOutput message; message << "$gamestate_winner_winner"; - if (rotationtype == 1) - rotate(); - - gRotation::HandleNewRound(); - if ( last_team_alive >= 0 ) sg_currentSettings->AutoAI( eTeam::teams( last_team_alive )->NumHumanPlayers() > 0 ); @@ -3412,51 +3476,22 @@ void rotate() { - //map && || config rotation - if (maprotation.StrPos(";") != -1) + if ( sg_mapRotation.Size() > 0 ) { - tString mapsT(maprotation); - tArray<tString> maps; - int nummaps = 0; - while (mapsT.StrPos(";") != -1) - { - maps.Insert(mapsT.SubStr(0, mapsT.StrPos(";"))); - mapsT = mapsT.SubStr(mapsT.StrPos(";") + 1); - nummaps++; - } - if (maprotationpos > nummaps) - maprotationpos = 0; - - tString output; - output << "MAP_FILE " << maps[maprotationpos]; - std::stringstream s(static_cast< char const * >( output ) ); - tConfItemBase::LoadLine(s); - - maprotationpos++; + conf_mapfile.Set( sg_mapRotation.Current() ); + sg_mapRotation.Rotate(); } - if (configrotation.StrPos(";") != -1) + if ( sg_configRotation.Size() > 0 ) { - tString configsT(configrotation); - tArray<tString> configs; - int numconfigs = 0; - while (configsT.StrPos(";") != -1) - { - configs.Insert(configsT.SubStr(0, configsT.StrPos(";"))); - configsT = configsT.SubStr(configsT.StrPos(";") + 1); - numconfigs++; - } - if (configrotationpos > numconfigs) - configrotationpos = 0; - const tPath& config = tDirectories::Config(); std::ifstream s; - if ( config.Open( s, configs[configrotationpos] ) ) + if ( config.Open( s, sg_configRotation.Current() ) ) { tConfItemBase::LoadAll( s ); } - configrotationpos++; + sg_configRotation.Rotate(); } } @@ -3899,6 +3934,11 @@ { sg_currentSettings = &singlePlayer; sg_copySettings(); + + // initiate rotation + rotate(); + gRotation::HandleNewRound(); + gRotation::HandleNewMatch(); } //gStatistics - original load call This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <z-...@us...> - 2008-02-04 17:01:19
|
Revision: 7722 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7722&view=rev Author: z-man Date: 2008-02-04 09:01:03 -0800 (Mon, 04 Feb 2008) Log Message: ----------- Merging branch 0.2.8 from revision 7702 to 7721: ------------------------------------------------------------------------ r7721 | z-man | 2008-02-04 17:36:23 +0100 (Mon, 04 Feb 2008) | 2 lines Better virtual RemoveFromGame logic for eGameObjects, derived classes now don't have to worry about things like removing themselves from the lists or clearing the current grid face (forgetting that has ugly effects). ------------------------------------------------------------------------ r7713 | z-man | 2008-01-31 23:12:57 +0100 (Thu, 31 Jan 2008) | 2 lines Negative hole scores now affect the score of the player who took the hole, positive goes to the one who made the hole. ------------------------------------------------------------------------ r7712 | wrtlprnft | 2008-01-31 15:22:54 +0100 (Thu, 31 Jan 2008) | 2 lines Removed unnecessary line of code, probably resulting in a 1e-9% performance increase. ------------------------------------------------------------------------ r7711 | z-man | 2008-01-30 22:28:37 +0100 (Wed, 30 Jan 2008) | 2 lines If console lines are wrapped, the continuation gets indented a bit. ------------------------------------------------------------------------ r7710 | z-man | 2008-01-30 21:48:36 +0100 (Wed, 30 Jan 2008) | 2 lines Fortress zones no longer collapse if FORTRESS_HELD_SCORE is zero. ------------------------------------------------------------------------ r7708 | z-man | 2008-01-30 12:19:45 +0100 (Wed, 30 Jan 2008) | 2 lines Made the random color picker dislike black even more. ------------------------------------------------------------------------ r7707 | z-man | 2008-01-30 11:55:13 +0100 (Wed, 30 Jan 2008) | 2 lines Eliminating duplicate password storage items on load. ------------------------------------------------------------------------ r7706 | z-man | 2008-01-30 11:36:27 +0100 (Wed, 30 Jan 2008) | 2 lines Fixed bug where you would get points for holding the base, but still was eliminated by its collapse. ------------------------------------------------------------------------ r7705 | z-man | 2008-01-30 10:35:32 +0100 (Wed, 30 Jan 2008) | 2 lines Hopefully a crashfix, and hopefully no reopening of old leak :) ------------------------------------------------------------------------ Revision Links: -------------- http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7702&view=rev Modified Paths: -------------- armagetronad/trunk/armagetronad/config/settings_dedicated.cfg armagetronad/trunk/armagetronad/src/engine/eGameObject.cpp armagetronad/trunk/armagetronad/src/engine/eGameObject.h armagetronad/trunk/armagetronad/src/engine/eNetGameObject.cpp armagetronad/trunk/armagetronad/src/engine/eNetGameObject.h armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp armagetronad/trunk/armagetronad/src/engine/eVoter.cpp armagetronad/trunk/armagetronad/src/render/rConsoleGraph.cpp armagetronad/trunk/armagetronad/src/render/rFont.cpp armagetronad/trunk/armagetronad/src/tron/gCycle.cpp armagetronad/trunk/armagetronad/src/tron/gCycle.h armagetronad/trunk/armagetronad/src/tron/gCycleMovement.cpp armagetronad/trunk/armagetronad/src/tron/gCycleMovement.h armagetronad/trunk/armagetronad/src/tron/gExplosion.cpp armagetronad/trunk/armagetronad/src/tron/gExplosion.h armagetronad/trunk/armagetronad/src/tron/gGame.cpp Modified: armagetronad/trunk/armagetronad/config/settings_dedicated.cfg =================================================================== --- armagetronad/trunk/armagetronad/config/settings_dedicated.cfg 2008-02-04 16:36:23 UTC (rev 7721) +++ armagetronad/trunk/armagetronad/config/settings_dedicated.cfg 2008-02-04 17:01:03 UTC (rev 7722) @@ -228,7 +228,7 @@ CYCLE_RUBBER_MINDISTANCE_LEGACY 1 # extra factor for minimal distance to walls enforced by the rubber code, active when peers with the rip bug are connected # single player settings, active while only one client is connected. -# Either SP_MIN_PLAYERS or SP_MIN_TEAMS must be bigger than 1, otherwise there will +# Either SP_MIN_PLAYERS or SP_TEAMS_MIN must be bigger than 1, otherwise there will # be no opponent and no meaningful rounds. SP_TEAM_BALANCE_WITH_AIS needs to stay enabled, # too. Modified: armagetronad/trunk/armagetronad/src/engine/eGameObject.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/engine/eGameObject.cpp 2008-02-04 16:36:23 UTC (rev 7721) +++ armagetronad/trunk/armagetronad/src/engine/eGameObject.cpp 2008-02-04 17:01:03 UTC (rev 7722) @@ -80,14 +80,43 @@ } -void eGameObject::RemoveFromGame(){ +void eGameObject::RemoveFromGame() +{ + int oldID = id; + if ( oldID >= 0 ) + { + AddRef(); + } + + OnRemoveFromGame(); + DoRemoveFromGame(); + + if ( oldID >= 0 ) + { + Release(); + } +} + + +// called on RemoveFromGame(). Call base class implementation, too, in your implementation. +void eGameObject::OnRemoveFromGame() +{ + // remove from lists RemoveFromListsAll(); + // remove from grid + currentFace = 0; +} + + +// called on RemoveFromGame(). Do not call base class implementation of this function, don't expect to get called from subclasses. +void eGameObject::DoRemoveFromGame() +{ + // simply delete delete this; } - eGameObject::eGameObject(eGrid *g,const eCoord &p,const eCoord &d,eFace *currentface,bool autodel) :autodelete(autodel),pos(p),dir(d),z(0),grid(g){ tASSERT(g); Modified: armagetronad/trunk/armagetronad/src/engine/eGameObject.h =================================================================== --- armagetronad/trunk/armagetronad/src/engine/eGameObject.h 2008-02-04 16:36:23 UTC (rev 7721) +++ armagetronad/trunk/armagetronad/src/engine/eGameObject.h 2008-02-04 17:01:03 UTC (rev 7722) @@ -108,8 +108,14 @@ void AddToList(); void RemoveFromList(); void RemoveFromListsAll(); - virtual void RemoveFromGame(); // call this instead of the destructor + void RemoveFromGame(); //!< removes the object physically from the game +protected: + virtual void OnRemoveFromGame(); //!< called on RemoveFromGame(). Call base class implementation, too, in your implementation. Must keep the object alive. +private: + virtual void DoRemoveFromGame(); //!< called on RemoveFromGame() after OnRemoveFromGame(). Do not call base class implementation of this function, don't expect to get called from subclasses. +public: + int GOID() const {return id;} REAL LastTime() const {return lastTime;} virtual REAL NextInterestingTime() const {return lastTime;} //!< the next time something interesting is going to happen with this object Modified: armagetronad/trunk/armagetronad/src/engine/eNetGameObject.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/engine/eNetGameObject.cpp 2008-02-04 16:36:23 UTC (rev 7721) +++ armagetronad/trunk/armagetronad/src/engine/eNetGameObject.cpp 2008-02-04 17:01:03 UTC (rev 7722) @@ -111,14 +111,12 @@ pingOverflow=0; } -void eNetGameObject::RemoveFromGame(){ +void eNetGameObject::DoRemoveFromGame(){ // let the object get deleted on exit if nobody else is interested tControlledPTR< eNetGameObject > bounce; if ( this->GetRefcount() >= 0 ) bounce = this; - RemoveFromListsAll(); - // unregister from player if ( player && this == player->object ) { @@ -126,8 +124,6 @@ } team = NULL; - - currentFace = 0; } eNetGameObject::~eNetGameObject(){ Modified: armagetronad/trunk/armagetronad/src/engine/eNetGameObject.h =================================================================== --- armagetronad/trunk/armagetronad/src/engine/eNetGameObject.h 2008-02-04 16:36:23 UTC (rev 7721) +++ armagetronad/trunk/armagetronad/src/engine/eNetGameObject.h 2008-02-04 17:01:03 UTC (rev 7722) @@ -75,7 +75,7 @@ eNetGameObject(eGrid *grid, const eCoord &pos,const eCoord &dir,ePlayerNetID* p,bool autodelete=false); eNetGameObject(nMessage &m); - virtual void RemoveFromGame(); // just remove it from the lists and unregister it + virtual void DoRemoveFromGame(); // just remove it from the lists and unregister it virtual void WriteCreate(nMessage &m); virtual void WriteSync(nMessage &m); Modified: armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp 2008-02-04 16:36:23 UTC (rev 7721) +++ armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp 2008-02-04 17:01:03 UTC (rev 7722) @@ -83,7 +83,12 @@ PasswordStorage(): save(false){}; }; - +static bool operator == ( PasswordStorage const & a, PasswordStorage const & b ) +{ + return + a.username == b.username; +} + static tArray<PasswordStorage> S_passwords; void se_DeletePasswords(){ @@ -158,7 +163,19 @@ PasswordStorage &storage = S_passwords[S_passwords.Len()]; nKrawall::ReadScrambledPassword(s, storage.password); storage.username.ReadLine(s); + storage.save = true; + + // check for duplicates + for( int i = S_passwords.Len() - 2; i >= 0; --i ) + { + PasswordStorage &other = S_passwords[i]; + if ( other == storage ) + { + storage.save = false; + break; + } + } } } }; @@ -3513,8 +3530,8 @@ newRGB[i] = randomizer.Get(15); } - int currentMinDiff = se_ColorDistance( currentRGB, nullRGB ) * 2; - int newMinDiff = se_ColorDistance( newRGB, nullRGB ) * 2; + int currentMinDiff = se_ColorDistance( currentRGB, nullRGB )/2; + int newMinDiff = se_ColorDistance( newRGB, nullRGB )/2; // check the minimal distance of the new random color with all players for ( int i = se_PlayerNetIDs.Len()-1; i >= 0; --i ) Modified: armagetronad/trunk/armagetronad/src/engine/eVoter.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/engine/eVoter.cpp 2008-02-04 16:36:23 UTC (rev 7721) +++ armagetronad/trunk/armagetronad/src/engine/eVoter.cpp 2008-02-04 17:01:03 UTC (rev 7722) @@ -732,8 +732,6 @@ virtual void OnDestroy() { machine_ = 0; - - delete this; } private: nMachine * machine_; Modified: armagetronad/trunk/armagetronad/src/render/rConsoleGraph.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/render/rConsoleGraph.cpp 2008-02-04 16:36:23 UTC (rev 7721) +++ armagetronad/trunk/armagetronad/src/render/rConsoleGraph.cpp 2008-02-04 17:01:03 UTC (rev 7722) @@ -112,6 +112,7 @@ rTextField out(-.95f,.99f,rCHEIGHT_CON, sr_fontConsole);//,&rFont::s_defaultFontSmall); out.SetWidth(1.9f); out.EnableLineWrap(); + out.SetIndent(3); int i; for(i=currentTop;i<=currentIn && i<=currentTop+MaxHeight();i++) Modified: armagetronad/trunk/armagetronad/src/render/rFont.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/render/rFont.cpp 2008-02-04 16:36:23 UTC (rev 7721) +++ armagetronad/trunk/armagetronad/src/render/rFont.cpp 2008-02-04 17:01:03 UTC (rev 7722) @@ -618,7 +618,14 @@ { WriteChar('\n'); c++; - if (wordWidth >= maxWidth) { + + for ( int i = parIndent-1; i >= 0; --i ) + { + WriteChar(' '); + cursorPos++; + } + + if (wordWidth >= maxWidth) { trouble = true; currentWidth = 0.; } else { Modified: armagetronad/trunk/armagetronad/src/tron/gCycle.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gCycle.cpp 2008-02-04 16:36:23 UTC (rev 7721) +++ armagetronad/trunk/armagetronad/src/tron/gCycle.cpp 2008-02-04 17:01:03 UTC (rev 7722) @@ -2301,7 +2301,7 @@ */ } -void gCycle::RemoveFromGame() +void gCycle::OnRemoveFromGame() { // keep this cycle alive tJUST_CONTROLLED_PTR< gCycle > keep; @@ -2329,7 +2329,7 @@ currentWall=NULL; lastWall=NULL; - gCycleMovement::RemoveFromGame(); + gCycleMovement::OnRemoveFromGame(); delete joystick_; joystick_ = NULL; @@ -3271,6 +3271,11 @@ } } +static void sg_HoleScore( gCycle & cycle ) +{ + cycle.Player()->AddScore( score_hole, tOutput("$player_win_hole"), tOutput("$player_lose_hole") ); +} + void gCycle::PassEdge(const eWall *ww,REAL time,REAL a,int){ { // deactivate time check @@ -3284,7 +3289,7 @@ // check whether we drove through a hole in an enemy wall made by a teammate gPlayerWall const * w = dynamic_cast< gPlayerWall const * >( ww ); - if ( w ) + if ( w && score_hole ) { gExplosion * explosion = w->Holer( a, time ); if ( explosion ) @@ -3300,8 +3305,18 @@ // this test must come last, it resets the flag. if ( explosion->AccountForHole() ) { - holer->Player()->AddScore( score_hole, tOutput("$player_win_hole"), tOutput("$player_lose_hole") ); - } + if ( score_hole > 0 ) + { + // positive hole score goes to the holer + sg_HoleScore( *holer ); + } + else + { + // negative hole score to the driver + sg_HoleScore( *this ); + + } + } } } } Modified: armagetronad/trunk/armagetronad/src/tron/gCycle.h =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gCycle.h 2008-02-04 16:36:23 UTC (rev 7721) +++ armagetronad/trunk/armagetronad/src/tron/gCycle.h 2008-02-04 17:01:03 UTC (rev 7722) @@ -195,7 +195,7 @@ protected: virtual ~gCycle(); - virtual void RemoveFromGame(); // call this instead of the destructor + virtual void OnRemoveFromGame(); // called when the cycle is physically removed from the game virtual void OnRoundEnd(); //!< called when the round ends Modified: armagetronad/trunk/armagetronad/src/tron/gCycleMovement.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gCycleMovement.cpp 2008-02-04 16:36:23 UTC (rev 7721) +++ armagetronad/trunk/armagetronad/src/tron/gCycleMovement.cpp 2008-02-04 17:01:03 UTC (rev 7722) @@ -2552,12 +2552,12 @@ maxSpaceHit_ = NULL; } -void gCycleMovement::RemoveFromGame() +void gCycleMovement::OnRemoveFromGame() { delete maxSpaceHit_; maxSpaceHit_ = NULL; - eNetGameObject::RemoveFromGame(); + eNetGameObject::OnRemoveFromGame(); } // ******************************************************************************************* Modified: armagetronad/trunk/armagetronad/src/tron/gCycleMovement.h =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gCycleMovement.h 2008-02-04 16:36:23 UTC (rev 7721) +++ armagetronad/trunk/armagetronad/src/tron/gCycleMovement.h 2008-02-04 17:01:03 UTC (rev 7722) @@ -139,7 +139,7 @@ , bool autodelete=1 ) ; //!< local constructor gCycleMovement ( nMessage & message ) ; //!< remote constructor virtual ~gCycleMovement () ; //!< destructor - virtual void RemoveFromGame(); // call this instead of the destructor + virtual void OnRemoveFromGame(); // called when the cycle is physically removed from the game protected: //! data from sync message struct SyncData Modified: armagetronad/trunk/armagetronad/src/tron/gExplosion.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gExplosion.cpp 2008-02-04 16:36:23 UTC (rev 7721) +++ armagetronad/trunk/armagetronad/src/tron/gExplosion.cpp 2008-02-04 17:01:03 UTC (rev 7722) @@ -493,8 +493,7 @@ #endif -void gExplosion::RemoveFromGame() +void gExplosion::DoRemoveFromGame() { sg_Explosions.Remove( this, listID ); - RemoveFromList(); } Modified: armagetronad/trunk/armagetronad/src/tron/gExplosion.h =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gExplosion.h 2008-02-04 16:36:23 UTC (rev 7721) +++ armagetronad/trunk/armagetronad/src/tron/gExplosion.h 2008-02-04 17:01:03 UTC (rev 7722) @@ -71,7 +71,7 @@ virtual void AddRef(){tReferencable< gExplosion >::AddRef();} virtual void Release(){tReferencable< gExplosion >::Release();} - virtual void RemoveFromGame(); + virtual void DoRemoveFromGame(); // called last when the object is removed from the game private: REAL createTime; Modified: armagetronad/trunk/armagetronad/src/tron/gGame.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/tron/gGame.cpp 2008-02-04 16:36:23 UTC (rev 7721) +++ armagetronad/trunk/armagetronad/src/tron/gGame.cpp 2008-02-04 17:01:03 UTC (rev 7722) @@ -2991,7 +2991,6 @@ tOutput o("$gamestate_30seconds_warn"); sn_CenterMessage(o); sn_ConsoleOut(o); - warning=6; warning=5; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <z-...@us...> - 2008-02-04 19:48:34
|
Revision: 7727 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7727&view=rev Author: z-man Date: 2008-02-04 11:48:35 -0800 (Mon, 04 Feb 2008) Log Message: ----------- Merging branch 0.2.8 from revision 7721 to 7723: ------------------------------------------------------------------------ r7723 | z-man | 2008-02-04 18:14:13 +0100 (Mon, 04 Feb 2008) | 501 lines Merging branch 0.2.8-auth from revision 7558 to 7721: ------------------------------------------------------------------------ r7718 | z-man | 2008-02-04 01:42:47 +0100 (Mon, 04 Feb 2008) | 3 lines Fixed epsy's eavesdropping bug where a moderator that is invited, but not member of a team could read /team messages. When looking for a player name, the input name is now filtered as well. ------------------------------------------------------------------------ r7715 | z-man | 2008-02-01 22:09:11 +0100 (Fri, 01 Feb 2008) | 2 lines Correctly check for the shorthand authority name when checking the authentication server's response. ------------------------------------------------------------------------ r7714 | z-man | 2008-02-01 21:34:13 +0100 (Fri, 01 Feb 2008) | 2 lines Client compiled with --enable-armathentication compiles again (why would a sane person do that?) ------------------------------------------------------------------------ r7709 | z-man | 2008-01-30 20:00:08 +0100 (Wed, 30 Jan 2008) | 2 lines Spectators invited to exactly one team can now also use /team to chat with the team. ------------------------------------------------------------------------ r7700 | z-man | 2008-01-29 18:07:13 +0100 (Tue, 29 Jan 2008) | 2 lines forgot one \n. ------------------------------------------------------------------------ r7690 | z-man | 2008-01-29 01:54:16 +0100 (Tue, 29 Jan 2008) | 2 lines Evaluating the authentication server's username response. ------------------------------------------------------------------------ r7688 | z-man | 2008-01-29 00:55:17 +0100 (Tue, 29 Jan 2008) | 2 lines Adding fully qualified user name to the PASSWORD_OK output. ------------------------------------------------------------------------ r7684 | z-man | 2008-01-28 21:14:37 +0100 (Mon, 28 Jan 2008) | 2 lines Sendig hashes with lowercase hexcodes; php generates them that way by default. ------------------------------------------------------------------------ r7681 | z-man | 2008-01-28 19:03:09 +0100 (Mon, 28 Jan 2008) | 2 lines also removing newlines from headers. ------------------------------------------------------------------------ r7677 | z-man | 2008-01-28 13:06:03 +0100 (Mon, 28 Jan 2008) | 2 lines Stopped abusing http error codes, rely on the message text instead. ------------------------------------------------------------------------ r7676 | z-man | 2008-01-28 11:29:27 +0100 (Mon, 28 Jan 2008) | 2 lines Actually made the code work like the docs say :) ------------------------------------------------------------------------ r7675 | z-man | 2008-01-28 11:25:45 +0100 (Mon, 28 Jan 2008) | 2 lines Documented chat commands. ------------------------------------------------------------------------ r7674 | z-man | 2008-01-28 11:13:33 +0100 (Mon, 28 Jan 2008) | 3 lines Fixed yet another cursor position bug. Text menu items with COLOR_SHOW rendering mode switch to COLOR_USE when not selected. ------------------------------------------------------------------------ r7673 | z-man | 2008-01-28 11:11:54 +0100 (Mon, 28 Jan 2008) | 2 lines MD5_PASSWORD_REMOVE -> USER_REMOVE ------------------------------------------------------------------------ r7672 | z-man | 2008-01-28 02:59:16 +0100 (Mon, 28 Jan 2008) | 2 lines /lock, /unlock, /invite and /uninvite team management chat for players of access level ACCESS_LEVEL_TEAM or better. ------------------------------------------------------------------------ r7671 | z-man | 2008-01-27 21:26:39 +0100 (Sun, 27 Jan 2008) | 2 lines Thorough protection against access elevation by coding bugs. There is one central check to pass, and only one way to circumvent it. ------------------------------------------------------------------------ r7670 | z-man | 2008-01-27 19:59:48 +0100 (Sun, 27 Jan 2008) | 2 lines Fixed broken console wrapping. ------------------------------------------------------------------------ r7669 | z-man | 2008-01-27 19:48:21 +0100 (Sun, 27 Jan 2008) | 2 lines Added ACCESS_LEVEL_IPS to let admins see IPs of players in the list. ------------------------------------------------------------------------ r7668 | z-man | 2008-01-27 18:54:12 +0100 (Sun, 27 Jan 2008) | 2 lines eavesdropping admins no longer get their own /msgs printed twice. ------------------------------------------------------------------------ r7666 | z-man | 2008-01-27 16:34:27 +0100 (Sun, 27 Jan 2008) | 2 lines Removed fallback to bmd5 when the authority did not return a method list, all protocol-non-compilance errors are now fatal and give meaningful error messages (I hope). ------------------------------------------------------------------------ r7665 | z-man | 2008-01-27 15:41:54 +0100 (Sun, 27 Jan 2008) | 2 lines added check for wrong hostname. ------------------------------------------------------------------------ r7663 | z-man | 2008-01-27 14:43:35 +0100 (Sun, 27 Jan 2008) | 2 lines Rejecting raw IP authorities. ------------------------------------------------------------------------ r7662 | z-man | 2008-01-27 14:31:32 +0100 (Sun, 27 Jan 2008) | 2 lines All response keywords transformed to CAPS. ------------------------------------------------------------------------ r7661 | z-man | 2008-01-27 14:31:00 +0100 (Sun, 27 Jan 2008) | 2 lines Password server response is now parsed case-insensitively. ------------------------------------------------------------------------ r7660 | z-man | 2008-01-27 14:08:12 +0100 (Sun, 27 Jan 2008) | 2 lines Repaired debug recordings. ------------------------------------------------------------------------ r7659 | z-man | 2008-01-27 14:02:50 +0100 (Sun, 27 Jan 2008) | 3 lines Short network messages are now ignored and don't cause disconnection. Logins are secured with an additional random token, making it harder to inject fake login accept packets with a wrong IP to circumvent the anti-pharming code. ------------------------------------------------------------------------ r7658 | z-man | 2008-01-27 13:23:59 +0100 (Sun, 27 Jan 2008) | 2 lines Counting with a bool? Not such a good idea :) ------------------------------------------------------------------------ r7653 | z-man | 2008-01-27 01:50:05 +0100 (Sun, 27 Jan 2008) | 2 lines When authentication names are anonymous, you now still get to see your own login messages. ------------------------------------------------------------------------ r7652 | z-man | 2008-01-27 01:30:51 +0100 (Sun, 27 Jan 2008) | 2 lines Finished version 0.1 of the server to authserver protocol. Nobody else seems interested enough, so we'll keep it n00bish. ------------------------------------------------------------------------ r7650 | z-man | 2008-01-27 01:28:27 +0100 (Sun, 27 Jan 2008) | 2 lines added authentication reference php script. ------------------------------------------------------------------------ r7649 | z-man | 2008-01-26 23:36:28 +0100 (Sat, 26 Jan 2008) | 2 lines Added /teams chat command. ------------------------------------------------------------------------ r7648 | z-man | 2008-01-26 21:59:56 +0100 (Sat, 26 Jan 2008) | 2 lines Spectating admins can now see /team messages, and really high level admins can always see /msg messages (they can read them in the logs already). All configurable, of course. ------------------------------------------------------------------------ r7647 | z-man | 2008-01-26 21:20:26 +0100 (Sat, 26 Jan 2008) | 2 lines corrected /admin denied message. ------------------------------------------------------------------------ r7646 | z-man | 2008-01-26 21:11:43 +0100 (Sat, 26 Jan 2008) | 2 lines Using tToLower and tToUpper instead of manually doing the work. ------------------------------------------------------------------------ r7645 | z-man | 2008-01-26 21:10:56 +0100 (Sat, 26 Jan 2008) | 1 line Filtering chat commands to lowercase. ------------------------------------------------------------------------ r7644 | z-man | 2008-01-26 21:10:32 +0100 (Sat, 26 Jan 2008) | 2 lines Added tToLower and tToUpper transform functions. ------------------------------------------------------------------------ r7643 | z-man | 2008-01-26 20:44:16 +0100 (Sat, 26 Jan 2008) | 1 line Better detection and reporting of unknown chat commands. ------------------------------------------------------------------------ r7642 | z-man | 2008-01-26 20:33:13 +0100 (Sat, 26 Jan 2008) | 1 line Fixed clientside generated namechange messages ------------------------------------------------------------------------ r7641 | z-man | 2008-01-26 20:21:33 +0100 (Sat, 26 Jan 2008) | 2 lines ALIAS -> USER_ALIAS ------------------------------------------------------------------------ r7640 | z-man | 2008-01-26 20:09:41 +0100 (Sat, 26 Jan 2008) | 2 lines Bugfixes of sliding play access level. ------------------------------------------------------------------------ r7639 | z-man | 2008-01-26 19:38:53 +0100 (Sat, 26 Jan 2008) | 2 lines Fixed non-authentication version. ------------------------------------------------------------------------ r7638 | z-man | 2008-01-26 19:32:01 +0100 (Sat, 26 Jan 2008) | 2 lines Added intermediate tAccessLevel definitions. Some C++ compilers seem to be smart enough to clamp assignments from ints to enums to defined values. ------------------------------------------------------------------------ r7637 | z-man | 2008-01-26 19:29:34 +0100 (Sat, 26 Jan 2008) | 3 lines Who can play is now managed by ePlayer.cpp itself, and not in the spawning code of gGame.cpp. Added ACCESS_LEVEL_PLAY_SLIDERS to allow tuning the sliding behavior of the to-play access level requirement. ------------------------------------------------------------------------ r7634 | z-man | 2008-01-26 17:31:48 +0100 (Sat, 26 Jan 2008) | 1 line Only include nanohttp when authentication is enabled. ------------------------------------------------------------------------ r7633 | z-man | 2008-01-26 17:30:19 +0100 (Sat, 26 Jan 2008) | 2 lines More SUDO -> CASACL ------------------------------------------------------------------------ r7631 | z-man | 2008-01-26 17:00:21 +0100 (Sat, 26 Jan 2008) | 2 lines SUDO -> CASACL (Check And Set ACcess Level), prounounced like Quetzalcoatl, your friendly Aztec God. ------------------------------------------------------------------------ r7630 | z-man | 2008-01-26 14:33:11 +0100 (Sat, 26 Jan 2008) | 2 lines Further SUDO comment. ------------------------------------------------------------------------ r7629 | z-man | 2008-01-26 13:52:01 +0100 (Sat, 26 Jan 2008) | 2 lines Refined and documented SUDO. ------------------------------------------------------------------------ r7628 | z-man | 2008-01-26 02:53:47 +0100 (Sat, 26 Jan 2008) | 2 lines Activated SUDO command. ------------------------------------------------------------------------ r7627 | z-man | 2008-01-26 02:38:14 +0100 (Sat, 26 Jan 2008) | 2 lines Worked around gcc-3.3 problems with function pointer default arguments. ------------------------------------------------------------------------ r7626 | z-man | 2008-01-26 02:36:50 +0100 (Sat, 26 Jan 2008) | 2 lines Added SUDO command. ------------------------------------------------------------------------ r7625 | z-man | 2008-01-26 00:10:10 +0100 (Sat, 26 Jan 2008) | 8 lines Documented settings. text input fields now let the text wrap correctly and make use of the space allocated for them in a not-completely-dumb way. And *sigh* depending on the text field, color codes are either ignored (for the usernames) or both displayed in text and rendered. "KICK 2pack" no longer kicks user 2 instead of player 2pack. all admin commands now also accept partial name matches, like /msg, and check for case sensitive matches in the screen name first, then the user name, then case insensitive matches in the two. Added authority black/whitelists. Debug recordings now work with authentication and are safe to share, no secret information is recorded. ------------------------------------------------------------------------ r7624 | z-man | 2008-01-24 19:32:12 +0100 (Thu, 24 Jan 2008) | 2 lines Whoops, repaired /msg and other things. ------------------------------------------------------------------------ r7623 | z-man | 2008-01-24 19:08:19 +0100 (Thu, 24 Jan 2008) | 2 lines Added /promote and /demote, saner spam checking. ------------------------------------------------------------------------ r7622 | z-man | 2008-01-24 17:38:19 +0100 (Thu, 24 Jan 2008) | 2 lines No more senseless name change messages, better error messages. ------------------------------------------------------------------------ r7621 | z-man | 2008-01-24 17:10:05 +0100 (Thu, 24 Jan 2008) | 2 lines Added access right settings for /admin commands, regular chat, playing, and the new /(de)op commands (replace /pickup) ------------------------------------------------------------------------ r7620 | z-man | 2008-01-24 15:30:42 +0100 (Thu, 24 Jan 2008) | 2 lines krawallserver -> armathentication :) ------------------------------------------------------------------------ r7619 | z-man | 2008-01-24 14:54:54 +0100 (Thu, 24 Jan 2008) | 2 lines Better screen name reservation; previously, "RESERVE_SCREEN_NAME Z-Man" would have had no effect, because the nickname is compared to the FILTERED name of players; so now the reserved name is filtered as well. ------------------------------------------------------------------------ r7618 | z-man | 2008-01-24 14:27:19 +0100 (Thu, 24 Jan 2008) | 2 lines ZTHread no longer required for remote logins; without threads, the required lookups are done between rounds. ------------------------------------------------------------------------ r7617 | z-man | 2008-01-24 13:55:57 +0100 (Thu, 24 Jan 2008) | 2 lines Updated. ------------------------------------------------------------------------ r7616 | z-man | 2008-01-24 13:40:00 +0100 (Thu, 24 Jan 2008) | 2 lines Proper error reporting when ZThread is not available and we can't to remote logins. ------------------------------------------------------------------------ r7615 | z-man | 2008-01-24 13:30:39 +0100 (Thu, 24 Jan 2008) | 2 lines Added: access levels to user accounts, aliases, reserved screen names, and authentication name based bans for REALLY stupid players. ------------------------------------------------------------------------ r7614 | z-man | 2008-01-24 10:55:49 +0100 (Thu, 24 Jan 2008) | 2 lines Added access levels to configuration system. ------------------------------------------------------------------------ r7613 | z-man | 2008-01-24 03:35:12 +0100 (Thu, 24 Jan 2008) | 2 lines Better error messages. ------------------------------------------------------------------------ r7612 | z-man | 2008-01-24 03:28:19 +0100 (Thu, 24 Jan 2008) | 2 lines seperate message for local logons. ------------------------------------------------------------------------ r7611 | z-man | 2008-01-24 03:12:16 +0100 (Thu, 24 Jan 2008) | 2 lines Added UI elements and non-chat based authentication initiation: in the player setup, there is a Global ID text item and an Auto Login toggle, and in the game menu, if on supporting servers, an Authenticate trigger. ------------------------------------------------------------------------ r7610 | z-man | 2008-01-23 22:08:39 +0100 (Wed, 23 Jan 2008) | 2 lines Less name character escaping. ------------------------------------------------------------------------ r7609 | z-man | 2008-01-23 20:27:20 +0100 (Wed, 23 Jan 2008) | 2 lines Less braindead handling of player names. ------------------------------------------------------------------------ r7608 | z-man | 2008-01-23 18:00:13 +0100 (Wed, 23 Jan 2008) | 2 lines Support for storage of password hashes for schemes with prefix and suffix. ------------------------------------------------------------------------ r7607 | z-man | 2008-01-23 17:53:46 +0100 (Wed, 23 Jan 2008) | 2 lines Filtering port, only to realize that nanohttp does not handle the port correctly anyway. Lowercasing the file path part of the authority for reference, lookup is done with the original. ------------------------------------------------------------------------ r7606 | z-man | 2008-01-23 17:20:57 +0100 (Wed, 23 Jan 2008) | 3 lines Ok, .authentication.armagetronad.net ;) Also, removing this default suffix from the authority if it is there. ------------------------------------------------------------------------ r7605 | z-man | 2008-01-23 17:08:21 +0100 (Wed, 23 Jan 2008) | 2 lines Sanity checking authority URL; appending default .armagetronad.net. ------------------------------------------------------------------------ r7604 | z-man | 2008-01-23 16:23:04 +0100 (Wed, 23 Jan 2008) | 2 lines fixed method retrieval, implemented method property reading. ------------------------------------------------------------------------ r7603 | z-man | 2008-01-23 15:33:12 +0100 (Wed, 23 Jan 2008) | 2 lines Strings get encoded for URIs now, so usernames can have spaces and stuff. ------------------------------------------------------------------------ r7602 | z-man | 2008-01-23 14:00:35 +0100 (Wed, 23 Jan 2008) | 2 lines Fixed abuse of temporary variable returned by std::ostringstream::str(). ------------------------------------------------------------------------ r7599 | z-man | 2008-01-23 11:17:13 +0100 (Wed, 23 Jan 2008) | 2 lines Fixes for non-zthread owners. ------------------------------------------------------------------------ r7598 | z-man | 2008-01-23 10:42:47 +0100 (Wed, 23 Jan 2008) | 2 lines Also removing pending login processes from view when the client logs out; they may be kept alive by running tasks. ------------------------------------------------------------------------ r7597 | z-man | 2008-01-23 04:05:28 +0100 (Wed, 23 Jan 2008) | 4 lines Two bugfixes: clients would clear the username sent by the server before opening the password form servers would ignore login attemps if the same client previously disconnected while in the process of logging in. ------------------------------------------------------------------------ r7596 | z-man | 2008-01-23 03:47:35 +0100 (Wed, 23 Jan 2008) | 2 lines Forgot to re-activate the Executer that actually uses background threads :) ------------------------------------------------------------------------ r7595 | z-man | 2008-01-23 03:45:03 +0100 (Wed, 23 Jan 2008) | 2 lines New, clearer structure without tread-troubling global variables on the server side. ------------------------------------------------------------------------ r7594 | z-man | 2008-01-23 03:44:31 +0100 (Wed, 23 Jan 2008) | 2 lines Test for zthread is only done when krawallserver is activated. ------------------------------------------------------------------------ r7593 | z-man | 2008-01-23 03:43:58 +0100 (Wed, 23 Jan 2008) | 2 lines Added convenience functions to machine observers. ------------------------------------------------------------------------ r7592 | z-man | 2008-01-23 03:06:58 +0100 (Wed, 23 Jan 2008) | 2 lines Added thread-safe variant of referencable objects. ------------------------------------------------------------------------ r7588 | z-man | 2008-01-22 18:16:04 +0100 (Tue, 22 Jan 2008) | 2 lines Improved password entry form, all forms of canceling are recognized, failed automatic logins are repeated automatically. ------------------------------------------------------------------------ r7587 | z-man | 2008-01-22 16:33:47 +0100 (Tue, 22 Jan 2008) | 2 lines Added authentication hash method query; the server now picks a method client, server and authority support (or gives up). ------------------------------------------------------------------------ r7586 | z-man | 2008-01-22 16:19:52 +0100 (Tue, 22 Jan 2008) | 2 lines Reduced number of mutex lock points in memory manager to 2; eliminated information passing over global variables. ------------------------------------------------------------------------ r7580 | z-man | 2008-01-22 10:11:20 +0100 (Tue, 22 Jan 2008) | 2 lines Earlier mutex locking. Eek, there is lots of communication using global variables. ------------------------------------------------------------------------ r7579 | z-man | 2008-01-22 04:01:00 +0100 (Tue, 22 Jan 2008) | 2 lines skeletons for fetching additional data about users and authentication methods. ------------------------------------------------------------------------ r7578 | z-man | 2008-01-22 03:05:53 +0100 (Tue, 22 Jan 2008) | 2 lines Leakfix and even better error messages. ------------------------------------------------------------------------ r7577 | z-man | 2008-01-22 03:05:08 +0100 (Tue, 22 Jan 2008) | 2 lines Using an Executer instead of manually starting threads. ------------------------------------------------------------------------ r7576 | z-man | 2008-01-22 03:04:10 +0100 (Tue, 22 Jan 2008) | 2 lines Call DoToDo() while waiting for real players. ------------------------------------------------------------------------ r7575 | z-man | 2008-01-22 02:37:47 +0100 (Tue, 22 Jan 2008) | 2 lines Silenced leak warnings from external libraries. ------------------------------------------------------------------------ r7574 | z-man | 2008-01-21 20:46:06 +0100 (Mon, 21 Jan 2008) | 2 lines Refactoring, clientside support for good md5 format (not yet final), better error messages for the user. ------------------------------------------------------------------------ r7573 | z-man | 2008-01-21 20:35:28 +0100 (Mon, 21 Jan 2008) | 2 lines Fixed deadlock. ------------------------------------------------------------------------ r7571 | luke-jr | 2008-01-21 14:21:05 +0100 (Mon, 21 Jan 2008) | 1 line fix z-mans typos ------------------------------------------------------------------------ r7561 | z-man | 2008-01-21 11:57:48 +0100 (Mon, 21 Jan 2008) | 2 lines Removed extra semicolon. ------------------------------------------------------------------------ r7560 | z-man | 2008-01-21 11:45:48 +0100 (Mon, 21 Jan 2008) | 2 lines Adapted to Tank's forum based auth script. Login with "/login authentication.armagetronad.net" now :) ------------------------------------------------------------------------ r7559 | z-man | 2008-01-21 11:36:51 +0100 (Mon, 21 Jan 2008) | 2 lines Commited patch 0.4, basically. ------------------------------------------------------------------------ ------------------------------------------------------------------------ Revision Links: -------------- http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7721&view=rev http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7558&view=rev Modified Paths: -------------- armagetronad/trunk/armagetronad/NEWS armagetronad/trunk/armagetronad/config/settings_dedicated.cfg armagetronad/trunk/armagetronad/configure.ac armagetronad/trunk/armagetronad/language/deutsch.txt armagetronad/trunk/armagetronad/language/english_base.txt armagetronad/trunk/armagetronad/language/english_base_notranslate.txt armagetronad/trunk/armagetronad/language/french.txt armagetronad/trunk/armagetronad/language/spanish.txt armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp armagetronad/trunk/armagetronad/src/engine/ePlayer.h armagetronad/trunk/armagetronad/src/engine/eTeam.cpp armagetronad/trunk/armagetronad/src/engine/eTeam.h armagetronad/trunk/armagetronad/src/engine/eVoter.cpp armagetronad/trunk/armagetronad/src/engine/eVoter.h armagetronad/trunk/armagetronad/src/network/nConfig.cpp armagetronad/trunk/armagetronad/src/network/nKrawall.cpp armagetronad/trunk/armagetronad/src/network/nKrawall.h armagetronad/trunk/armagetronad/src/network/nKrawallPrivate.cpp armagetronad/trunk/armagetronad/src/network/nNetwork.cpp armagetronad/trunk/armagetronad/src/network/nNetwork.h armagetronad/trunk/armagetronad/src/network/nServerInfo.cpp armagetronad/trunk/armagetronad/src/render/rConsoleGraph.cpp armagetronad/trunk/armagetronad/src/render/rFont.cpp armagetronad/trunk/armagetronad/src/render/rFont.h armagetronad/trunk/armagetronad/src/tools/tConfiguration.cpp armagetronad/trunk/armagetronad/src/tools/tConfiguration.h armagetronad/trunk/armagetronad/src/tools/tLocale.h armagetronad/trunk/armagetronad/src/tools/tMemManager.cpp armagetronad/trunk/armagetronad/src/tools/tMemManager.h armagetronad/trunk/armagetronad/src/tools/tSafePTR.h armagetronad/trunk/armagetronad/src/tools/tString.cpp armagetronad/trunk/armagetronad/src/tools/tString.h armagetronad/trunk/armagetronad/src/tools/tToDo.cpp armagetronad/trunk/armagetronad/src/tron/gAIBase.cpp armagetronad/trunk/armagetronad/src/tron/gCycle.cpp armagetronad/trunk/armagetronad/src/tron/gGame.cpp armagetronad/trunk/armagetronad/src/tron/gMenus.cpp armagetronad/trunk/armagetronad/src/ui/uInput.cpp armagetronad/trunk/armagetronad/src/ui/uInputQueue.cpp armagetronad/trunk/armagetronad/src/ui/uInputQueue.h armagetronad/trunk/armagetronad/src/ui/uMenu.cpp armagetronad/trunk/armagetronad/src/ui/uMenu.h Added Paths: ----------- armagetronad/trunk/armagetronad/batch/authentication_reference.php armagetronad/trunk/armagetronad/config/settings_authentication.cfg armagetronad/trunk/armagetronad/src/network/nAuthentification.cpp armagetronad/trunk/armagetronad/src/network/nAuthentification.h Removed Paths: ------------- armagetronad/trunk/armagetronad/src/network/nAuthentication.cpp armagetronad/trunk/armagetronad/src/network/nAuthentication.h Modified: armagetronad/trunk/armagetronad/NEWS =================================================================== --- armagetronad/trunk/armagetronad/NEWS 2008-02-04 19:10:15 UTC (rev 7726) +++ armagetronad/trunk/armagetronad/NEWS 2008-02-04 19:48:35 UTC (rev 7727) @@ -141,12 +141,36 @@ - PLAYER_MESSAGE <user ID or name> <Message>: Like /msg, but from the console +If --enable-armathentication was activated: +- ACCESS_LEVEL_IPS to let admins see IPs of players in the list. +- ACCESS_LEVEL_SPY_MSG/TEAM to let admins spy on team/private messages. +- CASACL to temporarily raise the access level +- ACCESS_LEVEL to modify the required access level to change settings +- AUTHORITY_WHITELIST and AUTHORITY_BLACKLIST to filter authorities you want on your server. +- GLOBAL_ID_ENABLED to toggle remote accounts +- LOCAL_USER, LOCAL_TEAM for local login accounts +- MD5_PREFIX/MD5_SUFFIX for additional password scrambling +- USER_LEVEL to grant users various access levels +- RESERVE_SCREEN_NAME to reserve a screen name to a certain player +- USER_ALIAS to bend authentication names around +- (UN)BAN_USER to ban really stupid users based on their global user ID, + BAN_USER_LIST to show a list. +- ACCESS_LEVEL_OP/ADMIN/CHAT/PLAY/PLAY_SLIDING to control who can do which things +- /lock, /unlock, /invite and /uninvite team management chat for players of + access level ACCESS_LEVEL_TEAM or better. +- /login chat command then uses the more secure hashed base logins + Featurelets ----------- +- /teams chat command that rougly prints team layout. - Added PLAYER_RANDOM_COLOR for lazy people who just want to have a color that differs from everyone else on the server. - Configuration files get reloaded on SIGHUP +- all admin commands now also accept partial name matches, like /msg, and check for case sensitive + matches in the screen name first, then the user name, then case insensitive matches in the two. +- --enable-krawallserver has been actually implemented now, and it enables secure logins + to accounts local to the server and not-so-secure logins managed by authentication servers. - A subculture list for server groups that are not managed by our main master servers - A friends list and filter for the server browser that shows you only servers with your friends on them. @@ -193,6 +217,10 @@ Bugfixes -------- +- Text input fields now let the text wrap correctly and make use of the space allocated + for them in a not-completely-dumb way. And *sigh* depending on the text field, color + codes are either ignored (for the usernames) or both displayed in text and rendered. +- "KICK 2pack" no longer kicks user 2 instead of player 2pack. - Fixed various trail end related extrapolation/simulation inaccuracies that looked like lag. - When extrapolating, the game's sensors never detected own or teammates' walls, Copied: armagetronad/trunk/armagetronad/batch/authentication_reference.php (from rev 7723, armagetronad/branches/0.2.8/armagetronad/batch/authentication_reference.php) =================================================================== --- armagetronad/trunk/armagetronad/batch/authentication_reference.php (rev 0) +++ armagetronad/trunk/armagetronad/batch/authentication_reference.php 2008-02-04 19:48:35 UTC (rev 7727) @@ -0,0 +1,285 @@ +<?php + +//////////////////////////////////////////////////// +// +// Authentication server, reference implementation 0.1 +// +// To run authority X, this script needs to be +// adapted and be callable from a web browser as +// http://X/armaauth/0.1 +// +// the easiest way to do so is to name the script index.php +// and place it into an appropriate armaauth/0.1 +// directory on a web server that supports php. +// +//////////////////////////////////////////////////// + +// however, before they are used, %u is replaced by the username. + +function substitutions( $fix, $user ) +{ + return str_replace( "%u", $user, $fix ); +} + + +// this function reports the result of the check back to the +// qerying AA server. + +function conclude($statusCode, $msg) +{ + // if you do want to abuse return error codes (the servers + // work fine with parsing the text response), uncomment + // the next line. The request is technically always successful. + $statusCode = 200; + + // the status codes passed in have been chosen somewhat + // meaningfully (200: ok, 404: something not found, + // 401: password failure) but still violate the standard. + + // report error code in header + header("Status: $statusCode", true, $statusCode); + header("Content-Type: text/plain"); + + // print message + die("$msg\n"); +} + +// read authority from gloval variables +$authority = $_SERVER['HTTP_HOST']; + +//////////////////////////////////////////////////// +// Bits you need to change follow. +//////////////////////////////////////////////////// + +// You should definitely check that the hostname the game +// server used to contact you is the one you intend it +// to use; otherwise, there may be problems with web +// servers known under different names. You should uncomment +// this and add your real authority hostname. + +/* +if ( $authority != "authority" ) + conclude( 404, "WRONG_HOST" ); +*/ + +// The user "database": fetch the password for a user. +// If you are fine with storing plaintext passwords, +// adapt this function; otherwise, adapt getPasswordHash(). + +function getPassword( $user ) +{ + // the user/password database. For very small groups + // of users, you may just get away with expanding this + // array. + $passwords= array ( + 'test' => 'password' // clever choice there, test + ); + + $password = $passwords[ $user ]; + if ( NULL == $password ) + return NULL; + + // return a pair of username and password. + // it is important that you return the username + // exactly as it appeared in the database. + // If the username lookup is case insensitive, + // the rest of the script and the game servers + // need to know what the correct form of the name + // is. + return array( $user, $password ); +} + +// these two functions return prefix and suffix for the md5 +// hash method. They are prepended/appended to the password +// before md5 is applied on it. Adapt them to the way your +// md5 password hash is stored in your database. + +// IMPORTANT: if you want to keep the %u (a good idea for +// security, prevents precomputation attacks on the passwords) +// user name lookup needs to be case sensitive, or there will +// be unexplainable password failures. + +function getPrefix() +{ + return "%u:aaauth:"; +} + +function getSuffix() +{ + global $authority; + return ":$authority"; +} + +// You do not need plain text passwords. The +// checks on the passwords are done to a hash function +// thereof. You can just as well precompute the +// work of this function and store the result, +// and maybe your user database already contains +// the one or other hash. phpBB, for example, +// stores md5( $password ). + +function getPasswordHash( $user, $method ) +{ + // fetch the plaintext password + $userInfo = getPassword( $user ); + if ( NULL == $userInfo ) + return NULL; + + // unpack the data + $trueUser = $userInfo[0]; + $password = $userInfo[1]; + + // check that neither prefix nor suffix conain %u if $trueUser != $user + if ( $trueUser != $user && ( strpos( getPrefix(), '%u' ) !== FALSE || strpos( getPrefix(), '%u' ) !== FALSE ) ) + { + conclude(404, 'UNKNOWN_USER ' . $user . ' Do not use %u in pre/suffix if your user database is making case-insensitive lookups.'); + } + + // two methods are currently supported + // by server and client, bmd5 (broken md5) + // and md5. Both use the md5 hash algorithm. + + switch( $method ) + { + case 'bmd5': + // bmd5 quirk: the hash is computed for password + a trailing 0 + $password = "$password" . chr(0); + break; + + case "md5": + // md5 adds the prefix and suffix before calculating + // the hash. The example values are chosen so that the + // resulting hash is the same one you find in .htdigest + // files and that is used in the digest http authentication + // method. If you set the prefix and suffix to empty + // strings, the resulting hash will be the one found + // in phpBB user databases. + $password = substitutions( getPrefix(), $trueUser ) . "$password" . substitutions( getSuffix(), $trueUser ); + break; + } + + // after that, both methods just calculate the md5 hash + // and return that. + return array( $trueUser, md5( $password ) ); +} + +// comma separated lists of methods you support. If, for example, +// you cannot generate the hash for the bmd5 method, just +// remove it from this list. + +function getMethods() +{ + return "md5, bmd5"; +} + +//////////////////////////////////////////////////// +// The rest of the script should not be changed, +//////////////////////////////////////////////////// + +// Of course, the AA password query passes in some variables. +// The first is the query type; it can either be +// 'methods' for a list of supported methods, +// 'params' for a list of method parameters, or +// 'check' to check a user's identity. + +$query = @strtolower($_REQUEST['query'] . ''); + +switch ( $query ) +{ +case "methods": + // give lists of supported methods. It's supposed to be "methods", + // followed by a comma and/or whitespace separated list of the methods. + conclude(200, 'METHODS '. getMethods() ); + break; + +// the other two queries pass in more parameters, both have +// the 'method' parameter that tells you which method should +// be used. Well behaved servers will pick one of the methods +// you support. + +case "params": + $method = @strtolower($_REQUEST['method'] . ''); + + // give method parameter info + if ( $method == 'md5' ) + { + // give prefix and suffix + conclude( 200, "PREFIX " . getPrefix() . "\nSUFFIX " . getSuffix() ); + } + + if ( $method == 'bmd5' ) + { + // bmd5 does not support or need extra parameters. + conclude(200 , '' ); + } + + // we know nothing about this. + conclude(404 , 'UNKNOWN_METHOD' ); + break; + +case "check": + $method = @strtolower($_REQUEST['method'] . ''); + + // the last query passes in the username to check, + $user = @$_REQUEST['user'] . ''; + + // a salt value (128 bit hexcoded) + $salt = @$_REQUEST['salt'] . ''; + + // and a hash value the AA client has computed. + $hash = @$_REQUEST['hash'] . ''; + + // we're supposed to check whether that hash is correct; + // to do so, we need to do the same operations to the + // password the client has done. + + // first, the client computed a hash of the password + // with method-specific rules. <TV cook mode> we have + // already prepared that here. </TV cook mode>. + $userInfo = getPasswordHash( $user, $method ); + + // check if user exists in the first place. + if ( $userInfo == NULL ) + { + conclude(404, 'UNKNOWN_USER ' . $user ); + } + + // unpack user info + $trueUser = $userInfo[0]; + $correctPasswordHash = $userInfo[1]; + + // the operations the AA client did were not on the hex-encoded + // hashes we have so far, but on binary packed variants thereof: + $packedSalt = pack("H*", $salt); + $correctPackedPasswordHash = pack('H*', $correctPasswordHash); + + // the client then simply calculated the MD5 sum of the two + // concatenated packed values. + $correctHash = md5($correctPackedPasswordHash . $packedSalt); + + // well, let's see if the client got it right! + if (strcasecmp($hash, $correctHash) === 0) + { + // he did! Return OK, followed by the user's full name. + conclude(200, 'PASSWORD_OK ' . $trueUser . '@' . $authority ); + } + + // he didn't. + conclude(401, 'PASSWORD_FAIL' ); + + // That's it. Note that any response other that a text beginning + // with "PASSWORD_OK" and a 200 return code will be interpreted + // by the server as an error and authentication will fail. + + // String comparisons for the control words (METHODS, PASSWORD_OK) + // are case-insensitive on the server. We just like to return them + // as caps becasue that looks more like CONTOL_CODES. + break; + +default: + // we don't know what the server wants from us + // if execution ends up here. + conclude(404, 'UNKNOWN_QUERY'); +} + +?> Copied: armagetronad/trunk/armagetronad/config/settings_authentication.cfg (from rev 7723, armagetronad/branches/0.2.8/armagetronad/config/settings_authentication.cfg) =================================================================== --- armagetronad/trunk/armagetronad/config/settings_authentication.cfg (rev 0) +++ armagetronad/trunk/armagetronad/config/settings_authentication.cfg 2008-02-04 19:48:35 UTC (rev 7727) @@ -0,0 +1,419 @@ +######################################################################### +# IMPORTANT: Users should NOT edit this file. Instead, copy the +# lines you want to change into a new file named autoexec.cfg +# ( either here or in your var directory ). +# This file will be overwritten when you upgrade, autoexec.cfg won't. +# Be sure to save the file as plain text, not rich text, especially +# if you're using TextEdit on a Mac. +######################################################################### + +######################################################################### +# +# Policies +# +######################################################################### + +# As all Armagetron subsystems, Authentication is complex and has many +# options for you to tweak. The policies for the default settings were +# chosen with the following priorities: +# 1. Compatibility with old clients +# 2. Security +# 3. General usability +# If you are a very security aware person, you will probably disagree +# with the priority choilce of 1. vs 2, and want to get maximal security, +# even if that means old clients will not be able to authenticate on +# your server; in this case, uncomment the following line: + +# HASH_METHOD_BLACKLIST bmd5 + +# this will disable the hash protocol clients up to 0.2.8.2.1 knew as +# the only one, which is vulnerable to relatively easy man in the +# middle attacks. New clients will, by default, refuse to use it, so +# if the the admins on your server are well educated and protect their +# login data with all means available to them, which includes using an +# up-to-date client, you should be safe even without this setting. +# You may get the occasional faked login from a regular player, though. + +######################################################################### +# +# Local Accounts +# +######################################################################### + +# To help your local users store their passwords, you should change the +# following settings to something server-specific: + +MD5_PREFIX %u: +MD5_SUFFIX :arma + +# those are strings that are appended/prepended to the password before +# the hash function is applied to them. So far, only the md5 protocol +# supports them, bmd5 ignores them. If you put a %u into the strings, +# it will be replaced by the username. This helps combat precomputation +# attacks; for team accounts, it will force the password to be kept in +# memory in plain text, though (not much of a problem). +# You need to set these up before you define the accounts. + +# The following commands are available for you to create local accounts: + +# LOCAL_USER <user name> <user password> + +# Creates an account for a single player. You should restrict the username +# to ASCII characters, best lowercase letters and numbers, and avoid spaces +# and the symbols @, #, \, :, and %. They will still work, but look ugly +# in the logs and on the screen because they all need to get escaped. +# Spaces in the username, if you absolutely must have them, need to +# be quoted or escaped, the user "Foo Bar" can get an account with either +# LOCAL_USER "Foo Bar" <password> +# or +# LOCAL_USER Foo\ Bar <password> +# You can get a literal \ into a usename by putting it there twice. + +# When logged in, local user accounts will appear as <user name>@ in the logs +# and on the screen, and they will have "Local" access rights by default. + +# You can also define accounts for whole teams with + +# LOCAL_TEAM <team name> <team password> + +# Those accouts will allow login from all usernames with a name starting with +# the team name. Users logged in via such an account will appear as +# <user name>@L_TEAM and get the access rights of "Team Member", more +# about that later. Accounts of this type are intended to be used for organized +# tournaments. + +# You can remove both kinds of accounts with USER_REMOVE. + +######################################################################### +# +# Remote Accounts +# +######################################################################### + +# We support a distributed authentication system where a user has to only get +# an account at the authority of his choice and use that to authenticate with +# on all participating servers. By default, this system is disabled. Enable +# it by changing the following setting to 1. + +GLOBAL_ID 0 + +# Your server will then make connection to the remote authentication servers +# every time a user will try to authenticate; those connections will happen +# in the background and should not cause too much extra lag. + +# Accounts from remote authentication servers will appear as +# <user name>@<authority> in your logs. + +# Maybe you don't want to accept logins from all authorities. If you want to +# exclude some, put them into this comma separated list: + +AUTHORITY_BLACKLIST + +# If you only want to accept logins from a selected group of authorities, put +# them into this comma separated list: + +AUTHORITY_WHITELIST + +######################################################################### +# +# Access Rights +# +######################################################################### + +# The old, single password inteface to the /admin command is disabled +# when you compile a server with this authentication. Instead, you +# can assign access rights to individual players with + +# USER_LEVEL <user name> <level> + +# The user name is the user's full authentication name as it appears in +# your logs, with all the escapes and character encodings; the "Foo Bar@" +# user from the example above would usually appear as Foo\_Bar@, and that +# is how you need to put him there. The level is the numberic access level; +# lower values are better. The predefined meanings (of course, you can +# disagree and define your own) of these are: + +# Level Meaning Details +# 0 Owner The owner of the server. Commands entered on the +# server console are executed with these rights. +# 1 Admin A server administrator. By default, almost as +# powerful as the owner himself. +# 2 Moderator A server moderator. Is still allowed to use /admin, +# but is restricted to player management commands. +# 7 Team Leader Leader of a team. By default, no admin rights at all. +# 8 Team Member Member of a team. Local team accounts get this level. +# 12 Local User Players with local accounts get this level. +# 15 Authenticated Players with remote accounts get this level. +# 20 Program Unauthenticated players. + +# As you see, lower numeric values mean more access rights. When we say +# "a user needs at least level X to do Y", that means his numeric level +# needs to be smaller or equal than X. + +# Remote (Global ID) accounts run a slightly higher risk of getting +# compromised than local accounts (simpy due to the fact that they +# will get used more often in more locations), so you should restrict +# Admin and Moderator rights to local accounts. To still have your +# Admins and Moderators appear with their Global ID accounts in your +# logs, use this little trick: define them a local account, give +# the rights to that, and define an alias for the local account: + +# LOCAL_USER z-man <password> +# USER_LEVEL z-man@ 1 +# USER_ALIAS z-man@ Z-Man@forums + +# When your admin then logs in to your server under his global account, +# nothing special happens; only when he uses your local account, he +# will get the access rights, and apart from that, there will be no +# differences; he still wil appear under his global account. + +# You can modifiy the minimal access rights required to do certain things. +# First, there are the administrative chat commands. To use /admin, you +# need to be at least + +ACCESS_LEVEL_ADMIN 2 + +# To use the /op, /dop, /promote and /demote ad-hoc access level modifying +# commands, you need ot have at least + +ACCESS_LEVEL_OP 7 + +# and these commands cannot raise the level of a user above + +ACCESS_LEVEL_OP_MAX 2 + +# (and of course, not above the player issuing these commands.) + +# To manage teams with the /lock, /unlock, /invite and /univite commands +# in all circumstances, you need this access level: + +ACCESS_LEVEL_TEAM 7 + +# As an emergency feature, /unlock and /invite are also always available +# to the players with the highest access level of a team. + +# To play on the server, you need to be at least at + +ACCESS_LEVEL_PLAY 20 + +# However, if at leat + +ACCESS_LEVEL_PLAY_SLIDERS 4 + +# users of a higher access level than you want to play, and +# your level is below + +ACCESS_LEVEL_PLAY_SLIDING 20 + +# you still will not be able to play. This is for servers with +# flexible tournament schedules, there you'll want to raise +# it to the level of 8 (Team Member), so that once some members +# of teams authorized to play on your server log in, all other +# players get removed. + +# To be able to chat, you need at least this level: + +ACCESS_LEVEL_CHAT 20 + +# If you don't have that, everyone on the server will be reminded +# that you want to chat at most every + +ACCESS_LEVEL_CHAT_TIMEOUT 60 + +# seconds. + +# If you are spectating a game and your access level is at least + +ACCESS_LEVEL_SPY_TEAM 2 + +#, you will see all /team messages. And if your level is at least + +ACCESS_LEVEL_SPY_MSG 0 + +# (no need to be a spectator), you will also see the /msg messages. + +# Having sufficient rights to use /admin does not entitle you to +# use all of the commands; they need to be unlocked for you. +# By default, most Admins can use all commands. To change the +# access level required to use a command, use + +# ACCESS_LEVEL <command> <level> + +# That command itself is by default restricted to be used by +# the owner, because it is the master key to all other commands. +# Sensible commands to unlock for moderator use are: + +ACCESS_LEVEL PLAYER_MESSAGE 2 +ACCESS_LEVEL KICK 2 +ACCESS_LEVEL BAN 2 +ACCESS_LEVEL KICK_TO 2 +ACCESS_LEVEL MOVE_TO 2 +ACCESS_LEVEL KILL 2 +ACCESS_LEVEL SILENCE 2 +ACCESS_LEVEL VOICE 2 +ACCESS_LEVEL CONSOLE_MESSAGE 2 +ACCESS_LEVEL CENTER_MESSAGE 2 + +# If you want to give team members access to the basic /admin command, +# you can also allow them to manage players: + +ACCESS_LEVEL ALLOW_TEAM_CHANGE_PLAYER 7 +ACCESS_LEVEL DISALLOW_TEAM_CHANGE_PLAYER 7 + +# A very powerful command with access levels is CASACL, prounounced +# like Quetzalcoatl, your friendly Aztec God. A bit like the suid flag +# on Unix executables, the setuid system command, and not completely +# unlike the sudo shell command or, if you go very far, Access Control +# in Vista, it allows to change the access level a config file is +# executed under. If you put + +# CASACL <required access level> <elevated access level> + +# into a configuration file, and a remote admin with at least the rights +# <required access level> orders to include that file, the commands after +# the CASACL command will be executed as if the user had access level +# <elevated access level>. Otherwise, script execution is aborted. +# The effect carries on to other config files included by the one with +# the CASACL command, but wears off as soon as processing the file with +# the command is done. Especially, since every command given as remote +# admin directly is considered one file, "/admin CASACL 20 0" will elevate +# the rights to Owner, but since no second command can be issued on the +# same line, nothing further happens. + +# We recommend you put a CASACL command at the top of every configuration +# file your remote administrators are going to include; it serves two +# purposes then: it guards the file from unauthorized inclusion, and +# it makes sure all the commands in the file work whenever the initial +# CASACL command is passed, provided you test it once with any account. +# This avoids scripts that only work partially and leave your server +# in an unhealthy state. + +# Oh yeah, CASACL is short for Check And Set ACcess Level. + +######################################################################### +# +# Chat Commands +# +######################################################################### + +# They have been mentioned in the previous section, so why not document +# them here? The following chat commands are available to authenticated +# users of high enough access level: + +# /admin <command> + +# executes the console command <command> with the access rights of +# the invoking user. + + +# /op <player name> <optional access level> + +# gives another player a higher access level; the level defaults to the +# level one lower than the caller's access level, which is also the maximal +# possible level. + +# /deop <player name> + +# reverses /op; it takes away a player's access level, effectively making +# him unauthenticated again. Only works on players of lower access level than +# the invoker, of course. + +# /promote <player name> <optional steps> + +# elevates a player's access level the given number of steps (default: one). + +# /demomote <player name> <optional steps> + +# lowers a player's access level the given number of steps (default: one). + +# Of course, you can't promote or demote someone of a higher access levle than +# yourself, and you can't raise a player's access level to more than one level +# below yours with either command. + + +# /lock + +# Locks your current team. Nobody can join it any more on their own. +# To let someone in, you need to invoke + +# /invite <player name> + +# From that moment on, the player is allowed to join you. Another effect +# of /inivte, even if your team is not locked, is that the invited player +# can read all of your team's /team messages. Invitations are permanent +# until revoked. That means a player who is invited into your team can +# join and leave it freely without further need to /invite him again. +# Players who were on the team when you /locked it are not automatically +# invited when they leave on their own account. + +# /uninvite <player name> + +# reverses /invite. The invitation is revoked, the player can no longer +# join you, and if he currently is on your team, he will be thrown out. + +# /unlock + +# makes your team available for everyone to join again. + + +######################################################################### +# +# Various +# +######################################################################### + +# The log format in ladderlog.txt is picked so that no unauthenticated +# user can ever appear under the same name as an authenticated user. To +# achieve that, @ signs are escaped for unauthenticated users. That +# changes their names relative to the way they appeared in older versions +# of the server. If you rather want to keep the names of unauthenticated +# players as they were before, change this to 1: + +LEGACY_LOG_NAMES 0 + +# Then, instead of mangling unauthenticated names, the authenticated names +# get a 0: prepended before them. + +# Really, really stupid users can be banned via their user ID with + +# BAN_USER <user> + +# Players of average intellect will not be stopped from playing by this, +# but they won't appear in your logs as authenticated and won't collect +# rating points for their account, so maybe this is not so useless as +# it seems. You can revert a ban with + +# UNBAN_USER <user> + +# and get a list with + +# BAN_USER_LIST + +# You can reserve a screen name to a certain user: + +# RESERVE_SCREEN_NAME <user> <screen name> + +# All other players, authenticated or not, will not be able to change their +# screen name to the picked name, then.The command is of course only +# of use if you have set ALLOW_IMPOSTORS to 0. + +# You can bend authenticated user names around with + +# USER_ALIAS <user> <alias> + +# after doing that, a player who authenticates as <user> will appear +# as <alias>. He will get granted the access rights you gave both +# IDs. + +# By default, the authentication names of all players are visible to +# everyone. You can grant your players a certain degree of anonymity +# by hiding the user names of all players of a certain maximal access +# level with + +ACCESS_LEVEL_HIDE_OF 15 + +# However, to users of the minimal access level + +ACCESS_LEVEL_HIDE_TO 2 + +# , all user names are shown at all times. Modified: armagetronad/trunk/armagetronad/config/settings_dedicated.cfg =================================================================== --- armagetronad/trunk/armagetronad/config/settings_dedicated.cfg 2008-02-04 19:10:15 UTC (rev 7726) +++ armagetronad/trunk/armagetronad/config/settings_dedicated.cfg 2008-02-04 19:48:35 UTC (rev 7727) @@ -101,6 +101,15 @@ ############################################################################################ # +# Authentication +# +############################################################################################ + +# if you compiled your server with authentication enabled, you can uncomment the following line: +# SINCLUDE settings_authentication.cfg + +############################################################################################ +# # Public information # ############################################################################################ Modified: armagetronad/trunk/armagetronad/configure.ac =================================================================== --- armagetronad/trunk/armagetronad/configure.ac 2008-02-04 19:10:15 UTC (rev 7726) +++ armagetronad/trunk/armagetronad/configure.ac 2008-02-04 19:48:35 UTC (rev 7727) @@ -148,13 +148,13 @@ AC_ARG_ENABLE(krawall, AC_HELP_STRING([--enable-krawall], - [enable special code for the krawall gaming network (user authentification...) (default=disabled)]),, + [enable special visuals for the krawall gaming network (default=disabled)]),, enable_krawall=no) -AC_ARG_ENABLE(krawallserver, - AC_HELP_STRING([--enable-krawallserver], - [enable special code for the krawall gaming network SERVER (user database query...). dont't touch this! (default=disabled)]),, -enable_krawallserver=no) +AC_ARG_ENABLE(armathentication, + AC_HELP_STRING([--enable-armathentication], + [enable server side code for the krawall style user authentication (default=disabled)]),, +enable_armathentication=no) AC_ARG_ENABLE(automakedefaults, AC_HELP_STRING([--enable-automakedefaults], @@ -261,7 +261,7 @@ AC_DEFINE(KRAWALL,,enables krawall) fi -if test x$enable_krawallserver = xyes; then +if test x$enable_armathentication = xyes; then AC_DEFINE(KRAWALL_SERVER,,enables krawall server) fi @@ -552,8 +552,28 @@ ) # fi +dnl ************************************************* +dnl ZThread +dnl ************************************************* + +if test x$enable_armathentication = xyes; then + +test -z "$ZTHREAD_CONFIG" && ZTHREAD_CONFIG=zthread-config + +if $ZTHREAD_CONFIG --libs > /dev/null; then + CPPFLAGS="$CPPFLAGS `$ZTHREAD_CONFIG --cflags`" + LIBS="`$ZTHREAD_CONFIG --libs` $LIBS" + AC_CHECK_LIB(ZThread,xmlParseMemory, + AC_DEFINE(HAVE_LIBZTHREAD,,[Define if you have the ZThread library]), + AC_MSG_WARN([ZThread library not found; $ZTHREAD_CONFIG gave non-working linker flags.]) + ,) +else + AC_MSG_WARN([ZThread library not found; $ZTHREAD_CONFIG does not work/exist.]) fi +fi # krawall +fi # armamain + dnl ************************************************* dnl math dnl ************************************************* @@ -1102,7 +1122,7 @@ echo "" if test x$build_dedicated = xtrue -o x$armamaster = xtrue ; then -echo " Build with Krawall authentication support (server): $enable_krawallserver" +echo " Build with Armathentication support (server): $enable_armathentication" echo " Init scripts will be installed in : $initdir" echo " Dynamic data will be kept in : `eval echo ${aa_localstatedir}`" echo " PID files will be kept in : `eval echo ${rundir}`" Modified: armagetronad/trunk/armagetronad/language/deutsch.txt =================================================================== --- armagetronad/trunk/armagetronad/language/deutsch.txt 2008-02-04 19:10:15 UTC (rev 7726) +++ armagetronad/trunk/armagetronad/language/deutsch.txt 2008-02-04 19:48:35 UTC (rev 7727) @@ -2256,7 +2256,7 @@ network_warn_unknowndescriptor \n\n\nUnbekannte Nachricht (ID \1) erhalten.\n\nES IST RATSAM, EINE NEUE VERSION VON ARMAGETRON ZU BESORGEN!!!!\n network_error Netzwerkfehler.\n network_error_timeout Verbindung zu Benutzer \1 verloren.\n -network_error_shortmessage Benutzer \1 sendet eine un... [truncated message content] |
From: <z-...@us...> - 2008-02-04 19:59:14
|
Revision: 7729 http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7729&view=rev Author: z-man Date: 2008-02-04 11:59:14 -0800 (Mon, 04 Feb 2008) Log Message: ----------- Merging branch 0.2.8 from revision 7723 to 7728: ------------------------------------------------------------------------ r7726 | wrtlprnft | 2008-02-04 20:10:15 +0100 (Mon, 04 Feb 2008) | 2 lines something went wrong when i tried to compile it, added a missing _ ------------------------------------------------------------------------ r7725 | wrtlprnft | 2008-02-04 20:04:51 +0100 (Mon, 04 Feb 2008) | 2 lines sorry, forgot a language string ------------------------------------------------------------------------ r7724 | wrtlprnft | 2008-02-04 20:03:33 +0100 (Mon, 04 Feb 2008) | 2 lines replaced TEAM_ALLOW_SHUFFLE_UP by ACCESSL_LEVEL_SHUFFLE_UP if armathication is enabled ------------------------------------------------------------------------ Revision Links: -------------- http://armagetronad.svn.sourceforge.net/armagetronad/?rev=7723&view=rev Modified Paths: -------------- armagetronad/trunk/armagetronad/config/settings_authentication.cfg armagetronad/trunk/armagetronad/language/english_base.txt armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp Modified: armagetronad/trunk/armagetronad/config/settings_authentication.cfg =================================================================== --- armagetronad/trunk/armagetronad/config/settings_authentication.cfg 2008-02-04 19:49:32 UTC (rev 7728) +++ armagetronad/trunk/armagetronad/config/settings_authentication.cfg 2008-02-04 19:59:14 UTC (rev 7729) @@ -232,6 +232,12 @@ # (no need to be a spectator), you will also see the /msg messages. +# Another change when compiling aith armathication is that the old +# setting TEAM_ALLOW_SHUFFLE_UP is replaced by an access level +# that's required to shuffle up. This defaults to team members. + +ACCESS_LEVEL_SHUFFLE_UP 8 + # Having sufficient rights to use /admin does not entitle you to # use all of the commands; they need to be unlocked for you. # By default, most Admins can use all commands. To change the @@ -326,7 +332,7 @@ # lowers a player's access level the given number of steps (default: one). -# Of course, you can't promote or demote someone of a higher access levle than +# Of course, you can't promote or demote someone of a higher access level than # yourself, and you can't raise a player's access level to more than one level # below yours with either command. Modified: armagetronad/trunk/armagetronad/language/english_base.txt =================================================================== --- armagetronad/trunk/armagetronad/language/english_base.txt 2008-02-04 19:49:32 UTC (rev 7728) +++ armagetronad/trunk/armagetronad/language/english_base.txt 2008-02-04 19:59:14 UTC (rev 7729) @@ -2648,6 +2648,7 @@ access_level_spy_team_help Minimal access level you need for seeing /team messages as a spectator. access_level_spy_msg_help Minimal access level you need for seeing /msg messages directed to others. access_level_play_help Minimal access level for playing +access_level_shuffle_up_help Minimal access level for shuffling up access_level_play_sliding_help Sliding minimal access level for playing; if enough players of a higher access level than given by ACCESS_LEVEL_PLAY are online, their level will be the minimal level for play; however, it will never be higher than ACCESS_LEVEL_PLAY_SLIDING. access_level_play_sliders_help The access level required to play will only slide up if at least this many players of a higher level are online. access_level_play_changed Access level required to play changed from \1 to \2.\n @@ -2665,6 +2666,7 @@ access_level_promote \1 has been promoted to "\2" by order of \3.\n access_level_admin_denied 0xff7f7f/admin denied,0xffffff insufficient access level.\n +access_level_shuffle_up_denied You have an insufficient access level to shuffle up.\n chat_command_unknown Unknown chat command "\1".\n Modified: armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp =================================================================== --- armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp 2008-02-04 19:49:32 UTC (rev 7728) +++ armagetronad/trunk/armagetronad/src/engine/ePlayer.cpp 2008-02-04 19:59:14 UTC (rev 7729) @@ -2471,10 +2471,15 @@ static tSettingItem<REAL> se_alreadySaidTimeoutConf("SPAM_PROTECTION_REPEAT", se_alreadySaidTimeout); +#ifndef KRAWALL_SERVER // flag set to allow players to shuffle themselves up in a team static bool se_allowShuffleUp=false; static tSettingItem<bool> se_allowShuffleUpConf("TEAM_ALLOW_SHUFFLE_UP", se_allowShuffleUp); +#else +static tAccessLevel se_shuffleUpAccessLevel = tAccessLevel_TeamMember; +static tSettingItem< tAccessLevel > se_shuffleUpAccessLevelConf( "ACCESS_LEVEL_SHUFFLE_UP", se_shuffleUpAccessLevel ); +#endif // help message printed out to whoever asks for it static tString se_helpMessage(""); @@ -2953,24 +2958,35 @@ else IDWish = msg.ToInt()-1; } - + if (IDWish < 0) IDWish = 0; if (IDWish >= len) IDWish = len-1; - - if ( !se_allowShuffleUp && IDWish < IDNow ) - { - sn_ConsoleOut(tOutput("$player_noshuffleup"), p->Owner()); - return; - } - + + if(IDWish < IDNow) + { +#ifndef KRAWALL_SERVER + if ( !se_allowShuffleUp ) + { + sn_ConsoleOut(tOutput("$player_noshuffleup"), p->Owner()); + return; + } +#else + if ( !p->GetAccessLevel() > se_shuffleUpAccessLevel ) + { + sn_ConsoleOut(tOutput("$access_level_shuffle_up_denied"), p->Owner()); + return; + } +#endif + } + if( IDNow == IDWish ) { sn_ConsoleOut(tOutput("$player_noshuffle"), p->Owner()); return; } - + p->CurrentTeam()->Shuffle( IDNow, IDWish ); se_ListTeam( p, p->CurrentTeam() ); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |