--- a/.travis.yml Sun Nov 15 14:40:51 2015 +0100
+++ b/.travis.yml Sun Nov 15 14:42:59 2015 +0100
@@ -6,24 +6,18 @@
- gcc
- clang
env:
- # Default build. Release.
- BUILD_ARGS="-DCMAKE_BUILD_TYPE=Release"
- # Debug build
- BUILD_ARGS="-DCMAKE_BUILD_TYPE=Debug"
- # Everything that's optional
- - BUILD_ARGS="-DBUILD_ENGINE_C=1"
- - BUILD_ARGS="-DNOPNG=1"
- - BUILD_ARGS="-DNOVIDEOREC=1"
- - BUILD_ARGS="-DNOSERVER=1"
- - BUILD_ARGS="-DLUA_SYSTEM=0"
- - BUILD_ARGS="-DPHYSFS_SYSTEM=0"
- - BUILD_ARGS="-DGL2=1"
+ - BUILD_ARGS="-DNOSERVER=1 -DBUILD_ENGINE_C=1"
+ - BUILD_ARGS="-DNOSERVER=1 -DNOVIDEOREC=1 -DNOPNG=1"
+ - BUILD_ARGS="-DNOSERVER=1 -DLUA_SYSTEM=0 -DPHYSFS_SYSTEM=0"
matrix:
allow_failures:
# Failures we expect here
before_install:
+ - sudo add-apt-repository -y ppa:zoogie/sdl2-snapshots
- sudo apt-get update -qq
- - sudo apt-get install debhelper cmake dpkg-dev libqt4-dev qt4-qmake libphysfs-dev libsdl1.2-dev libsdl-ttf2.0-dev libsdl-mixer1.2-dev libsdl-image1.2-dev libsdl-net1.2-dev bzip2 ghc libghc-mtl-dev libghc-parsec3-dev libghc-bytestring-show-dev libghc-vector-dev libghc-zlib-dev libghc-random-dev libghc-stm-dev libghc-network-dev libghc-dataenc-dev libghc-hslogger-dev libghc-utf8-string-dev libghc-sha-dev libghc-entropy-dev liblua5.1-0-dev imagemagick fpc fp-compiler fp-units-misc libpng-dev fp-units-gfx libavcodec-dev libavformat-dev freeglut3-dev libglew1.6-dev
+ - sudo apt-get install debhelper cmake dpkg-dev libqt4-dev qt4-qmake libphysfs-dev libsdl2-dev libsdl2-ttf-dev libsdl2-mixer-dev libsdl2-image-dev libsdl2-net-dev bzip2 ghc libghc-mtl-dev libghc-parsec3-dev libghc-bytestring-show-dev libghc-vector-dev libghc-zlib-dev libghc-random-dev libghc-stm-dev libghc-network-dev libghc-dataenc-dev libghc-hslogger-dev libghc-utf8-string-dev libghc-sha-dev libghc-entropy-dev liblua5.1-0-dev imagemagick fpc fp-compiler fp-units-misc libpng-dev fp-units-gfx libavcodec-dev libavformat-dev
script:
- mkdir build && cd build && cmake $BUILD_ARGS .. && make VERBOSE=1 && make test_verbose
notifications:
--- a/CMakeLists.txt Sun Nov 15 14:40:51 2015 +0100
+++ b/CMakeLists.txt Sun Nov 15 14:42:59 2015 +0100
@@ -8,6 +8,12 @@
endif()
endforeach()
+foreach(hwpolicy CMP0026)
+ if(POLICY ${hwpolicy})
+ cmake_policy(SET ${hwpolicy} OLD)
+ endif()
+endforeach()
+
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake_modules")
include(${CMAKE_MODULE_PATH}/utils.cmake)
@@ -59,6 +65,8 @@
message(STATUS "Building ${HEDGEWARS_VERSION}-r${HEDGEWARS_REVISION} (${HEDGEWARS_HASH})")
+#io library paths
+include(${CMAKE_MODULE_PATH}/paths.cmake)
#general utilities
include(${CMAKE_MODULE_PATH}/utils.cmake)
#paths initialization
--- a/ChangeLog.txt Sun Nov 15 14:40:51 2015 +0100
+++ b/ChangeLog.txt Sun Nov 15 14:42:59 2015 +0100
@@ -5,6 +5,7 @@
* Hammer damage is now rounded down. This means it will cause NO DAMAGE to a hedgehog with less than 3 hp.
* Fixed bee not being affected by wrap world edge while still being thrown
* Fixed turn not ending when sticky mine was trapped on rubberband
+ * Various other fixes
0.9.21 -> 0.9.22
+ New Weapon / Map object: AirMine (floating mine that will follow nearby hedgehogs)
--- a/INSTALL Sun Nov 15 14:40:51 2015 +0100
+++ b/INSTALL Sun Nov 15 14:42:59 2015 +0100
@@ -2,10 +2,10 @@
- CMake >= 2.6.0
- FreePascal >= 2.2.4
- Qt >= 4.7.0
- - SDL >= 1.2.5
- - SDL_net >= 1.2.5
- - SDL_mixer >= 1.2
- - SDL_image >= 1.2
+ - SDL >= 2.0
+ - SDL_net >= 2.0
+ - SDL_mixer >= 2.0
+ - SDL_image >= 2.0
- SDL_ttf >= 2.0
- Lua = 5.1.0
- Physfs >= 2.0.0
@@ -16,7 +16,6 @@
- hslogger package
For videorecording:
- FFmpeg or LibAV
- - GLUT (when SDL < 2)
For compressed screenshots:
- libpng
--- a/QTfrontend/CMakeLists.txt Sun Nov 15 14:40:51 2015 +0100
+++ b/QTfrontend/CMakeLists.txt Sun Nov 15 14:42:59 2015 +0100
@@ -20,8 +20,10 @@
message(FATAL_ERROR "This version of Qt is known *not* to work, please update or use a lower version")
endif()
-find_package(SDL1or2) #video in SDLInteraction
-find_package(SDL_mixer REQUIRED) #audio in SDLInteraction
+find_package(SDL2 REQUIRED)
+find_package(SDL2_mixer REQUIRED) #audio in SDLInteraction
+include_directories(${SDL2_INCLUDE_DIR})
+include_directories(${SDL2MIXER_INCLUDE_DIR})
if(LIBAV_FOUND)
add_definitions(-DVIDEOREC -D__STDC_CONSTANT_MACROS)
@@ -60,8 +62,6 @@
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/ui/widget)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/util)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/util/platform)
-include_directories(${SDL_INCLUDE_DIR})
-include_directories(${SDLMIXER_INCLUDE_DIR})
include_directories(BEFORE ${PHYSFS_INCLUDE_DIR})
include_directories(BEFORE ${PHYSLAYER_INCLUDE_DIR})
include_directories(${LUA_INCLUDE_DIR}) #brought by physlayer hwpacksmounter.h
@@ -204,13 +204,16 @@
list(APPEND HW_LINK_LIBS
physfs physlayer
${QT_LIBRARIES}
- ${SDL_LIBRARY}
- ${SDLMIXER_LIBRARY}
+ )
+
+list(APPEND HW_LINK_LIBS
+ ${SDL2_LIBRARY}
+ ${SDL2MIXER_LIBRARY}
)
if(WIN32 AND NOT UNIX)
- if(NOT SDL_LIBRARY)
- list(APPEND HW_LINK_LIBS SDL)
+ if(NOT SDL2_LIBRARY)
+ list(APPEND HW_LINK_LIBS SDL2)
endif()
list(APPEND HW_LINK_LIBS
--- a/QTfrontend/game.cpp Sun Nov 15 14:40:51 2015 +0100
+++ b/QTfrontend/game.cpp Sun Nov 15 14:42:59 2015 +0100
@@ -17,7 +17,6 @@
*/
#include <QApplication>
-#include <QClipboard>
#include <QString>
#include <QCheckBox>
@@ -261,18 +260,6 @@
.arg(QString::fromUtf8(msg.mid(2).left(size - 4))));
return;
}
- case 'y':
- {
- // copy string to clipboard
- QApplication::clipboard()->setText(QString::fromUtf8(msg.mid(2)));
- break;
- }
- case 'Y':
- {
- // paste clipboard to game
- SendIPC(QString("Y").toAscii() + QApplication::clipboard()->text().toUtf8().left(250).replace('\n', ' '));
- break;
- }
case 'i':
{
emit GameStats(msg.at(2), QString::fromUtf8(msg.mid(3)));
--- a/QTfrontend/gameuiconfig.cpp Sun Nov 15 14:40:51 2015 +0100
+++ b/QTfrontend/gameuiconfig.cpp Sun Nov 15 14:42:59 2015 +0100
@@ -86,10 +86,11 @@
else Form->ui.pageOptions->CBResolution->setCurrentIndex(t);
// Default the windowed resolution to 5/6 of the screen size
- int screenWidth = SDL_GetVideoInfo()->current_w * 5 / 6;
- int screenHeight = SDL_GetVideoInfo()->current_h * 5 / 6;
- QString widthStr; widthStr.setNum(screenWidth);
- QString heightStr; heightStr.setNum(screenHeight);
+ QSize screenSize = SDLInteraction::instance().getCurrentResolution();
+ screenSize *= 5.0 / 6;
+
+ QString widthStr = QString::number(screenSize.width());
+ QString heightStr = QString::number(screenSize.height());
QString wWidth = value("video/windowedWidth", widthStr).toString();
QString wHeight = value("video/windowedHeight", heightStr).toString();
// If left blank reset the resolution to the default
--- a/QTfrontend/main.cpp Sun Nov 15 14:40:51 2015 +0100
+++ b/QTfrontend/main.cpp Sun Nov 15 14:42:59 2015 +0100
@@ -37,6 +37,8 @@
#include "FileEngine.h"
#include "MessageDialog.h"
+#include "SDLInteraction.h"
+
#ifdef _WIN32
#include <Shlobj.h>
#elif defined __APPLE__
@@ -154,6 +156,8 @@
cocoaInit = new CocoaInitializer(); // Creates the autoreleasepool preventing cocoa object leaks on OS X.
#endif
+ SDLInteraction::instance();
+
HWApplication app(argc, argv);
app.setAttribute(Qt::AA_DontShowIconsInMenus,false);
--- a/QTfrontend/ui/widget/about.cpp Sun Nov 15 14:40:51 2015 +0100
+++ b/QTfrontend/ui/widget/about.cpp Sun Nov 15 14:42:59 2015 +0100
@@ -101,14 +101,17 @@
libinfo.append(QString(tr("Unknown Compiler")).arg(__VERSION__) + QString("<br>"));
#endif
- const SDL_version *sdl_ver = SDL_Linked_Version();
- libinfo.append(QString("<a href=\"http://www.libsdl.org/\">SDL</a> version: %1.%2.%3<br>")
+ const SDL_version *sdl_ver;
+ SDL_version sdl_version;
+ SDL_GetVersion(&sdl_version);
+ sdl_ver = &sdl_version;
+ libinfo.append(QString("<a href=\"http://www.libsdl.org/\">SDL2</a> version: %1.%2.%3<br>")
.arg(sdl_ver->major)
.arg(sdl_ver->minor)
.arg(sdl_ver->patch));
const SDL_version *sdlmixer_ver = Mix_Linked_Version();
- libinfo.append(QString("<a href=\"http://www.libsdl.org/\">SDL_mixer</a> version: %1.%2.%3<br>")
+ libinfo.append(QString("<a href=\"http://www.libsdl.org/\">SDL2_mixer</a> version: %1.%2.%3<br>")
.arg(sdlmixer_ver->major)
.arg(sdlmixer_ver->minor)
.arg(sdlmixer_ver->patch));
--- a/QTfrontend/util/LibavInteraction.cpp Sun Nov 15 14:40:51 2015 +0100
+++ b/QTfrontend/util/LibavInteraction.cpp Sun Nov 15 14:42:59 2015 +0100
@@ -33,8 +33,11 @@
#include "HWApplication.h"
// compatibility section
+#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(54, 8, 0)
+#define av_codec_is_encoder(x) x->encode
+#endif
+
#if LIBAVCODEC_VERSION_MAJOR < 55
-#define av_codec_is_encoder(x) x->encode
#define AVCodecID CodecID
#endif
--- a/QTfrontend/util/SDLInteraction.cpp Sun Nov 15 14:40:51 2015 +0100
+++ b/QTfrontend/util/SDLInteraction.cpp Sun Nov 15 14:42:59 2015 +0100
@@ -85,19 +85,15 @@
{
QStringList result;
- SDL_Rect **modes;
+ int modesNumber = SDL_GetNumDisplayModes(0);
+ SDL_DisplayMode mode;
- modes = SDL_ListModes(NULL, SDL_FULLSCREEN);
-
- if((modes == (SDL_Rect **)0) || (modes == (SDL_Rect **)-1))
+ for(int i = 0; i < modesNumber; ++i)
{
- result << "640x480";
- }
- else
- {
- for(int i = 0; modes[i]; ++i)
- if ((modes[i]->w >= 640) && (modes[i]->h >= 480))
- result << QString("%1x%2").arg(modes[i]->w).arg(modes[i]->h);
+ SDL_GetDisplayMode(0, i, &mode);
+
+ if ((mode.w >= 640) && (mode.h >= 480))
+ result << QString("%1x%2").arg(mode.w).arg(mode.h);
}
return result;
@@ -108,6 +104,9 @@
{
QStringList result;
+#if SDL_VERSION_ATLEAST(2, 0, 0)
+// TODO or not TODO?
+#else
int i = 0;
while(i < 1024 && sdlkeys[i][1][0] != '\0')
i++;
@@ -181,7 +180,8 @@
// Terminate the list
sdlkeys[i][0][0] = '\0';
- sdlkeys[i][1][0] = '\0';
+ sdlkeys[i][1][0] = '\0';
+#endif
}
@@ -243,7 +243,7 @@
if (!m_audioInitialized) return;
if (m_music == NULL)
- m_music = Mix_LoadMUS_RW(PHYSFSRWOPS_openRead(m_musicTrack.toLocal8Bit().constData()));
+ m_music = Mix_LoadMUS_RW(PHYSFSRWOPS_openRead(m_musicTrack.toLocal8Bit().constData()), 0);
Mix_VolumeMusic(MIX_MAX_VOLUME/4);
Mix_FadeInMusic(m_music, -1, 1750);
@@ -264,3 +264,12 @@
m_isPlayingMusic = false;
}
+
+QSize SDLInteraction::getCurrentResolution()
+{
+ SDL_DisplayMode mode;
+
+ SDL_GetDesktopDisplayMode(0, &mode);
+
+ return QSize(mode.w, mode.h);
+}
--- a/QTfrontend/util/SDLInteraction.h Sun Nov 15 14:40:51 2015 +0100
+++ b/QTfrontend/util/SDLInteraction.h Sun Nov 15 14:42:59 2015 +0100
@@ -27,7 +27,15 @@
#include <QMap>
#include <QStringList>
+#include <QSize>
+// workaround some strange Qt and SLD2 interaction
+#ifdef Q_OS_MAC
+# ifdef MAC_OS_X_VERSION_MIN_REQUIRED
+# undef MAC_OS_X_VERSION_MIN_REQUIRED
+# define MAC_OS_X_VERSION_MIN_REQUIRED MAC_OS_X_VERSION_10_6
+# endif
+#endif
#include "SDL_mixer.h"
/**
@@ -103,6 +111,8 @@
/// Fades out and stops the background music (if playing).
void stopMusic();
+
+ QSize getCurrentResolution();
};
--- a/README.md Sun Nov 15 14:40:51 2015 +0100
+++ b/README.md Sun Nov 15 14:42:59 2015 +0100
@@ -1,6 +1,8 @@
Hedgewars - a turn based strategy game.
=======================================
+[![Build Status](https://travis-ci.org/hedgewars/hw.svg)](https://travis-ci.org/hedgewars/hw)
+
Copyright 2004-2015 Andrey Korotaev <unC0Rr@gmail.com> and others.
See QTfrontend/res/html/about.html and CREDITS for a complete list of authors.
--- a/cmake_modules/CheckHaskellModuleExists.cmake Sun Nov 15 14:40:51 2015 +0100
+++ b/cmake_modules/CheckHaskellModuleExists.cmake Sun Nov 15 14:42:59 2015 +0100
@@ -11,7 +11,7 @@
macro(CHECK_HASKELL_MODULE_EXISTS MODULE FUNCTION PARAMCOUNT LIBRARY)
set(VARIABLE "HS_MODULE_${LIBRARY}_${FUNCTION}")
- if("${VARIABLE}" MATCHES "^${VARIABLE}$")
+ if(${VARIABLE} MATCHES ^${VARIABLE}$)
message(STATUS "Looking for ${FUNCTION} in ${MODULE}")
set(PARAMETERS "")
--- a/cmake_modules/FindSDL1or2.cmake Sun Nov 15 14:40:51 2015 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,24 +0,0 @@
-find_package(SDL QUIET)
-
-if(NOT SDL_FOUND)
- find_package(SDL2 REQUIRED)
- set(SDL_INCLUDE_DIR ${SDL2_INCLUDE_DIR})
- set(SDL_LIBRARY ${SDL2_LIBRARY})
-endif()
-
-if(NOT SDL_VERSION)
- #find which version of SDL we have
- find_file(sdlversion_h SDL_version.h ${SDL_INCLUDE_DIR})
- if(sdlversion_h)
- file(STRINGS ${sdlversion_h} sdl_majorversion_tmp REGEX "SDL_MAJOR_VERSION[\t' ']+[0-9]+")
- file(STRINGS ${sdlversion_h} sdl_minorversion_tmp REGEX "SDL_MINOR_VERSION[\t' ']+[0-9]+")
- file(STRINGS ${sdlversion_h} sdl_patchversion_tmp REGEX "SDL_PATCHLEVEL[\t' ']+[0-9]+")
- string(REGEX MATCH "([0-9]+)" sdl_majorversion "${sdl_majorversion_tmp}")
- string(REGEX MATCH "([0-9]+)" sdl_minorversion "${sdl_minorversion_tmp}")
- string(REGEX MATCH "([0-9]+)" sdl_patchversion "${sdl_patchversion_tmp}")
- set(SDL_VERSION "${sdl_majorversion}.${sdl_minorversion}.${sdl_patchversion}")
- endif()
-endif()
-
-mark_as_advanced(sdlversion_h sdl_majorversion sdl_minorversion sdl_patchversion)
-
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/cmake_modules/FindSDL2_image.cmake Sun Nov 15 14:42:59 2015 +0100
@@ -0,0 +1,88 @@
+# - Locate SDL2_image library
+# This module defines:
+# SDL2_IMAGE_LIBRARIES, the name of the library to link against
+# SDL2_IMAGE_INCLUDE_DIRS, where to find the headers
+# SDL2_IMAGE_FOUND, if false, do not try to link against
+# SDL2_IMAGE_VERSION_STRING - human-readable string containing the version of SDL2_image
+#
+# For backward compatiblity the following variables are also set:
+# SDL2IMAGE_LIBRARY (same value as SDL2_IMAGE_LIBRARIES)
+# SDL2IMAGE_INCLUDE_DIR (same value as SDL2_IMAGE_INCLUDE_DIRS)
+# SDL2IMAGE_FOUND (same value as SDL2_IMAGE_FOUND)
+#
+# $SDL2DIR is an environment variable that would
+# correspond to the ./configure --prefix=$SDL2DIR
+# used in building SDL2.
+#
+# Created by Eric Wing. This was influenced by the FindSDL2.cmake
+# module, but with modifications to recognize OS X frameworks and
+# additional Unix paths (FreeBSD, etc).
+
+#=============================================================================
+# Copyright 2005-2009 Kitware, Inc.
+# Copyright 2012 Benjamin Eikel
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+# (To distribute this file outside of CMake, substitute the full
+# License text for the above reference.)
+
+if(NOT SDL2_IMAGE_INCLUDE_DIR AND SDL2IMAGE_INCLUDE_DIR)
+ set(SDL2_IMAGE_INCLUDE_DIR ${SDL2IMAGE_INCLUDE_DIR} CACHE PATH "directory cache
+entry initialized from old variable name")
+endif()
+find_path(SDL2_IMAGE_INCLUDE_DIR SDL_image.h
+ HINTS
+ ENV SDL2IMAGEDIR
+ ENV SDL2DIR
+ PATH_SUFFIXES include/SDL2 include
+)
+
+if(NOT SDL2_IMAGE_LIBRARY AND SDL2IMAGE_LIBRARY)
+ set(SDL2_IMAGE_LIBRARY ${SDL2IMAGE_LIBRARY} CACHE FILEPATH "file cache entry
+initialized from old variable name")
+endif()
+find_library(SDL2_IMAGE_LIBRARY
+ NAMES SDL2_image
+ HINTS
+ ENV SDL2IMAGEDIR
+ ENV SDL2DIR
+ PATH_SUFFIXES lib
+)
+
+if(SDL2_IMAGE_INCLUDE_DIR AND EXISTS "${SDL2_IMAGE_INCLUDE_DIR}/SDL2_image.h")
+ file(STRINGS "${SDL2_IMAGE_INCLUDE_DIR}/SDL2_image.h" SDL2_IMAGE_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL2_IMAGE_MAJOR_VERSION[ \t]+[0-9]+$")
+ file(STRINGS "${SDL2_IMAGE_INCLUDE_DIR}/SDL2_image.h" SDL2_IMAGE_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL2_IMAGE_MINOR_VERSION[ \t]+[0-9]+$")
+ file(STRINGS "${SDL2_IMAGE_INCLUDE_DIR}/SDL2_image.h" SDL2_IMAGE_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL2_IMAGE_PATCHLEVEL[ \t]+[0-9]+$")
+ string(REGEX REPLACE "^#define[ \t]+SDL2_IMAGE_MAJOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_IMAGE_VERSION_MAJOR "${SDL2_IMAGE_VERSION_MAJOR_LINE}")
+ string(REGEX REPLACE "^#define[ \t]+SDL2_IMAGE_MINOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_IMAGE_VERSION_MINOR "${SDL2_IMAGE_VERSION_MINOR_LINE}")
+ string(REGEX REPLACE "^#define[ \t]+SDL2_IMAGE_PATCHLEVEL[ \t]+([0-9]+)$" "\\1" SDL2_IMAGE_VERSION_PATCH "${SDL2_IMAGE_VERSION_PATCH_LINE}")
+ set(SDL2_IMAGE_VERSION_STRING ${SDL2_IMAGE_VERSION_MAJOR}.${SDL2_IMAGE_VERSION_MINOR}.${SDL2_IMAGE_VERSION_PATCH})
+ unset(SDL2_IMAGE_VERSION_MAJOR_LINE)
+ unset(SDL2_IMAGE_VERSION_MINOR_LINE)
+ unset(SDL2_IMAGE_VERSION_PATCH_LINE)
+ unset(SDL2_IMAGE_VERSION_MAJOR)
+ unset(SDL2_IMAGE_VERSION_MINOR)
+ unset(SDL2_IMAGE_VERSION_PATCH)
+endif()
+
+set(SDL2_IMAGE_LIBRARIES ${SDL2_IMAGE_LIBRARY})
+set(SDL2_IMAGE_INCLUDE_DIRS ${SDL2_IMAGE_INCLUDE_DIR})
+
+include(FindPackageHandleStandardArgs)
+
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2_image
+ REQUIRED_VARS SDL2_IMAGE_LIBRARIES SDL2_IMAGE_INCLUDE_DIRS
+ VERSION_VAR SDL2_IMAGE_VERSION_STRING)
+
+# for backward compatiblity
+set(SDL2IMAGE_LIBRARY ${SDL2_IMAGE_LIBRARIES})
+set(SDL2IMAGE_INCLUDE_DIR ${SDL2_IMAGE_INCLUDE_DIRS})
+set(SDL2IMAGE_FOUND ${SDL2_IMAGE_FOUND})
+
+mark_as_advanced(SDL2_IMAGE_LIBRARY SDL2_IMAGE_INCLUDE_DIR)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/cmake_modules/FindSDL2_mixer.cmake Sun Nov 15 14:42:59 2015 +0100
@@ -0,0 +1,88 @@
+# - Locate SDL2_mixer library
+# This module defines:
+# SDL2_MIXER_LIBRARIES, the name of the library to link against
+# SDL2_MIXER_INCLUDE_DIRS, where to find the headers
+# SDL2_MIXER_FOUND, if false, do not try to link against
+# SDL2_MIXER_VERSION_STRING - human-readable string containing the version of SDL2_mixer
+#
+# For backward compatiblity the following variables are also set:
+# SDL2MIXER_LIBRARY (same value as SDL2_MIXER_LIBRARIES)
+# SDL2MIXER_INCLUDE_DIR (same value as SDL2_MIXER_INCLUDE_DIRS)
+# SDL2MIXER_FOUND (same value as SDL2_MIXER_FOUND)
+#
+# $SDL2DIR is an environment variable that would
+# correspond to the ./configure --prefix=$SDL2DIR
+# used in building SDL2.
+#
+# Created by Eric Wing. This was influenced by the FindSDL2.cmake
+# module, but with modifications to recognize OS X frameworks and
+# additional Unix paths (FreeBSD, etc).
+
+#=============================================================================
+# Copyright 2005-2009 Kitware, Inc.
+# Copyright 2012 Benjamin Eikel
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+# (To distribute this file outside of CMake, substitute the full
+# License text for the above reference.)
+
+if(NOT SDL2_MIXER_INCLUDE_DIR AND SDL2MIXER_INCLUDE_DIR)
+ set(SDL2_MIXER_INCLUDE_DIR ${SDL2MIXER_INCLUDE_DIR} CACHE PATH "directory cache
+entry initialized from old variable name")
+endif()
+find_path(SDL2_MIXER_INCLUDE_DIR SDL_mixer.h
+ HINTS
+ ENV SDL2MIXERDIR
+ ENV SDL2DIR
+ PATH_SUFFIXES include/SDL2 include
+)
+
+if(NOT SDL2_MIXER_LIBRARY AND SDL2MIXER_LIBRARY)
+ set(SDL2_MIXER_LIBRARY ${SDL2MIXER_LIBRARY} CACHE FILEPATH "file cache entry
+initialized from old variable name")
+endif()
+find_library(SDL2_MIXER_LIBRARY
+ NAMES SDL2_mixer
+ HINTS
+ ENV SDL2MIXERDIR
+ ENV SDL2DIR
+ PATH_SUFFIXES lib
+)
+
+if(SDL2_MIXER_INCLUDE_DIR AND EXISTS "${SDL2_MIXER_INCLUDE_DIR}/SDL2_mixer.h")
+ file(STRINGS "${SDL2_MIXER_INCLUDE_DIR}/SDL2_mixer.h" SDL2_MIXER_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL2_MIXER_MAJOR_VERSION[ \t]+[0-9]+$")
+ file(STRINGS "${SDL2_MIXER_INCLUDE_DIR}/SDL2_mixer.h" SDL2_MIXER_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL2_MIXER_MINOR_VERSION[ \t]+[0-9]+$")
+ file(STRINGS "${SDL2_MIXER_INCLUDE_DIR}/SDL2_mixer.h" SDL2_MIXER_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL2_MIXER_PATCHLEVEL[ \t]+[0-9]+$")
+ string(REGEX REPLACE "^#define[ \t]+SDL2_MIXER_MAJOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_MIXER_VERSION_MAJOR "${SDL2_MIXER_VERSION_MAJOR_LINE}")
+ string(REGEX REPLACE "^#define[ \t]+SDL2_MIXER_MINOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_MIXER_VERSION_MINOR "${SDL2_MIXER_VERSION_MINOR_LINE}")
+ string(REGEX REPLACE "^#define[ \t]+SDL2_MIXER_PATCHLEVEL[ \t]+([0-9]+)$" "\\1" SDL2_MIXER_VERSION_PATCH "${SDL2_MIXER_VERSION_PATCH_LINE}")
+ set(SDL2_MIXER_VERSION_STRING ${SDL2_MIXER_VERSION_MAJOR}.${SDL2_MIXER_VERSION_MINOR}.${SDL2_MIXER_VERSION_PATCH})
+ unset(SDL2_MIXER_VERSION_MAJOR_LINE)
+ unset(SDL2_MIXER_VERSION_MINOR_LINE)
+ unset(SDL2_MIXER_VERSION_PATCH_LINE)
+ unset(SDL2_MIXER_VERSION_MAJOR)
+ unset(SDL2_MIXER_VERSION_MINOR)
+ unset(SDL2_MIXER_VERSION_PATCH)
+endif()
+
+set(SDL2_MIXER_LIBRARIES ${SDL2_MIXER_LIBRARY})
+set(SDL2_MIXER_INCLUDE_DIRS ${SDL2_MIXER_INCLUDE_DIR})
+
+include(FindPackageHandleStandardArgs)
+
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2_mixer
+ REQUIRED_VARS SDL2_MIXER_LIBRARIES SDL2_MIXER_INCLUDE_DIRS
+ VERSION_VAR SDL2_MIXER_VERSION_STRING)
+
+# for backward compatiblity
+set(SDL2MIXER_LIBRARY ${SDL2_MIXER_LIBRARIES})
+set(SDL2MIXER_INCLUDE_DIR ${SDL2_MIXER_INCLUDE_DIRS})
+set(SDL2MIXER_FOUND ${SDL2_MIXER_FOUND})
+
+mark_as_advanced(SDL2_MIXER_LIBRARY SDL2_MIXER_INCLUDE_DIR)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/cmake_modules/FindSDL2_net.cmake Sun Nov 15 14:42:59 2015 +0100
@@ -0,0 +1,88 @@
+# - Locate SDL2_net library
+# This module defines:
+# SDL2_NET_LIBRARIES, the name of the library to link against
+# SDL2_NET_INCLUDE_DIRS, where to find the headers
+# SDL2_NET_FOUND, if false, do not try to link against
+# SDL2_NET_VERSION_STRING - human-readable string containing the version of SDL2_net
+#
+# For backward compatiblity the following variables are also set:
+# SDL2NET_LIBRARY (same value as SDL2_NET_LIBRARIES)
+# SDL2NET_INCLUDE_DIR (same value as SDL2_NET_INCLUDE_DIRS)
+# SDL2NET_FOUND (same value as SDL2_NET_FOUND)
+#
+# $SDL2DIR is an environment variable that would
+# correspond to the ./configure --prefix=$SDL2DIR
+# used in building SDL2.
+#
+# Created by Eric Wing. This was influenced by the FindSDL2.cmake
+# module, but with modifications to recognize OS X frameworks and
+# additional Unix paths (FreeBSD, etc).
+
+#=============================================================================
+# Copyright 2005-2009 Kitware, Inc.
+# Copyright 2012 Benjamin Eikel
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+# (To distribute this file outside of CMake, substitute the full
+# License text for the above reference.)
+
+if(NOT SDL2_NET_INCLUDE_DIR AND SDL2NET_INCLUDE_DIR)
+ set(SDL2_NET_INCLUDE_DIR ${SDL2NET_INCLUDE_DIR} CACHE PATH "directory cache
+entry initialized from old variable name")
+endif()
+find_path(SDL2_NET_INCLUDE_DIR SDL_net.h
+ HINTS
+ ENV SDL2NETDIR
+ ENV SDL2DIR
+ PATH_SUFFIXES include/SDL2 include
+)
+
+if(NOT SDL2_NET_LIBRARY AND SDL2NET_LIBRARY)
+ set(SDL2_NET_LIBRARY ${SDL2NET_LIBRARY} CACHE FILEPATH "file cache entry
+initialized from old variable name")
+endif()
+find_library(SDL2_NET_LIBRARY
+ NAMES SDL2_net
+ HINTS
+ ENV SDL2NETDIR
+ ENV SDL2DIR
+ PATH_SUFFIXES lib
+)
+
+if(SDL2_NET_INCLUDE_DIR AND EXISTS "${SDL2_NET_INCLUDE_DIR}/SDL2_net.h")
+ file(STRINGS "${SDL2_NET_INCLUDE_DIR}/SDL2_net.h" SDL2_NET_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL2_NET_MAJOR_VERSION[ \t]+[0-9]+$")
+ file(STRINGS "${SDL2_NET_INCLUDE_DIR}/SDL2_net.h" SDL2_NET_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL2_NET_MINOR_VERSION[ \t]+[0-9]+$")
+ file(STRINGS "${SDL2_NET_INCLUDE_DIR}/SDL2_net.h" SDL2_NET_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL2_NET_PATCHLEVEL[ \t]+[0-9]+$")
+ string(REGEX REPLACE "^#define[ \t]+SDL2_NET_MAJOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_NET_VERSION_MAJOR "${SDL2_NET_VERSION_MAJOR_LINE}")
+ string(REGEX REPLACE "^#define[ \t]+SDL2_NET_MINOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_NET_VERSION_MINOR "${SDL2_NET_VERSION_MINOR_LINE}")
+ string(REGEX REPLACE "^#define[ \t]+SDL2_NET_PATCHLEVEL[ \t]+([0-9]+)$" "\\1" SDL2_NET_VERSION_PATCH "${SDL2_NET_VERSION_PATCH_LINE}")
+ set(SDL2_NET_VERSION_STRING ${SDL2_NET_VERSION_MAJOR}.${SDL2_NET_VERSION_MINOR}.${SDL2_NET_VERSION_PATCH})
+ unset(SDL2_NET_VERSION_MAJOR_LINE)
+ unset(SDL2_NET_VERSION_MINOR_LINE)
+ unset(SDL2_NET_VERSION_PATCH_LINE)
+ unset(SDL2_NET_VERSION_MAJOR)
+ unset(SDL2_NET_VERSION_MINOR)
+ unset(SDL2_NET_VERSION_PATCH)
+endif()
+
+set(SDL2_NET_LIBRARIES ${SDL2_NET_LIBRARY})
+set(SDL2_NET_INCLUDE_DIRS ${SDL2_NET_INCLUDE_DIR})
+
+include(FindPackageHandleStandardArgs)
+
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2_net
+ REQUIRED_VARS SDL2_NET_LIBRARIES SDL2_NET_INCLUDE_DIRS
+ VERSION_VAR SDL2_NET_VERSION_STRING)
+
+# for backward compatiblity
+set(SDL2NET_LIBRARY ${SDL2_NET_LIBRARIES})
+set(SDL2NET_INCLUDE_DIR ${SDL2_NET_INCLUDE_DIRS})
+set(SDL2NET_FOUND ${SDL2_NET_FOUND})
+
+mark_as_advanced(SDL2_NET_LIBRARY SDL2_NET_INCLUDE_DIR)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/cmake_modules/FindSDL2_ttf.cmake Sun Nov 15 14:42:59 2015 +0100
@@ -0,0 +1,88 @@
+# - Locate SDL2_ttf library
+# This module defines:
+# SDL2_TTF_LIBRARIES, the name of the library to link against
+# SDL2_TTF_INCLUDE_DIRS, where to find the headers
+# SDL2_TTF_FOUND, if false, do not try to link against
+# SDL2_TTF_VERSION_STRING - human-readable string containing the version of SDL2_ttf
+#
+# For backward compatiblity the following variables are also set:
+# SDL2TTF_LIBRARY (same value as SDL2_TTF_LIBRARIES)
+# SDL2TTF_INCLUDE_DIR (same value as SDL2_TTF_INCLUDE_DIRS)
+# SDL2TTF_FOUND (same value as SDL2_TTF_FOUND)
+#
+# $SDL2DIR is an environment variable that would
+# correspond to the ./configure --prefix=$SDL2DIR
+# used in building SDL2.
+#
+# Created by Eric Wing. This was influenced by the FindSDL2.cmake
+# module, but with modifications to recognize OS X frameworks and
+# additional Unix paths (FreeBSD, etc).
+
+#=============================================================================
+# Copyright 2005-2009 Kitware, Inc.
+# Copyright 2012 Benjamin Eikel
+#
+# Distributed under the OSI-approved BSD License (the "License");
+# see accompanying file Copyright.txt for details.
+#
+# This software is distributed WITHOUT ANY WARRANTY; without even the
+# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+# See the License for more information.
+#=============================================================================
+# (To distribute this file outside of CMake, substitute the full
+# License text for the above reference.)
+
+if(NOT SDL2_TTF_INCLUDE_DIR AND SDL2TTF_INCLUDE_DIR)
+ set(SDL2_TTF_INCLUDE_DIR ${SDL2TTF_INCLUDE_DIR} CACHE PATH "directory cache
+entry initialized from old variable name")
+endif()
+find_path(SDL2_TTF_INCLUDE_DIR SDL_ttf.h
+ HINTS
+ ENV SDL2TTFDIR
+ ENV SDL2DIR
+ PATH_SUFFIXES include/SDL2 include
+)
+
+if(NOT SDL2_TTF_LIBRARY AND SDL2TTF_LIBRARY)
+ set(SDL2_TTF_LIBRARY ${SDL2TTF_LIBRARY} CACHE FILEPATH "file cache entry
+initialized from old variable name")
+endif()
+find_library(SDL2_TTF_LIBRARY
+ NAMES SDL2_ttf
+ HINTS
+ ENV SDL2TTFDIR
+ ENV SDL2DIR
+ PATH_SUFFIXES lib
+)
+
+if(SDL2_TTF_INCLUDE_DIR AND EXISTS "${SDL2_TTF_INCLUDE_DIR}/SDL2_ttf.h")
+ file(STRINGS "${SDL2_TTF_INCLUDE_DIR}/SDL2_ttf.h" SDL2_TTF_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL2_TTF_MAJOR_VERSION[ \t]+[0-9]+$")
+ file(STRINGS "${SDL2_TTF_INCLUDE_DIR}/SDL2_ttf.h" SDL2_TTF_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL2_TTF_MINOR_VERSION[ \t]+[0-9]+$")
+ file(STRINGS "${SDL2_TTF_INCLUDE_DIR}/SDL2_ttf.h" SDL2_TTF_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL2_TTF_PATCHLEVEL[ \t]+[0-9]+$")
+ string(REGEX REPLACE "^#define[ \t]+SDL2_TTF_MAJOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_TTF_VERSION_MAJOR "${SDL2_TTF_VERSION_MAJOR_LINE}")
+ string(REGEX REPLACE "^#define[ \t]+SDL2_TTF_MINOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_TTF_VERSION_MINOR "${SDL2_TTF_VERSION_MINOR_LINE}")
+ string(REGEX REPLACE "^#define[ \t]+SDL2_TTF_PATCHLEVEL[ \t]+([0-9]+)$" "\\1" SDL2_TTF_VERSION_PATCH "${SDL2_TTF_VERSION_PATCH_LINE}")
+ set(SDL2_TTF_VERSION_STRING ${SDL2_TTF_VERSION_MAJOR}.${SDL2_TTF_VERSION_MINOR}.${SDL2_TTF_VERSION_PATCH})
+ unset(SDL2_TTF_VERSION_MAJOR_LINE)
+ unset(SDL2_TTF_VERSION_MINOR_LINE)
+ unset(SDL2_TTF_VERSION_PATCH_LINE)
+ unset(SDL2_TTF_VERSION_MAJOR)
+ unset(SDL2_TTF_VERSION_MINOR)
+ unset(SDL2_TTF_VERSION_PATCH)
+endif()
+
+set(SDL2_TTF_LIBRARIES ${SDL2_TTF_LIBRARY})
+set(SDL2_TTF_INCLUDE_DIRS ${SDL2_TTF_INCLUDE_DIR})
+
+include(FindPackageHandleStandardArgs)
+
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2_ttf
+ REQUIRED_VARS SDL2_TTF_LIBRARIES SDL2_TTF_INCLUDE_DIRS
+ VERSION_VAR SDL2_TTF_VERSION_STRING)
+
+# for backward compatiblity
+set(SDL2TTF_LIBRARY ${SDL2_TTF_LIBRARIES})
+set(SDL2TTF_INCLUDE_DIR ${SDL2_TTF_INCLUDE_DIRS})
+set(SDL2TTF_FOUND ${SDL2_TTF_FOUND})
+
+mark_as_advanced(SDL2_TTF_LIBRARY SDL2_TTF_INCLUDE_DIR)
--- a/cmake_modules/paths.cmake Sun Nov 15 14:40:51 2015 +0100
+++ b/cmake_modules/paths.cmake Sun Nov 15 14:42:59 2015 +0100
@@ -15,7 +15,7 @@
#resource paths
if(UNIX AND NOT APPLE)
set(target_binary_install_dir "bin" CACHE PATH "install dest for binaries")
- set(target_library_install_dir "lib" CACHE PATH "install dest for libs")
+ set(target_library_install_dir "lib${LIB_SUFFIX}" CACHE PATH "install dest for libs")
string(SUBSTRING "${DATA_INSTALL_DIR}" 0 1 sharepath_start)
if(${sharepath_start} MATCHES "/")
--- a/gameServer/Actions.hs Sun Nov 15 14:40:51 2015 +0100
+++ b/gameServer/Actions.hs Sun Nov 15 14:42:59 2015 +0100
@@ -744,10 +744,6 @@
blackList <- liftM (map (recordFileName . fromJust . checkInfo) . filter (isJust . checkInfo)) allClientsS
- readyCheckersIds <- io $ do
- allci <- allClientsM rnc
- filterM (client'sM rnc (isJust . checkInfo)) allci
-
(cinfo, l) <- io $ loadReplay (fromIntegral p) blackList
when (isJust cinfo) $
mapM_ processAction [
--- a/gameServer/EngineInteraction.hs Sun Nov 15 14:40:51 2015 +0100
+++ b/gameServer/EngineInteraction.hs Sun Nov 15 14:42:59 2015 +0100
@@ -126,10 +126,10 @@
&& Set.null (keys2 Set.\\ Map.keysSet prms)
&& (not . null . drop 41 $ scheme)
&& (not . null . tail $ prms Map.! "AMMO")
- && ((B.length . head $ prms Map.! "AMMO") > 200)
+ && ((B.length . head . tail $ prms Map.! "AMMO") > 200)
mapGenTypes = ["+rnd+", "+maze+", "+drawn+", "+perlin+"]
scriptName = head . fromMaybe ["Normal"] $ Map.lookup "SCRIPT" prms
- maybeScript = let s = scriptName in if s == "Normal" then [] else [eml ["escript Scripts/Multiplayer/", s, ".lua"]]
+ maybeScript = let s = scriptName in if s == "Normal" then [] else [eml ["escript Scripts/Multiplayer/", spaces2Underlining s, ".lua"]]
maybeMap = let m = mParams Map.! "MAP" in if m `elem` mapGenTypes then [] else [eml ["emap ", m]]
scheme = tail $ prms Map.! "SCHEME"
mapgen = mParams Map.! "MAPGEN"
@@ -166,6 +166,7 @@
infRopes = ammoStr `B.index` 7 == '9'
vamp = gameFlags .&. 0x00000200 /= 0
infattacks = gameFlags .&. 0x00100000 /= 0
+ spaces2Underlining = B.map (\c -> if c == ' ' then '_' else c)
drawnMapData :: B.ByteString -> [B.ByteString]
drawnMapData =
@@ -195,6 +196,7 @@
, ("e$minesnum", 1)
, ("e$minedudpct", 1)
, ("e$explosives", 1)
+ , ("e$airmines", 1)
, ("e$healthprob", 1)
, ("e$hcaseamount", 1)
, ("e$waterrise", 1)
--- a/gameServer/OfficialServer/GameReplayStore.hs Sun Nov 15 14:40:51 2015 +0100
+++ b/gameServer/OfficialServer/GameReplayStore.hs Sun Nov 15 14:42:59 2015 +0100
@@ -38,13 +38,13 @@
pickReplayFile :: Int -> [String] -> IO String
pickReplayFile p blackList = do
- files <- liftM (filter (\f -> sameProto f && notBlacklisted f)) $ getDirectoryContents "replays"
+ files <- liftM (filter (\f -> sameProto f && notBlacklisted ("replays/" ++ f))) $ getDirectoryContents "replays"
if (not $ null files) then
return $ "replays/" ++ head files
else
return ""
where
- sameProto = (isSuffixOf ('.' : show p))
+ sameProto = isSuffixOf ('.' : show p)
notBlacklisted = flip notElem blackList
saveReplay :: RoomInfo -> IO ()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/gameServer/OfficialServer/Glicko2.hs Sun Nov 15 14:42:59 2015 +0100
@@ -0,0 +1,70 @@
+{-
+ Glicko2, as described in http://www.glicko.net/glicko/glicko2.pdf
+-}
+
+module OfficialServer.Glicko2 where
+
+data RatingData = RatingData {
+ ratingValue
+ , rD
+ , volatility :: Double
+ }
+data GameData = GameData {
+ opponentRating :: RatingData,
+ gameScore :: Double
+ }
+
+τ, ε :: Double
+τ = 0.3
+ε = 0.000001
+
+g_φ :: Double -> Double
+g_φ φ = 1 / sqrt (1 + 3 * φ^2 / pi^2)
+
+calcE :: RatingData -> GameData -> (Double, Double, Double)
+calcE oldRating (GameData oppRating s) = (
+ 1 / (1 + exp (g_φᵢ * (μᵢ - μ)))
+ , g_φᵢ
+ , s
+ )
+ where
+ μ = (ratingValue oldRating - 1500) / 173.7178
+ φ = rD oldRating / 173.7178
+ μᵢ = (ratingValue oppRating - 1500) / 173.7178
+ φᵢ = rD oppRating / 173.7178
+ g_φᵢ = g_φ φᵢ
+
+
+calcNewRating :: RatingData -> [GameData] -> RatingData
+calcNewRating oldRating [] = RatingData (ratingValue oldRating) (173.7178 * sqrt (φ ^ 2 + σ ^ 2)) σ
+ where
+ φ = rD oldRating / 173.7178
+ σ = volatility oldRating
+
+calcNewRating oldRating games = RatingData (173.7178 * μ' + 1500) (173.7178 * sqrt φ'sqr) σ'
+ where
+ _Es = map (calcE oldRating) games
+ υ = 1 / sum (map υ_p _Es)
+ υ_p (_Eᵢ, g_φᵢ, _) = g_φᵢ ^ 2 * _Eᵢ * (1 - _Eᵢ)
+ _Δ = υ * part1
+ part1 = sum (map _Δ_p _Es)
+ _Δ_p (_Eᵢ, g_φᵢ, sᵢ) = g_φᵢ * (sᵢ - _Eᵢ)
+
+ μ = (ratingValue oldRating - 1500) / 173.7178
+ φ = rD oldRating / 173.7178
+ σ = volatility oldRating
+
+ a = log (σ ^ 2)
+ f :: Double -> Double
+ f x = exp x * (_Δ ^ 2 - φ ^ 2 - υ - exp x) / 2 / (φ ^ 2 + υ + exp x) ^ 2 - (x - a) / τ ^ 2
+
+ _A = a
+ _B = if _Δ ^ 2 > φ ^ 2 + υ then log (_Δ ^ 2 - φ ^ 2 - υ) else head . dropWhile ((>) 0 . f) . map (\k -> a - k * τ) $ [1 ..]
+ fA = f _A
+ fB = f _B
+ σ' = (\(_A, _, _, _) -> exp (_A / 2)) . head . dropWhile (\(_A, _, _B, _) -> abs (_B - _A) > ε) $ iterate step5 (_A, fA, _B, fB)
+ step5 (_A, fA, _B, fB) = let _C = _A + (_A - _B) * fA / (fB - fA); fC = f _C in
+ if fC * fB < 0 then (_B, fB, _C, fC) else (_A, fA / 2, _C, fC)
+
+ φ'sqr = 1 / (1 / (φ ^ 2 + σ' ^ 2) + 1 / υ)
+ μ' = μ + φ'sqr * part1
--- a/gameServer/OfficialServer/checker.hs Sun Nov 15 14:40:51 2015 +0100
+++ b/gameServer/OfficialServer/checker.hs Sun Nov 15 14:42:59 2015 +0100
@@ -54,7 +54,7 @@
deriving Show
serverAddress = "netserver.hedgewars.org"
-protocolNumber = "49"
+protocolNumber = "51"
getLines :: Handle -> IO [B.ByteString]
getLines h = g
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/gameServer/OfficialServer/updateRating.hs Sun Nov 15 14:42:59 2015 +0100
@@ -0,0 +1,104 @@
+{-# LANGUAGE ScopedTypeVariables, OverloadedStrings #-}
+module Main where
+
+import Data.Maybe
+import Data.TConfig
+import qualified Data.ByteString.Char8 as B
+import Database.MySQL.Simple
+import Database.MySQL.Simple.QueryResults
+import Database.MySQL.Simple.Result
+import Control.Monad
+import Control.Exception
+import System.IO
+import qualified Data.Map as Map
+import Data.Time.Clock
+------
+import OfficialServer.Glicko2
+
+
+queryEpochDates = "SELECT epoch, todatetime, todatetime + INTERVAL 1 week FROM rating_epochs WHERE epoch = (SELECT MAX(epoch) FROM rating_epochs)"
+queryPreviousRatings = "SELECT v.userid, v.rating, v.rd, v.volatility FROM rating_values as v WHERE (v.epoch = (SELECT MAX(epoch) FROM rating_epochs))"
+queryGameResults =
+ "SELECT \
+ \ p.userid \
+ \ , p.place \
+ \ , COALESCE(vp.rating, 1500) \
+ \ , COALESCE(vp.rd, 350) \
+ \ , COALESCE(vp.volatility, 0.06) \
+ \ , COALESCE(vo.rating, 1500) \
+ \ , COALESCE(vo.rd, 350) \
+ \ , COALESCE(vo.volatility, 0.06) \
+ \ FROM \
+ \ (SELECT epoch, todatetime FROM rating_epochs WHERE epoch = (SELECT MAX(epoch) FROM rating_epochs)) as e \
+ \ JOIN rating_games as g ON (g.time BETWEEN e.todatetime AND e.todatetime + INTERVAL 1 WEEK - INTERVAL 1 SECOND) \
+ \ JOIN rating_players as p ON (p.gameid = g.id) \
+ \ JOIN rating_players as o ON (p.gameid = o.gameid AND p.userid <> o.userid AND (p.place = 0 OR (p.place <> o.place))) \
+ \ LEFT OUTER JOIN rating_values as vp ON (vp.epoch = e.epoch AND vp.userid = p.userid) \
+ \ LEFT OUTER JOIN rating_values as vo ON (vo.epoch = e.epoch AND vo.userid = o.userid) \
+ \ GROUP BY p.userid, p.gameid, p.place \
+ \ ORDER BY p.userid"
+insertNewRatings = "INSERT INTO rating_values (userid, epoch, rating, rd, volatility) VALUES (?, ?, ?, ?, ?)"
+insertNewEpoch = "INSERT INTO rating_epochs (epoch, todatetime) VALUES (?, ?)"
+
+mergeRatingData :: Map.Map Int (RatingData, [GameData]) -> [(Int, (RatingData, [GameData]))] -> Map.Map Int (RatingData, [GameData])
+mergeRatingData m s = foldr (unc0rry (Map.insertWith mf)) m s
+ where
+ mf (rd, gds) (_, gds2) = (rd, gds ++ gds2)
+ unc0rry f (a, b) c = f a b c
+
+calculateRatings dbConn = do
+ [(epochNum :: Int, fromDate :: UTCTime, toDate :: UTCTime)] <- query_ dbConn queryEpochDates
+ initRatingData <- (Map.fromList . map fromDBrating) `fmap` query_ dbConn queryPreviousRatings
+ gameData <- map fromGameResult `fmap` query_ dbConn queryGameResults
+ let mData = map getNewRating . Map.toList $ mergeRatingData initRatingData gameData
+ executeMany dbConn insertNewRatings $ map (toInsert epochNum) mData
+ execute dbConn insertNewEpoch (epochNum + 1, toDate)
+ return ()
+ where
+ toInsert e (i, RatingData r rd v) = (i, e + 1, r, rd, v)
+ getNewRating (a, d) = (a, uncurry calcNewRating d)
+ convPlace :: Int -> Double
+ convPlace 0 = 0.5
+ convPlace 1 = 1.0
+ convPlace 2 = 0.0
+ convPlace _ = error "Incorrect place value"
+ fromDBrating (a, b, c, d) = (a, (RatingData b c d, []))
+ fromGameResult (pid, place, prating, pRD, pvol, orating, oRD, ovol) =
+ (pid,
+ (RatingData prating pRD pvol
+ , [GameData (RatingData orating oRD ovol) $ convPlace place]))
+
+
+data DBConnectInfo = DBConnectInfo {
+ dbHost
+ , dbName
+ , dbLogin
+ , dbPassword :: B.ByteString
+ }
+
+cfgFileName :: String
+cfgFileName = "hedgewars-server.ini"
+
+
+readServerConfig :: ConnectInfo -> IO ConnectInfo
+readServerConfig ci = do
+ cfg <- readConfig cfgFileName
+ return $ ci{
+ connectHost = value "dbHost" cfg
+ , connectDatabase = value "dbName" cfg
+ , connectUser = value "dbLogin" cfg
+ , connectPassword = value "dbPassword" cfg
+ }
+ where
+ value n c = fromJust2 n $ getValue n c
+ fromJust2 n Nothing = error $ "Missing config entry " ++ n
+ fromJust2 _ (Just a) = a
+
+dbConnectionLoop mySQLConnectionInfo =
+ Control.Exception.handle (\(e :: SomeException) -> hPutStrLn stderr $ show e) $
+ bracket
+ (connect mySQLConnectionInfo)
+ close
+ calculateRatings
+
+main = readServerConfig defaultConnectInfo >>= dbConnectionLoop
--- a/hedgewars/CMakeLists.txt Sun Nov 15 14:40:51 2015 +0100
+++ b/hedgewars/CMakeLists.txt Sun Nov 15 14:42:59 2015 +0100
@@ -1,8 +1,10 @@
-find_package(SDL1or2)
-find_package(SDL_image)
-find_package(SDL_net)
-find_package(SDL_ttf)
-find_package(SDL_mixer)
+enable_language(Pascal)
+
+find_package(SDL2 REQUIRED)
+find_package(SDL2_image REQUIRED)
+find_package(SDL2_net REQUIRED)
+find_package(SDL2_ttf REQUIRED)
+find_package(SDL2_mixer REQUIRED)
include(CheckLibraryExists)
include(${CMAKE_MODULE_PATH}/utils.cmake)
@@ -122,22 +124,16 @@
#DEPENDECIES AND EXECUTABLES SECTION
if(APPLE AND (NOT BUILD_ENGINE_LIBRARY))
- #on OSX we need to provide the SDL_main() function when building as
- #executable and the entry point too
- add_subdirectory(sdlmain)
- list(APPEND HW_LINK_LIBS SDLmain)
- add_flag_append(CMAKE_Pascal_FLAGS "-k-lsdlmain")
- add_flag_append(CMAKE_Pascal_FLAGS "-XMSDL_main")
#OpenGL deps
add_flag_append(CMAKE_Pascal_FLAGS "-k-framework -kCocoa")
add_flag_append(CMAKE_Pascal_FLAGS "-k-framework -kOpenGL")
#set the correct library or framework style depending on the main SDL
- string(FIND "${SDL_LIBRARY}" "dylib" sdl_framework)
+ string(FIND "${SDL2_LIBRARY}" "dylib" sdl_framework)
if(${sdl_framework} GREATER -1)
- add_flag_append(CMAKE_Pascal_FLAGS "-k-lsdl -k-lsdl_image -k-lsdl_mixer -k-lsdl_ttf -k-lsdl_net")
+ add_flag_append(CMAKE_Pascal_FLAGS "-k-lsdl2 -k-lsdl2_image -k-lsdl2_mixer -k-lsdl2_ttf -k-lsdl2_net")
else()
- add_flag_append(CMAKE_Pascal_FLAGS "-k-framework -kSDL -k-framework -kSDL_image -k-framework -kSDL_mixer -k-framework -kSDL_net -k-framework -kSDL_net -k-framework -kSDL_ttf")
+ add_flag_append(CMAKE_Pascal_FLAGS "-k-framework -kSDL2 -k-framework -kSDL2_image -k-framework -kSDL2_mixer -k-framework -kSDL2_net -k-framework -kSDL2_net -k-framework -kSDL2_ttf")
endif()
endif()
@@ -145,8 +141,6 @@
add_subdirectory(avwrapper)
list(APPEND HW_LINK_LIBS avwrapper)
add_definitions(-dUSE_VIDEO_RECORDING)
- #only for SDL < 2, linking carried out by fpc
- find_package_or_disable_msg(GLUT NOVIDEOREC "Video recording will not be built")
endif()
find_package_or_disable_msg(PNG NOPNG "Screenshots will be saved in BMP")
@@ -185,21 +179,17 @@
#Mix_Init/Mix_Quit from SDL_mixer 1.2.10
-check_library_exists(${SDLMIXER_LIBRARY} Mix_Init "" HAVE_MIXINIT)
+check_library_exists(${SDL2MIXER_LIBRARY} Mix_Init "" HAVE_MIXINIT)
if(HAVE_MIXINIT)
add_definitions(-dSDL_MIXER_NEWER)
endif(HAVE_MIXINIT)
#IMG_Init/IMG_Quit from SDL_image 1.2.8
-check_library_exists(${SDLIMAGE_LIBRARY} IMG_Init "" HAVE_IMGINIT)
+check_library_exists(${SDL2IMAGE_LIBRARY} IMG_Init "" HAVE_IMGINIT)
if(HAVE_IMGINIT)
add_definitions(-dSDL_IMAGE_NEWER)
endif(HAVE_IMGINIT)
-if(${SDL_VERSION} VERSION_GREATER 1.3)
- add_definitions(-dSDL2)
-endif()
-
#opengl 2
IF(GL2)
add_definitions(-dGL2)
--- a/hedgewars/SDLh.pas Sun Nov 15 14:40:51 2015 +0100
+++ b/hedgewars/SDLh.pas Sun Nov 15 14:42:59 2015 +0100
@@ -57,25 +57,17 @@
(* SDL *)
const
{$IFDEF WIN32}
- SDLLibName = 'SDL.dll';
- SDL_TTFLibName = 'SDL_ttf.dll';
- SDL_MixerLibName = 'SDL_mixer.dll';
- SDL_ImageLibName = 'SDL_image.dll';
- SDL_NetLibName = 'SDL_net.dll';
+ SDLLibName = 'SDL2.dll';
+ SDL_TTFLibName = 'SDL2_ttf.dll';
+ SDL_MixerLibName = 'SDL2_mixer.dll';
+ SDL_ImageLibName = 'SDL2_image.dll';
+ SDL_NetLibName = 'SDL2_net.dll';
{$ELSE}
- {$IFDEF SDL2}
- SDLLibName = 'libSDL2';
- SDL_TTFLibName = 'libSDL2_ttf';
- SDL_MixerLibName = 'libSDL2_mixer';
- SDL_ImageLibName = 'libSDL2_image';
- SDL_NetLibName = 'libSDL2_net';
- {$ELSE}
- SDLLibName = 'libSDL';
- SDL_TTFLibName = 'libSDL_ttf';
- SDL_MixerLibName = 'libSDL_mixer';
- SDL_ImageLibName = 'libSDL_image';
- SDL_NetLibName = 'libSDL_net';
- {$ENDIF}
+ SDLLibName = 'libSDL2';
+ SDL_TTFLibName = 'libSDL2_ttf';
+ SDL_MixerLibName = 'libSDL2_mixer';
+ SDL_ImageLibName = 'libSDL2_image';
+ SDL_NetLibName = 'libSDL2_net';
{$ENDIF}
/////////////////////////////////////////////////////////////////
@@ -87,14 +79,9 @@
SDL_INIT_AUDIO = $00000010;
SDL_INIT_VIDEO = $00000020; // implies SDL_INIT_EVENTS (sdl2)
SDL_INIT_JOYSTICK = $00000200; // implies SDL_INIT_EVENTS (sdl2)
-{$IFDEF SDL2}
SDL_INIT_HAPTIC = $00001000;
SDL_INIT_GAMECONTROLLER = $00002000; // implies SDL_INIT_JOYSTICK
SDL_INIT_EVENTS = $00004000;
-{$ELSE}
- SDL_INIT_CDROM = $00000100;
- SDL_INIT_EVENTTHREAD = $01000000;
-{$ENDIF}
SDL_INIT_NOPARACHUTE = $00100000;
//SDL_INIT_EVERYTHING // unsafe, init subsystems one at a time
@@ -108,7 +95,9 @@
SDL_BUTTON_WHEELDOWN = 5;
-{$IFDEF SDL2}
+ SDL_TEXTEDITINGEVENT_TEXT_SIZE = 32;
+ SDL_TEXTINPUTEVENT_TEXT_SIZE = 32;
+
// SDL_Event types
// pascal does not support unions as is, so we list here every possible event
// and later associate a struct type each
@@ -201,39 +190,6 @@
SDL_WINDOWEVENT_FOCUS_GAINED = 12; //*< Window has gained keyboard focus
SDL_WINDOWEVENT_FOCUS_LOST = 13; //*< Window has lost keyboard focus
SDL_WINDOWEVENT_CLOSE = 14; //*< The window manager requests that the window be closed */
-{$ELSE}
- // SDL_Event types
- SDL_NOEVENT = 0;
- SDL_ACTIVEEVENT = 1;
- SDL_KEYDOWN = 2;
- SDL_KEYUP = 3;
- SDL_MOUSEMOTION = 4;
- SDL_MOUSEBUTTONDOWN = 5;
- SDL_MOUSEBUTTONUP = 6;
- SDL_JOYAXISMOTION = 7;
- SDL_JOYBALLMOTION = 8;
- SDL_JOYHATMOTION = 9;
- SDL_JOYBUTTONDOWN = 10;
- SDL_JOYBUTTONUP = 11;
- SDL_QUITEV = 12;
- SDL_VIDEORESIZE = 16;
-
- // SDL_Surface flags
- SDL_SWSURFACE = $00000000;
- SDL_HWSURFACE = $00000001;
- SDL_OPENGL = $00000002;
- SDL_ASYNCBLIT = $00000004;
- SDL_RESIZABLE = $00000010;
- SDL_NOFRAME = $00000020;
- SDL_HWACCEL = $00000100;
- SDL_SRCCOLORKEY = $00001000;
- SDL_RLEACCEL = $00004000;
- SDL_SRCALPHA = $00010000;
- SDL_ANYFORMAT = $00100000;
- SDL_HWPALETTE = $20000000;
- SDL_DOUBLEBUF = $40000000;
- SDL_FULLSCREEN = $80000000;
-{$ENDIF}
{$IFDEF ENDIAN_LITTLE}
RMask = $000000FF;
@@ -269,11 +225,13 @@
KMOD_MODE = $4000;
{* SDL_mixer *}
- MIX_MAX_VOLUME = 128;
- MIX_INIT_FLAC = $00000001;
- MIX_INIT_MOD = $00000002;
- MIX_INIT_MP3 = $00000004;
- MIX_INIT_OGG = $00000008;
+ MIX_MAX_VOLUME = 128;
+ MIX_INIT_FLAC = $00000001;
+ MIX_INIT_MOD = $00000002;
+ MIX_INIT_MODPLUG = $00000004;
+ MIX_INIT_MP3 = $00000008;
+ MIX_INIT_OGG = $00000010;
+ MIX_INIT_FLUIDSYNTH = $00000020;
{* SDL_TTF *}
TTF_STYLE_NORMAL = 0;
@@ -296,7 +254,8 @@
IMG_INIT_PNG = $00000002;
IMG_INIT_TIF = $00000004;
- {* SDL_keysym *}
+ {* SDL_keycode *}
+ SDLK_UNKNOWN = 0;
SDLK_BACKSPACE = 8;
SDLK_RETURN = 13;
SDLK_ESCAPE = 27;
@@ -317,6 +276,250 @@
SDLK_PAGEUP = 280;
SDLK_PAGEDOWN = 281;
+ // special keycodes (for modifier keys etc. will have this bit set)
+ SDLK_SCANCODE_MASK = (1 shl 30);
+
+ SDL_SCANCODE_UNKNOWN = 0;
+ SDL_SCANCODE_A = 4;
+ SDL_SCANCODE_B = 5;
+ SDL_SCANCODE_C = 6;
+ SDL_SCANCODE_D = 7;
+ SDL_SCANCODE_E = 8;
+ SDL_SCANCODE_F = 9;
+ SDL_SCANCODE_G = 10;
+ SDL_SCANCODE_H = 11;
+ SDL_SCANCODE_I = 12;
+ SDL_SCANCODE_J = 13;
+ SDL_SCANCODE_K = 14;
+ SDL_SCANCODE_L = 15;
+ SDL_SCANCODE_M = 16;
+ SDL_SCANCODE_N = 17;
+ SDL_SCANCODE_O = 18;
+ SDL_SCANCODE_P = 19;
+ SDL_SCANCODE_Q = 20;
+ SDL_SCANCODE_R = 21;
+ SDL_SCANCODE_S = 22;
+ SDL_SCANCODE_T = 23;
+ SDL_SCANCODE_U = 24;
+ SDL_SCANCODE_V = 25;
+ SDL_SCANCODE_W = 26;
+ SDL_SCANCODE_X = 27;
+ SDL_SCANCODE_Y = 28;
+ SDL_SCANCODE_Z = 29;
+ SDL_SCANCODE_1 = 30;
+ SDL_SCANCODE_2 = 31;
+ SDL_SCANCODE_3 = 32;
+ SDL_SCANCODE_4 = 33;
+ SDL_SCANCODE_5 = 34;
+ SDL_SCANCODE_6 = 35;
+ SDL_SCANCODE_7 = 36;
+ SDL_SCANCODE_8 = 37;
+ SDL_SCANCODE_9 = 38;
+ SDL_SCANCODE_0 = 39;
+ SDL_SCANCODE_RETURN = 40;
+ SDL_SCANCODE_ESCAPE = 41;
+ SDL_SCANCODE_BACKSPACE = 42;
+ SDL_SCANCODE_TAB = 43;
+ SDL_SCANCODE_SPACE = 44;
+ SDL_SCANCODE_MINUS = 45;
+ SDL_SCANCODE_EQUALS = 46;
+ SDL_SCANCODE_LEFTBRACKET = 47;
+ SDL_SCANCODE_RIGHTBRACKET = 48;
+ SDL_SCANCODE_BACKSLASH = 49;
+ SDL_SCANCODE_NONUSHASH = 50;
+ SDL_SCANCODE_SEMICOLON = 51;
+ SDL_SCANCODE_APOSTROPHE = 52;
+ SDL_SCANCODE_GRAVE = 53;
+ SDL_SCANCODE_COMMA = 54;
+ SDL_SCANCODE_PERIOD = 55;
+ SDL_SCANCODE_SLASH = 56;
+ SDL_SCANCODE_CAPSLOCK = 57;
+ SDL_SCANCODE_F1 = 58;
+ SDL_SCANCODE_F2 = 59;
+ SDL_SCANCODE_F3 = 60;
+ SDL_SCANCODE_F4 = 61;
+ SDL_SCANCODE_F5 = 62;
+ SDL_SCANCODE_F6 = 63;
+ SDL_SCANCODE_F7 = 64;
+ SDL_SCANCODE_F8 = 65;
+ SDL_SCANCODE_F9 = 66;
+ SDL_SCANCODE_F10 = 67;
+ SDL_SCANCODE_F11 = 68;
+ SDL_SCANCODE_F12 = 69;
+ SDL_SCANCODE_PRINTSCREEN = 70;
+ SDL_SCANCODE_SCROLLLOCK = 71;
+ SDL_SCANCODE_PAUSE = 72;
+ SDL_SCANCODE_INSERT = 73;
+ SDL_SCANCODE_HOME = 74;
+ SDL_SCANCODE_PAGEUP = 75;
+ SDL_SCANCODE_DELETE = 76;
+ SDL_SCANCODE_END = 77;
+ SDL_SCANCODE_PAGEDOWN = 78;
+ SDL_SCANCODE_RIGHT = 79;
+ SDL_SCANCODE_LEFT = 80;
+ SDL_SCANCODE_DOWN = 81;
+ SDL_SCANCODE_UP = 82;
+ SDL_SCANCODE_NUMLOCKCLEAR = 83;
+ SDL_SCANCODE_KP_DIVIDE = 84;
+ SDL_SCANCODE_KP_MULTIPLY = 85;
+ SDL_SCANCODE_KP_MINUS = 86;
+ SDL_SCANCODE_KP_PLUS = 87;
+ SDL_SCANCODE_KP_ENTER = 88;
+ SDL_SCANCODE_KP_1 = 89;
+ SDL_SCANCODE_KP_2 = 90;
+ SDL_SCANCODE_KP_3 = 91;
+ SDL_SCANCODE_KP_4 = 92;
+ SDL_SCANCODE_KP_5 = 93;
+ SDL_SCANCODE_KP_6 = 94;
+ SDL_SCANCODE_KP_7 = 95;
+ SDL_SCANCODE_KP_8 = 96;
+ SDL_SCANCODE_KP_9 = 97;
+ SDL_SCANCODE_KP_0 = 98;
+ SDL_SCANCODE_KP_PERIOD = 99;
+ SDL_SCANCODE_NONUSBACKSLASH = 100;
+ SDL_SCANCODE_APPLICATION = 101;
+ SDL_SCANCODE_POWER = 102;
+ SDL_SCANCODE_KP_EQUALS = 103;
+ SDL_SCANCODE_F13 = 104;
+ SDL_SCANCODE_F14 = 105;
+ SDL_SCANCODE_F15 = 106;
+ SDL_SCANCODE_F16 = 107;
+ SDL_SCANCODE_F17 = 108;
+ SDL_SCANCODE_F18 = 109;
+ SDL_SCANCODE_F19 = 110;
+ SDL_SCANCODE_F20 = 111;
+ SDL_SCANCODE_F21 = 112;
+ SDL_SCANCODE_F22 = 113;
+ SDL_SCANCODE_F23 = 114;
+ SDL_SCANCODE_F24 = 115;
+ SDL_SCANCODE_EXECUTE = 116;
+ SDL_SCANCODE_HELP = 117;
+ SDL_SCANCODE_MENU = 118;
+ SDL_SCANCODE_SELECT = 119;
+ SDL_SCANCODE_STOP = 120;
+ SDL_SCANCODE_AGAIN = 121;
+ SDL_SCANCODE_UNDO = 122;
+ SDL_SCANCODE_CUT = 123;
+ SDL_SCANCODE_COPY = 124;
+ SDL_SCANCODE_PASTE = 125;
+ SDL_SCANCODE_FIND = 126;
+ SDL_SCANCODE_MUTE = 127;
+ SDL_SCANCODE_VOLUMEUP = 128;
+ SDL_SCANCODE_VOLUMEDOWN = 129;
+ SDL_SCANCODE_KP_COMMA = 133;
+ SDL_SCANCODE_KP_EQUALSAS400 = 134;
+ SDL_SCANCODE_INTERNATIONAL1 = 135;
+ SDL_SCANCODE_INTERNATIONAL2 = 136;
+ SDL_SCANCODE_INTERNATIONAL3 = 137;
+ SDL_SCANCODE_INTERNATIONAL4 = 138;
+ SDL_SCANCODE_INTERNATIONAL5 = 139;
+ SDL_SCANCODE_INTERNATIONAL6 = 140;
+ SDL_SCANCODE_INTERNATIONAL7 = 141;
+ SDL_SCANCODE_INTERNATIONAL8 = 142;
+ SDL_SCANCODE_INTERNATIONAL9 = 143;
+ SDL_SCANCODE_LANG1 = 144; (*< Hangul/English toggle *)
+ SDL_SCANCODE_LANG2 = 145; (*< Hanja conversion *)
+ SDL_SCANCODE_LANG3 = 146; (*< Katakana *)
+ SDL_SCANCODE_LANG4 = 147; (*< Hiragana *)
+ SDL_SCANCODE_LANG5 = 148; (*< Zenkaku/Hankaku *)
+ SDL_SCANCODE_LANG6 = 149; (*< reserved *)
+ SDL_SCANCODE_LANG7 = 150; (*< reserved *)
+ SDL_SCANCODE_LANG8 = 151; (*< reserved *)
+ SDL_SCANCODE_LANG9 = 152; (*< reserved *)
+ SDL_SCANCODE_ALTERASE = 153;
+ SDL_SCANCODE_SYSREQ = 154;
+ SDL_SCANCODE_CANCEL = 155;
+ SDL_SCANCODE_CLEAR = 156;
+ SDL_SCANCODE_PRIOR = 157;
+ SDL_SCANCODE_RETURN2 = 158;
+ SDL_SCANCODE_SEPARATOR = 159;
+ SDL_SCANCODE_OUT = 160;
+ SDL_SCANCODE_OPER = 161;
+ SDL_SCANCODE_CLEARAGAIN = 162;
+ SDL_SCANCODE_CRSEL = 163;
+ SDL_SCANCODE_EXSEL = 164;
+ SDL_SCANCODE_KP_00 = 176;
+ SDL_SCANCODE_KP_000 = 177;
+ SDL_SCANCODE_THOUSANDSSEPARATOR = 178;
+ SDL_SCANCODE_DECIMALSEPARATOR = 179;
+ SDL_SCANCODE_CURRENCYUNIT = 180;
+ SDL_SCANCODE_CURRENCYSUBUNIT = 181;
+ SDL_SCANCODE_KP_LEFTPAREN = 182;
+ SDL_SCANCODE_KP_RIGHTPAREN = 183;
+ SDL_SCANCODE_KP_LEFTBRACE = 184;
+ SDL_SCANCODE_KP_RIGHTBRACE = 185;
+ SDL_SCANCODE_KP_TAB = 186;
+ SDL_SCANCODE_KP_BACKSPACE = 187;
+ SDL_SCANCODE_KP_A = 188;
+ SDL_SCANCODE_KP_B = 189;
+ SDL_SCANCODE_KP_C = 190;
+ SDL_SCANCODE_KP_D = 191;
+ SDL_SCANCODE_KP_E = 192;
+ SDL_SCANCODE_KP_F = 193;
+ SDL_SCANCODE_KP_XOR = 194;
+ SDL_SCANCODE_KP_POWER = 195;
+ SDL_SCANCODE_KP_PERCENT = 196;
+ SDL_SCANCODE_KP_LESS = 197;
+ SDL_SCANCODE_KP_GREATER = 198;
+ SDL_SCANCODE_KP_AMPERSAND = 199;
+ SDL_SCANCODE_KP_DBLAMPERSAND = 200;
+ SDL_SCANCODE_KP_VERTICALBAR = 201;
+ SDL_SCANCODE_KP_DBLVERTICALBAR = 202;
+ SDL_SCANCODE_KP_COLON = 203;
+ SDL_SCANCODE_KP_HASH = 204;
+ SDL_SCANCODE_KP_SPACE = 205;
+ SDL_SCANCODE_KP_AT = 206;
+ SDL_SCANCODE_KP_EXCLAM = 207;
+ SDL_SCANCODE_KP_MEMSTORE = 208;
+ SDL_SCANCODE_KP_MEMRECALL = 209;
+ SDL_SCANCODE_KP_MEMCLEAR = 210;
+ SDL_SCANCODE_KP_MEMADD = 211;
+ SDL_SCANCODE_KP_MEMSUBTRACT = 212;
+ SDL_SCANCODE_KP_MEMMULTIPLY = 213;
+ SDL_SCANCODE_KP_MEMDIVIDE = 214;
+ SDL_SCANCODE_KP_PLUSMINUS = 215;
+ SDL_SCANCODE_KP_CLEAR = 216;
+ SDL_SCANCODE_KP_CLEARENTRY = 217;
+ SDL_SCANCODE_KP_BINARY = 218;
+ SDL_SCANCODE_KP_OCTAL = 219;
+ SDL_SCANCODE_KP_DECIMAL = 220;
+ SDL_SCANCODE_KP_HEXADECIMAL = 221;
+ SDL_SCANCODE_LCTRL = 224;
+ SDL_SCANCODE_LSHIFT = 225;
+ SDL_SCANCODE_LALT = 226;
+ SDL_SCANCODE_LGUI = 227;
+ SDL_SCANCODE_RCTRL = 228;
+ SDL_SCANCODE_RSHIFT = 229;
+ SDL_SCANCODE_RALT = 230;
+ SDL_SCANCODE_RGUI = 231;
+ SDL_SCANCODE_MODE = 257;
+ SDL_SCANCODE_AUDIONEXT = 258;
+ SDL_SCANCODE_AUDIOPREV = 259;
+ SDL_SCANCODE_AUDIOSTOP = 260;
+ SDL_SCANCODE_AUDIOPLAY = 261;
+ SDL_SCANCODE_AUDIOMUTE = 262;
+ SDL_SCANCODE_MEDIASELECT = 263;
+ SDL_SCANCODE_WWW = 264;
+ SDL_SCANCODE_MAIL = 265;
+ SDL_SCANCODE_CALCULATOR = 266;
+ SDL_SCANCODE_COMPUTER = 267;
+ SDL_SCANCODE_AC_SEARCH = 268;
+ SDL_SCANCODE_AC_HOME = 269;
+ SDL_SCANCODE_AC_BACK = 270;
+ SDL_SCANCODE_AC_FORWARD = 271;
+ SDL_SCANCODE_AC_STOP = 272;
+ SDL_SCANCODE_AC_REFRESH = 273;
+ SDL_SCANCODE_AC_BOOKMARKS = 274;
+ SDL_SCANCODE_BRIGHTNESSDOWN = 275;
+ SDL_SCANCODE_BRIGHTNESSUP = 276;
+ SDL_SCANCODE_DISPLAYSWITCH = 277;
+ SDL_SCANCODE_KBDILLUMTOGGLE = 278;
+ SDL_SCANCODE_KBDILLUMDOWN = 279;
+ SDL_SCANCODE_KBDILLUMUP = 280;
+ SDL_SCANCODE_EJECT = 281;
+ SDL_SCANCODE_SLEEP = 282;
+ SDL_SCANCODE_APP1 = 283;
+ SDL_SCANCODE_APP2 = 284;
/////////////////////////////////////////////////////////////////
/////////////////////// TYPE DEFINITIONS ///////////////////////
@@ -327,25 +530,20 @@
// http://www.freepascal.org/docs-html/prog/progsu144.html
type
-{$IFDEF SDL2}
PSDL_Window = Pointer;
PSDL_Renderer = Pointer;
PSDL_Texture = Pointer;
PSDL_GLContext= Pointer;
TSDL_TouchId = Int64;
-{$ENDIF}
TSDL_FingerId = Int64;
+ TSDL_Keycode = LongInt;
+ TSDL_Scancode = LongInt;
TSDL_eventaction = (SDL_ADDEVENT, SDL_PEEPEVENT, SDL_GETEVENT);
PSDL_Rect = ^TSDL_Rect;
TSDL_Rect = record
-{$IFDEF SDL2}
x, y, w, h: LongInt;
-{$ELSE}
- x, y: SmallInt;
- w, h: Word;
-{$ENDIF}
end;
TPoint = record
@@ -354,7 +552,6 @@
PSDL_PixelFormat = ^TSDL_PixelFormat;
TSDL_PixelFormat = record
-{$IFDEF SDL2}
format: LongWord;
palette: Pointer;
BitsPerPixel : Byte;
@@ -374,25 +571,6 @@
Ashift: Byte;
refcount: LongInt;
next: PSDL_PixelFormat;
-{$ELSE}
- palette: Pointer;
- BitsPerPixel : Byte;
- BytesPerPixel: Byte;
- Rloss : Byte;
- Gloss : Byte;
- Bloss : Byte;
- Aloss : Byte;
- Rshift: Byte;
- Gshift: Byte;
- Bshift: Byte;
- Ashift: Byte;
- RMask : LongWord;
- GMask : LongWord;
- BMask : LongWord;
- AMask : LongWord;
- colorkey: LongWord;
- alpha: Byte;
-{$ENDIF}
end;
PSDL_Surface = ^TSDL_Surface;
@@ -400,7 +578,7 @@
flags : LongWord;
format: PSDL_PixelFormat;
w, h : LongInt;
- pitch : {$IFDEF SDL2}LongInt{$ELSE}Word{$ENDIF};
+ pitch : LongInt;
pixels: Pointer;
{$IFDEF PAS2C}
hwdata : Pointer;
@@ -412,16 +590,12 @@
refcount : LongInt;
offset : LongInt;
{$ELSE}
-{$IFDEF SDL2}
userdata : Pointer;
locked : LongInt;
lock_data : Pointer;
clip_rect : TSDL_Rect;
map : Pointer;
refcount : LongInt;
-{$ELSE}
- offset : LongInt;
-{$ENDIF}
{$ENDIF}
end;
@@ -437,18 +611,14 @@
(* SDL_RWops and friends *)
PSDL_RWops = ^TSDL_RWops;
-{$IFDEF SDL2}
TSize = function( context: PSDL_RWops): Int64; cdecl;
TSeek = function( context: PSDL_RWops; offset: Int64; whence: LongInt ): Int64; cdecl;
-{$ELSE}
- TSeek = function( context: PSDL_RWops; offset: LongInt; whence: LongInt ): LongInt; cdecl;
-{$ENDIF}
TRead = function( context: PSDL_RWops; Ptr: Pointer; size: LongInt; maxnum : LongInt ): LongInt; cdecl;
TWrite = function( context: PSDL_RWops; Ptr: Pointer; size: LongInt; num: LongInt ): LongInt; cdecl;
TClose = function( context: PSDL_RWops ): LongInt; cdecl;
TStdio = record
- autoclose: {$IFDEF SDL2}Boolean{$ELSE}LongInt{$ENDIF};
+ autoclose: Boolean;
fp: Pointer;
end;
@@ -460,9 +630,7 @@
TUnknown = record
data1: Pointer;
-{$IFDEF SDL2}
data2: Pointer;
-{$ENDIF}
end;
{$IFDEF ANDROID}
@@ -479,7 +647,7 @@
size, left: LongInt;
end;
TWindowsio = record
- append : {$IFDEF SDL2}Boolean{$ELSE}LongInt{$ENDIF};
+ append : Boolean;
h : Pointer;
buffer : TWinbuffer;
end;
@@ -487,9 +655,7 @@
{$ENDIF}
TSDL_RWops = record
-{$IFDEF SDL2}
size: TSize;
-{$ENDIF}
seek: TSeek;
read: TRead;
write: TWrite;
@@ -511,10 +677,9 @@
{* SDL_Event type definition *}
-{$IFDEF SDL2}
TSDL_Keysym = record
- scancode: LongInt;
- sym: LongInt;
+ scancode: TSDL_Scancode;
+ sym: TSDL_Keycode;
modifier: Word;
unused: LongWord;
end;
@@ -528,21 +693,20 @@
data1, data2: LongInt;
end;
- // available in sdl12 but not exposed
TSDL_TextEditingEvent = record
- type_: LongWord;
- timestamp: LongWord;
- windowID: LongWord;
- text: array[0..31] of Byte;
- start, lenght: LongInt;
+ type_: Longword;
+ timestamp: Longword;
+ windowID: Longword;
+ text: array [0..SDL_TEXTEDITINGEVENT_TEXT_SIZE - 1] of char;
+ start: LongInt;
+ length: LongInt;
end;
- // available in sdl12 but not exposed
TSDL_TextInputEvent = record
- type_: LongWord;
- timestamp: LongWord;
- windowID: LongWord;
- text: array[0..31] of Byte;
+ type_: Longword;
+ timestamp: Longword;
+ windowID: Longword;
+ text: array [0..SDL_TEXTINPUTEVENT_TEXT_SIZE - 1] of char;
end;
TSDL_TouchFingerEvent = record
@@ -613,167 +777,92 @@
end;
TSDL_OSEvent = TSDL_CommonEvent;
-{$ELSE}
- TSDL_KeySym = record
- scancode: Byte;
- sym: LongWord;
- modifier: LongWord;
- unicode: Word;
- end;
-
- TSDL_ActiveEvent = record
- type_: Byte;
- gain: Byte;
- state: Byte;
- end;
-
- TSDL_ResizeEvent = record
- type_: Byte;
- w, h: LongInt;
- end;
-{$ENDIF}
TSDL_KeyboardEvent = record
-{$IFDEF SDL2}
type_: LongWord;
timestamp: LongWord;
windowID: LongWord;
state, repeat_, padding2, padding3: Byte;
-{$ELSE}
- type_, which, state: Byte;
-{$ENDIF}
keysym: TSDL_Keysym;
end;
TSDL_MouseMotionEvent = record
-{$IFDEF SDL2}
type_: LongWord;
timestamp: LongWord;
windowID: LongWord;
which, state: LongWord;
x, y, xrel, yrel: LongInt;
-{$ELSE}
- type_, which, state: Byte;
- x, y, xrel, yrel: Word;
-{$ENDIF}
end;
TSDL_MouseButtonEvent = record
-{$IFDEF SDL2}
type_: LongWord;
timestamp: LongWord;
windowID: LongWord;
which: LongWord;
button, state, padding1, padding2: Byte;
x, y: LongInt;
-{$ELSE}
- type_, which, button, state: Byte;
- x, y: Word;
-{$ENDIF}
end;
TSDL_MouseWheelEvent = record
type_: LongWord;
-{$IFDEF SDL2}
timestamp: LongWord;
windowID: LongWord;
which: LongWord;
-{$ELSE}
- which: Byte;
-{$ENDIF}
x, y: LongInt;
end;
TSDL_JoyAxisEvent = record
-{$IFDEF SDL2}
type_: LongWord;
timestamp: LongWord;
which: LongWord;
-{$ELSE}
- type_: Byte;
- which: Byte;
-{$ENDIF}
axis: Byte;
-{$IFDEF SDL2}
padding1, padding2, padding3: Byte;
value: LongInt;
padding4: Word;
-{$ELSE}
- value: SmallInt;
-{$ENDIF}
end;
TSDL_JoyBallEvent = record
-{$IFDEF SDL2}
type_: LongWord;
timestamp: LongWord;
which: LongWord;
-{$ELSE}
- type_: Byte;
- which: Byte;
-{$ENDIF}
ball: Byte;
-{$IFDEF SDL2}
padding1, padding2, padding3: Byte;
-{$ENDIF}
xrel, yrel: SmallInt;
end;
TSDL_JoyHatEvent = record
-{$IFDEF SDL2}
type_: LongWord;
timestamp: LongWord;
which: LongWord;
-{$ELSE}
- type_: Byte;
- which: Byte;
-{$ENDIF}
hat: Byte;
value: Byte;
-{$IFDEF SDL2}
padding1, padding2: Byte;
-{$ENDIF}
end;
TSDL_JoyButtonEvent = record
-{$IFDEF SDL2}
type_: LongWord;
timestamp: LongWord;
-{$ELSE}
- type_: Byte;
-{$ENDIF}
which: Byte;
button: Byte;
state: Byte;
-{$IFDEF SDL2}
padding1: Byte;
-{$ENDIF}
end;
TSDL_QuitEvent = record
-{$IFDEF SDL2}
type_: LongWord;
timestamp: LongWord;
-{$ELSE}
- type_: Byte;
-{$ENDIF}
end;
TSDL_UserEvent = record
-{$IFDEF SDL2}
type_: LongWord;
timestamp: LongWord;
windowID: LongWord;
-{$ELSE}
- type_: Byte;
-{$ENDIF}
code: LongInt;
data1, data2: Pointer;
end;
PSDL_Event = ^TSDL_Event;
TSDL_Event = record
-{$IFDEF SDL2}
case LongInt of
SDL_FIRSTEVENT: (type_: LongWord);
SDL_COMMONDEVENT: (common: TSDL_CommonEvent);
@@ -781,7 +870,7 @@
SDL_KEYDOWN,
SDL_KEYUP: (key: TSDL_KeyboardEvent);
SDL_TEXTEDITING: (edit: TSDL_TextEditingEvent);
- SDL_TEXTINPUT: (tedit: TSDL_TextInputEvent);
+ SDL_TEXTINPUT: (text: TSDL_TextInputEvent);
SDL_MOUSEMOTION: (motion: TSDL_MouseMotionEvent);
SDL_MOUSEBUTTONDOWN,
SDL_MOUSEBUTTONUP: (button: TSDL_MouseButtonEvent);
@@ -809,25 +898,6 @@
SDL_DOLLARGESTURE: (dgesture: TSDL_DollarGestureEvent);
SDL_DROPFILE: (drop: TSDL_DropEvent);
SDL_ALLEVENTS: (foo: shortstring);
-{$ELSE}
- case Byte of
- SDL_NOEVENT: (type_: Byte);
- SDL_ACTIVEEVENT: (active: TSDL_ActiveEvent);
- SDL_KEYDOWN,
- SDL_KEYUP: (key: TSDL_KeyboardEvent);
- SDL_MOUSEMOTION: (motion: TSDL_MouseMotionEvent);
- SDL_MOUSEBUTTONDOWN,
- SDL_MOUSEBUTTONUP: (button: TSDL_MouseButtonEvent);
- SDL_JOYAXISMOTION: (jaxis: TSDL_JoyAxisEvent);
- SDL_JOYHATMOTION: (jhat: TSDL_JoyHatEvent);
- SDL_JOYBALLMOTION: (jball: TSDL_JoyBallEvent);
- SDL_JOYBUTTONDOWN,
- SDL_JOYBUTTONUP: (jbutton: TSDL_JoyButtonEvent);
- SDL_QUITEV: (quit: TSDL_QuitEvent);
- //SDL_SYSWMEVENT,SDL_EVENT_RESERVEDA,SDL_EVENT_RESERVEDB
- SDL_VIDEORESIZE: (resize: TSDL_ResizeEvent);
- SDL_ALLEVENTS: (foo: shortstring);
-{$ENDIF}
end;
TSDL_EventFilter = function( event : PSDL_Event ): Integer; cdecl;
@@ -858,7 +928,6 @@
SDL_GL_MULTISAMPLEBUFFERS,
SDL_GL_MULTISAMPLESAMPLES,
SDL_GL_ACCELERATED_VISUAL,
-{$IFDEF SDL2}
SDL_GL_RETAINED_BACKING,
SDL_GL_CONTEXT_MAJOR_VERSION,
SDL_GL_CONTEXT_MINOR_VERSION,
@@ -866,12 +935,8 @@
SDL_GL_CONTEXT_FLAGS,
SDL_GL_CONTEXT_PROFILE_MASK,
SDL_GL_SHARE_WITH_CURRENT_CONTEXT
-{$ELSE}
- SDL_GL_SWAP_CONTROL
-{$ENDIF}
);
-{$IFDEF SDL2}
TSDL_ArrayByteOrder = ( // array component order, low Byte -> high Byte
SDL_ARRAYORDER_NONE,
SDL_ARRAYORDER_RGB,
@@ -881,7 +946,6 @@
SDL_ARRAYORDER_BGRA,
SDL_ARRAYORDER_ABGR
);
-{$ENDIF}
// Joystick/Controller support
PSDL_Joystick = ^TSDL_Joystick;
@@ -953,6 +1017,8 @@
function SDL_InitSubSystem(flags: LongWord): LongInt; cdecl; external SDLLibName;
procedure SDL_Quit; cdecl; external SDLLibName;
+procedure SDL_free(mem: Pointer); cdecl; external SDLLibName;
+
procedure SDL_Delay(msec: LongWord); cdecl; external SDLLibName;
function SDL_GetTicks: LongWord; cdecl; external SDLLibName;
@@ -986,8 +1052,9 @@
function SDL_RWFromFile(filename, mode: PChar): PSDL_RWops; cdecl; external SDLLibName;
function SDL_SaveBMP_RW(surface: PSDL_Surface; dst: PSDL_RWops; freedst: LongInt): LongInt; cdecl; external SDLLibName;
-{$IFDEF SDL2}
function SDL_CreateWindow(title: PChar; x,y,w,h: LongInt; flags: LongWord): PSDL_Window; cdecl; external SDLLibName;
+procedure SDL_SetWindowIcon(window: PSDL_Window; icon: PSDL_Surface); cdecl; external SDLLibName;
+
function SDL_CreateRenderer(window: PSDL_Window; index: LongInt; flags: LongWord): PSDL_Renderer; cdecl; external SDLLibName;
function SDL_DestroyWindow(window: PSDL_Window): LongInt; cdecl; external SDLLibName;
function SDL_DestroyRenderer(renderer: PSDL_Renderer): LongInt; cdecl; external SDLLibName;
@@ -996,7 +1063,7 @@
function SDL_GL_CreateContext(window: PSDL_Window): PSDL_GLContext; cdecl; external SDLLibName;
procedure SDL_GL_DeleteContext(context: PSDL_GLContext); cdecl; external SDLLibName;
-function SDL_GL_SwapWindow(window: PSDL_Window): LongInt; cdecl; external SDLLibName;
+procedure SDL_GL_SwapWindow(window: PSDL_Window); cdecl; external SDLLibName;
function SDL_GL_SetSwapInterval(interval: LongInt): LongInt; cdecl; external SDLLibName;
procedure SDL_VideoQuit; cdecl; external SDLLibName;
@@ -1017,25 +1084,19 @@
procedure SDL_WarpMouseInWindow(window: PSDL_Window; x, y: LongInt); cdecl; external SDLLibName;
function SDL_SetHint(name, value: PChar): Boolean; cdecl; external SDLLibName;
procedure SDL_StartTextInput; cdecl; external SDLLibName;
+procedure SDL_StopTextInput; cdecl; external SDLLibName;
function SDL_PeepEvents(event: PSDL_Event; numevents: LongInt; action: TSDL_eventaction; minType, maxType: LongWord): LongInt; cdecl; external SDLLibName;
function SDL_AllocFormat(format: LongWord): PSDL_PixelFormat; cdecl; external SDLLibName;
procedure SDL_FreeFormat(pixelformat: PSDL_PixelFormat); cdecl; external SDLLibName;
-{$ELSE}
-function SDL_PeepEvents(event: PSDL_Event; numevents: LongInt; action: TSDL_eventaction; mask: LongWord): LongInt; cdecl; external SDLLibName;
-
-function SDL_EnableUNICODE(enable: LongInt): LongInt; cdecl; external SDLLibName;
-function SDL_EnableKeyRepeat(timedelay, interval: LongInt): LongInt; cdecl; external SDLLibName;
-function SDL_VideoDriverName(namebuf: PChar; maxlen: LongInt): PChar; cdecl; external SDLLibName;
-{$ENDIF}
function SDL_GetMouseState(x, y: PLongInt): Byte; cdecl; external SDLLibName;
-function SDL_GetKeyName(key: LongWord): PChar; cdecl; external SDLLibName;
-function SDL_GetScancodeName(key: LongWord): PChar; cdecl; external SDLLibName;
-function SDL_GetKeyFromScancode(key: LongWord): LongInt; cdecl; external SDLLibName;
-
+function SDL_GetKeyName(key: TSDL_Keycode): PChar; cdecl; external SDLLibName;
+function SDL_GetScancodeName(key: TSDL_Scancode): PChar; cdecl; external SDLLibName;
+function SDL_GetKeyFromScancode(key: TSDL_Scancode): TSDL_Keycode; cdecl; external SDLLibName;
+// SDL2 functions has some additional functions (not listed here) for keycode/scancode translation
procedure SDL_PumpEvents; cdecl; external SDLLibName;
function SDL_PollEvent(event: PSDL_Event): LongInt; cdecl; external SDLLibName;
@@ -1043,8 +1104,9 @@
procedure SDL_SetEventFilter(filter: TSDL_EventFilter); cdecl; external SDLLibName;
function SDL_ShowCursor(toggle: LongInt): LongInt; cdecl; external SDLLibName;
-procedure SDL_WarpMouse(x, y: Word); {$IFDEF SDL2}inline{$ELSE}cdecl; external SDLLibName{$ENDIF};
-function SDL_GetKeyState(numkeys: PLongInt): PByteArray; cdecl; external SDLLibName {$IFDEF SDL2} name 'SDL_GetKeyboardState'{$ENDIF};
+procedure SDL_WarpMouse(x, y: Word); inline;
+
+function SDL_GetKeyboardState(numkeys: PLongInt): PByteArray; cdecl; external SDLLibName;
procedure SDL_WM_SetIcon(icon: PSDL_Surface; mask : Byte); cdecl; external SDLLibName;
procedure SDL_WM_SetCaption(title: PChar; icon: PChar); cdecl; external SDLLibName;
@@ -1053,14 +1115,14 @@
(* remember to mark the threaded functions as 'cdecl; export;'
(or have fun debugging nil arguments) *)
-function SDL_CreateThread(fn: Pointer; {$IFDEF SDL2}name: PChar;{$ENDIF} data: Pointer): PSDL_Thread; cdecl; external SDLLibName;
+function SDL_CreateThread(fn: Pointer; name: PChar; data: Pointer): PSDL_Thread; cdecl; external SDLLibName;
procedure SDL_WaitThread(thread: PSDL_Thread; status: PLongInt); cdecl; external SDLLibName;
procedure SDL_KillThread(thread: PSDL_Thread); cdecl; external SDLLibName;
function SDL_CreateMutex: PSDL_mutex; cdecl; external SDLLibName;
procedure SDL_DestroyMutex(mutex: PSDL_mutex); cdecl; external SDLLibName;
-function SDL_LockMutex(mutex: PSDL_mutex): LongInt; cdecl; external SDLLibName {$IFNDEF SDL2}name 'SDL_mutexP'{$ENDIF};
-function SDL_UnlockMutex(mutex: PSDL_mutex): LongInt; cdecl; external SDLLibName {$IFNDEF SDL2}name 'SDL_mutexV'{$ENDIF};
+function SDL_LockMutex(mutex: PSDL_mutex): LongInt; cdecl; external SDLLibName;
+function SDL_UnlockMutex(mutex: PSDL_mutex): LongInt; cdecl; external SDLLibName;
function SDL_GL_SetAttribute(attr: TSDL_GLattr; value: LongInt): LongInt; cdecl; external SDLLibName;
procedure SDL_GL_SwapBuffers; cdecl; external SDLLibName;
@@ -1165,6 +1227,12 @@
function SDLNet_AddSocket(_set: PSDLNet_SocketSet; sock: PTCPSocket): LongInt; cdecl; external SDL_NetLibName;
function SDLNet_CheckSockets(_set: PSDLNet_SocketSet; timeout: LongInt): LongInt; cdecl; external SDL_NetLibName;
+// SDL 2 clipboard functions
+function SDL_HasClipboardText(): Boolean; cdecl; external SDLLibName;
+// returns nil if memory for clipboard contents copy couldn't be allocated
+function SDL_GetClipboardText(): PChar; cdecl; external SDLLibName;
+// returns 0 on success or negative error number on failure
+function SDL_SetClipboardText(const text: PChar): LongInt; cdecl; external SDLLibName;
procedure SDLNet_Write16(value: Word; buf: Pointer);
procedure SDLNet_Write32(value: LongWord; buf: Pointer);
@@ -1172,7 +1240,6 @@
function SDLNet_Read32(buf: Pointer): LongWord;
implementation
-{$IFDEF SDL2}
uses uStore;
// for sdl1.2 we directly call SDL_WarpMouse()
@@ -1183,16 +1250,11 @@
begin
WarpMouse(x, y);
end;
-{$ENDIF}
function SDL_MustLock(Surface: PSDL_Surface): Boolean;
begin
SDL_MustLock:=
-{$IFDEF SDL2}
((surface^.flags and SDL_RLEACCEL) <> 0)
-{$ELSE}
- ( surface^.offset <> 0 ) or (( surface^.flags and (SDL_HWSURFACE or SDL_ASYNCBLIT or SDL_RLEACCEL)) <> 0)
-{$ENDIF}
end;
{$IFNDEF SDL_MIXER_NEWER}
@@ -1245,5 +1307,6 @@
(PByteArray(buf)^[0] shl 24)
end;
+
end.
--- a/hedgewars/avwrapper/CMakeLists.txt Sun Nov 15 14:40:51 2015 +0100
+++ b/hedgewars/avwrapper/CMakeLists.txt Sun Nov 15 14:42:59 2015 +0100
@@ -1,9 +1,5 @@
#libraries have already been searched in main CMakeLists.txt
-# TODO: this check is only for SDL < 2
-# fpc will take care of linking but we need to have this library installed
-find_package(GLUT REQUIRED)
-
include_directories(${LIBAV_INCLUDE_DIR})
add_library(avwrapper avwrapper.c)
--- a/hedgewars/avwrapper/avwrapper.c Sun Nov 15 14:40:51 2015 +0100
+++ b/hedgewars/avwrapper/avwrapper.c Sun Nov 15 14:42:59 2015 +0100
@@ -66,6 +66,17 @@
#if LIBAVCODEC_VERSION_MAJOR < 56
#define av_frame_alloc avcodec_alloc_frame
#define av_frame_free av_freep
+#define av_packet_rescale_ts rescale_ts
+
+static void rescale_ts(AVPacket *pkt, AVRational ctb, AVRational stb)
+{
+ if (pkt->pts != AV_NOPTS_VALUE)
+ pkt->pts = av_rescale_q(pkt->pts, ctb, stb);
+ if (pkt->dts != AV_NOPTS_VALUE)
+ pkt->dts = av_rescale_q(pkt->dts, ctb, stb);
+ if (pkt->duration > 0)
+ pkt->duration = av_rescale_q(pkt->duration, ctb, stb);
+}
#endif
#if LIBAVCODEC_VERSION_MAJOR < 57
@@ -149,6 +160,10 @@
g_pAudio->sample_rate = g_Frequency;
g_pAudio->channels = g_Channels;
+ // set time base as invers of sample rate
+ g_pAudio->time_base.den = g_pAStream->time_base.den = g_Frequency;
+ g_pAudio->time_base.num = g_pAStream->time_base.num = 1;
+
// set quality
g_pAudio->bit_rate = 160000;
@@ -192,6 +207,8 @@
AVPacket Packet;
av_init_packet(&Packet);
+ Packet.data = NULL;
+ Packet.size = 0;
int NumSamples = fread(g_pSamples, 2*g_Channels, g_NumSamples, g_pSoundFile);
@@ -210,6 +227,8 @@
return FatalError("avcodec_encode_audio2 failed");
if (!got_packet)
return 0;
+
+ av_packet_rescale_ts(&Packet, g_pAudio->time_base, g_pAStream->time_base);
#else
if (NumSamples == 0)
return 0;
@@ -252,9 +271,9 @@
of which frame timestamps are represented. for fixed-fps content,
timebase should be 1/framerate and timestamp increments should be
identically 1. */
- g_pVideo->time_base.den = g_Framerate.num;
- g_pVideo->time_base.num = g_Framerate.den;
- //g_pVideo->gop_size = 12; /* emit one intra frame every twelve frames at most */
+ g_pVideo->time_base.den = g_pVStream->time_base.den = g_Framerate.num;
+ g_pVideo->time_base.num = g_pVStream->time_base.num = g_Framerate.den;
+
g_pVideo->pix_fmt = AV_PIX_FMT_YUV420P;
// set quality
@@ -309,6 +328,9 @@
if (!g_pVFrame)
return FatalError("Could not allocate frame");
+ g_pVFrame->width = g_Width;
+ g_pVFrame->height = g_Height;
+ g_pVFrame->format = AV_PIX_FMT_YUV420P;
g_pVFrame->linesize[0] = g_Width;
g_pVFrame->linesize[1] = g_Width/2;
g_pVFrame->linesize[2] = g_Width/2;
@@ -343,6 +365,7 @@
Packet.size = 0;
g_pVFrame->pts++;
+#if LIBAVCODEC_VERSION_MAJOR < 58
if (g_pFormat->flags & AVFMT_RAWPICTURE)
{
/* raw video case. The API will change slightly in the near
@@ -357,6 +380,7 @@
return 0;
}
else
+#endif
{
#if LIBAVCODEC_VERSION_MAJOR >= 54
int got_packet;
@@ -365,10 +389,7 @@
if (!got_packet)
return 0;
- if (Packet.pts != AV_NOPTS_VALUE)
- Packet.pts = av_rescale_q(Packet.pts, g_pVideo->time_base, g_pVStream->time_base);
- if (Packet.dts != AV_NOPTS_VALUE)
- Packet.dts = av_rescale_q(Packet.dts, g_pVideo->time_base, g_pVStream->time_base);
+ av_packet_rescale_ts(&Packet, g_pVideo->time_base, g_pVStream->time_base);
#else
Packet.size = avcodec_encode_video(g_pVideo, g_OutBuffer, OUTBUFFER_SIZE, pFrame);
if (Packet.size < 0)
@@ -506,7 +527,7 @@
{
do
ret = WriteFrame(NULL);
- while (ret >= 0);
+ while (ret > 0);
if (ret < 0)
return ret;
}
@@ -515,7 +536,7 @@
{
ret = WriteAudioFrame();
}
- while(ret >= 0);
+ while(ret > 0);
if (ret < 0)
return ret;
--- a/hedgewars/hwengine.pas Sun Nov 15 14:40:51 2015 +0100
+++ b/hedgewars/hwengine.pas Sun Nov 15 14:42:59 2015 +0100
@@ -154,11 +154,7 @@
var event: TSDL_Event;
PrevTime, CurrTime: LongWord;
isTerminated: boolean;
-{$IFDEF SDL2}
previousGameState: TGameState;
-{$ELSE}
- prevFocusState: boolean;
-{$ENDIF}
begin
isTerminated:= false;
PrevTime:= SDL_GetTicks;
@@ -166,15 +162,14 @@
begin
SDL_PumpEvents();
- while SDL_PeepEvents(@event, 1, SDL_GETEVENT, {$IFDEF SDL2}SDL_FIRSTEVENT, SDL_LASTEVENT{$ELSE}SDL_ALLEVENTS{$ENDIF}) > 0 do
+ while SDL_PeepEvents(@event, 1, SDL_GETEVENT, SDL_FIRSTEVENT, SDL_LASTEVENT) > 0 do
begin
case event.type_ of
-{$IFDEF SDL2}
SDL_KEYDOWN:
if GameState = gsChat then
begin
// sdl on iphone supports only ashii keyboards and the unicode field is deprecated in sdl 1.3
- KeyPressChat(SDL_GetKeyFromScancode(event.key.keysym.sym), event.key.keysym.sym, event.key.keysym.modifier);
+ KeyPressChat(event.key.keysym);
end
else
if GameState >= gsGame then ProcessKey(event.key);
@@ -182,6 +177,20 @@
if (GameState <> gsChat) and (GameState >= gsGame) then
ProcessKey(event.key);
+ SDL_MOUSEBUTTONDOWN:
+ if GameState = gsConfirm then
+ ParseCommand('quit', true)
+ else
+ if (GameState >= gsGame) then ProcessMouse(event.button, true);
+
+ SDL_MOUSEBUTTONUP:
+ if (GameState >= gsGame) then ProcessMouse(event.button, false);
+
+ SDL_MOUSEWHEEL:
+ ProcessMouseWheel(event.wheel.x, event.wheel.y);
+
+ SDL_TEXTINPUT: uChat.TextInput(event.text);
+
SDL_WINDOWEVENT:
if event.window.event = SDL_WINDOWEVENT_SHOWN then
begin
@@ -217,45 +226,6 @@
SDL_FINGERUP:
onTouchUp(event.tfinger.x, event.tfinger.y, event.tfinger.fingerId);
{$ENDIF}
-{$ELSE}
- SDL_KEYDOWN:
- if GameState = gsChat then
- KeyPressChat(event.key.keysym.unicode, event.key.keysym.sym, event.key.keysym.modifier)
- else
- if GameState >= gsGame then ProcessKey(event.key);
- SDL_KEYUP:
- if (GameState <> gsChat) and (GameState >= gsGame) then
- ProcessKey(event.key);
-
- SDL_MOUSEBUTTONDOWN:
- if GameState = gsConfirm then
- ParseCommand('quit', true)
- else
- if (GameState >= gsGame) then ProcessMouse(event.button, true);
-
- SDL_MOUSEBUTTONUP:
- if (GameState >= gsGame) then ProcessMouse(event.button, false);
-
- SDL_ACTIVEEVENT:
- if (event.active.state and SDL_APPINPUTFOCUS) <> 0 then
- begin
- prevFocusState:= cHasFocus;
- cHasFocus:= event.active.gain = 1;
- if prevFocusState xor cHasFocus then
- onFocusStateChanged()
- end;
-
- SDL_VIDEORESIZE:
- begin
- // using lower values than cMinScreenWidth or cMinScreenHeight causes widget overlap and off-screen widget parts
- // Change by sheepluva:
- // Let's only use even numbers for custom width/height since I ran into scaling issues with odd width values.
- // Maybe just fixes the symptom not the actual cause(?), I'm too tired to find out :P
- cNewScreenWidth:= max(2 * (event.resize.w div 2), cMinScreenWidth);
- cNewScreenHeight:= max(2 * (event.resize.h div 2), cMinScreenHeight);
- cScreenResizeDelay:= RealTicks+500;
- end;
-{$ENDIF}
SDL_JOYAXISMOTION:
ControllerAxisEvent(event.jaxis.which, event.jaxis.axis, event.jaxis.value);
SDL_JOYHATMOTION:
@@ -351,20 +321,16 @@
AddFileLog(inttostr(i) + ': ' + ParamStr(i));
WriteToConsole('Init SDL... ');
- if not cOnlyStats then SDLTry(SDL_Init(SDL_INIT_VIDEO or SDL_INIT_NOPARACHUTE) >= 0, true);
+ if not cOnlyStats then SDLTry(SDL_Init(SDL_INIT_VIDEO or SDL_INIT_NOPARACHUTE) >= 0, 'SDL_Init', true);
WriteLnToConsole(msgOK);
-{$IFDEF SDL2}
- SDL_StartTextInput();
-{$ELSE}
- SDL_EnableUNICODE(1);
-{$ENDIF}
+ //SDL_StartTextInput();
SDL_ShowCursor(0);
if not cOnlyStats then
begin
WriteToConsole('Init SDL_ttf... ');
- SDLTry(TTF_Init() <> -1, true);
+ SDLTry(TTF_Init() <> -1, 'TTF_Init', true);
WriteLnToConsole(msgOK);
end;
--- a/hedgewars/options.inc Sun Nov 15 14:40:51 2015 +0100
+++ b/hedgewars/options.inc Sun Nov 15 14:42:59 2015 +0100
@@ -60,10 +60,6 @@
{$ENDIF}
{$ENDIF}
-{$IFDEF USE_TOUCH_INTERFACE}
- {$DEFINE SDL2}
-{$ENDIF}
-
{$DEFINE _S:=}
{$DEFINE _P:=}
--- a/hedgewars/sdlmain/CMakeLists.txt Sun Nov 15 14:40:51 2015 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-find_package(SDL REQUIRED)
-
-include_directories(${SDL_INCLUDE_DIR})
-
-add_library (SDLmain STATIC SDLMain.m)
-
-
--- a/hedgewars/sdlmain/SDLMain.h Sun Nov 15 14:40:51 2015 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,16 +0,0 @@
-/* SDLMain.m - main entry point for our Cocoa-ized SDL app
- Initial Version: Darrell Walisser <dwaliss1@purdue.edu>
- Non-NIB-Code & other changes: Max Horn <max@quendi.de>
-
- Feel free to customize this file to suit your needs
-*/
-
-#ifndef _SDLMain_h_
-#define _SDLMain_h_
-
-#import <Cocoa/Cocoa.h>
-
-@interface SDLMain : NSObject
-@end
-
-#endif /* _SDLMain_h_ */
--- a/hedgewars/sdlmain/SDLMain.m Sun Nov 15 14:40:51 2015 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,385 +0,0 @@
-/* SDLMain.m - main entry point for our Cocoa-ized SDL app
- Initial Version: Darrell Walisser <dwaliss1@purdue.edu>
- Non-NIB-Code & other changes: Max Horn <max@quendi.de>
-
- Feel free to customize this file to suit your needs
-*/
-
-#include "SDL.h"
-#include "SDLMain.h"
-#include <sys/param.h> /* for MAXPATHLEN */
-#include <unistd.h>
-
-/* For some reaon, Apple removed setAppleMenu from the headers in 10.4,
- but the method still is there and works. To avoid warnings, we declare
- it ourselves here. */
-@interface NSApplication(SDL_Missing_Methods)
-- (void)setAppleMenu:(NSMenu *)menu;
-@end
-
-/* Use this flag to determine whether we use SDLMain.nib or not */
-#define SDL_USE_NIB_FILE 0
-
-/* Use this flag to determine whether we use CPS (docking) or not */
-#define SDL_USE_CPS 1
-#ifdef SDL_USE_CPS
-/* Portions of CPS.h */
-typedef struct CPSProcessSerNum
-{
- UInt32 lo;
- UInt32 hi;
-} CPSProcessSerNum;
-
-extern OSErr CPSGetCurrentProcess( CPSProcessSerNum *psn);
-extern OSErr CPSEnableForegroundOperation( CPSProcessSerNum *psn, UInt32 _arg2, UInt32 _arg3, UInt32 _arg4, UInt32 _arg5);
-extern OSErr CPSSetFrontProcess( CPSProcessSerNum *psn);
-
-#endif /* SDL_USE_CPS */
-
-static int gArgc;
-static char **gArgv;
-static BOOL gFinderLaunch;
-static BOOL gCalledAppMainline = FALSE;
-
-static NSString *getApplicationName(void)
-{
- const NSDictionary *dict;
- NSString *appName = 0;
-
- /* Determine the application name */
- dict = (const NSDictionary *)CFBundleGetInfoDictionary(CFBundleGetMainBundle());
- if (dict)
- appName = [dict objectForKey: @"CFBundleName"];
-
- if (![appName length])
- appName = [[NSProcessInfo processInfo] processName];
-
- return appName;
-}
-
-#if SDL_USE_NIB_FILE
-/* A helper category for NSString */
-@interface NSString (ReplaceSubString)
-- (NSString *)stringByReplacingRange:(NSRange)aRange with:(NSString *)aString;
-@end
-#endif
-
-@interface SDLApplication : NSApplication
-@end
-
-@implementation SDLApplication
-/* Invoked from the Quit menu item */
-- (void)terminate:(id)sender
-{
- /* Post a SDL_QUIT event */
- SDL_Event event;
- event.type = SDL_QUIT;
- SDL_PushEvent(&event);
-}
-@end
-
-/* The main class of the application, the application's delegate */
-@implementation SDLMain
-
-/* Set the working directory to the .app's parent directory */
-- (void) setupWorkingDirectory:(BOOL)shouldChdir
-{
- if (shouldChdir)
- {
- char parentdir[MAXPATHLEN];
- CFURLRef url = CFBundleCopyBundleURL(CFBundleGetMainBundle());
- CFURLRef url2 = CFURLCreateCopyDeletingLastPathComponent(0, url);
- if (CFURLGetFileSystemRepresentation(url2, 1, (UInt8 *)parentdir, MAXPATHLEN)) {
- chdir(parentdir); /* chdir to the binary app's parent */
- }
- CFRelease(url);
- CFRelease(url2);
- }
-}
-
-#if SDL_USE_NIB_FILE
-
-/* Fix menu to contain the real app name instead of "SDL App" */
-- (void)fixMenu:(NSMenu *)aMenu withAppName:(NSString *)appName
-{
- NSRange aRange;
- NSEnumerator *enumerator;
- NSMenuItem *menuItem;
-
- aRange = [[aMenu title] rangeOfString:@"SDL App"];
- if (aRange.length != 0)
- [aMenu setTitle: [[aMenu title] stringByReplacingRange:aRange with:appName]];
-
- enumerator = [[aMenu itemArray] objectEnumerator];
- while ((menuItem = [enumerator nextObject]))
- {
- aRange = [[menuItem title] rangeOfString:@"SDL App"];
- if (aRange.length != 0)
- [menuItem setTitle: [[menuItem title] stringByReplacingRange:aRange with:appName]];
- if ([menuItem hasSubmenu])
- [self fixMenu:[menuItem submenu] withAppName:appName];
- }
- [ aMenu sizeToFit ];
-}
-
-#else
-
-static void setApplicationMenu(void)
-{
- /* warning: this code is very odd */
- NSMenu *appleMenu;
- NSMenuItem *menuItem;
- NSString *title;
- NSString *appName;
-
- appName = getApplicationName();
- appleMenu = [[NSMenu alloc] initWithTitle:@""];
-
- /* Add menu items */
- title = [@"About " stringByAppendingString:appName];
- [appleMenu addItemWithTitle:title action:@selector(orderFrontStandardAboutPanel:) keyEquivalent:@""];
-
- [appleMenu addItem:[NSMenuItem separatorItem]];
-
- title = [@"Hide " stringByAppendingString:appName];
- [appleMenu addItemWithTitle:title action:@selector(hide:) keyEquivalent:@"h"];
-
- menuItem = (NSMenuItem *)[appleMenu addItemWithTitle:@"Hide Others" action:@selector(hideOtherApplications:) keyEquivalent:@"h"];
- [menuItem setKeyEquivalentModifierMask:(NSAlternateKeyMask|NSCommandKeyMask)];
-
- [appleMenu addItemWithTitle:@"Show All" action:@selector(unhideAllApplications:) keyEquivalent:@""];
-
- [appleMenu addItem:[NSMenuItem separatorItem]];
-
- title = [@"Quit " stringByAppendingString:appName];
- [appleMenu addItemWithTitle:title action:@selector(terminate:) keyEquivalent:@"q"];
-
-
- /* Put menu into the menubar */
- menuItem = [[NSMenuItem alloc] initWithTitle:@"" action:nil keyEquivalent:@""];
- [menuItem setSubmenu:appleMenu];
- [[NSApp mainMenu] addItem:menuItem];
-
- /* Tell the application object that this is now the application menu */
- [NSApp setAppleMenu:appleMenu];
-
- /* Finally give up our references to the objects */
- [appleMenu release];
- [menuItem release];
-}
-
-/* Create a window menu */
-static void setupWindowMenu(void)
-{
- NSMenu *windowMenu;
- NSMenuItem *windowMenuItem;
- NSMenuItem *menuItem;
-
- windowMenu = [[NSMenu alloc] initWithTitle:@"Window"];
-
- /* "Minimize" item */
- menuItem = [[NSMenuItem alloc] initWithTitle:@"Minimize" action:@selector(performMiniaturize:) keyEquivalent:@"m"];
- [windowMenu addItem:menuItem];
- [menuItem release];
-
- /* Put menu into the menubar */
- windowMenuItem = [[NSMenuItem alloc] initWithTitle:@"Window" action:nil keyEquivalent:@""];
- [windowMenuItem setSubmenu:windowMenu];
- [[NSApp mainMenu] addItem:windowMenuItem];
-
- /* Tell the application object that this is now the window menu */
- [NSApp setWindowsMenu:windowMenu];
-
- /* Finally give up our references to the objects */
- [windowMenu release];
- [windowMenuItem release];
-}
-
-/* Replacement for NSApplicationMain */
-static void CustomApplicationMain (int argc, char **argv)
-{
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
- SDLMain *sdlMain;
-
- /* Ensure the application object is initialised */
- [SDLApplication sharedApplication];
-
-#ifdef SDL_USE_CPS
- {
- CPSProcessSerNum PSN;
- /* Tell the dock about us */
- if (!CPSGetCurrentProcess(&PSN))
- if (!CPSEnableForegroundOperation(&PSN,0x03,0x3C,0x2C,0x1103))
- if (!CPSSetFrontProcess(&PSN))
- [SDLApplication sharedApplication];
- }
-#endif /* SDL_USE_CPS */
-
- /* Set up the menubar */
- NSMenu *menu = [[NSMenu alloc] init];
- [NSApp setMainMenu:menu];
- setApplicationMenu();
- setupWindowMenu();
- [menu release];
-
- /* Create SDLMain and make it the app delegate */
- sdlMain = [[SDLMain alloc] init];
- [NSApp setDelegate:sdlMain];
-
- /* Start the main event loop */
- [NSApp run];
-
- [sdlMain release];
- [pool release];
-}
-
-#endif
-
-
-/*
- * Catch document open requests...this lets us notice files when the app
- * was launched by double-clicking a document, or when a document was
- * dragged/dropped on the app's icon. You need to have a
- * CFBundleDocumentsType section in your Info.plist to get this message,
- * apparently.
- *
- * Files are added to gArgv, so to the app, they'll look like command line
- * arguments. Previously, apps launched from the finder had nothing but
- * an argv[0].
- *
- * This message may be received multiple times to open several docs on launch.
- *
- * This message is ignored once the app's mainline has been called.
- */
-- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename
-{
- const char *temparg;
- size_t arglen;
- char *arg;
- char **newargv;
-
- if (!gFinderLaunch) /* MacOS is passing command line args. */
- return FALSE;
-
- if (gCalledAppMainline) /* app has started, ignore this document. */
- return FALSE;
-
- temparg = [filename UTF8String];
- arglen = SDL_strlen(temparg) + 1;
- arg = (char *) SDL_malloc(arglen);
- if (arg == NULL)
- return FALSE;
-
- newargv = (char **) realloc(gArgv, sizeof (char *) * (gArgc + 2));
- if (newargv == NULL)
- {
- SDL_free(arg);
- return FALSE;
- }
- gArgv = newargv;
-
- SDL_strlcpy(arg, temparg, arglen);
- gArgv[gArgc++] = arg;
- gArgv[gArgc] = NULL;
- return TRUE;
-}
-
-
-/* Called when the internal event loop has just started running */
-- (void) applicationDidFinishLaunching: (NSNotification *) note
-{
- int status;
-
- /* Set the working directory to the .app's parent directory */
- [self setupWorkingDirectory:gFinderLaunch];
-
-#if SDL_USE_NIB_FILE
- /* Set the main menu to contain the real app name instead of "SDL App" */
- [self fixMenu:[NSApp mainMenu] withAppName:getApplicationName()];
-#endif
-
- /* Hand off to main application code */
- gCalledAppMainline = TRUE;
- status = SDL_main (gArgc, gArgv);
-
- /* We're done, thank you for playing */
- exit(status);
-}
-@end
-
-
-@implementation NSString (ReplaceSubString)
-
-- (NSString *)stringByReplacingRange:(NSRange)aRange with:(NSString *)aString
-{
- unsigned int bufferSize;
- unsigned int selfLen = [self length];
- unsigned int aStringLen = [aString length];
- unichar *buffer;
- NSRange localRange;
- NSString *result;
-
- bufferSize = selfLen + aStringLen - aRange.length;
- buffer = (unichar *)NSAllocateMemoryPages(bufferSize*sizeof(unichar));
-
- /* Get first part into buffer */
- localRange.location = 0;
- localRange.length = aRange.location;
- [self getCharacters:buffer range:localRange];
-
- /* Get middle part into buffer */
- localRange.location = 0;
- localRange.length = aStringLen;
- [aString getCharacters:(buffer+aRange.location) range:localRange];
-
- /* Get last part into buffer */
- localRange.location = aRange.location + aRange.length;
- localRange.length = selfLen - localRange.location;
- [self getCharacters:(buffer+aRange.location+aStringLen) range:localRange];
-
- /* Build output string */
- result = [NSString stringWithCharacters:buffer length:bufferSize];
-
- NSDeallocateMemoryPages(buffer, bufferSize);
-
- return result;
-}
-
-@end
-
-
-
-#ifdef main
-# undef main
-#endif
-
-
-/* Main entry point to executable - should *not* be SDL_main! */
-int main (int argc, char **argv)
-{
- /* Copy the arguments into a global variable */
- /* This is passed if we are launched by double-clicking */
- if ( argc >= 2 && strncmp (argv[1], "-psn", 4) == 0 ) {
- gArgv = (char **) SDL_malloc(sizeof (char *) * 2);
- gArgv[0] = argv[0];
- gArgv[1] = NULL;
- gArgc = 1;
- gFinderLaunch = YES;
- } else {
- int i;
- gArgc = argc;
- gArgv = (char **) SDL_malloc(sizeof (char *) * (argc+1));
- for (i = 0; i <= argc; i++)
- gArgv[i] = argv[i];
- gFinderLaunch = NO;
- }
-
-#if SDL_USE_NIB_FILE
- [SDLApplication poseAsClass:[NSApplication class]];
- NSApplicationMain (argc, argv);
-#else
- CustomApplicationMain (argc, argv);
-#endif
- return 0;
-}
-
--- a/hedgewars/uAI.pas Sun Nov 15 14:40:51 2015 +0100
+++ b/hedgewars/uAI.pas Sun Nov 15 14:42:59 2015 +0100
@@ -530,7 +530,7 @@
FillBonuses(((Me^.State and gstAttacked) <> 0) and (not isInMultiShoot));
SDL_LockMutex(ThreadLock);
-ThinkThread:= SDL_CreateThread(@Think{$IFDEF SDL2}, 'think'{$ENDIF}, Me);
+ThinkThread:= SDL_CreateThread(@Think, PChar('think'), Me);
SDL_UnlockMutex(ThreadLock);
end;
--- a/hedgewars/uChat.pas Sun Nov 15 14:40:51 2015 +0100
+++ b/hedgewars/uChat.pas Sun Nov 15 14:42:59 2015 +0100
@@ -21,6 +21,7 @@
unit uChat;
interface
+uses SDLh;
procedure initModule;
procedure freeModule;
@@ -28,12 +29,13 @@
procedure CleanupInput;
procedure AddChatString(s: shortstring);
procedure DrawChat;
-procedure KeyPressChat(Key, Sym: Longword; Modifier: Word);
+procedure KeyPressChat(keysym: TSDL_Keysym);
procedure SendHogSpeech(s: shortstring);
procedure CopyToClipboard(var newContent: shortstring);
+procedure TextInput(var event: TSDL_TextInputEvent);
implementation
-uses SDLh, uInputHandler, uTypes, uVariables, uCommands, uUtils, uTextures, uRender, uIO, uScript, uRenderUtils;
+uses uInputHandler, uTypes, uVariables, uCommands, uUtils, uTextures, uRender, uIO, uScript, uRenderUtils;
const MaxStrIndex = 27;
MaxInputStrLen = 200;
@@ -267,8 +269,6 @@
inc(visibleCount)
end;
-procedure CheckPasteBuffer(); forward;
-
procedure UpdateInputLinePrefix();
begin
if liveLua then
@@ -302,7 +302,6 @@
// draw chat input line first and under all other lines
if (GameState = gsChat) and (InputStr.Tex <> nil) then
begin
- CheckPasteBuffer();
if InputLinePrefix.Tex = nil then
RenderChatLineTex(InputLinePrefix, InputLinePrefix.s);
@@ -571,9 +570,8 @@
begin
FreezeEnterKey;
history:= 0;
-{$IFNDEF SDL2}
- SDL_EnableKeyRepeat(0,0);
-{$ENDIF}
+ SDL_StopTextInput();
+ //SDL_EnableKeyRepeat(0,0);
GameState:= gsGame;
ResetKbd;
end;
@@ -728,7 +726,8 @@
procedure CopyToClipboard(var newContent: shortstring);
begin
- SendIPC(_S'y' + copy(newContent, 1, 253) + #0);
+ // SDL2 clipboard
+ SDL_SetClipboardText(Str2PChar(newContent));
end;
procedure CopySelectionToClipboard();
@@ -782,39 +781,41 @@
end;
procedure PasteFromClipboard();
+var clip: PChar;
begin
- SendIPC(_S'Y');
-end;
-
-procedure CheckPasteBuffer();
-begin
- if Length(ChatPasteBuffer) > 0 then
+ // use SDL2 clipboard functions
+ if SDL_HasClipboardText() then
begin
- InsertIntoInputStr(ChatPasteBuffer);
- ChatPasteBuffer:= '';
+ clip:= SDL_GetClipboardText();
+ // returns NULL if not enough memory for a copy of clipboard content
+ if clip <> nil then
+ begin
+ InsertIntoInputStr(shortstring(clip));
+ SDL_free(Pointer(clip));
+ end;
end;
end;
-procedure KeyPressChat(Key, Sym: Longword; Modifier: Word);
-const firstByteMark: array[0..3] of byte = (0, $C0, $E0, $F0);
- nonStateMask = (not (KMOD_NUM or KMOD_CAPS));
-var i, btw, index: integer;
- utf8: shortstring;
- action, selMode, ctrl, ctrlonly: boolean;
+procedure KeyPressChat(keysym: TSDL_Keysym);
+const nonStateMask = (not (KMOD_NUM or KMOD_CAPS));
+var i, index: integer;
+ selMode, ctrl, ctrlonly: boolean;
skip: TCharSkip;
+ Scancode: TSDL_Scancode;
+ Modifier: Word;
begin
+ Scancode:= keysym.scancode;
+ Modifier:= keysym.modifier;
+
LastKeyPressTick:= RealTicks;
- action:= true;
-
- CheckPasteBuffer();
selMode:= (modifier and (KMOD_LSHIFT or KMOD_RSHIFT)) <> 0;
ctrl:= (modifier and (KMOD_LCTRL or KMOD_RCTRL)) <> 0;
ctrlonly:= ctrl and ((modifier and nonStateMask and (not (KMOD_LCTRL or KMOD_RCTRL))) = 0);
skip:= none;
- case Sym of
- SDLK_BACKSPACE:
+ case Scancode of
+ SDL_SCANCODE_BACKSPACE:
begin
if selectedPos < 0 then
begin
@@ -831,7 +832,7 @@
DeleteSelected();
UpdateCursorCoords();
end;
- SDLK_DELETE:
+ SDL_SCANCODE_DELETE:
begin
if selectedPos < 0 then
begin
@@ -848,7 +849,7 @@
DeleteSelected();
UpdateCursorCoords();
end;
- SDLK_ESCAPE:
+ SDL_SCANCODE_ESCAPE:
begin
if Length(InputStr.s) > 0 then
begin
@@ -857,7 +858,7 @@
end
else CleanupInput
end;
- SDLK_RETURN, SDLK_KP_ENTER:
+ SDL_SCANCODE_RETURN, SDL_SCANCODE_KP_ENTER:
begin
if Length(InputStr.s) > 0 then
begin
@@ -867,10 +868,10 @@
end;
CleanupInput
end;
- SDLK_UP, SDLK_DOWN:
+ SDL_SCANCODE_UP, SDL_SCANCODE_DOWN:
begin
- if (Sym = SDLK_UP) and (history < localLastStr) then inc(history);
- if (Sym = SDLK_DOWN) and (history > 0) then dec(history);
+ if (Scancode = SDL_SCANCODE_UP) and (history < localLastStr) then inc(history);
+ if (Scancode = SDL_SCANCODE_DOWN) and (history > 0) then dec(history);
index:= localLastStr - history + 1;
if (index > localLastStr) then
begin
@@ -884,7 +885,7 @@
ResetSelection();
UpdateCursorCoords();
end;
- SDLK_HOME:
+ SDL_SCANCODE_HOME:
begin
if cursorPos > 0 then
begin
@@ -896,7 +897,7 @@
UpdateCursorCoords();
end;
- SDLK_END:
+ SDL_SCANCODE_END:
begin
i:= Length(InputStr.s);
if cursorPos < i then
@@ -909,7 +910,7 @@
UpdateCursorCoords();
end;
- SDLK_LEFT:
+ SDL_SCANCODE_LEFT:
begin
if cursorPos > 0 then
begin
@@ -938,7 +939,7 @@
UpdateCursorCoords();
end;
- SDLK_RIGHT:
+ SDL_SCANCODE_RIGHT:
begin
if cursorPos < Length(InputStr.s) then
begin
@@ -963,11 +964,12 @@
UpdateCursorCoords();
end;
- SDLK_PAGEUP, SDLK_PAGEDOWN:
+ SDL_SCANCODE_PAGEUP, SDL_SCANCODE_PAGEDOWN:
begin
// ignore me!!!
end;
- SDLK_a:
+ // TODO: figure out how to determine those keys better
+ SDL_SCANCODE_a:
begin
// select all
if ctrlonly then
@@ -978,18 +980,14 @@
cursorPos:= Length(InputStr.s);
UpdateCursorCoords();
end
- else
- action:= false;
end;
- SDLK_c:
+ SDL_SCANCODE_c:
begin
// copy
if ctrlonly then
CopySelectionToClipboard()
- else
- action:= false;
end;
- SDLK_v:
+ SDL_SCANCODE_v:
begin
// paste
if ctrlonly then
@@ -997,10 +995,8 @@
DeleteSelected();
PasteFromClipboard();
end
- else
- action:= false;
end;
- SDLK_x:
+ SDL_SCANCODE_x:
begin
// cut
if ctrlonly then
@@ -1008,51 +1004,32 @@
CopySelectionToClipboard();
DeleteSelected();
end
- else
- action:= false;
end;
- else
- action:= false;
end;
- if not action and (Key <> 0) then
- begin
- DeleteSelected();
+end;
- if (Key < $80) then
- btw:= 1
- else if (Key < $800) then
- btw:= 2
- else if (Key < $10000) then
- btw:= 3
- else
- btw:= 4;
-
- utf8:= '';
+procedure TextInput(var event: TSDL_TextInputEvent);
+var s: shortstring;
+ l: byte;
+begin
+ DeleteSelected();
- for i:= btw downto 2 do
- begin
- utf8:= char((Key or $80) and $BF) + utf8;
- Key:= Key shr 6
- end;
-
- utf8:= char(Key or firstByteMark[Pred(btw)]) + utf8;
-
- if Length(InputStr.s) + btw > MaxInputStrLen then
- exit;
+ l:= 0;
+ while event.text[l] <> #0 do
+ begin
+ s[l + 1]:= event.text[l];
+ inc(l)
+ end;
- // if speech bubble quotes are used as first input, add the closing quote and place cursor inbetween
- if (Length(InputStr.s) = 0) and (Length(utf8) = 1) and (charIsForHogSpeech(utf8[1])) then
- begin
- InsertIntoInputStr(utf8);
- InsertIntoInputStr(utf8);
- cursorPos:= 1;
- UpdateCursorCoords();
- end
- else
- InsertIntoInputStr(utf8);
+ if l > 0 then
+ begin
+ if byte(InputStr.s[0]) + l > 240 then exit;
+ s[0]:= char(l);
+ InsertIntoInputStr(s);
end
end;
+
procedure chChatMessage(var s: shortstring);
begin
AddChatString(s)
@@ -1098,9 +1075,9 @@
begin
s:= s; // avoid compiler hint
GameState:= gsChat;
-{$IFNDEF SDL2}
- SDL_EnableKeyRepeat(200,45);
-{$ENDIF}
+ SDL_StopTextInput();
+ SDL_StartTextInput();
+ //SDL_EnableKeyRepeat(200,45);
if length(s) = 0 then
SetLine(InputStr, '', true)
else
@@ -1140,6 +1117,7 @@
LastKeyPressTick:= 0;
ResetCursor();
+ SDL_StopTextInput();
end;
procedure freeModule;
--- a/hedgewars/uDebug.pas Sun Nov 15 14:40:51 2015 +0100
+++ b/hedgewars/uDebug.pas Sun Nov 15 14:42:59 2015 +0100
@@ -24,7 +24,7 @@
procedure OutError(Msg: shortstring; isFatalError: boolean);
procedure TryDo(Assert: boolean; Msg: shortstring; isFatal: boolean); inline;
-procedure SDLTry(Assert: boolean; isFatal: boolean);
+procedure SDLTry(Assert: boolean; Msg: shortstring; isFatal: boolean);
implementation
uses SDLh, uConsole, uCommands, uConsts;
@@ -47,13 +47,13 @@
OutError(Msg, isFatal)
end;
-procedure SDLTry(Assert: boolean; isFatal: boolean);
+procedure SDLTry(Assert: boolean; Msg: shortstring; isFatal: boolean);
var s: shortstring;
begin
if not Assert then
begin
s:= SDL_GetError();
- OutError(s, isFatal)
+ OutError(Msg + ': ' + s, isFatal)
end
end;
--- a/hedgewars/uGearsHandlersMess.pas Sun Nov 15 14:40:51 2015 +0100
+++ b/hedgewars/uGearsHandlersMess.pas Sun Nov 15 14:42:59 2015 +0100
@@ -2650,7 +2650,11 @@
AfterAttack;
- HHGear^.State := HHGear^.State and (not (gstAttacking or gstAttacked or gstMoving));
+ // make sure hog doesn't end up facing in wrong direction due to high jump
+ if (HHGear^.State and gstHHHJump) <> 0 then
+ HHGear^.dX.isNegative := (not HHGear^.dX.isNegative);
+
+ HHGear^.State := HHGear^.State and (not (gstAttacking or gstAttacked or gstMoving or gstHHJumping or gstHHHJump));
HHGear^.Message := HHGear^.Message and (not gmAttack);
Gear^.doStep := @doStepParachuteWork;
--- a/hedgewars/uIO.pas Sun Nov 15 14:40:51 2015 +0100
+++ b/hedgewars/uIO.pas Sun Nov 15 14:42:59 2015 +0100
@@ -105,16 +105,16 @@
var ipaddr: TIPAddress;
begin
WriteToConsole('Init SDL_Net... ');
- SDLTry(SDLNet_Init = 0, true);
+ SDLTry(SDLNet_Init = 0, 'SDLNet_Init', true);
fds:= SDLNet_AllocSocketSet(1);
- SDLTry(fds <> nil, true);
+ SDLTry(fds <> nil, 'SDLNet_AllocSocketSet', true);
WriteLnToConsole(msgOK);
WriteToConsole('Establishing IPC connection to tcp 127.0.0.1:' + IntToStr(ipcPort) + ' ');
{$HINTS OFF}
- SDLTry(SDLNet_ResolveHost(ipaddr, PChar('127.0.0.1'), ipcPort) = 0, true);
+ SDLTry(SDLNet_ResolveHost(ipaddr, PChar('127.0.0.1'), ipcPort) = 0, 'SDLNet_ResolveHost', true);
{$HINTS ON}
IPCSock:= SDLNet_TCP_Open(ipaddr);
- SDLTry(IPCSock <> nil, true);
+ SDLTry(IPCSock <> nil, 'SDLNet_TCP_Open', true);
WriteLnToConsole(msgOK)
end;
@@ -163,7 +163,6 @@
ParseChatCommand('chatmsg ' + #4, s, 2)
else
isProcessed:= false;
- 'Y': ChatPasteBuffer:= copy(s, 2, Length(s) - 1);
else
isProcessed:= false;
end;
--- a/hedgewars/uInputHandler.pas Sun Nov 15 14:40:51 2015 +0100
+++ b/hedgewars/uInputHandler.pas Sun Nov 15 14:42:59 2015 +0100
@@ -30,6 +30,7 @@
//procedure MaskModifier(var code: LongInt; modifier: LongWord);
procedure MaskModifier(Modifier: shortstring; var code: LongInt);
procedure ProcessMouse(event: TSDL_MouseButtonEvent; ButtonDown: boolean);
+procedure ProcessMouseWheel(x, y: LongInt);
procedure ProcessKey(event: TSDL_KeyboardEvent); inline;
procedure ProcessKey(code: LongInt; KeyDown: boolean);
@@ -82,8 +83,8 @@
var code: LongInt;
begin
name:= LowerCase(name);
- code:= cKeyMaxIndex;
- while (code > 0) and (KeyNames[code] <> name) do dec(code);
+ code:= 0;
+ while (code <= cKeyMaxIndex) and (KeyNames[code] <> name) do inc(code);
MaskModifier(Modifier, code);
KeyNameToCode:= code;
@@ -168,7 +169,13 @@
if CurrentBinds[code][0] <> #0 then
begin
- if (code > 3) and KeyDown and (not ((CurrentBinds[code] = 'put')) or (CurrentBinds[code] = 'ammomenu') or (CurrentBinds[code] = '+cur_u') or (CurrentBinds[code] = '+cur_d') or (CurrentBinds[code] = '+cur_l') or (CurrentBinds[code] = '+cur_r')) and (CurrentTeam <> nil) and (not CurrentTeam^.ExtDriven) then bShowAmmoMenu:= false;
+ if (code < cKeyMaxIndex - 2) // means not mouse buttons
+ and KeyDown
+ and (not ((CurrentBinds[code] = 'put')) or (CurrentBinds[code] = 'ammomenu') or (CurrentBinds[code] = '+cur_u') or (CurrentBinds[code] = '+cur_d') or (CurrentBinds[code] = '+cur_l') or (CurrentBinds[code] = '+cur_r'))
+ and (CurrentTeam <> nil)
+ and (not CurrentTeam^.ExtDriven)
+ then bShowAmmoMenu:= false;
+
if KeyDown then
begin
Trusted:= Trusted and (not isPaused); //releasing keys during pause should be allowed on the other hand
@@ -203,25 +210,36 @@
procedure ProcessKey(event: TSDL_KeyboardEvent); inline;
var code: LongInt;
begin
- code:= event.keysym.sym;
- //MaskModifier(code, event.keysym.modifier);
+ // TODO
+ code:= LongInt(event.keysym.scancode);
+ //writelntoconsole('[KEY] '+inttostr(code)+ ' -> ''' +KeyNames[code] + ''', type = '+inttostr(event.type_));
ProcessKey(code, event.type_ = SDL_KEYDOWN);
end;
procedure ProcessMouse(event: TSDL_MouseButtonEvent; ButtonDown: boolean);
begin
-case event.button of
- SDL_BUTTON_LEFT:
- ProcessKey(KeyNameToCode('mousel'), ButtonDown);
- SDL_BUTTON_MIDDLE:
- ProcessKey(KeyNameToCode('mousem'), ButtonDown);
- SDL_BUTTON_RIGHT:
- ProcessKey(KeyNameToCode('mouser'), ButtonDown);
- SDL_BUTTON_WHEELDOWN:
- ProcessKey(KeyNameToCode('wheeldown'), ButtonDown);
- SDL_BUTTON_WHEELUP:
- ProcessKey(KeyNameToCode('wheelup'), ButtonDown);
- end;
+ //writelntoconsole('[MOUSE] '+inttostr(event.button));
+ case event.button of
+ SDL_BUTTON_LEFT:
+ ProcessKey(KeyNameToCode('mousel'), ButtonDown);
+ SDL_BUTTON_MIDDLE:
+ ProcessKey(KeyNameToCode('mousem'), ButtonDown);
+ SDL_BUTTON_RIGHT:
+ ProcessKey(KeyNameToCode('mouser'), ButtonDown);
+ SDL_BUTTON_WHEELDOWN:
+ ProcessKey(KeyNameToCode('wheeldown'), ButtonDown);
+ SDL_BUTTON_WHEELUP:
+ ProcessKey(KeyNameToCode('wheelup'), ButtonDown);
+ end;
+end;
+
+procedure ProcessMouseWheel(x, y: LongInt);
+begin
+ //writelntoconsole('[MOUSEWHEEL] '+inttostr(x)+', '+inttostr(y));
+ if y > 0 then
+ ProcessKey(KeyNameToCode('wheelup'), true)
+ else if y < 0 then
+ ProcessKey(KeyNameToCode('wheeldown'), true);
end;
procedure ResetKbd;
@@ -232,125 +250,131 @@
ProcessKey(t, False);
end;
+
+procedure InitDefaultBinds;
+var i: Longword;
+begin
+ DefaultBinds[KeyNameToCode('escape')]:= 'quit';
+ DefaultBinds[KeyNameToCode(_S'`')]:= 'history';
+ DefaultBinds[KeyNameToCode('delete')]:= 'rotmask';
+
+ //numpad
+ //DefaultBinds[265]:= '+volup';
+ //DefaultBinds[256]:= '+voldown';
+
+ DefaultBinds[KeyNameToCode(_S'0')]:= '+volup';
+ DefaultBinds[KeyNameToCode(_S'9')]:= '+voldown';
+ DefaultBinds[KeyNameToCode(_S'8')]:= 'mute';
+ DefaultBinds[KeyNameToCode(_S'c')]:= 'capture';
+ DefaultBinds[KeyNameToCode(_S'r')]:= 'record';
+ DefaultBinds[KeyNameToCode(_S'h')]:= 'findhh';
+ DefaultBinds[KeyNameToCode(_S'p')]:= 'pause';
+ DefaultBinds[KeyNameToCode(_S's')]:= '+speedup';
+ DefaultBinds[KeyNameToCode(_S't')]:= 'chat';
+ DefaultBinds[KeyNameToCode(_S'y')]:= 'confirm';
+
+ DefaultBinds[KeyNameToCode('mousem')]:= 'zoomreset';
+ DefaultBinds[KeyNameToCode('wheelup')]:= 'zoomin';
+ DefaultBinds[KeyNameToCode('wheeldown')]:= 'zoomout';
+
+ DefaultBinds[KeyNameToCode('f12')]:= 'fullscr';
+
+
+ DefaultBinds[KeyNameToCode('mousel')]:= '/put';
+ DefaultBinds[KeyNameToCode('mouser')]:= 'ammomenu';
+ DefaultBinds[KeyNameToCode('backspace')]:= 'hjump';
+ DefaultBinds[KeyNameToCode('tab')]:= 'switch';
+ DefaultBinds[KeyNameToCode('return')]:= 'ljump';
+ DefaultBinds[KeyNameToCode('space')]:= '+attack';
+ DefaultBinds[KeyNameToCode('up')]:= '+up';
+ DefaultBinds[KeyNameToCode('down')]:= '+down';
+ DefaultBinds[KeyNameToCode('left')]:= '+left';
+ DefaultBinds[KeyNameToCode('right')]:= '+right';
+ DefaultBinds[KeyNameToCode('left_shift')]:= '+precise';
+
+
+ DefaultBinds[KeyNameToCode('j0a0u')]:= '+left';
+ DefaultBinds[KeyNameToCode('j0a0d')]:= '+right';
+ DefaultBinds[KeyNameToCode('j0a1u')]:= '+up';
+ DefaultBinds[KeyNameToCode('j0a1d')]:= '+down';
+ for i:= 1 to 10 do DefaultBinds[KeyNameToCode('f'+IntToStr(i))]:= 'slot '+IntToStr(i);
+ for i:= 1 to 5 do DefaultBinds[KeyNameToCode(IntToStr(i))]:= 'timer '+IntToStr(i);
+
+ loadBinds('dbind', cPathz[ptData] + '/settings.ini');
+end;
+
+
procedure InitKbdKeyTable;
var i, j, k, t: LongInt;
s: string[15];
begin
-//TODO in sdl13 this overrides some values (A and B) change indices to some other values at the back perhaps?
-KeyNames[1]:= 'mousel';
-KeyNames[2]:= 'mousem';
-KeyNames[3]:= 'mouser';
-KeyNames[4]:= 'wheelup';
-KeyNames[5]:= 'wheeldown';
+ KeyNames[cKeyMaxIndex ]:= 'mousel';
+ KeyNames[cKeyMaxIndex - 1]:= 'mousem';
+ KeyNames[cKeyMaxIndex - 2]:= 'mouser';
+ KeyNames[cKeyMaxIndex - 3]:= 'wheelup';
+ KeyNames[cKeyMaxIndex - 4]:= 'wheeldown';
-for i:= 6 to cKeyMaxIndex do
- begin
- s:= shortstring(sdl_getkeyname(i));
- //WriteLnToConsole('uInputHandler - ' + IntToStr(i) + ': ' + s + ' ' + IntToStr(cKeyMaxIndex));
- if s = 'unknown key' then KeyNames[i]:= ''
- else
+ for i:= 0 to cKeyMaxIndex - 5 do
begin
+ s:= shortstring(SDL_GetScancodeName(TSDL_Scancode(i)));
+
for t:= 1 to Length(s) do
if s[t] = ' ' then
s[t]:= '_';
KeyNames[i]:= LowerCase(s)
end;
- end;
-// get the size of keyboard array
-SDL_GetKeyState(@k);
+ // get the size of keyboard array
+ SDL_GetKeyboardState(@k);
-// Controller(s)
-for j:= 0 to Pred(ControllerNumControllers) do
- begin
- for i:= 0 to Pred(ControllerNumAxes[j]) do
+ // Controller(s)
+ for j:= 0 to Pred(ControllerNumControllers) do
begin
- keynames[k + 0]:= 'j' + IntToStr(j) + 'a' + IntToStr(i) + 'u';
- keynames[k + 1]:= 'j' + IntToStr(j) + 'a' + IntToStr(i) + 'd';
- inc(k, 2);
- end;
- for i:= 0 to Pred(ControllerNumHats[j]) do
- begin
- keynames[k + 0]:= 'j' + IntToStr(j) + 'h' + IntToStr(i) + 'u';
- keynames[k + 1]:= 'j' + IntToStr(j) + 'h' + IntToStr(i) + 'r';
- keynames[k + 2]:= 'j' + IntToStr(j) + 'h' + IntToStr(i) + 'd';
- keynames[k + 3]:= 'j' + IntToStr(j) + 'h' + IntToStr(i) + 'l';
- inc(k, 4);
- end;
- for i:= 0 to Pred(ControllerNumButtons[j]) do
- begin
- keynames[k]:= 'j' + IntToStr(j) + 'b' + IntToStr(i);
- inc(k, 1);
+ for i:= 0 to Pred(ControllerNumAxes[j]) do
+ begin
+ KeyNames[k + 0]:= 'j' + IntToStr(j) + 'a' + IntToStr(i) + 'u';
+ KeyNames[k + 1]:= 'j' + IntToStr(j) + 'a' + IntToStr(i) + 'd';
+ inc(k, 2);
+ end;
+ for i:= 0 to Pred(ControllerNumHats[j]) do
+ begin
+ KeyNames[k + 0]:= 'j' + IntToStr(j) + 'h' + IntToStr(i) + 'u';
+ KeyNames[k + 1]:= 'j' + IntToStr(j) + 'h' + IntToStr(i) + 'r';
+ KeyNames[k + 2]:= 'j' + IntToStr(j) + 'h' + IntToStr(i) + 'd';
+ KeyNames[k + 3]:= 'j' + IntToStr(j) + 'h' + IntToStr(i) + 'l';
+ inc(k, 4);
+ end;
+ for i:= 0 to Pred(ControllerNumButtons[j]) do
+ begin
+ KeyNames[k]:= 'j' + IntToStr(j) + 'b' + IntToStr(i);
+ inc(k, 1);
+ end;
end;
- end;
-DefaultBinds[KeyNameToCode('escape')]:= 'quit';
-DefaultBinds[KeyNameToCode(_S'`')]:= 'history';
-DefaultBinds[KeyNameToCode('delete')]:= 'rotmask';
-
-//numpad
-//DefaultBinds[265]:= '+volup';
-//DefaultBinds[256]:= '+voldown';
-
-DefaultBinds[KeyNameToCode(_S'0')]:= '+volup';
-DefaultBinds[KeyNameToCode(_S'9')]:= '+voldown';
-DefaultBinds[KeyNameToCode(_S'8')]:= 'mute';
-DefaultBinds[KeyNameToCode(_S'c')]:= 'capture';
-DefaultBinds[KeyNameToCode(_S'r')]:= 'record';
-DefaultBinds[KeyNameToCode(_S'h')]:= 'findhh';
-DefaultBinds[KeyNameToCode(_S'p')]:= 'pause';
-DefaultBinds[KeyNameToCode(_S's')]:= '+speedup';
-DefaultBinds[KeyNameToCode(_S't')]:= 'chat';
-DefaultBinds[KeyNameToCode(_S'y')]:= 'confirm';
-
-DefaultBinds[KeyNameToCode('mousem')]:= 'zoomreset';
-DefaultBinds[KeyNameToCode('wheelup')]:= 'zoomin';
-DefaultBinds[KeyNameToCode('wheeldown')]:= 'zoomout';
-
-DefaultBinds[KeyNameToCode('f12')]:= 'fullscr';
+ InitDefaultBinds
+end;
-DefaultBinds[KeyNameToCode('mousel')]:= '/put';
-DefaultBinds[KeyNameToCode('mouser')]:= 'ammomenu';
-DefaultBinds[KeyNameToCode('backspace')]:= 'hjump';
-DefaultBinds[KeyNameToCode('tab')]:= 'switch';
-DefaultBinds[KeyNameToCode('return')]:= 'ljump';
-DefaultBinds[KeyNameToCode('space')]:= '+attack';
-DefaultBinds[KeyNameToCode('up')]:= '+up';
-DefaultBinds[KeyNameToCode('down')]:= '+down';
-DefaultBinds[KeyNameToCode('left')]:= '+left';
-DefaultBinds[KeyNameToCode('right')]:= '+right';
-DefaultBinds[KeyNameToCode('left_shift')]:= '+precise';
-
-DefaultBinds[KeyNameToCode('j0a0u')]:= '+left';
-DefaultBinds[KeyNameToCode('j0a0d')]:= '+right';
-DefaultBinds[KeyNameToCode('j0a1u')]:= '+up';
-DefaultBinds[KeyNameToCode('j0a1d')]:= '+down';
-for i:= 1 to 10 do DefaultBinds[KeyNameToCode('f'+IntToStr(i))]:= 'slot '+char(i+48);
-for i:= 1 to 5 do DefaultBinds[KeyNameToCode(IntToStr(i))]:= 'timer '+IntToStr(i);
-
-loadBinds('dbind', cPathz[ptData] + '/settings.ini');
-end;
-
+{$IFNDEF MOBILE}
procedure SetBinds(var binds: TBinds);
-{$IFNDEF MOBILE}
var
t: LongInt;
-{$ENDIF}
begin
-{$IFDEF MOBILE}
- binds:= binds; // avoid hint
- CurrentBinds:= DefaultBinds;
-{$ELSE}
for t:= 0 to cKbdMaxIndex do
if (CurrentBinds[t] <> binds[t]) and tkbd[t] then
ProcessKey(t, False);
CurrentBinds:= binds;
+end;
+{$ELSE}
+procedure SetBinds(var binds: TBinds);
+begin
+ binds:= binds; // avoid hint
+ CurrentBinds:= DefaultBinds;
+end;
{$ENDIF}
-end;
procedure SetDefaultBinds;
begin
@@ -438,7 +462,7 @@
var
k: LongInt;
begin
- SDL_GetKeyState(@k);
+ SDL_GetKeyboardState(@k);
k:= k + joy * (ControllerNumAxes[joy]*2 + ControllerNumHats[joy]*4 + ControllerNumButtons[joy]*2);
ProcessKey(k + axis*2, value > 20000);
ProcessKey(k + (axis*2)+1, value < -20000);
@@ -448,7 +472,7 @@
var
k: LongInt;
begin
- SDL_GetKeyState(@k);
+ SDL_GetKeyboardState(@k);
k:= k + joy * (ControllerNumAxes[joy]*2 + ControllerNumHats[joy]*4 + ControllerNumButtons[joy]*2);
ProcessKey(k + ControllerNumAxes[joy]*2 + hat*4 + 0, (value and SDL_HAT_UP) <> 0);
ProcessKey(k + ControllerNumAxes[joy]*2 + hat*4 + 1, (value and SDL_HAT_RIGHT)<> 0);
@@ -460,7 +484,7 @@
var
k: LongInt;
begin
- SDL_GetKeyState(@k);
+ SDL_GetKeyboardState(@k);
k:= k + joy * (ControllerNumAxes[joy]*2 + ControllerNumHats[joy]*4 + ControllerNumButtons[joy]*2);
ProcessKey(k + ControllerNumAxes[joy]*2 + ControllerNumHats[joy]*4 + button, pressed);
end;
--- a/hedgewars/uLand.pas Sun Nov 15 14:40:51 2015 +0100
+++ b/hedgewars/uLand.pas Sun Nov 15 14:42:59 2015 +0100
@@ -263,7 +263,7 @@
TryDo(Surface <> nil, 'Assert (LandSurface <> nil) failed', true);
if SDL_MustLock(Surface) then
- SDLTry(SDL_LockSurface(Surface) >= 0, true);
+ SDLTry(SDL_LockSurface(Surface) >= 0, 'SDL_LockSurface', true);
p:= Surface^.pixels;
for y:= 0 to LAND_HEIGHT - 1 do
@@ -451,7 +451,7 @@
cpX:= (LAND_WIDTH - tmpsurf^.w) div 2;
cpY:= LAND_HEIGHT - tmpsurf^.h;
if SDL_MustLock(tmpsurf) then
- SDLTry(SDL_LockSurface(tmpsurf) >= 0, true);
+ SDLTry(SDL_LockSurface(tmpsurf) >= 0, 'SDL_LockSurface', true);
p:= tmpsurf^.pixels;
for y:= 0 to Pred(tmpsurf^.h) do
--- a/hedgewars/uLandGraphics.pas Sun Nov 15 14:40:51 2015 +0100
+++ b/hedgewars/uLandGraphics.pas Sun Nov 15 14:42:59 2015 +0100
@@ -716,7 +716,7 @@
col:= Frame div numFramesFirstCol;
if SDL_MustLock(Image) then
- SDLTry(SDL_LockSurface(Image) >= 0, true);
+ SDLTry(SDL_LockSurface(Image) >= 0, 'TryPlaceOnLand', true);
bpp:= Image^.format^.BytesPerPixel;
TryDo(bpp = 4, 'It should be 32 bpp sprite', true);
@@ -835,7 +835,7 @@
col:= Frame div numFramesFirstCol;
if SDL_MustLock(Image) then
- SDLTry(SDL_LockSurface(Image) >= 0, true);
+ SDLTry(SDL_LockSurface(Image) >= 0, 'EraseLand', true);
bpp:= Image^.format^.BytesPerPixel;
TryDo(bpp = 4, 'It should be 32 bpp sprite', true);
@@ -918,7 +918,7 @@
col:= Frame div numFramesFirstCol;
if SDL_MustLock(Image) then
- SDLTry(SDL_LockSurface(Image) >= 0, true);
+ SDLTry(SDL_LockSurface(Image) >= 0, 'SDL_LockSurface', true);
bpp:= Image^.format^.BytesPerPixel;
TryDo(bpp = 4, 'It should be 32 bpp sprite', true);
@@ -930,7 +930,7 @@
TryDo(finalSurface <> nil, 'GetPlaceCollisionTex: fail to create surface', true);
if SDL_MustLock(finalSurface) then
- SDLTry(SDL_LockSurface(finalSurface) >= 0, true);
+ SDLTry(SDL_LockSurface(finalSurface) >= 0, 'GetPlaceCollisionTex', true);
p:= PLongWordArray(@(PLongWordArray(Image^.pixels)^[ (Image^.pitch div 4) * row * h + col * w ]));
pt:= PLongWordArray(finalSurface^.pixels);
--- a/hedgewars/uLandObjects.pas Sun Nov 15 14:40:51 2015 +0100
+++ b/hedgewars/uLandObjects.pas Sun Nov 15 14:42:59 2015 +0100
@@ -109,7 +109,7 @@
WriteToConsole('Generating collision info... ');
if SDL_MustLock(Image) then
- SDLTry(SDL_LockSurface(Image) >= 0, true);
+ SDLTry(SDL_LockSurface(Image) >= 0, 'SDL_LockSurface', true);
bpp:= Image^.format^.BytesPerPixel;
TryDo(bpp = 4, 'Land object should be 32bit', true);
@@ -160,7 +160,7 @@
WriteToConsole('Generating collision info... ');
if SDL_MustLock(Image) then
- SDLTry(SDL_LockSurface(Image) >= 0, true);
+ SDLTry(SDL_LockSurface(Image) >= 0, 'SDL_LockSurface', true);
bpp:= Image^.format^.BytesPerPixel;
TryDo(bpp = 4, 'Land object should be 32bit', true);
@@ -208,8 +208,8 @@
procedure InitRects;
begin
-RectCount:= 0;
-New(Rects)
+ RectCount:= 0;
+ New(Rects)
end;
procedure FreeRects;
@@ -365,7 +365,7 @@
CheckCanPlace:= bRes;
end;
-function TryPut(var Obj: TThemeObject): boolean; overload;
+function TryPut(var Obj: TThemeObject): boolean;
const MaxPointsIndex = 2047;
var x, y: Longword;
ar: array[0..MaxPointsIndex] of TPoint;
@@ -386,12 +386,12 @@
begin
ar[cnt].x:= x;
ar[cnt].y:= y;
- inc(cnt);
- if cnt > MaxPointsIndex then // buffer is full, do not check the rest land
+ if cnt >= MaxPointsIndex then // buffer is full, do not check the rest land
begin
y:= LAND_HEIGHT;
x:= LAND_WIDTH;
end
+ else inc(cnt);
end;
inc(y, 3);
until y >= LAND_HEIGHT - Height;
@@ -412,7 +412,7 @@
TryPut:= bRes;
end;
-function TryPut(var Obj: TSprayObject; Surface: PSDL_Surface): boolean; overload;
+function TryPut2(var Obj: TSprayObject; Surface: PSDL_Surface): boolean;
const MaxPointsIndex = 8095;
var x, y: Longword;
ar: array[0..MaxPointsIndex] of TPoint;
@@ -420,7 +420,7 @@
r: TSDL_Rect;
bRes: boolean;
begin
-TryPut:= false;
+TryPut2:= false;
cnt:= 0;
with Obj do
begin
@@ -439,18 +439,19 @@
begin
ar[cnt].x:= x;
ar[cnt].y:= y;
- inc(cnt);
- if cnt > MaxPointsIndex then // buffer is full, do not check the rest land
+ if cnt >= MaxPointsIndex then // buffer is full, do not check the rest land
begin
- y:= 5000;
- x:= 5000;
+ y:= $FF000000;
+ x:= $FF000000;
end
+ else inc(cnt);
end;
inc(y, 12);
until y >= LAND_HEIGHT - Height - 8;
inc(x, getrandom(12) + 12)
until x >= LAND_WIDTH - Width;
bRes:= cnt <> 0;
+AddFileLog('CHECKPOINT 004');
if bRes then
begin
i:= getrandom(cnt);
@@ -464,7 +465,7 @@
end
else Maxcnt:= 0
end;
-TryPut:= bRes;
+TryPut2:= bRes;
end;
@@ -845,13 +846,13 @@
exit;
WriteLnToConsole('Adding theme objects...');
- for i:=0 to ThemeObjects.Count do
+ for i:=0 to Pred(ThemeObjects.Count) do
ThemeObjects.objs[i].Maxcnt := max(1, (ThemeObjects.objs[i].Maxcnt * MaxHedgehogs) div 18); // Maxcnt is proportional to map size, but allow objects to span even if we're on a tiny map
repeat
t := getrandom(ThemeObjects.Count);
b := false;
- for i:=0 to ThemeObjects.Count do
+ for i:= 0 to Pred(ThemeObjects.Count) do
begin
ii := (i+t) mod ThemeObjects.Count;
@@ -869,18 +870,18 @@
exit;
WriteLnToConsole('Adding spray objects...');
- for i:=0 to SprayObjects.Count do
+ for i:= 0 to Pred(SprayObjects.Count) do
SprayObjects.objs[i].Maxcnt := max(1, (SprayObjects.objs[i].Maxcnt * MaxHedgehogs) div 18); // Maxcnt is proportional to map size, but allow objects to span even if we're on a tiny map
repeat
t := getrandom(SprayObjects.Count);
b := false;
- for i:=0 to SprayObjects.Count do
+ for i:= 0 to Pred(SprayObjects.Count) do
begin
ii := (i+t) mod SprayObjects.Count;
if SprayObjects.objs[ii].Maxcnt <> 0 then
- b := b or TryPut(SprayObjects.objs[ii], Surface)
+ b := b or TryPut2(SprayObjects.objs[ii], Surface)
end;
until not b;
end;
@@ -915,7 +916,6 @@
procedure AddOnLandObjects(Surface: PSDL_Surface);
begin
InitRects;
-//AddSprayObjects(Surface, SprayObjects, 12);
AddSprayObjects(Surface, SprayObjects);
FreeRects
end;
--- a/hedgewars/uMisc.pas Sun Nov 15 14:40:51 2015 +0100
+++ b/hedgewars/uMisc.pas Sun Nov 15 14:42:59 2015 +0100
@@ -30,11 +30,7 @@
function doSurfaceConversion(tmpsurf: PSDL_Surface): PSDL_Surface;
function MakeScreenshot(filename: shortstring; k: LongInt; dump: LongWord): boolean;
function GetTeamStatString(p: PTeam): shortstring;
-{$IFDEF SDL2}
function SDL_RectMake(x, y, width, height: LongInt): TSDL_Rect; inline;
-{$ELSE}
-function SDL_RectMake(x, y: SmallInt; width, height: Word): TSDL_Rect; inline;
-{$ENDIF}
implementation
uses SysUtils, uVariables, uUtils
@@ -303,7 +299,7 @@
image^.size:= size;
image^.buffer:= p;
-SDL_CreateThread(@SaveScreenshot{$IFDEF SDL2}, 'snapshot'{$ENDIF}, image);
+SDL_CreateThread(@SaveScreenshot, PChar('snapshot'), image);
MakeScreenshot:= true; // possibly it is not true but we will not wait for thread to terminate
end;
@@ -321,11 +317,7 @@
end;
end;
-{$IFDEF SDL2}
function SDL_RectMake(x, y, width, height: LongInt): TSDL_Rect; inline;
-{$ELSE}
-function SDL_RectMake(x, y: SmallInt; width, height: Word): TSDL_Rect; inline;
-{$ENDIF}
begin
SDL_RectMake.x:= x;
SDL_RectMake.y:= y;
@@ -340,32 +332,15 @@
GetTeamStatString:= s;
end;
-{$IFDEF SDL2}
-// FIXME - pretty sure this is not handling endianness correctly like the SDL1 is
+procedure initModule;
const SDL_PIXELFORMAT_ABGR8888 = (1 shl 28) or (6 shl 24) or (7 shl 20) or (6 shl 16) or (32 shl 8) or 4;
-{$ELSE}
-const format: TSDL_PixelFormat = (
- palette: nil; BitsPerPixel: 32; BytesPerPixel: 4;
- Rloss: 0; Gloss: 0; Bloss: 0; Aloss: 0;
- Rshift: RShift; Gshift: GShift; Bshift: BShift; Ashift: AShift;
- RMask: RMask; GMask: GMask; BMask: BMask; AMask: AMask;
- colorkey: 0; alpha: 255);
-{$ENDIF}
-
-procedure initModule;
begin
-{$IFDEF SDL2}
conversionFormat:= SDL_AllocFormat(SDL_PIXELFORMAT_ABGR8888);
-{$ELSE}
- conversionFormat:= @format;
-{$ENDIF}
end;
procedure freeModule;
begin
-{$IFDEF SDL2}
SDL_FreeFormat(conversionFormat);
-{$ENDIF}
end;
end.
--- a/hedgewars/uRender.pas Sun Nov 15 14:40:51 2015 +0100
+++ b/hedgewars/uRender.pas Sun Nov 15 14:42:59 2015 +0100
@@ -104,8 +104,7 @@
implementation
uses {$IFNDEF PAS2C} StrUtils, {$ENDIF}SysUtils, uVariables, uUtils, uConsts
- {$IFDEF GL2}, uMatrix, uConsole{$ENDIF}
- {$IF NOT DEFINED(SDL2) AND DEFINED(USE_VIDEO_RECORDING)}, glut {$ENDIF};
+ {$IFDEF GL2}, uMatrix, uConsole{$ENDIF};
{$IFDEF USE_TOUCH_INTERFACE}
const
--- a/hedgewars/uRenderUtils.pas Sun Nov 15 14:40:51 2015 +0100
+++ b/hedgewars/uRenderUtils.pas Sun Nov 15 14:42:59 2015 +0100
@@ -99,7 +99,7 @@
tmpsurf:= TTF_RenderUTF8_Blended(Fontz[Font].Handle, PChar(s), clr);
finalRect.x:= X + cFontBorder + 2;
finalRect.y:= Y + cFontBorder;
- SDLTry(tmpsurf <> nil, true);
+ SDLTry(tmpsurf <> nil, 'TTF_RenderUTF8_Blended', true);
SDL_UpperBlit(tmpsurf, @textRect, Surface, @finalRect);
SDL_FreeSurface(tmpsurf);
finalRect.x:= X;
@@ -522,7 +522,7 @@
rect.x:= edgeHeight + 1 + ((i - w) div 2);
// trying to more evenly position the text, vertically
rect.y:= edgeHeight + ((j-(numLines*h)) div 2) + line * h;
- SDLTry(tmpsurf <> nil, true);
+ SDLTry(tmpsurf <> nil, 'TTF_Init', true);
SDL_UpperBlit(tmpsurf, nil, finalSurface, @rect);
SDL_FreeSurface(tmpsurf);
inc(line);
--- a/hedgewars/uSound.pas Sun Nov 15 14:40:51 2015 +0100
+++ b/hedgewars/uSound.pas Sun Nov 15 14:42:59 2015 +0100
@@ -322,7 +322,7 @@
end;
WriteToConsole('Init SDL_mixer... ');
- SDLTry(Mix_Init(MIX_INIT_OGG) <> 0, true);
+ SDLTry(Mix_Init(MIX_INIT_OGG) <> 0, 'Mix_Init', true);
WriteLnToConsole(msgOK);
Mix_AllocateChannels(Succ(chanTPU));
@@ -424,7 +424,7 @@
s:= cPathz[Soundz[snd].Path] + '/' + Soundz[snd].FileName;
WriteToConsole(msgLoading + s + ' ');
defVoicepack^.chunks[snd]:= Mix_LoadWAV_RW(rwopsOpenRead(s), 1);
- SDLTry(defVoicepack^.chunks[snd] <> nil, true);
+ SDLTry(defVoicepack^.chunks[snd] <> nil, 'Mix_LoadWAV_RW', true);
WriteLnToConsole(msgOK);
end;
lastChan[snd]:= Mix_PlayChannelTimed(-1, defVoicepack^.chunks[snd], 0, -1)
@@ -523,7 +523,7 @@
s:= cPathz[Soundz[snd].Path] + '/' + Soundz[snd].FileName;
WriteToConsole(msgLoading + s + ' ');
defVoicepack^.chunks[snd]:= Mix_LoadWAV_RW(rwopsOpenRead(s), 1);
- SDLTry(defVoicepack^.chunks[snd] <> nil, true);
+ SDLTry(defVoicepack^.chunks[snd] <> nil, 'Mix_LoadWAV_RW', true);
WriteLnToConsole(msgOK);
end;
if fadems > 0 then
@@ -574,10 +574,10 @@
WriteToConsole(msgLoading + s + ' ');
Mus:= Mix_LoadMUS_RW(rwopsOpenRead(s));
- SDLTry(Mus <> nil, false);
+ SDLTry(Mus <> nil, 'Mix_LoadMUS_RW', false);
WriteLnToConsole(msgOK);
- SDLTry(Mix_FadeInMusic(Mus, -1, 3000) <> -1, false)
+ SDLTry(Mix_FadeInMusic(Mus, -1, 3000) <> -1, 'Mix_FadeInMusic', false)
end;
procedure SetVolume(vol: LongInt);
--- a/hedgewars/uStore.pas Sun Nov 15 14:40:51 2015 +0100
+++ b/hedgewars/uStore.pas Sun Nov 15 14:42:59 2015 +0100
@@ -55,25 +55,20 @@
procedure InitOffscreenOpenGL;
{$ENDIF}
-{$IFDEF SDL2}
procedure WarpMouse(x, y: Word); inline;
-{$ENDIF}
procedure SwapBuffers; {$IFDEF USE_VIDEO_RECORDING}cdecl{$ELSE}inline{$ENDIF};
procedure SetSkyColor(r, g, b: real);
implementation
uses uMisc, uConsole, uVariables, uUtils, uTextures, uRender, uRenderUtils,
uCommands, uPhysFSLayer, uDebug
- {$IFDEF USE_CONTEXT_RESTORE}, uWorld{$ENDIF}
- {$IF NOT DEFINED(SDL2) AND DEFINED(USE_VIDEO_RECORDING)}, glut {$ENDIF};
+ {$IFDEF USE_CONTEXT_RESTORE}, uWorld{$ENDIF};
-var
-{$IFDEF SDL2}
+//type TGPUVendor = (gvUnknown, gvNVIDIA, gvATI, gvIntel, gvApple);
+
+var
SDLwindow: PSDL_Window;
SDLGLcontext: PSDL_GLContext;
-{$ELSE}
- SDLPrimSurface: PSDL_Surface;
-{$ENDIF}
squaresize : LongInt;
numsquares : LongInt;
ProgrTex: PTexture;
@@ -117,9 +112,9 @@
clr.g:= (Color shr 8) and $FF;
clr.b:= Color and $FF;
tmpsurf:= TTF_RenderUTF8_Blended(Fontz[Font].Handle, s, clr);
-SDLTry(tmpsurf <> nil, true);
+SDLTry(tmpsurf <> nil, 'TTF_RenderUTF8_Blended', true);
tmpsurf:= doSurfaceConversion(tmpsurf);
-SDLTry(tmpsurf <> nil, true);
+SDLTry(tmpsurf <> nil, 'TTF_RenderUTF8_Blended, doSurfaceConversion', true);
SDL_UpperBlit(tmpsurf, nil, Surface, @finalRect);
SDL_FreeSurface(tmpsurf);
finalRect.x:= X;
@@ -361,7 +356,7 @@
s:= cPathz[ptFonts] + '/' + Name;
WriteToConsole(msgLoading + s + ' (' + inttostr(Height) + 'pt)... ');
Handle:= TTF_OpenFontRW(rwopsOpenRead(s), true, Height);
- SDLTry(Handle <> nil, true);
+ SDLTry(Handle <> nil, 'TTF_OpenFontRW', true);
TTF_SetFontStyle(Handle, style);
WriteLnToConsole(msgOK)
end;
@@ -610,7 +605,7 @@
// anounce that loading failed
OutError(msgFailed, false);
- SDLTry(false, (imageFlags and ifCritical) <> 0);
+ SDLTry(false, 'LoadImage', (imageFlags and ifCritical) <> 0);
// rwops was already freed by IMG_Load_RW
rwops:= nil;
end else
@@ -729,9 +724,6 @@
{$ELSE}
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
{$ENDIF}
-{$IFNDEF SDL2} // vsync is default in SDL2
- SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, LongInt((cReducedQuality and rqDesyncVBlank) = 0));
-{$ENDIF}
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 6);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);
@@ -744,49 +736,22 @@
procedure SetupOpenGL;
var buf: array[byte] of char;
begin
+ AddFileLog('Setting up OpenGL (using driver: ' + shortstring(SDL_GetCurrentVideoDriver()) + ')');
-{$IFDEF SDL2}
- AddFileLog('Setting up OpenGL (using driver: ' + shortstring(SDL_GetCurrentVideoDriver()) + ')');
-{$ELSE}
- buf[0]:= char(0); // avoid compiler hint
- AddFileLog('Setting up OpenGL (using driver: ' + shortstring(SDL_VideoDriverName(buf, sizeof(buf))) + ')');
-{$ENDIF}
-
-{$IFDEF MOBILE}
// TODO: this function creates an opengles1.1 context
// un-comment below and add proper logic to support opengles2.0
//SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
//SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
if SDLGLcontext = nil then
SDLGLcontext:= SDL_GL_CreateContext(SDLwindow);
- SDLTry(SDLGLcontext <> nil, true);
- SDL_GL_SetSwapInterval(1);
-{$ENDIF}
+ SDLTry(SDLGLcontext <> nil, 'SDLGLcontext', true);
+ SDLTry(SDL_GL_SetSwapInterval(1) = 0, 'SDL_GL_SetSwapInterval', true);
RendererSetup();
+
+// gl2 init/matrix code was here, but removed
end;
-(*
-procedure UpdateProjection;
-var
- s: GLfloat;
-begin
- s:=cScaleFactor;
- mProjection[0,0]:= s/cScreenWidth; mProjection[0,1]:= 0.0; mProjection[0,2]:=0.0; mProjection[0,3]:= 0.0;
- mProjection[1,0]:= 0.0; mProjection[1,1]:= -s/cScreenHeight; mProjection[1,2]:=0.0; mProjection[1,3]:= 0.0;
- mProjection[2,0]:= 0.0; mProjection[2,1]:= 0.0; mProjection[2,2]:=1.0; mProjection[2,3]:= 0.0;
- mProjection[3,0]:= cStereoDepth; mProjection[3,1]:= s/2; mProjection[3,2]:=0.0; mProjection[3,3]:= 1.0;
-
-{$IFDEF GL2}
- UpdateModelviewProjection;
-{$ELSE}
- glMatrixMode(GL_PROJECTION);
- glLoadMatrixf(@mProjection[0, 0]);
- glMatrixMode(GL_MODELVIEW);
-{$ENDIF}
-end;
-*)
-
////////////////////////////////////////////////////////////////////////////////
procedure AddProgress;
var r: TSDL_Rect;
@@ -1016,41 +981,23 @@
end;
{$IFDEF USE_VIDEO_RECORDING}
-{$IFDEF SDL2}
procedure InitOffscreenOpenGL;
begin
// create hidden window
- SDLwindow:= SDL_CreateWindow('hedgewars video rendering (SDL2 hidden window)',
+ SDLwindow:= SDL_CreateWindow(PChar('hedgewars video rendering (SDL2 hidden window)'),
SDL_WINDOWPOS_CENTERED_MASK, SDL_WINDOWPOS_CENTERED_MASK,
cScreenWidth, cScreenHeight,
SDL_WINDOW_HIDDEN or SDL_WINDOW_OPENGL);
- SDLTry(SDLwindow <> nil, true);
+ SDLTry(SDLwindow <> nil, 'SDL_CreateWindow', true);
SetupOpenGL();
end;
-{$ELSE}
-procedure InitOffscreenOpenGL;
-var ArgCount: LongInt;
- PrgName: pchar;
-begin
- ArgCount:= 1;
- PrgName:= 'hwengine';
- glutInit(@ArgCount, @PrgName);
- glutInitWindowSize(cScreenWidth, cScreenHeight);
- // we do not need a window, but without this call OpenGL will not initialize
- glutCreateWindow('hedgewars video rendering (glut hidden window)');
- glutHideWindow();
- // we do not need to set this callback, but it is required for GLUT3 compat
- glutDisplayFunc(@SwapBuffers);
- RendererSetup();
-end;
-{$ENDIF} // SDL2
{$ENDIF} // USE_VIDEO_RECORDING
procedure chFullScr(var s: shortstring);
var flags: Longword = 0;
reinit: boolean = false;
{$IFNDEF DARWIN}ico: PSDL_Surface;{$ENDIF}
- {$IFDEF SDL2}x, y: LongInt;{$ENDIF}
+ x, y: LongInt;
begin
if cOnlyStats then
begin
@@ -1073,28 +1020,12 @@
end;
AddFileLog('Preparing to change video parameters...');
-{$IFDEF SDL2}
if SDLwindow = nil then
-{$ELSE}
- if SDLPrimSurface = nil then
-{$ENDIF}
begin
// set window title
- {$IFNDEF SDL2}
- SDL_WM_SetCaption(_P'Hedgewars', nil);
- {$ENDIF}
WriteToConsole('Init SDL_image... ');
- SDLTry(IMG_Init(IMG_INIT_PNG) <> 0, true);
+ SDLTry(IMG_Init(IMG_INIT_PNG) <> 0, 'IMG_Init', true);
WriteLnToConsole(msgOK);
- // load engine icon
- {$IFNDEF DARWIN}
- ico:= LoadDataImage(ptGraphics, 'hwengine', ifIgnoreCaps);
- if ico <> nil then
- begin
- SDL_WM_SetIcon(ico, 0);
- SDL_FreeSurface(ico)
- end;
- {$ENDIF}
end
else
begin
@@ -1119,10 +1050,6 @@
//uTextures.freeModule; //DEBUG ONLY
{$ENDIF}
AddFileLog('Freeing old primary surface...');
- {$IFNDEF SDL2}
- SDL_FreeSurface(SDLPrimSurface);
- SDLPrimSurface:= nil;
- {$ENDIF}
{$ENDIF}
end;
@@ -1136,7 +1063,6 @@
*)
SetupOpenGLAttributes();
{$ENDIF}
-{$IFDEF SDL2}
// these values in x and y make the window appear in the center
x:= SDL_WINDOWPOS_CENTERED_MASK;
y:= SDL_WINDOWPOS_CENTERED_MASK;
@@ -1155,26 +1081,18 @@
flags:= flags or SDL_WINDOW_FULLSCREEN;
if SDLwindow = nil then
- SDLwindow:= SDL_CreateWindow('Hedgewars', x, y, cScreenWidth, cScreenHeight, flags);
- SDLTry(SDLwindow <> nil, true);
-{$ELSE}
- flags:= SDL_OPENGL or SDL_RESIZABLE;
- if cFullScreen then
- flags:= flags or SDL_FULLSCREEN;
- if not cOnlyStats then
+ SDLwindow:= SDL_CreateWindow(PChar('Hedgewars'), x, y, cScreenWidth, cScreenHeight, flags);
+ SDLTry(SDLwindow <> nil, 'SDL_CreateWindow', true);
+
+ // load engine ico
+ {$IFNDEF DARWIN}
+ ico:= LoadDataImage(ptGraphics, 'hwengine', ifIgnoreCaps);
+ if ico <> nil then
begin
- {$IFDEF WIN32}
- s:= SDL_getenv('SDL_VIDEO_CENTERED');
- SDL_putenv('SDL_VIDEO_CENTERED=1');
+ SDL_SetWindowIcon(SDLwindow, ico);
+ SDL_FreeSurface(ico);
+ end;
{$ENDIF}
- SDLPrimSurface:= SDL_SetVideoMode(cScreenWidth, cScreenHeight, 0, flags);
- SDLTry(SDLPrimSurface <> nil, true);
- {$IFDEF WIN32}
- SDL_putenv(str2pchar('SDL_VIDEO_CENTERED=' + s));
- {$ENDIF}
- end;
-{$ENDIF}
-
SetupOpenGL();
if reinit then
@@ -1197,7 +1115,6 @@
end;
end;
-{$IFDEF SDL2}
// for sdl1.2 we directly call SDL_WarpMouse()
// for sdl2 we provide a SDL_WarpMouse() which just calls this function
// this has the advantage of reducing 'uses' and 'ifdef' statements
@@ -1206,17 +1123,12 @@
begin
SDL_WarpMouseInWindow(SDLwindow, x, y);
end;
-{$ENDIF}
procedure SwapBuffers; {$IFDEF USE_VIDEO_RECORDING}cdecl{$ELSE}inline{$ENDIF};
begin
if GameType = gmtRecord then
exit;
-{$IFDEF SDL2}
SDL_GL_SwapWindow(SDLwindow);
-{$ELSE}
- SDL_GL_SwapBuffers();
-{$ENDIF}
end;
procedure SetSkyColor(r, g, b: real);
@@ -1244,12 +1156,8 @@
// init all count texture pointers
for i:= Low(CountTexz) to High(CountTexz) do
CountTexz[i] := nil;
-{$IFDEF SDL2}
SDLwindow:= nil;
SDLGLcontext:= nil;
-{$ELSE}
- SDLPrimSurface:= nil;
-{$ENDIF}
prevHat:= 'NoHat';
tmpHatSurf:= nil;
@@ -1271,10 +1179,8 @@
end;
TTF_Quit();
-{$IFDEF SDL2}
SDL_GL_DeleteContext(SDLGLcontext);
SDL_DestroyWindow(SDLwindow);
-{$ENDIF}
SDL_Quit();
end;
end.
--- a/hedgewars/uTextures.pas Sun Nov 15 14:40:51 2015 +0100
+++ b/hedgewars/uTextures.pas Sun Nov 15 14:42:59 2015 +0100
@@ -236,7 +236,7 @@
glBindTexture(GL_TEXTURE_2D, Surface2Tex^.id);
if SDL_MustLock(surf) then
- SDLTry(SDL_LockSurface(surf) >= 0, true);
+ SDLTry(SDL_LockSurface(surf) >= 0, 'Lock surface', true);
fromP4:= Surf^.pixels;
--- a/hedgewars/uVariables.pas Sun Nov 15 14:40:51 2015 +0100
+++ b/hedgewars/uVariables.pas Sun Nov 15 14:42:59 2015 +0100
@@ -244,8 +244,6 @@
MaxTextureSize: LongInt;
- ChatPasteBuffer: shortstring;
-
/////////////////////////////////////
//Buttons
{$IFDEF USE_TOUCH_INTERFACE}
@@ -2739,8 +2737,6 @@
cViewLimitsDebug:= false;
AprilOne := false;
- ChatPasteBuffer:= '';
-
// initialize pointers to nil
// (don't rely on implicit init of fpc, because that one only happens ONCE when used as lib)
CurAmmoGear:= nil;
--- a/misc/libphysfs/CMakeLists.txt Sun Nov 15 14:40:51 2015 +0100
+++ b/misc/libphysfs/CMakeLists.txt Sun Nov 15 14:42:59 2015 +0100
@@ -148,7 +148,7 @@
if(WINDOWS)
set(PHYSFS_HAVE_CDROM_SUPPORT TRUE)
set(PHYSFS_HAVE_THREAD_SUPPORT TRUE)
- list(APPEND OTHER_LDFLAGS ${SDL_LIBRARY})
+ list(APPEND OTHER_LDFLAGS ${SDL2_LIBRARY})
endif(WINDOWS)
if(NOT PHYSFS_HAVE_CDROM_SUPPORT)
--- a/misc/libphyslayer/CMakeLists.txt Sun Nov 15 14:40:51 2015 +0100
+++ b/misc/libphyslayer/CMakeLists.txt Sun Nov 15 14:42:59 2015 +0100
@@ -1,7 +1,7 @@
+find_package(SDL2 REQUIRED)
-find_package(SDL1or2)
+include_directories(${SDL2_INCLUDE_DIR})
include_directories(${PHYSFS_INCLUDE_DIR})
-include_directories(${SDL_INCLUDE_DIR})
include_directories(${LUA_INCLUDE_DIR})
@@ -15,7 +15,7 @@
#compiles and links actual library
add_library (physlayer ${PHYSLAYER_SRCS})
#TODO: find good VERSION and SOVERSION values
-target_link_libraries(physlayer ${SDL_LIBRARY} lua physfs)
+target_link_libraries(physlayer ${SDL2_LIBRARY} lua physfs)
install(TARGETS physlayer RUNTIME DESTINATION ${target_binary_install_dir}
LIBRARY DESTINATION ${target_library_install_dir}
ARCHIVE DESTINATION ${target_library_install_dir})
--- a/misc/winutils/include/GL/glut.h Sun Nov 15 14:40:51 2015 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,716 +0,0 @@
-#ifndef __glut_h__
-#define __glut_h__
-
-/* Copyright (c) Mark J. Kilgard, 1994, 1995, 1996, 1998. */
-
-/* This program is freely distributable without licensing fees and is
- provided without guarantee or warrantee expressed or implied. This
- program is -not- in the public domain. */
-
-#if defined(_WIN32)
-
-/* GLUT 3.7 now tries to avoid including <windows.h>
- to avoid name space pollution, but Win32's <GL/gl.h>
- needs APIENTRY and WINGDIAPI defined properly. */
-# if 0
- /* This would put tons of macros and crap in our clean name space. */
-# define WIN32_LEAN_AND_MEAN
-# include <windows.h>
-# else
- /* XXX This is from Win32's <windef.h> */
-# ifndef APIENTRY
-# define GLUT_APIENTRY_DEFINED
-# if (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED) || defined(__BORLANDC__) || defined(__LCC__)
-# define APIENTRY __stdcall
-# else
-# define APIENTRY
-# endif
-# endif
- /* XXX This is from Win32's <winnt.h> */
-# ifndef CALLBACK
-# if (defined(_M_MRX000) || defined(_M_IX86) || defined(_M_ALPHA) || defined(_M_PPC)) && !defined(MIDL_PASS) || defined(__LCC__)
-# define CALLBACK __stdcall
-# else
-# define CALLBACK
-# endif
-# endif
- /* XXX Hack for lcc compiler. It doesn't support __declspec(dllimport), just __stdcall. */
-# if defined( __LCC__ )
-# undef WINGDIAPI
-# define WINGDIAPI __stdcall
-# else
- /* XXX This is from Win32's <wingdi.h> and <winnt.h> */
-# ifndef WINGDIAPI
-# define GLUT_WINGDIAPI_DEFINED
-# define WINGDIAPI __declspec(dllimport)
-# endif
-# endif
- /* XXX This is from Win32's <ctype.h> */
-# ifndef _WCHAR_T_DEFINED
-typedef unsigned short wchar_t;
-# define _WCHAR_T_DEFINED
-# endif
-# endif
-
-/* To disable automatic library usage for GLUT, define GLUT_NO_LIB_PRAGMA
- in your compile preprocessor options. */
-# if !defined(GLUT_BUILDING_LIB) && !defined(GLUT_NO_LIB_PRAGMA)
-# pragma comment (lib, "winmm.lib") /* link with Windows MultiMedia lib */
-/* To enable automatic SGI OpenGL for Windows library usage for GLUT,
- define GLUT_USE_SGI_OPENGL in your compile preprocessor options. */
-# ifdef GLUT_USE_SGI_OPENGL
-# pragma comment (lib, "opengl.lib") /* link with SGI OpenGL for Windows lib */
-# pragma comment (lib, "glu.lib") /* link with SGI OpenGL Utility lib */
-# pragma comment (lib, "glut.lib") /* link with Win32 GLUT for SGI OpenGL lib */
-# else
-# pragma comment (lib, "opengl32.lib") /* link with Microsoft OpenGL lib */
-# pragma comment (lib, "glu32.lib") /* link with Microsoft OpenGL Utility lib */
-# pragma comment (lib, "glut32.lib") /* link with Win32 GLUT lib */
-# endif
-# endif
-
-/* To disable supression of annoying warnings about floats being promoted
- to doubles, define GLUT_NO_WARNING_DISABLE in your compile preprocessor
- options. */
-# ifndef GLUT_NO_WARNING_DISABLE
-# pragma warning (disable:4244) /* Disable bogus VC++ 4.2 conversion warnings. */
-# pragma warning (disable:4305) /* VC++ 5.0 version of above warning. */
-# endif
-
-/* Win32 has an annoying issue where there are multiple C run-time
- libraries (CRTs). If the executable is linked with a different CRT
- from the GLUT DLL, the GLUT DLL will not share the same CRT static
- data seen by the executable. In particular, atexit callbacks registered
- in the executable will not be called if GLUT calls its (different)
- exit routine). GLUT is typically built with the
- "/MD" option (the CRT with multithreading DLL support), but the Visual
- C++ linker default is "/ML" (the single threaded CRT).
-
- One workaround to this issue is requiring users to always link with
- the same CRT as GLUT is compiled with. That requires users supply a
- non-standard option. GLUT 3.7 has its own built-in workaround where
- the executable's "exit" function pointer is covertly passed to GLUT.
- GLUT then calls the executable's exit function pointer to ensure that
- any "atexit" calls registered by the application are called if GLUT
- needs to exit.
-
- Note that the __glut*WithExit routines should NEVER be called directly.
- To avoid the atexit workaround, #define GLUT_DISABLE_ATEXIT_HACK. */
-
-/* XXX This is from Win32's <process.h> */
-# if !defined(_MSC_VER) && !defined(__cdecl)
- /* Define __cdecl for non-Microsoft compilers. */
-# define __cdecl
-# define GLUT_DEFINED___CDECL
-# endif
-# ifndef _CRTIMP
-# ifdef _NTSDK
- /* Definition compatible with NT SDK */
-# define _CRTIMP
-# else
- /* Current definition */
-# ifdef _DLL
-# define _CRTIMP __declspec(dllimport)
-# else
-# define _CRTIMP
-# endif
-# endif
-# define GLUT_DEFINED__CRTIMP
-# endif
-
-/* GLUT API entry point declarations for Win32. */
-# ifdef GLUT_BUILDING_LIB
-# define GLUTAPI __declspec(dllexport)
-# else
-# ifdef _DLL
-# define GLUTAPI __declspec(dllimport)
-# else
-# define GLUTAPI extern
-# endif
-# endif
-
-/* GLUT callback calling convention for Win32. */
-# define GLUTCALLBACK __cdecl
-
-#endif /* _WIN32 */
-
-#include <GL/gl.h>
-#include <GL/glu.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#if defined(_WIN32)
-# ifndef GLUT_BUILDING_LIB
-extern _CRTIMP void __cdecl exit(int);
-# endif
-#else
-/* non-Win32 case. */
-/* Define APIENTRY and CALLBACK to nothing if we aren't on Win32. */
-# define APIENTRY
-# define GLUT_APIENTRY_DEFINED
-# define CALLBACK
-/* Define GLUTAPI and GLUTCALLBACK as below if we aren't on Win32. */
-# define GLUTAPI extern
-# define GLUTCALLBACK
-/* Prototype exit for the non-Win32 case (see above). */
-extern void exit(int);
-#endif
-
-/**
- GLUT API revision history:
-
- GLUT_API_VERSION is updated to reflect incompatible GLUT
- API changes (interface changes, semantic changes, deletions,
- or additions).
-
- GLUT_API_VERSION=1 First public release of GLUT. 11/29/94
-
- GLUT_API_VERSION=2 Added support for OpenGL/GLX multisampling,
- extension. Supports new input devices like tablet, dial and button
- box, and Spaceball. Easy to query OpenGL extensions.
-
- GLUT_API_VERSION=3 glutMenuStatus added.
-
- GLUT_API_VERSION=4 glutInitDisplayString, glutWarpPointer,
- glutBitmapLength, glutStrokeLength, glutWindowStatusFunc, dynamic
- video resize subAPI, glutPostWindowRedisplay, glutKeyboardUpFunc,
- glutSpecialUpFunc, glutIgnoreKeyRepeat, glutSetKeyRepeat,
- glutJoystickFunc, glutForceJoystickFunc (NOT FINALIZED!).
-**/
-#ifndef GLUT_API_VERSION /* allow this to be overriden */
-#define GLUT_API_VERSION 3
-#endif
-
-/**
- GLUT implementation revision history:
-
- GLUT_XLIB_IMPLEMENTATION is updated to reflect both GLUT
- API revisions and implementation revisions (ie, bug fixes).
-
- GLUT_XLIB_IMPLEMENTATION=1 mjk's first public release of
- GLUT Xlib-based implementation. 11/29/94
-
- GLUT_XLIB_IMPLEMENTATION=2 mjk's second public release of
- GLUT Xlib-based implementation providing GLUT version 2
- interfaces.
-
- GLUT_XLIB_IMPLEMENTATION=3 mjk's GLUT 2.2 images. 4/17/95
-
- GLUT_XLIB_IMPLEMENTATION=4 mjk's GLUT 2.3 images. 6/?/95
-
- GLUT_XLIB_IMPLEMENTATION=5 mjk's GLUT 3.0 images. 10/?/95
-
- GLUT_XLIB_IMPLEMENTATION=7 mjk's GLUT 3.1+ with glutWarpPoitner. 7/24/96
-
- GLUT_XLIB_IMPLEMENTATION=8 mjk's GLUT 3.1+ with glutWarpPoitner
- and video resize. 1/3/97
-
- GLUT_XLIB_IMPLEMENTATION=9 mjk's GLUT 3.4 release with early GLUT 4 routines.
-
- GLUT_XLIB_IMPLEMENTATION=11 Mesa 2.5's GLUT 3.6 release.
-
- GLUT_XLIB_IMPLEMENTATION=12 mjk's GLUT 3.6 release with early GLUT 4 routines + signal handling.
-
- GLUT_XLIB_IMPLEMENTATION=13 mjk's GLUT 3.7 beta with GameGLUT support.
-
- GLUT_XLIB_IMPLEMENTATION=14 mjk's GLUT 3.7 beta with f90gl friend interface.
-
- GLUT_XLIB_IMPLEMENTATION=15 mjk's GLUT 3.7 beta sync'ed with Mesa <GL/glut.h>
-**/
-#ifndef GLUT_XLIB_IMPLEMENTATION /* Allow this to be overriden. */
-#define GLUT_XLIB_IMPLEMENTATION 15
-#endif
-
-/* Display mode bit masks. */
-#define GLUT_RGB 0
-#define GLUT_RGBA GLUT_RGB
-#define GLUT_INDEX 1
-#define GLUT_SINGLE 0
-#define GLUT_DOUBLE 2
-#define GLUT_ACCUM 4
-#define GLUT_ALPHA 8
-#define GLUT_DEPTH 16
-#define GLUT_STENCIL 32
-#if (GLUT_API_VERSION >= 2)
-#define GLUT_MULTISAMPLE 128
-#define GLUT_STEREO 256
-#endif
-#if (GLUT_API_VERSION >= 3)
-#define GLUT_LUMINANCE 512
-#endif
-
-/* Mouse buttons. */
-#define GLUT_LEFT_BUTTON 0
-#define GLUT_MIDDLE_BUTTON 1
-#define GLUT_RIGHT_BUTTON 2
-
-/* Mouse button state. */
-#define GLUT_DOWN 0
-#define GLUT_UP 1
-
-#if (GLUT_API_VERSION >= 2)
-/* function keys */
-#define GLUT_KEY_F1 1
-#define GLUT_KEY_F2 2
-#define GLUT_KEY_F3 3
-#define GLUT_KEY_F4 4
-#define GLUT_KEY_F5 5
-#define GLUT_KEY_F6 6
-#define GLUT_KEY_F7 7
-#define GLUT_KEY_F8 8
-#define GLUT_KEY_F9 9
-#define GLUT_KEY_F10 10
-#define GLUT_KEY_F11 11
-#define GLUT_KEY_F12 12
-/* directional keys */
-#define GLUT_KEY_LEFT 100
-#define GLUT_KEY_UP 101
-#define GLUT_KEY_RIGHT 102
-#define GLUT_KEY_DOWN 103
-#define GLUT_KEY_PAGE_UP 104
-#define GLUT_KEY_PAGE_DOWN 105
-#define GLUT_KEY_HOME 106
-#define GLUT_KEY_END 107
-#define GLUT_KEY_INSERT 108
-#endif
-
-/* Entry/exit state. */
-#define GLUT_LEFT 0
-#define GLUT_ENTERED 1
-
-/* Menu usage state. */
-#define GLUT_MENU_NOT_IN_USE 0
-#define GLUT_MENU_IN_USE 1
-
-/* Visibility state. */
-#define GLUT_NOT_VISIBLE 0
-#define GLUT_VISIBLE 1
-
-/* Window status state. */
-#define GLUT_HIDDEN 0
-#define GLUT_FULLY_RETAINED 1
-#define GLUT_PARTIALLY_RETAINED 2
-#define GLUT_FULLY_COVERED 3
-
-/* Color index component selection values. */
-#define GLUT_RED 0
-#define GLUT_GREEN 1
-#define GLUT_BLUE 2
-
-#if defined(_WIN32)
-/* Stroke font constants (use these in GLUT program). */
-#define GLUT_STROKE_ROMAN ((void*)0)
-#define GLUT_STROKE_MONO_ROMAN ((void*)1)
-
-/* Bitmap font constants (use these in GLUT program). */
-#define GLUT_BITMAP_9_BY_15 ((void*)2)
-#define GLUT_BITMAP_8_BY_13 ((void*)3)
-#define GLUT_BITMAP_TIMES_ROMAN_10 ((void*)4)
-#define GLUT_BITMAP_TIMES_ROMAN_24 ((void*)5)
-#if (GLUT_API_VERSION >= 3)
-#define GLUT_BITMAP_HELVETICA_10 ((void*)6)
-#define GLUT_BITMAP_HELVETICA_12 ((void*)7)
-#define GLUT_BITMAP_HELVETICA_18 ((void*)8)
-#endif
-#else
-/* Stroke font opaque addresses (use constants instead in source code). */
-GLUTAPI void *glutStrokeRoman;
-GLUTAPI void *glutStrokeMonoRoman;
-
-/* Stroke font constants (use these in GLUT program). */
-#define GLUT_STROKE_ROMAN (&glutStrokeRoman)
-#define GLUT_STROKE_MONO_ROMAN (&glutStrokeMonoRoman)
-
-/* Bitmap font opaque addresses (use constants instead in source code). */
-GLUTAPI void *glutBitmap9By15;
-GLUTAPI void *glutBitmap8By13;
-GLUTAPI void *glutBitmapTimesRoman10;
-GLUTAPI void *glutBitmapTimesRoman24;
-GLUTAPI void *glutBitmapHelvetica10;
-GLUTAPI void *glutBitmapHelvetica12;
-GLUTAPI void *glutBitmapHelvetica18;
-
-/* Bitmap font constants (use these in GLUT program). */
-#define GLUT_BITMAP_9_BY_15 (&glutBitmap9By15)
-#define GLUT_BITMAP_8_BY_13 (&glutBitmap8By13)
-#define GLUT_BITMAP_TIMES_ROMAN_10 (&glutBitmapTimesRoman10)
-#define GLUT_BITMAP_TIMES_ROMAN_24 (&glutBitmapTimesRoman24)
-#if (GLUT_API_VERSION >= 3)
-#define GLUT_BITMAP_HELVETICA_10 (&glutBitmapHelvetica10)
-#define GLUT_BITMAP_HELVETICA_12 (&glutBitmapHelvetica12)
-#define GLUT_BITMAP_HELVETICA_18 (&glutBitmapHelvetica18)
-#endif
-#endif
-
-/* glutGet parameters. */
-#define GLUT_WINDOW_X ((GLenum) 100)
-#define GLUT_WINDOW_Y ((GLenum) 101)
-#define GLUT_WINDOW_WIDTH ((GLenum) 102)
-#define GLUT_WINDOW_HEIGHT ((GLenum) 103)
-#define GLUT_WINDOW_BUFFER_SIZE ((GLenum) 104)
-#define GLUT_WINDOW_STENCIL_SIZE ((GLenum) 105)
-#define GLUT_WINDOW_DEPTH_SIZE ((GLenum) 106)
-#define GLUT_WINDOW_RED_SIZE ((GLenum) 107)
-#define GLUT_WINDOW_GREEN_SIZE ((GLenum) 108)
-#define GLUT_WINDOW_BLUE_SIZE ((GLenum) 109)
-#define GLUT_WINDOW_ALPHA_SIZE ((GLenum) 110)
-#define GLUT_WINDOW_ACCUM_RED_SIZE ((GLenum) 111)
-#define GLUT_WINDOW_ACCUM_GREEN_SIZE ((GLenum) 112)
-#define GLUT_WINDOW_ACCUM_BLUE_SIZE ((GLenum) 113)
-#define GLUT_WINDOW_ACCUM_ALPHA_SIZE ((GLenum) 114)
-#define GLUT_WINDOW_DOUBLEBUFFER ((GLenum) 115)
-#define GLUT_WINDOW_RGBA ((GLenum) 116)
-#define GLUT_WINDOW_PARENT ((GLenum) 117)
-#define GLUT_WINDOW_NUM_CHILDREN ((GLenum) 118)
-#define GLUT_WINDOW_COLORMAP_SIZE ((GLenum) 119)
-#if (GLUT_API_VERSION >= 2)
-#define GLUT_WINDOW_NUM_SAMPLES ((GLenum) 120)
-#define GLUT_WINDOW_STEREO ((GLenum) 121)
-#endif
-#if (GLUT_API_VERSION >= 3)
-#define GLUT_WINDOW_CURSOR ((GLenum) 122)
-#endif
-#define GLUT_SCREEN_WIDTH ((GLenum) 200)
-#define GLUT_SCREEN_HEIGHT ((GLenum) 201)
-#define GLUT_SCREEN_WIDTH_MM ((GLenum) 202)
-#define GLUT_SCREEN_HEIGHT_MM ((GLenum) 203)
-#define GLUT_MENU_NUM_ITEMS ((GLenum) 300)
-#define GLUT_DISPLAY_MODE_POSSIBLE ((GLenum) 400)
-#define GLUT_INIT_WINDOW_X ((GLenum) 500)
-#define GLUT_INIT_WINDOW_Y ((GLenum) 501)
-#define GLUT_INIT_WINDOW_WIDTH ((GLenum) 502)
-#define GLUT_INIT_WINDOW_HEIGHT ((GLenum) 503)
-#define GLUT_INIT_DISPLAY_MODE ((GLenum) 504)
-#if (GLUT_API_VERSION >= 2)
-#define GLUT_ELAPSED_TIME ((GLenum) 700)
-#endif
-#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13)
-#define GLUT_WINDOW_FORMAT_ID ((GLenum) 123)
-#endif
-
-#if (GLUT_API_VERSION >= 2)
-/* glutDeviceGet parameters. */
-#define GLUT_HAS_KEYBOARD ((GLenum) 600)
-#define GLUT_HAS_MOUSE ((GLenum) 601)
-#define GLUT_HAS_SPACEBALL ((GLenum) 602)
-#define GLUT_HAS_DIAL_AND_BUTTON_BOX ((GLenum) 603)
-#define GLUT_HAS_TABLET ((GLenum) 604)
-#define GLUT_NUM_MOUSE_BUTTONS ((GLenum) 605)
-#define GLUT_NUM_SPACEBALL_BUTTONS ((GLenum) 606)
-#define GLUT_NUM_BUTTON_BOX_BUTTONS ((GLenum) 607)
-#define GLUT_NUM_DIALS ((GLenum) 608)
-#define GLUT_NUM_TABLET_BUTTONS ((GLenum) 609)
-#endif
-#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13)
-#define GLUT_DEVICE_IGNORE_KEY_REPEAT ((GLenum) 610)
-#define GLUT_DEVICE_KEY_REPEAT ((GLenum) 611)
-#define GLUT_HAS_JOYSTICK ((GLenum) 612)
-#define GLUT_OWNS_JOYSTICK ((GLenum) 613)
-#define GLUT_JOYSTICK_BUTTONS ((GLenum) 614)
-#define GLUT_JOYSTICK_AXES ((GLenum) 615)
-#define GLUT_JOYSTICK_POLL_RATE ((GLenum) 616)
-#endif
-
-#if (GLUT_API_VERSION >= 3)
-/* glutLayerGet parameters. */
-#define GLUT_OVERLAY_POSSIBLE ((GLenum) 800)
-#define GLUT_LAYER_IN_USE ((GLenum) 801)
-#define GLUT_HAS_OVERLAY ((GLenum) 802)
-#define GLUT_TRANSPARENT_INDEX ((GLenum) 803)
-#define GLUT_NORMAL_DAMAGED ((GLenum) 804)
-#define GLUT_OVERLAY_DAMAGED ((GLenum) 805)
-
-#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
-/* glutVideoResizeGet parameters. */
-#define GLUT_VIDEO_RESIZE_POSSIBLE ((GLenum) 900)
-#define GLUT_VIDEO_RESIZE_IN_USE ((GLenum) 901)
-#define GLUT_VIDEO_RESIZE_X_DELTA ((GLenum) 902)
-#define GLUT_VIDEO_RESIZE_Y_DELTA ((GLenum) 903)
-#define GLUT_VIDEO_RESIZE_WIDTH_DELTA ((GLenum) 904)
-#define GLUT_VIDEO_RESIZE_HEIGHT_DELTA ((GLenum) 905)
-#define GLUT_VIDEO_RESIZE_X ((GLenum) 906)
-#define GLUT_VIDEO_RESIZE_Y ((GLenum) 907)
-#define GLUT_VIDEO_RESIZE_WIDTH ((GLenum) 908)
-#define GLUT_VIDEO_RESIZE_HEIGHT ((GLenum) 909)
-#endif
-
-/* glutUseLayer parameters. */
-#define GLUT_NORMAL ((GLenum) 0)
-#define GLUT_OVERLAY ((GLenum) 1)
-
-/* glutGetModifiers return mask. */
-#define GLUT_ACTIVE_SHIFT 1
-#define GLUT_ACTIVE_CTRL 2
-#define GLUT_ACTIVE_ALT 4
-
-/* glutSetCursor parameters. */
-/* Basic arrows. */
-#define GLUT_CURSOR_RIGHT_ARROW 0
-#define GLUT_CURSOR_LEFT_ARROW 1
-/* Symbolic cursor shapes. */
-#define GLUT_CURSOR_INFO 2
-#define GLUT_CURSOR_DESTROY 3
-#define GLUT_CURSOR_HELP 4
-#define GLUT_CURSOR_CYCLE 5
-#define GLUT_CURSOR_SPRAY 6
-#define GLUT_CURSOR_WAIT 7
-#define GLUT_CURSOR_TEXT 8
-#define GLUT_CURSOR_CROSSHAIR 9
-/* Directional cursors. */
-#define GLUT_CURSOR_UP_DOWN 10
-#define GLUT_CURSOR_LEFT_RIGHT 11
-/* Sizing cursors. */
-#define GLUT_CURSOR_TOP_SIDE 12
-#define GLUT_CURSOR_BOTTOM_SIDE 13
-#define GLUT_CURSOR_LEFT_SIDE 14
-#define GLUT_CURSOR_RIGHT_SIDE 15
-#define GLUT_CURSOR_TOP_LEFT_CORNER 16
-#define GLUT_CURSOR_TOP_RIGHT_CORNER 17
-#define GLUT_CURSOR_BOTTOM_RIGHT_CORNER 18
-#define GLUT_CURSOR_BOTTOM_LEFT_CORNER 19
-/* Inherit from parent window. */
-#define GLUT_CURSOR_INHERIT 100
-/* Blank cursor. */
-#define GLUT_CURSOR_NONE 101
-/* Fullscreen crosshair (if available). */
-#define GLUT_CURSOR_FULL_CROSSHAIR 102
-#endif
-
-/* GLUT initialization sub-API. */
-GLUTAPI void APIENTRY glutInit(int *argcp, char **argv);
-#if defined(_WIN32) && !defined(GLUT_DISABLE_ATEXIT_HACK)
-GLUTAPI void APIENTRY __glutInitWithExit(int *argcp, char **argv, void (__cdecl *exitfunc)(int));
-#ifndef GLUT_BUILDING_LIB
-static void APIENTRY glutInit_ATEXIT_HACK(int *argcp, char **argv) { __glutInitWithExit(argcp, argv, exit); }
-#define glutInit glutInit_ATEXIT_HACK
-#endif
-#endif
-GLUTAPI void APIENTRY glutInitDisplayMode(unsigned int mode);
-#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
-GLUTAPI void APIENTRY glutInitDisplayString(const char *string);
-#endif
-GLUTAPI void APIENTRY glutInitWindowPosition(int x, int y);
-GLUTAPI void APIENTRY glutInitWindowSize(int width, int height);
-GLUTAPI void APIENTRY glutMainLoop(void);
-
-/* GLUT window sub-API. */
-GLUTAPI int APIENTRY glutCreateWindow(const char *title);
-#if defined(_WIN32) && !defined(GLUT_DISABLE_ATEXIT_HACK)
-GLUTAPI int APIENTRY __glutCreateWindowWithExit(const char *title, void (__cdecl *exitfunc)(int));
-#ifndef GLUT_BUILDING_LIB
-static int APIENTRY glutCreateWindow_ATEXIT_HACK(const char *title) { return __glutCreateWindowWithExit(title, exit); }
-#define glutCreateWindow glutCreateWindow_ATEXIT_HACK
-#endif
-#endif
-GLUTAPI int APIENTRY glutCreateSubWindow(int win, int x, int y, int width, int height);
-GLUTAPI void APIENTRY glutDestroyWindow(int win);
-GLUTAPI void APIENTRY glutPostRedisplay(void);
-#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 11)
-GLUTAPI void APIENTRY glutPostWindowRedisplay(int win);
-#endif
-GLUTAPI void APIENTRY glutSwapBuffers(void);
-GLUTAPI int APIENTRY glutGetWindow(void);
-GLUTAPI void APIENTRY glutSetWindow(int win);
-GLUTAPI void APIENTRY glutSetWindowTitle(const char *title);
-GLUTAPI void APIENTRY glutSetIconTitle(const char *title);
-GLUTAPI void APIENTRY glutPositionWindow(int x, int y);
-GLUTAPI void APIENTRY glutReshapeWindow(int width, int height);
-GLUTAPI void APIENTRY glutPopWindow(void);
-GLUTAPI void APIENTRY glutPushWindow(void);
-GLUTAPI void APIENTRY glutIconifyWindow(void);
-GLUTAPI void APIENTRY glutShowWindow(void);
-GLUTAPI void APIENTRY glutHideWindow(void);
-#if (GLUT_API_VERSION >= 3)
-GLUTAPI void APIENTRY glutFullScreen(void);
-GLUTAPI void APIENTRY glutSetCursor(int cursor);
-#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
-GLUTAPI void APIENTRY glutWarpPointer(int x, int y);
-#endif
-
-/* GLUT overlay sub-API. */
-GLUTAPI void APIENTRY glutEstablishOverlay(void);
-GLUTAPI void APIENTRY glutRemoveOverlay(void);
-GLUTAPI void APIENTRY glutUseLayer(GLenum layer);
-GLUTAPI void APIENTRY glutPostOverlayRedisplay(void);
-#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 11)
-GLUTAPI void APIENTRY glutPostWindowOverlayRedisplay(int win);
-#endif
-GLUTAPI void APIENTRY glutShowOverlay(void);
-GLUTAPI void APIENTRY glutHideOverlay(void);
-#endif
-
-/* GLUT menu sub-API. */
-GLUTAPI int APIENTRY glutCreateMenu(void (GLUTCALLBACK *func)(int));
-#if defined(_WIN32) && !defined(GLUT_DISABLE_ATEXIT_HACK)
-GLUTAPI int APIENTRY __glutCreateMenuWithExit(void (GLUTCALLBACK *func)(int), void (__cdecl *exitfunc)(int));
-#ifndef GLUT_BUILDING_LIB
-static int APIENTRY glutCreateMenu_ATEXIT_HACK(void (GLUTCALLBACK *func)(int)) { return __glutCreateMenuWithExit(func, exit); }
-#define glutCreateMenu glutCreateMenu_ATEXIT_HACK
-#endif
-#endif
-GLUTAPI void APIENTRY glutDestroyMenu(int menu);
-GLUTAPI int APIENTRY glutGetMenu(void);
-GLUTAPI void APIENTRY glutSetMenu(int menu);
-GLUTAPI void APIENTRY glutAddMenuEntry(const char *label, int value);
-GLUTAPI void APIENTRY glutAddSubMenu(const char *label, int submenu);
-GLUTAPI void APIENTRY glutChangeToMenuEntry(int item, const char *label, int value);
-GLUTAPI void APIENTRY glutChangeToSubMenu(int item, const char *label, int submenu);
-GLUTAPI void APIENTRY glutRemoveMenuItem(int item);
-GLUTAPI void APIENTRY glutAttachMenu(int button);
-GLUTAPI void APIENTRY glutDetachMenu(int button);
-
-/* GLUT window callback sub-API. */
-GLUTAPI void APIENTRY glutDisplayFunc(void (GLUTCALLBACK *func)(void));
-GLUTAPI void APIENTRY glutReshapeFunc(void (GLUTCALLBACK *func)(int width, int height));
-GLUTAPI void APIENTRY glutKeyboardFunc(void (GLUTCALLBACK *func)(unsigned char key, int x, int y));
-GLUTAPI void APIENTRY glutMouseFunc(void (GLUTCALLBACK *func)(int button, int state, int x, int y));
-GLUTAPI void APIENTRY glutMotionFunc(void (GLUTCALLBACK *func)(int x, int y));
-GLUTAPI void APIENTRY glutPassiveMotionFunc(void (GLUTCALLBACK *func)(int x, int y));
-GLUTAPI void APIENTRY glutEntryFunc(void (GLUTCALLBACK *func)(int state));
-GLUTAPI void APIENTRY glutVisibilityFunc(void (GLUTCALLBACK *func)(int state));
-GLUTAPI void APIENTRY glutIdleFunc(void (GLUTCALLBACK *func)(void));
-GLUTAPI void APIENTRY glutTimerFunc(unsigned int millis, void (GLUTCALLBACK *func)(int value), int value);
-GLUTAPI void APIENTRY glutMenuStateFunc(void (GLUTCALLBACK *func)(int state));
-#if (GLUT_API_VERSION >= 2)
-GLUTAPI void APIENTRY glutSpecialFunc(void (GLUTCALLBACK *func)(int key, int x, int y));
-GLUTAPI void APIENTRY glutSpaceballMotionFunc(void (GLUTCALLBACK *func)(int x, int y, int z));
-GLUTAPI void APIENTRY glutSpaceballRotateFunc(void (GLUTCALLBACK *func)(int x, int y, int z));
-GLUTAPI void APIENTRY glutSpaceballButtonFunc(void (GLUTCALLBACK *func)(int button, int state));
-GLUTAPI void APIENTRY glutButtonBoxFunc(void (GLUTCALLBACK *func)(int button, int state));
-GLUTAPI void APIENTRY glutDialsFunc(void (GLUTCALLBACK *func)(int dial, int value));
-GLUTAPI void APIENTRY glutTabletMotionFunc(void (GLUTCALLBACK *func)(int x, int y));
-GLUTAPI void APIENTRY glutTabletButtonFunc(void (GLUTCALLBACK *func)(int button, int state, int x, int y));
-#if (GLUT_API_VERSION >= 3)
-GLUTAPI void APIENTRY glutMenuStatusFunc(void (GLUTCALLBACK *func)(int status, int x, int y));
-GLUTAPI void APIENTRY glutOverlayDisplayFunc(void (GLUTCALLBACK *func)(void));
-#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
-GLUTAPI void APIENTRY glutWindowStatusFunc(void (GLUTCALLBACK *func)(int state));
-#endif
-#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13)
-GLUTAPI void APIENTRY glutKeyboardUpFunc(void (GLUTCALLBACK *func)(unsigned char key, int x, int y));
-GLUTAPI void APIENTRY glutSpecialUpFunc(void (GLUTCALLBACK *func)(int key, int x, int y));
-GLUTAPI void APIENTRY glutJoystickFunc(void (GLUTCALLBACK *func)(unsigned int buttonMask, int x, int y, int z), int pollInterval);
-#endif
-#endif
-#endif
-
-/* GLUT color index sub-API. */
-GLUTAPI void APIENTRY glutSetColor(int, GLfloat red, GLfloat green, GLfloat blue);
-GLUTAPI GLfloat APIENTRY glutGetColor(int ndx, int component);
-GLUTAPI void APIENTRY glutCopyColormap(int win);
-
-/* GLUT state retrieval sub-API. */
-GLUTAPI int APIENTRY glutGet(GLenum type);
-GLUTAPI int APIENTRY glutDeviceGet(GLenum type);
-#if (GLUT_API_VERSION >= 2)
-/* GLUT extension support sub-API */
-GLUTAPI int APIENTRY glutExtensionSupported(const char *name);
-#endif
-#if (GLUT_API_VERSION >= 3)
-GLUTAPI int APIENTRY glutGetModifiers(void);
-GLUTAPI int APIENTRY glutLayerGet(GLenum type);
-#endif
-
-/* GLUT font sub-API */
-GLUTAPI void APIENTRY glutBitmapCharacter(void *font, int character);
-GLUTAPI int APIENTRY glutBitmapWidth(void *font, int character);
-GLUTAPI void APIENTRY glutStrokeCharacter(void *font, int character);
-GLUTAPI int APIENTRY glutStrokeWidth(void *font, int character);
-#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
-GLUTAPI int APIENTRY glutBitmapLength(void *font, const unsigned char *string);
-GLUTAPI int APIENTRY glutStrokeLength(void *font, const unsigned char *string);
-#endif
-
-/* GLUT pre-built models sub-API */
-GLUTAPI void APIENTRY glutWireSphere(GLdouble radius, GLint slices, GLint stacks);
-GLUTAPI void APIENTRY glutSolidSphere(GLdouble radius, GLint slices, GLint stacks);
-GLUTAPI void APIENTRY glutWireCone(GLdouble base, GLdouble height, GLint slices, GLint stacks);
-GLUTAPI void APIENTRY glutSolidCone(GLdouble base, GLdouble height, GLint slices, GLint stacks);
-GLUTAPI void APIENTRY glutWireCube(GLdouble size);
-GLUTAPI void APIENTRY glutSolidCube(GLdouble size);
-GLUTAPI void APIENTRY glutWireTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings);
-GLUTAPI void APIENTRY glutSolidTorus(GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings);
-GLUTAPI void APIENTRY glutWireDodecahedron(void);
-GLUTAPI void APIENTRY glutSolidDodecahedron(void);
-GLUTAPI void APIENTRY glutWireTeapot(GLdouble size);
-GLUTAPI void APIENTRY glutSolidTeapot(GLdouble size);
-GLUTAPI void APIENTRY glutWireOctahedron(void);
-GLUTAPI void APIENTRY glutSolidOctahedron(void);
-GLUTAPI void APIENTRY glutWireTetrahedron(void);
-GLUTAPI void APIENTRY glutSolidTetrahedron(void);
-GLUTAPI void APIENTRY glutWireIcosahedron(void);
-GLUTAPI void APIENTRY glutSolidIcosahedron(void);
-
-#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 9)
-/* GLUT video resize sub-API. */
-GLUTAPI int APIENTRY glutVideoResizeGet(GLenum param);
-GLUTAPI void APIENTRY glutSetupVideoResizing(void);
-GLUTAPI void APIENTRY glutStopVideoResizing(void);
-GLUTAPI void APIENTRY glutVideoResize(int x, int y, int width, int height);
-GLUTAPI void APIENTRY glutVideoPan(int x, int y, int width, int height);
-
-/* GLUT debugging sub-API. */
-GLUTAPI void APIENTRY glutReportErrors(void);
-#endif
-
-#if (GLUT_API_VERSION >= 4 || GLUT_XLIB_IMPLEMENTATION >= 13)
-/* GLUT device control sub-API. */
-/* glutSetKeyRepeat modes. */
-#define GLUT_KEY_REPEAT_OFF 0
-#define GLUT_KEY_REPEAT_ON 1
-#define GLUT_KEY_REPEAT_DEFAULT 2
-
-/* Joystick button masks. */
-#define GLUT_JOYSTICK_BUTTON_A 1
-#define GLUT_JOYSTICK_BUTTON_B 2
-#define GLUT_JOYSTICK_BUTTON_C 4
-#define GLUT_JOYSTICK_BUTTON_D 8
-
-GLUTAPI void APIENTRY glutIgnoreKeyRepeat(int ignore);
-GLUTAPI void APIENTRY glutSetKeyRepeat(int repeatMode);
-GLUTAPI void APIENTRY glutForceJoystickFunc(void);
-
-/* GLUT game mode sub-API. */
-/* glutGameModeGet. */
-#define GLUT_GAME_MODE_ACTIVE ((GLenum) 0)
-#define GLUT_GAME_MODE_POSSIBLE ((GLenum) 1)
-#define GLUT_GAME_MODE_WIDTH ((GLenum) 2)
-#define GLUT_GAME_MODE_HEIGHT ((GLenum) 3)
-#define GLUT_GAME_MODE_PIXEL_DEPTH ((GLenum) 4)
-#define GLUT_GAME_MODE_REFRESH_RATE ((GLenum) 5)
-#define GLUT_GAME_MODE_DISPLAY_CHANGED ((GLenum) 6)
-
-GLUTAPI void APIENTRY glutGameModeString(const char *string);
-GLUTAPI int APIENTRY glutEnterGameMode(void);
-GLUTAPI void APIENTRY glutLeaveGameMode(void);
-GLUTAPI int APIENTRY glutGameModeGet(GLenum mode);
-#endif
-
-#ifdef __cplusplus
-}
-
-#endif
-
-#ifdef GLUT_APIENTRY_DEFINED
-# undef GLUT_APIENTRY_DEFINED
-# undef APIENTRY
-#endif
-
-#ifdef GLUT_WINGDIAPI_DEFINED
-# undef GLUT_WINGDIAPI_DEFINED
-# undef WINGDIAPI
-#endif
-
-#ifdef GLUT_DEFINED___CDECL
-# undef GLUT_DEFINED___CDECL
-# undef __cdecl
-#endif
-
-#ifdef GLUT_DEFINED__CRTIMP
-# undef GLUT_DEFINED__CRTIMP
-# undef _CRTIMP
-#endif
-
-#endif /* __glut_h__ */
--- a/project_files/hedgewars.pro Sun Nov 15 14:40:51 2015 +0100
+++ b/project_files/hedgewars.pro Sun Nov 15 14:42:59 2015 +0100
@@ -277,8 +277,8 @@
}
!macx {
- LIBS += -lSDL -lSDL_mixer -lSDL_net
+ LIBS += -lSDL2 -lSDL2_mixer -lSDL2_net
!win32 {
- INCLUDEPATH += /usr/local/include/SDL /usr/include/SDL
+ INCLUDEPATH += /usr/local/include/SDL2 /usr/include/SDL2
}
}
--- a/project_files/hwc/CMakeLists.txt Sun Nov 15 14:40:51 2015 +0100
+++ b/project_files/hwc/CMakeLists.txt Sun Nov 15 14:42:59 2015 +0100
@@ -1,11 +1,11 @@
#the usual set of dependencies
find_package(OpenGL REQUIRED)
find_package(GLEW REQUIRED)
-find_package(SDL REQUIRED)
-find_package(SDL_mixer REQUIRED)
-find_package(SDL_net REQUIRED)
-find_package(SDL_image REQUIRED)
-find_package(SDL_ttf REQUIRED)
+find_package(SDL2 REQUIRED)
+find_package(SDL2_mixer REQUIRED)
+find_package(SDL2_net REQUIRED)
+find_package(SDL2_image REQUIRED)
+find_package(SDL2_ttf REQUIRED)
#compile our rtl implementation
include_directories(${GLEW_INCLUDE_DIR})
@@ -13,7 +13,7 @@
include_directories(${PHYSFS_INCLUDE_DIR})
include_directories(${PHYSLAYER_INCLUDE_DIR})
include_directories(${LUA_INCLUDE_DIR})
-include_directories(${SDL_INCLUDE_DIR})
+include_directories(${SDL2_INCLUDE_DIR})
add_subdirectory(rtl)
# convert list into pascal array
@@ -83,11 +83,11 @@
target_link_libraries(hwengine fpcrtl
${LUA_LIBRARY}
${OPENGL_LIBRARY}
- ${SDL_LIBRARY}
- ${SDLMIXER_LIBRARY}
- ${SDLNET_LIBRARY}
- ${SDLIMAGE_LIBRARY}
- ${SDLTTF_LIBRARY}
+ ${SDL2_LIBRARY}
+ ${SDL2_MIXER_LIBRARY}
+ ${SDL2_NET_LIBRARY}
+ ${SDL2_IMAGE_LIBRARY}
+ ${SDL2_TTF_LIBRARY}
${GLEW_LIBRARY}
physfs
physlayer
--- a/project_files/hwc/rtl/fpcrtl.h Sun Nov 15 14:40:51 2015 +0100
+++ b/project_files/hwc/rtl/fpcrtl.h Sun Nov 15 14:42:59 2015 +0100
@@ -110,6 +110,7 @@
#define sdlh_Mix_VolumeMusic stub_Mix_VolumeMusic
#endif
+#define sdlh_SDL_free SDL_free
#define sdlh_SDL_ConvertSurface SDL_ConvertSurface
#define sdlh_SDL_CreateRGBSurface SDL_CreateRGBSurface
#define sdlh_SDL_CreateThread SDL_CreateThread
@@ -120,7 +121,7 @@
#define sdlh_SDL_FreeSurface SDL_FreeSurface
#define sdlh_SDL_GetError SDL_GetError
#define sdlh_SDL_GetKeyName SDL_GetKeyName
-#define sdlh_SDL_GetKeyState SDL_GetKeyState
+#define sdlh_SDL_GetKeyboardState SDL_GetKeyboardState
#define sdlh_SDL_GetMouseState SDL_GetMouseState
#define sdlh_SDL_GetRGBA SDL_GetRGBA
#define sdlh_SDL_GetTicks SDL_GetTicks
@@ -148,8 +149,8 @@
#define sdlh_SDL_WaitThread SDL_WaitThread
#define sdlh_SDL_CreateMutex SDL_CreateMutex
#define sdlh_SDL_DestroyMutex SDL_DestroyMutex
-#define SDL_LockMutex SDL_mutexP
-#define SDL_UnlockMutex SDL_mutexV
+#define sdlh_SDL_LockMutex SDL_LockMutex
+#define sdlh_SDL_UnlockMutex SDL_UnlockMutex
#ifndef EMSCRIPTEN
#define sdlh_SDL_ShowCursor SDL_ShowCursor
#else
--- a/share/hedgewars.appdata.xml Sun Nov 15 14:40:51 2015 +0100
+++ b/share/hedgewars.appdata.xml Sun Nov 15 14:42:59 2015 +0100
@@ -1,7 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<application>
<id type="desktop">hedgewars.desktop</id>
- <licence>GFDL</licence>
+ <metadata_license>GFDL</metadata_license>
+ <name>Hedgewars</name>
+ <summary>Funny turn-based artillery game, featuring fighting Hedgehogs!</summary>
<description>
<p>
Hedgewars is a turn based strategy, artillery, action and comedy game, featuring the antics of pink hedgehogs with attitude as they battle from the depths of hell to the depths of space.
--- a/share/hedgewars/Data/CMakeLists.txt Sun Nov 15 14:40:51 2015 +0100
+++ b/share/hedgewars/Data/CMakeLists.txt Sun Nov 15 14:42:59 2015 +0100
@@ -1,4 +1,17 @@
-foreach(dir "Fonts" "Forts" "Graphics" "Locale" "Maps" "Music" "Sounds" "Themes" "Missions" "Names" "misc" "Scripts")
+foreach(dir
+ Fonts
+ Forts
+ Graphics
+ Locale
+ Maps
+ Missions
+ Music
+ Names
+ Scripts
+ Sounds
+ Themes
+ misc
+ )
add_subdirectory(${dir})
endforeach(dir)
--- a/share/hedgewars/Data/Locale/missions_it.txt Sun Nov 15 14:40:51 2015 +0100
+++ b/share/hedgewars/Data/Locale/missions_it.txt Sun Nov 15 14:42:59 2015 +0100
@@ -43,5 +43,41 @@
User_Mission_-_Rope_Knock_Challenge.name=Sfida: a colpi di corda
User_Mission_-_Rope_Knock_Challenge.desc="Guarda sempre dietro di te!"
+User_Mission_-_Nobody_Laugh.name=Missione: Nessuno ride
+User_Mission_-_Nobody_Laugh.desc="Questo non è un gioco."
+
User_Mission_-_RCPlane_Challenge.name=Sfida: aereo radiocomandato
-User_Mission_-_RCPlane_Challenge.desc="Ti senti abbastanza sicuro, eh, aviatore?"
\ No newline at end of file
+User_Mission_-_RCPlane_Challenge.desc="Ti senti abbastanza sicuro, eh, aviatore?"
+
+portal.name=Missione: Sfida il portale della mente
+portal.desc="Usa il portale per muoverti velocemente e lontano, usalo per uccidere, ma usalo con cauzione!"
+
+Target_Practice_-_Bazooka_easy.name=Tiro al Bersaglio: Bazooka (facile)
+Target_Practice_-_Bazooka_easy.desc="Ok, soldati, fate saltare questi bersagli più in fretta che potete!"
+
+Target_Practice_-_Bazooka_hard.name=Tiro al Bersaglio: Bazooka (difficile)
+Target_Practice_-_Bazooka_hard.desc="Puoi colpire i bersagli anche quando sono molto lontani?"
+
+Target_Practice_-_Cluster_Bomb.name=Tiro al Bersaglio: Bomba Cluster
+Target_Practice_-_Cluster_Bomb.desc="A qualcuno serve una doccia calda!"
+
+Target_Practice_-_Shotgun.name=Tiro al Bersaglio: Shotgun
+Target_Practice_-_Shotgun.desc="Prima spara, poi fai le domande!"
+
+Target_Practice_-_Homing_Bee.name=Tiro al Bersaglio: Ape a ricerca
+Target_Practice_-_Homing_Bee.desc="Usare l'ape a ricerca è più complicato di quello che sembra."
+
+Target_Practice_-_Grenade_easy.name=Tiro al Bersagio: Granata (facile)
+Target_Practice_-_Grenade_easy.desc="Un training di riscaldamento per aspiranti granatieri."
+
+Target_Practice_-_Grenade_hard.name=Tiro al Bersagio: Granata (difficile)
+Target_Practice_-_Grenade_hard.desc="Questo non è per novellini! Piazzeremo i bersagli in posti veramente difficili."
+
+Challenge_-_Speed_Shoppa_-_Hedgelove.name=Sfida: Amo Shoppa
+Challenge_-_Speed_Shoppa_-_Hedgelove.desc="Fai vedere il tuo amore e colleziona alcune casse in una mappa piccola."
+
+Challenge_-_Speed_Shoppa_-_Ropes.name=Sfida: Funi e Casse
+Challenge_-_Speed_Shoppa_-_Ropes.desc="Prendi la tua fune e colleziona tutte le casse in questa mappa media."
+
+Challenge_-_Speed_Shoppa_-_ShoppaKing.name=Sfida: Il Cliente è il Re
+Challenge_-_Speed_Shoppa_-_ShoppaKing.desc="Fai vedere che sei degno di un vero re e colleziona tutte le casse più in fretta che puoi in questa mappa grande."
--- a/share/hedgewars/Data/Locale/tips_it.xml Sun Nov 15 14:40:51 2015 +0100
+++ b/share/hedgewars/Data/Locale/tips_it.xml Sun Nov 15 14:42:59 2015 +0100
@@ -6,52 +6,73 @@
<tip>Scegli lo stesso colore di un amico per giocare in squadra. Ciascuno controllerà i propri ricci ma la vittoria o la sconfitta saranno comuni.</tip>
<tip>Alcune armi potrebbero fare pochi danni ma possono essere devastanti se usate al momento giusto. Prova ad esempio ad utilizzare la Desert Eagle per spingere più ricci in acqua.</tip>
<tip>Se non sai cosa fare e non vuoi sprecare munizioni, salta il turno. Ma non farlo troppe volte perché c'è il Sudden Death!</tip>
+ <tip>Vuoi utilizzare più a lungo la corda? Rilascia la corda a mezz'aria e spara di nuovo. Finché non tocchi il terreno potrai riusare la corda senza sprecare munizioni!</tip>
<tip>Se vuoi evitare che altri possano impersonarti, utilizzando il tuo nickname, sul server ufficiale, registrati su http://www.hedgewars.org/.</tip>
<tip>Sei stanco delle partite preimpostate? Prova una missione - le missioni offrono interessanti modalità differenti di partite in base alle tue scelte.</tip>
<tip>Il gioco salverà sempre l'ultima partita giocata come demo. Seleziona 'Gioco locale' e clicca il bottone 'Demos' nell'angolo in basso a destra per gestirle.</tip>
- <tip>Hedgewars è un programma Open Source e gratuito che noi creiamo nel nostro tempo libero. Se hai problemi, chiedi nei nostri forum ma, per favore, non aspettarti un supporto 24/7!</tip>
+ <tip>Hedgewars è un programma Open Source e gratuito che creiamo nel nostro tempo libero. Se hai problemi, chiedi nei nostri forum oppure visita il nostro canale IRC!</tip>
<tip>Hedgewars è un programma Open Source e gratuito che creiamo nel nostro tempo libero. Se ti piace, aiutaci con una piccola donazione o contribuisci con il tuo lavoro!</tip>
- <tip>Hedgewars è un programma Open Source e gratuito che creiamo nel nostro tempo libero. Condividilo con tutta la famiglia e e con gli amici come più ti piace!</tip>
- <tip>Di tanto in tanto ci saranno tornei ufficiali. Gli eventi saranno annunciati su http://www.hedgewars.org/ con qualche giorno di anticipo.</tip>
+ <tip>Hedgewars è un programma Open Source e gratuito che creiamo nel nostro tempo libero. Condividilo con tutta la famiglia e con gli amici come più ti piace!</tip>
+ <tip>Hedgewars è un programma Open Source e gratuito che creiamo nel nostro tempo libero. Incontra gli sviluppatori sul canale <a href="irc://irc.freenode.net/hedgewars">#hedgewars</a>!</tip>
+ <tip>Di tanto in tanto ci saranno tornei ufficiali. Gli eventi saranno annunciati su <a href="http://www.hedgewars.org/">http://www.hedgewars.org/</a> con qualche giorno di anticipo.</tip>
<tip>Hedgewars è disponibile in molte lingue. Se la traduzione nella tua lingua sembra mancante o non aggiornata, sentiti libero di contattaci!</tip>
- <tip>Hedgewars può essere usato su molti sistemi operativi differenti come Microsoft Windows - XP, Vista, 7 -, Mac OS X e Linux.</tip>
+ <tip>Hedgewars può essere usato su molti sistemi operativi differenti come Microsoft Windows, Mac OS X e GNU/Linux.</tip>
<tip>Ricordati che sei sempre in grado di configurare partire personalizzate in locale e online. Non devi sentirti limitato alle opzioni predefinite!</tip>
- <tip>Durante il gioco dovresti fare una breve pausa almeno ogni ora. In caso di partite più lunghe, sospendi l'attività per almeno 30 minuti al termine del gioco!</tip>
+ <tip>Collega uno o più gamepad prima di iniziare il gioco per poterli assegnare alle tue squadra.</tip>
+ <tip>Durante il gioco dovresti fare una breve pausa almeno ogni ora per evitare la stanchezza da gioco eccessivo.</tip>
<tip>Se la tua scheda grafica non è in grado di fornire OpenGL con accelerazione hardware, prova ad abilitare la modalità a bassa qualità per migliorare le prestazioni.</tip>
+ <tip>Se la tua scheda grafica non è in grado di fornire OpenGL con accelerazione hardware, prova ad aggiornarne i driver.</tip>
<tip>Siamo aperti a suggerimenti e consigli costruttivi. Se non ti piace qualcosa o hai una buona idea, comunicacelo!</tip>
<tip>In particolare quando giochi online sii educato e ricorda che potrebbero esserci dei minorenni che stanno giocando con te o contro di te!</tip>
- <tip>Le modalità di gioco speciali, come 'Vampirismo' o 'Karma' ti permettono di sviluppare nuove tattiche. Provale in una partita personalizzata!</tip>
+ <tip>Le modalità di gioco speciali, come “Vampirismo” o “Karma” ti permettono di sviluppare nuove tattiche. Provale in una partita personalizzata!</tip>
<tip>Non dovresti mai installare Hedgewars su computer che non possiedi (scuola, università, lavoro, ecc.). Per favore, chiedi ai responsabili!</tip>
<tip>Hedgewars può essere perfetto per brevi partite durante le pause. Assicurati solamente di non aver aggiunto troppi ricci o di usare una mappa troppo grande. Ridurre tempo e vita può aiutare allo stesso modo.</tip>
<tip>Nessun riccio è stato maltrattato durante lo sviluppo di questo gioco.</tip>
- <tip>Hedgewars è un programma Open Source e gratuito che creiamo nel nostro tempo libero. Se qualcuno ti ha venduto il gioco, dovresti chiedere un rimborso!</tip>
- <tip>Collega uno o più gamepad prima di iniziare il gioco per poterli assegnare alle tue squadra.</tip>
- <tip>Crea un account su %1 per evitare che altri possano usare il tuo nickname preferito mentre giochi sul server ufficiale.</tip>
- <tip>Se la tua scheda grafica non è in grado di fornire OpenGL con accelerazione hardware, prova ad aggiornarne i driver.</tip>
- <tip>Ci sono tre salti disponibili. Premi [salto in alto] due volte per eseguire un salto in alto all'indietro.</tip>
+ <tip>Ci sono tre tipi di salto disponibili. Premi [salto in alto] due volte per eseguire un salto in alto all'indietro.</tip>
<tip>Paura di cadere da un dirupo? Premi [mirino di precisione] per girare a [sinistra] o a [destra] senza muoverti.</tip>
<tip>Alcune armi richiedono strategie particolari o semplicemente molto allenamento, quindi non arrenderti nell'utilizzo di un'arma specifica se manchi il nemico una volta.</tip>
<tip>Molte armi non funzionano quando toccano l'acqua. L'Ape a Ricerca così come la Torta sono delle eccezioni.</tip>
<tip>Il vecchio Limburger causa solo una piccola esplosione. Tuttavia il vento influisce sulla nuvola puzzolente e può avvelenare più ricci contemporaneamente.</tip>
- <tip>L'Ultima Sonata è l'attacco aereo più dannoso. Perderai il tuo riccio, eseguendolo, quindi ci sono anche delle grosse controindicazioni.</tip>
- <tip>Le Mine Adesive sono lo strumento perfetto per creare piccole reazioni a catena e spingere i ricci nemici in situazioni difficili... o in acqua.</tip>
+ <tip>L'Ultima Sonata è l'attacco aereo più dannoso. Perderai il tuo riccio, eseguendolo, quindi c'è anche una grossa controindicazione.</tip>
+ <tip>L'Ape a Ricerca può essere difficile da usare. Il suo raggio di curvatura dipende dalla sua velocità, quindi cerca di non usarla a piena potenza.</tip>
+ <tip>Le Mine Adesive sono lo strumento perfetto per creare piccole reazioni a catena e spingere i ricci nemici in situazioni difficili … o in acqua.</tip>
<tip>Il Martello è più efficate se usato su ponti o travi. Colpire i ricci li farà sprofondare attraverso il terreno.</tip>
<tip>Se sei bloccato dietro un riccio nemico, usa il Martello per liberarti senza essere danneggiato da un'esplosione.</tip>
<tip>La distanza massima di cammino della Torta dipende dal terreno che deve attraversare. Usa [attacca] per farla esplodere prima.</tip>
<tip>Il Lanciafiamme è un'arma che può essere usata anche per scavare gallerie.</tip>
+ <tip>Usa la Bomba Molotov o il Lanciafiamme per impedire temporaneamente ai ricci di attraversare terreni pianeggianti, tunnel o collinette.</tip>
<tip>Vuoi sapere chi c'è dietro il gioco? Clicca sul logo Hedgewars nel menu principale per vederne gli autori e sviluppatori.</tip>
- <tip>Ti piace Hedgewars? Diventa fan su %1 o seguici su %2!</tip>
- <tip>Sentiti libero di disegnare tombe, cappelli, bandiere o anche mappe e temi personalizzati - lo puoi fare con TheGIMP! Ma nota che dovrai condividerli in qualche modo per usarli online.</tip>
- <tip>Vuoi proprio un cappello specifico? Facci una piccola donazione e riceverai un cappello esclusivo a tua scelta!</tip>
+ <tip>Ti piace Hedgewars? Diventa fan su <a href="http://www.facebook.com/Hedgewars">Facebook</a> oppure seguici su <a href="http://twitter.com/hedgewars">Twitter</a></tip>
+ <tip>Sentiti libero di disegnare tombe, cappelli, bandiere o anche mappe e temi personalizzati! Ma nota che dovrai condividerli in qualche modo per usarli online.</tip>
<tip>Mantieni aggiornati i driver della tua scheda video, per evitare problemi durante il gioco.</tip>
- <tip>Puoi trovare i file di configurazione del gioco in "Documenti\Hedgewars". Crea delle copie di sicurezza o prendi i file con te, ma non modificarli manualmente!</tip>
- <tip>Puoi associare i file relativi a Hedgewars (partite salvate e registrazioni demo) al gioco, in modo da lanciarli direttamente dal tuo gestore file o browser Internet.</tip>
- <tip>Vuoi utilizzare più a lungo la corda? Rilascia la corda a mezz'aria e spara di nuovo. Finché non tocchi il terreno potrai riusare la corda senza sprecare munizioni!</tip>
- <tip>Puoi trovare i file di configurazione del gioco in "Library/Application Support/Hedgewars" nella tua cartella utente. Crea una copia di sicurezza o porta i file con te, ma non modificarli mai manualmente.</tip>
- <tip>Puoi trovare i file di configurazione del gioco in ".hedgewars" nella tua cartella home. Crea una copia di sicurezza o porta i file con te, ma non modificarli mai manualmente.</tip>
- <tip>Usa la Bomba Molotov o il Lanciafiamme per impedire temporaneamente ai ricci di attraversari terreni pianeggianti, tunnel o collinette.</tip>
- <tip>L'Ape a Ricerca può essere difficile da usare. Il suo raggio di curvatura dipende dalla sua velocità, quindi cerca di non usarla a piena potenza.</tip>
+ <tip>Testa o croce? Scrivi “/rnd” nella schermata LOBBY e lo scoprirai. Funziona anche “/rnd carta sasso forbice”!</tip>
+ <tip>Puoi associare i file relativi a Hedgewars (partite salvate e registrazioni demo) al gioco, in modo da lanciarli direttamente dal tuo gestore file o browser web.</tip>
+ <tip>Le mine Dud non sono innocue: Anche se il loro timer è rotto, possono ancora esplodere se vengono abusate troppo!</tip>
+ <tip>L'amore è caldo! Utilizza Seduzione per scongelare ricci congelati.</Tip>
+ <tip>Il fumo proveniente da un barile è un indicatore che è basso di “salute” e che anche piccole quantità di danno potrebbe farlo scoppiare.</tip>
+ <tip>I barili iniziano con 60 salute e subiscono danni come ricci, quindi hanno bisogno di un po' di danno per esplodere</tip>
+ <tip>Hai bisogno di più forza di rimbalzo? Modifica la forza di rimbalzo di granate, bombe a grappolo, vecchi limburgers e mine tenendo premuto [mirino di precisione] e premendo uno dei tasti del timer.</tip>
+ <tip>Hai dimenticato gli obiettivi o modificatori di gioco mentre stai giocando? Premi il pulsante pausa o esci per rivederli di nuovo!</tip>
+ <tip>Puoi prendere a pugni, frustare, e martellare anche altre cose e non solo ricci. Colpiscili tutti!</tip>
+ <tip> Se non menzionato altrimenti, le mine normalmente esplodono dopo 3 secondi.</tip>
+ <tip>In modalità Re, il tuo re partirà più sano, più forte e più resistente ai danni e colpi rispetto ai servi.</tip>
+ <tip>In modalità Re, il re si danneggerà in ogni turno quando non ci saranno più servi nella sua squadra.</tip>
+ <tip>La frusta colpisce anche i ricci e gli oggetti anche dietro una parete sottile.</tip>
+ <tip>La mannaia aumenta il danno con l'aumentare della velocità.</tip>
+ <tip>Puoi far cadere torte dalle scogliere, ma per farlo bisogna stare molto vicino al bordo, quindi stai attento.</tip>
+ <tip>Usa la tua corda per allontanare altri ricci ad esempio facendola scorrere sul terreno. Questa tecnica è nota come “rope-knocking”.</tip>
+ <tip>Non fermarti su un pendio ghiacciato, o scivolerai via. In alternativa, è possibile tenere premuto [mirino di precisione].</tip>
+ <tip>Nelle terre innevate Natalizie, i mucchi di neve aumentano nel corso del tempo, a meno che la terra non sia indistruttibile.</tip>
+ <tip>Fai attenzione nelle terre innevate e Natalizie, perché le travi sono fatte di ghiaccio scivoloso.</tip>
+ <tip>Il tempo di fuga dipende dall'arma che hai usato. Fai attenzione, alcune armi non hanno un tempo di fuga e finiscono subito il tuo turno!</tip>
<windows-only>
- <tip>La versione Windows di Hedgewars supporta Xfire. Assicurati di aggiungere Hedgewars alla sua lista giochi, così i tuoi amici potranno vederti giocare.</tip>
+ <tip>Questa versione di Hedgewars supporta <a href="http://www.xfire.com">Xfire</a>. Assicurati di aggiungere Hedgewars alla sua lista giochi, cosi i tuoi amici potranno vederti giocare.</tip>
+ <tip>Puoi trovare i file di configurazione di Hedgewars in “My Documents\Hedgewars”. Crea una copia di sicurezza o porta i file con te, ma non modificarli mai manualmente.</tip>
</windows-only>
+ <mac-only>
+ <tip>Puoi trovare i file di configurazione di Hedgewars in “Library/Application Support/Hedgewars” nella tua cartella utente. Crea una copia di sicurezza o porta i file con te, ma non modificarli mai manualmente.</tip>
+ </mac-only>
+ <linux-only>
+ <tip>Puoi trovare i file di configurazione di Hedgewars in “.hedgewars” nella tua cartella utente. Crea una copia di sicurezza o porta i file con te, ma non modificarli mai manualmente.</tip>
+ </linux-only>
</tips>
--- a/share/hedgewars/Data/Scripts/OfficialChallenges.lua Sun Nov 15 14:40:51 2015 +0100
+++ b/share/hedgewars/Data/Scripts/OfficialChallenges.lua Sun Nov 15 14:42:59 2015 +0100
@@ -36,6 +36,8 @@
return("Racer Challenge #6")
elseif LandDigest == "M256715557Scripts/Multiplayer/Racer.lua" then
return("Racer Challenge #15")
+ elseif LandDigest == "M-1389184823Scripts/Multiplayer/Racer.lua" then
+ return("Racer Challenge #17")
end
end
end
--- a/tools/CMakeLists.txt Sun Nov 15 14:40:51 2015 +0100
+++ b/tools/CMakeLists.txt Sun Nov 15 14:42:59 2015 +0100
@@ -8,13 +8,14 @@
if(APPLE AND NOT SKIPBUNDLE)
find_package(Qt4 REQUIRED QUIET)
+ find_package(SDL2 REQUIRED)
+ find_package(SDL2_image REQUIRED)
+ find_package(SDL2_net REQUIRED)
+ find_package(SDL2_ttf REQUIRED)
+ find_package(SDL2_mixer REQUIRED)
+
find_package(PNG REQUIRED)
- find_package(SDL REQUIRED)
- find_package(SDL_image REQUIRED)
- find_package(SDL_net REQUIRED)
- find_package(SDL_ttf REQUIRED)
- find_package(SDL_mixer REQUIRED)
- find_package(OggVorbis REQUIRED)
+
if(NOT NOAUTOUPDATE)
find_package(Sparkle) #needed for SPARKLE_FOUND variable
#needed because the 'if' clause in the script prints silly policy warnings
--- a/tools/build_windows.bat Sun Nov 15 14:40:51 2015 +0100
+++ b/tools/build_windows.bat Sun Nov 15 14:42:59 2015 +0100
@@ -27,8 +27,6 @@
::for video recording
if not exist %CD%\misc\winutils\bin\avformat-54.dll cscript %CD%\tools\w32DownloadUnzip.vbs http://hedgewars.googlecode.com/files/libav-win32-20121022-dll.zip %CD%\misc\winutils\bin
-if not exist %CD%\misc\winutils\bin\glut32.dll cscript %CD%\tools\w32DownloadUnzip.vbs https://user.xmission.com/~nate/glut/glut-3.7.6-bin.zip %CD%\misc\winutils\bin
-copy /y %CD%\misc\winutils\bin\glut-3.7.6-bin\glut32.dll %CD%\misc\winutils\bin\glut32.dll
::this is needed because fpc png unit hardcodes libpng-1.2.12
if not exist %CD%\misc\winutils\bin\libpng13.dll copy /y %CD%\misc\winutils\bin\libpng15-15.dll %CD%\misc\winutils\bin\libpng13.dll