Merge branch 'sdl_android' of github.com:pelya/commandergenius into sdl_android

This commit is contained in:
Gerhard Stein
2014-06-23 17:00:34 +02:00
192 changed files with 5719 additions and 5924 deletions

3
.gitmodules vendored
View File

@@ -59,3 +59,6 @@
[submodule "project/jni/application/xserver-debian/xserver"]
path = project/jni/application/xserver-debian/xserver
url = git@github.com:pelya/xserver.git
[submodule "project/jni/application/uae4all2"]
path = project/jni/application/uae4all2
url = git@github.com:lubomyr/uae4all2.git

View File

@@ -16,9 +16,6 @@ Requested features, might never get implemented, see todo.txt for features that
- Show/hide screen controls with longpress on Text Edit button.
- Floating on-screen joystick - initially invisible, it appears when you touch the screen,
centered on your finger, then it slides with your finger if you bump the joystick edge.
- Export phone vibrator to SDL - interface is available in SDL 1.3.
- Control screen brightness with SDL_SetGamma().
@@ -28,6 +25,10 @@ Requested features, might never get implemented, see todo.txt for features that
- Support of libjnigraphics (it will disable on-screen keyboard, only SW SDL screen surface supported).
This is not relevant already, as every device around is fast enough with GL.
- Resize default on-screen buttons for different screen sizes.
- Cloud save support.
- OpenArena: chat text input should be faster.
- OpenArena: Shift and Ctrl keys on USB keyboard do not work for text input.

View File

@@ -229,13 +229,18 @@ echo >> AndroidAppSettings.cfg
echo "# Force relative (laptop) mouse movement mode, useful when both on-screen keyboard and mouse are needed (y) or (n)" >> AndroidAppSettings.cfg
echo ForceRelativeMouseMode=$ForceRelativeMouseMode >> AndroidAppSettings.cfg
echo >> AndroidAppSettings.cfg
echo "# Application needs arrow keys (y) or (n), will show on-screen dpad/joystick (y) or (n)" >> AndroidAppSettings.cfg
echo "# Show on-screen dpad/joystick, that will act as arrow keys (y) or (n)" >> AndroidAppSettings.cfg
echo AppNeedsArrowKeys=$AppNeedsArrowKeys >> AndroidAppSettings.cfg
echo >> AndroidAppSettings.cfg
echo "# On-screen dpad/joystick will appear under finger when it touches the screen (y) or (n)" >> AndroidAppSettings.cfg
echo "# Joystick always follows finger, so moving mouse requires touching the screen with other finger" >> AndroidAppSettings.cfg
echo FloatingScreenJoystick=$FloatingScreenJoystick >> AndroidAppSettings.cfg
echo >> AndroidAppSettings.cfg
echo "# Application needs text input (y) or (n), enables button for text input on screen" >> AndroidAppSettings.cfg
echo AppNeedsTextInput=$AppNeedsTextInput >> AndroidAppSettings.cfg
echo >> AndroidAppSettings.cfg
echo "# Application uses joystick (y) or (n), the on-screen DPAD will be used as joystick 0 axes 0-1" >> AndroidAppSettings.cfg
echo "# This will disable AppNeedsArrowKeys option" >> AndroidAppSettings.cfg
echo AppUsesJoystick=$AppUsesJoystick >> AndroidAppSettings.cfg
echo >> AndroidAppSettings.cfg
echo "# Application uses second on-screen joystick, as SDL joystick 0 axes 2-3 (y)/(n)" >> AndroidAppSettings.cfg
@@ -532,6 +537,12 @@ else
AppNeedsArrowKeys=false
fi
if [ "$FloatingScreenJoystick" = "y" ] ; then
FloatingScreenJoystick=true
else
FloatingScreenJoystick=false
fi
if [ "$AppNeedsTextInput" = "y" ] ; then
AppNeedsTextInput=true
else
@@ -767,6 +778,7 @@ $SEDI "s/public static boolean ForceRelativeMouseMode = .*;/public static boolea
$SEDI "s/public static boolean ShowMouseCursor = .*;/public static boolean ShowMouseCursor = $ShowMouseCursor;/" project/src/Globals.java
$SEDI "s/public static boolean GenerateSubframeTouchEvents = .*;/public static boolean GenerateSubframeTouchEvents = $GenerateSubframeTouchEvents;/" project/src/Globals.java
$SEDI "s/public static boolean AppNeedsArrowKeys = .*;/public static boolean AppNeedsArrowKeys = $AppNeedsArrowKeys;/" project/src/Globals.java
$SEDI "s/public static boolean FloatingScreenJoystick = .*;/public static boolean FloatingScreenJoystick = $FloatingScreenJoystick;/" project/src/Globals.java
$SEDI "s/public static boolean AppNeedsTextInput = .*;/public static boolean AppNeedsTextInput = $AppNeedsTextInput;/" project/src/Globals.java
$SEDI "s/public static boolean AppUsesJoystick = .*;/public static boolean AppUsesJoystick = $AppUsesJoystick;/" project/src/Globals.java
$SEDI "s/public static boolean AppUsesSecondJoystick = .*;/public static boolean AppUsesSecondJoystick = $AppUsesSecondJoystick;/" project/src/Globals.java

View File

@@ -3,12 +3,18 @@
APPNAME=`grep AppName AndroidAppSettings.cfg | sed 's/.*=//' | tr -d '"' | tr " '/" '---'`
APPVER=`grep AppVersionName AndroidAppSettings.cfg | sed 's/.*=//' | tr -d '"' | tr " '/" '---'`
ARCHIVER=gzip
EXT=gz
which xz > /dev/null && ARCHIVER="xz -z" && EXT=xz
which pxz > /dev/null && ARCHIVER=pxz && EXT=xz
# TODO: Boost, Python and ffmpeg are stored in repository as precompiled binaries, the proper way to fix that is to build them using scripts, and remove that binaries
# --exclude="*.a" --exclude="*.so"
tar -c -z --exclude-vcs --exclude="*.o" --exclude="*.d" --exclude="*.dep" \
-f $APPNAME-$APPVER-src.tar.gz \
tar -c --exclude-vcs --exclude="*.o" --exclude="*.d" --exclude="*.dep" \
`git ls-files --exclude-standard | grep -v '^project/jni/application/.*'` \
`find project/jni/application -maxdepth 1 -type f -o -type l` \
project/jni/application/src \
project/jni/application/`readlink project/jni/application/src` \
project/AndroidManifest.xml project/src "$@"
project/AndroidManifest.xml project/src \
project/obj/local/armeabi-v7a/*.so project/obj/local/x86/*.so \
"$@" | $ARCHIVER > $APPNAME-$APPVER-src.tar.$EXT

View File

@@ -1,6 +1,6 @@
/*
Simple DirectMedia Layer
Java source code (C) 2009-2012 Sergii Pylypenko
Java source code (C) 2009-2014 Sergii Pylypenko
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages

View File

@@ -1,6 +1,6 @@
/*
Simple DirectMedia Layer
Java source code (C) 2009-2012 Sergii Pylypenko
Java source code (C) 2009-2014 Sergii Pylypenko
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages

View File

@@ -1,6 +1,6 @@
/*
Simple DirectMedia Layer
Java source code (C) 2009-2012 Sergii Pylypenko
Java source code (C) 2009-2014 Sergii Pylypenko
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages

View File

@@ -1,6 +1,6 @@
/*
Simple DirectMedia Layer
Java source code (C) 2009-2012 Sergii Pylypenko
Java source code (C) 2009-2014 Sergii Pylypenko
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages

View File

@@ -1,6 +1,6 @@
/*
Simple DirectMedia Layer
Java source code (C) 2009-2012 Sergii Pylypenko
Java source code (C) 2009-2014 Sergii Pylypenko
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
@@ -89,6 +89,7 @@ class Globals
public static int TouchscreenKeyboardDrawSize = 1;
public static int TouchscreenKeyboardTheme = 2;
public static int TouchscreenKeyboardTransparency = 2;
public static boolean FloatingScreenJoystick = false;
public static int AccelerometerSensitivity = 2;
public static int AccelerometerCenterPos = 2;
public static int TrackballDampening = 0;
@@ -130,7 +131,6 @@ class Globals
public static String DataDir = new String("");
public static boolean VideoLinearFilter = true;
public static boolean MultiThreadedVideo = false;
public static boolean BrokenLibCMessageShown = false;
public static boolean OuyaEmulation = false; // For debugging
public static boolean RedirectStdout = false; // For debugging

View File

@@ -1,6 +1,6 @@
/*
Simple DirectMedia Layer
Java source code (C) 2009-2012 Sergii Pylypenko
Java source code (C) 2009-2014 Sergii Pylypenko
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages

View File

@@ -1,6 +1,6 @@
/*
Simple DirectMedia Layer
Java source code (C) 2009-2012 Sergii Pylypenko
Java source code (C) 2009-2014 Sergii Pylypenko
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages

View File

@@ -1,6 +1,6 @@
/*
Simple DirectMedia Layer
Java source code (C) 2009-2012 Sergii Pylypenko
Java source code (C) 2009-2014 Sergii Pylypenko
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
@@ -159,7 +159,7 @@ class Settings
out.writeInt(Globals.OptionalDataDownload.length);
for(int i = 0; i < Globals.OptionalDataDownload.length; i++)
out.writeBoolean(Globals.OptionalDataDownload[i]);
out.writeBoolean(Globals.BrokenLibCMessageShown);
out.writeBoolean(false); // Unused
out.writeInt(Globals.TouchscreenKeyboardDrawSize);
out.writeInt(p.getApplicationVersion());
out.writeFloat(AccelerometerReader.gyro.x1);
@@ -177,6 +177,7 @@ class Settings
out.writeBoolean(Globals.MoveMouseWithGyroscope);
out.writeInt(Globals.MoveMouseWithGyroscopeSpeed);
out.writeBoolean(Globals.FingerHover);
out.writeBoolean(Globals.FloatingScreenJoystick);
out.close();
settingsLoaded = true;
@@ -346,7 +347,7 @@ class Settings
Globals.OptionalDataDownload = new boolean[settingsFile.readInt()];
for(int i = 0; i < Globals.OptionalDataDownload.length; i++)
Globals.OptionalDataDownload[i] = settingsFile.readBoolean();
Globals.BrokenLibCMessageShown = settingsFile.readBoolean();
settingsFile.readBoolean(); // Unused
Globals.TouchscreenKeyboardDrawSize = settingsFile.readInt();
int cfgVersion = settingsFile.readInt();
AccelerometerReader.gyro.x1 = settingsFile.readFloat();
@@ -364,6 +365,7 @@ class Settings
Globals.MoveMouseWithGyroscope = settingsFile.readBoolean();
Globals.MoveMouseWithGyroscopeSpeed = settingsFile.readInt();
Globals.FingerHover = settingsFile.readBoolean();
Globals.FloatingScreenJoystick = settingsFile.readBoolean();
settingsLoaded = true;
@@ -409,7 +411,7 @@ class Settings
Globals.DownloadToSdcard = false;
}
Globals.DataDir = Globals.DownloadToSdcard ?
SdcardAppPath.getPath(p) :
SdcardAppPath.getBestPath(p) :
p.getFilesDir().getAbsolutePath();
if( Globals.DownloadToSdcard )
{
@@ -419,6 +421,12 @@ class Settings
for( String s: fileList )
if( s.toUpperCase().startsWith(DataDownloader.DOWNLOAD_FLAG_FILENAME.toUpperCase()) )
Globals.DataDir = SdcardAppPath.deprecatedPath(p);
// Also check for pre-Kitkat files location
fileList = new File(SdcardAppPath.getPath(p)).list();
if( fileList != null )
for( String s: fileList )
if( s.toUpperCase().startsWith(DataDownloader.DOWNLOAD_FLAG_FILENAME.toUpperCase()) )
Globals.DataDir = SdcardAppPath.getPath(p);
}
}
@@ -554,7 +562,8 @@ class Settings
nativeSetupScreenKeyboard( Globals.TouchscreenKeyboardSize,
Globals.TouchscreenKeyboardDrawSize,
Globals.TouchscreenKeyboardTheme,
Globals.TouchscreenKeyboardTransparency );
Globals.TouchscreenKeyboardTransparency,
Globals.FloatingScreenJoystick ? 1 : 0 );
SetupTouchscreenKeyboardGraphics(p);
for( int i = 0; i < Globals.RemapScreenKbKeycode.length; i++ )
nativeSetKeymapKeyScreenKb(i, SDL_Keys.values[Globals.RemapScreenKbKeycode[i]]);
@@ -680,12 +689,18 @@ class Settings
{
private static SdcardAppPath get()
{
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.FROYO)
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT)
return Kitkat.Holder.sInstance;
else if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.FROYO)
return Froyo.Holder.sInstance;
else
return Dummy.Holder.sInstance;
}
public abstract String path(final Context p);
public String bestPath(final Context p)
{
return path(p);
};
public static String deprecatedPath(final Context p)
{
return Environment.getExternalStorageDirectory().getAbsolutePath() + "/app-data/" + p.getPackageName();
@@ -697,6 +712,13 @@ class Settings
} catch(Exception e) { }
return Dummy.Holder.sInstance.path(p);
}
public static String getBestPath(final Context p)
{
try {
return get().bestPath(p);
} catch(Exception e) { }
return Dummy.Holder.sInstance.path(p);
}
private static class Froyo extends SdcardAppPath
{
@@ -709,6 +731,32 @@ class Settings
return p.getExternalFilesDir(null).getAbsolutePath();
}
}
private static class Kitkat extends Froyo
{
private static class Holder
{
private static final Kitkat sInstance = new Kitkat();
}
public String bestPath(final Context p)
{
File[] paths = p.getExternalFilesDirs(null);
String ret = path(p);
long maxSize = -1;
for( File path: paths )
{
if( path == null )
continue;
StatFs stat = new StatFs(path.getPath());
long size = (long)stat.getAvailableBlocks() * stat.getBlockSize() / 1024 / 1024;
if( size > maxSize )
{
maxSize = size;
ret = path.getPath();
}
}
return ret;
};
}
private static class Dummy extends SdcardAppPath
{
private static class Holder
@@ -799,7 +847,7 @@ class Settings
private static native void nativeSetCompatibilityHacks();
private static native void nativeSetVideoMultithreaded();
private static native void nativeSetVideoForceSoftwareMode();
private static native void nativeSetupScreenKeyboard(int size, int drawsize, int theme, int transparency);
private static native void nativeSetupScreenKeyboard(int size, int drawsize, int theme, int transparency, int floatingScreenJoystick);
private static native void nativeSetupScreenKeyboardButtons(byte[] img);
private static native void nativeInitKeymap();
private static native int nativeGetKeymapKey(int key);
@@ -816,4 +864,3 @@ class Settings
public static native int nativeChmod(final String name, int mode);
public static native void nativeChdir(final String dir);
}

View File

@@ -1,6 +1,6 @@
/*
Simple DirectMedia Layer
Java source code (C) 2009-2012 Sergii Pylypenko
Java source code (C) 2009-2014 Sergii Pylypenko
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages

View File

@@ -1,6 +1,6 @@
/*
Simple DirectMedia Layer
Java source code (C) 2009-2012 Sergii Pylypenko
Java source code (C) 2009-2014 Sergii Pylypenko
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages

View File

@@ -1,6 +1,6 @@
/*
Simple DirectMedia Layer
Java source code (C) 2009-2012 Sergii Pylypenko
Java source code (C) 2009-2014 Sergii Pylypenko
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages

View File

@@ -1,6 +1,6 @@
/*
Simple DirectMedia Layer
Java source code (C) 2009-2012 Sergii Pylypenko
Java source code (C) 2009-2014 Sergii Pylypenko
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages

View File

@@ -1,6 +1,6 @@
/*
Simple DirectMedia Layer
Java source code (C) 2009-2012 Sergii Pylypenko
Java source code (C) 2009-2014 Sergii Pylypenko
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages

View File

@@ -1,6 +1,6 @@
/*
Simple DirectMedia Layer
Java source code (C) 2009-2012 Sergii Pylypenko
Java source code (C) 2009-2014 Sergii Pylypenko
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages

View File

@@ -9,10 +9,10 @@ APP_PIE := false # This feature makes executables incompatible to Android API 15
# Global compiler flags
ifneq ($(filter armeabi-v7a-hard, $(APP_ABI)),)
# Link-time optimization enabled for optimization junkies. -O9001 etc
APP_CFLAGS := -flto
APP_CXXFLAGS := -flto
APP_LDFLAGS := -flto
# Link-time optimization enabled for optimization junkies. -O999 etc
#APP_CFLAGS := -flto
#APP_CXXFLAGS := -flto
#APP_LDFLAGS := -flto
# Latest GCC got better LTO support
NDK_TOOLCHAIN_VERSION := 4.8
#NDK_TOOLCHAIN_VERSION := 4.8
endif

View File

@@ -1,47 +1,259 @@
# The application settings for Android libSDL port
AppSettingVersion=17
LibSdlVersion=1.3
# Specify application name (e.x. My Application)
AppName="Alien Blaster"
# Specify reversed site name of application (e.x. com.mysite.myapp)
AppFullName=de.schwardtnet.alienblaster
ScreenOrientation=h
InhibitSuspend=n
AppDataDownloadUrl="!Game data|alienblaster110_data1.zip^!Game data|alienblaster110_data2.zip^!Game data|alienblaster110_data3.zip"
VideoDepthBpp=16
NeedDepthBuffer=n
NeedStencilBuffer=n
NeedGles2=n
SwVideoMode=n
SdlVideoResize=y
SdlVideoResizeKeepAspect=n
CompatibilityHacks=
CompatibilityHacksStaticInit=n
CompatibilityHacksTextInputEmulatesHwKeyboard=n
AppUsesMouse=n
AppNeedsTwoButtonMouse=n
ShowMouseCursor=n
ForceRelativeMouseMode=n
AppNeedsArrowKeys=y
AppNeedsTextInput=y
AppUsesJoystick=n
AppHandlesJoystickSensitivity=n
AppUsesMultitouch=n
NonBlockingSwapBuffers=n
RedefinedKeys="RETURN LCTRL NO_REMAP NO_REMAP LCTRL"
AppTouchscreenKeyboardKeysAmount=4
AppTouchscreenKeyboardKeysAmountAutoFire=1
RedefinedKeysScreenKb="RETURN LCTRL PAGEUP PAGEDOWN LCTRL"
StartupMenuButtonTimeout=3000
HiddenMenuOptions='OptionalDownloadConfig'
FirstStartMenuOptions=''
MultiABI=n
# Application version code (integer)
AppVersionCode=110014
# Application user-visible version name (string)
AppVersionName="1.1.0.14"
# Specify path to download application data in zip archive in the form 'Description|URL|MirrorURL^Description2|URL2|MirrorURL2^...'
# If you'll start Description with '!' symbol it will be enabled by default, other downloads should be selected by user from startup config menu
# If the URL in in the form ':dir/file.dat:http://URL/' it will be downloaded as binary BLOB to the application dir and not unzipped
# If the URL does not contain 'http://' it is treated as file from 'project/jni/application/src/AndroidData' dir -
# these files are put inside .apk package by build system
# Also please avoid 'https://' URLs, many Android devices do not have trust certificates and will fail to connect to SF.net over HTTPS
AppDataDownloadUrl="!Game data|alienblaster110_data1.zip^!Game data|alienblaster110_data2.zip^!Game data|alienblaster110_data3.zip"
# Reset SDL config when updating application to the new version (y) / (n)
ResetSdlConfigForThisVersion=n
# Delete application data files when upgrading (specify file/dir paths separated by spaces)
DeleteFilesOnUpgrade="%"
CompiledLibraries="sdl_mixer sdl_image"
CustomBuildScript=n
AppCflags='-O3'
AppLdflags=''
AppSubdirsBuild=''
AppCmdline=''
# Here you may type readme text, which will be shown during startup. Format is:
# Text in English, use \\\\n to separate lines (that's four backslashes)^de:Text in Deutsch^ru:Text in Russian^button:Button that will open some URL:http://url-to-open/
ReadmeText='^You can press "Home" now - the data will be downloaded in background^In game press "Menu" for secondary fire, "Volume Up/Down" to cycle weapons'
# libSDL version to use (1.2/1.3/2.0)
LibSdlVersion=1.3
# Specify screen orientation: (v)ertical/(p)ortrait or (h)orizontal/(l)andscape
ScreenOrientation=h
# Video color depth - 16 BPP is the fastest and supported for all modes, 24 bpp is supported only
# with SwVideoMode=y, SDL_OPENGL mode supports everything. (16)/(24)/(32)
VideoDepthBpp=16
# Enable OpenGL depth buffer (needed only for 3-d applications, small speed decrease) (y) or (n)
NeedDepthBuffer=n
# Enable OpenGL stencil buffer (needed only for 3-d applications, small speed decrease) (y) or (n)
NeedStencilBuffer=n
# Try to use GLES 2.x context - will revert to GLES 1.X if unsupported by device
# you need this option only if you're developing 3-d app (y) or (n)
NeedGles2=n
# Application uses software video buffer - you're calling SDL_SetVideoMode() without SDL_HWSURFACE and without SDL_OPENGL,
# this will allow small speed optimization. Enable this even when you're using SDL_HWSURFACE. (y) or (n)
SwVideoMode=n
# Application video output will be resized to fit into native device screen (y)/(n)
SdlVideoResize=y
# Application resizing will keep 4:3 aspect ratio, with black bars at sides (y)/(n)
SdlVideoResizeKeepAspect=n
# Do not allow device to sleep when the application is in foreground, set this for video players or apps which use accelerometer
InhibitSuspend=n
# Create Android service, so the app is less likely to be killed while in background
CreateService=
# Application does not call SDL_Flip() or SDL_UpdateRects() appropriately, or draws from non-main thread -
# enabling the compatibility mode will force screen update every 100 milliseconds, which is laggy and inefficient (y) or (n)
CompatibilityHacksForceScreenUpdate=
# Application does not call SDL_Flip() or SDL_UpdateRects() after mouse click (ScummVM and all Amiga emulators do that) -
# force screen update by moving mouse cursor a little after each click (y) or (n)
CompatibilityHacksForceScreenUpdateMouseClick=y
# Application initializes SDL audio/video inside static constructors (which is bad, you won't be able to run ndk-gdb) (y)/(n)
CompatibilityHacksStaticInit=n
# On-screen Android soft text input emulates hardware keyboard, this will only work with Hackers Keyboard app (y)/(n)
CompatibilityHacksTextInputEmulatesHwKeyboard=n
# Hack for broken devices: prevent audio chopping, by sleeping a bit after pushing each audio chunk (y)/(n)
CompatibilityHacksPreventAudioChopping=
# Hack for broken apps: application ignores audio buffer size returned by SDL (y)/(n)
CompatibilityHacksAppIgnoresAudioBufferSize=
# Hack for VCMI: preload additional shared libraries before aplication start
CompatibilityHacksAdditionalPreloadedSharedLibraries=""
# Hack for Free Heroes 2, which redraws the screen inside SDL_PumpEvents(): slow and compatible SDL event queue -
# do not use it with accelerometer/gyroscope, or your app may freeze at random (y)/(n)
CompatibilityHacksSlowCompatibleEventQueue=
# Save and restore OpenGL state when drawing on-screen keyboard for apps that use SDL_OPENGL
CompatibilityHacksTouchscreenKeyboardSaveRestoreOpenGLState=
# Application uses SDL_UpdateRects() properly, and does not draw in any region outside those rects.
# This improves drawing speed, but I know only one application that does that, and it's written by me (y)/(n)
CompatibilityHacksProperUsageOfSDL_UpdateRects=
# Application uses mouse (y) or (n), this will show mouse emulation dialog to the user
AppUsesMouse=n
# Application needs two-button mouse, will also enable advanced point-and-click features (y) or (n)
AppNeedsTwoButtonMouse=n
# Right mouse button can do long-press/drag&drop action, necessary for some games (y) or (n)
# If you disable it, swiping with two fingers will send mouse wheel events
RightMouseButtonLongPress=
# Show SDL mouse cursor, for applications that do not draw cursor at all (y) or (n)
ShowMouseCursor=n
# Generate more touch events, by default SDL generates one event per one video frame, this is useful for drawing apps (y) or (n)
GenerateSubframeTouchEvents=
# Force relative (laptop) mouse movement mode, useful when both on-screen keyboard and mouse are needed (y) or (n)
ForceRelativeMouseMode=n
# Show on-screen dpad/joystick, that will act as arrow keys (y) or (n)
AppNeedsArrowKeys=y
# On-screen dpad/joystick will appear under finger when it touches the screen (y) or (n)
# Joystick always follows finger, so moving mouse requires touching the screen with other finger
FloatingScreenJoystick=y
# Application needs text input (y) or (n), enables button for text input on screen
AppNeedsTextInput=y
# Application uses joystick (y) or (n), the on-screen DPAD will be used as joystick 0 axes 0-1
# This will disable AppNeedsArrowKeys option
AppUsesJoystick=n
# Application uses second on-screen joystick, as SDL joystick 0 axes 2-3 (y)/(n)
AppUsesSecondJoystick=n
# Application uses third on-screen joystick, as SDL joystick 0 axes 20-21 (y)/(n)
AppUsesThirdJoystick=
# Application uses accelerometer (y) or (n), the accelerometer will be used as joystick 1 axes 0-1 and 5-7
AppUsesAccelerometer=
# Application uses gyroscope (y) or (n), the gyroscope will be used as joystick 1 axes 2-4
AppUsesGyroscope=
# Use gyroscope to move mouse cursor (y) or (n), it eats battery, and can be disabled in settings, do not use with AppUsesGyroscope setting
MoveMouseWithGyroscope=
# Application uses multitouch (y) or (n), multitouch events are passed as SDL_JOYBALLMOTION events for the joystick 0
AppUsesMultitouch=n
# Application records audio (it will use any available source, such a s microphone)
# API is defined in file SDL_android.h: int SDL_ANDROID_OpenAudioRecording(SDL_AudioSpec *spec); void SDL_ANDROID_CloseAudioRecording(void);
# This option will add additional permission to Android manifest (y)/(n)
AppRecordsAudio=
# Application needs to access SD card. If your data files are bigger than 5 Mb, enable it. (y) / (n)
AccessSdCard=
# Application needs Internet access. If you disable it, you'll have to bundle all your data files inside .apk (y) / (n)
AccessInternet=
# Immersive mode - Android will hide on-screen Home/Back keys. Looks bad if you invoke Android keyboard. (y) / (n)
ImmersiveMode=
# Application implements Android-specific routines to put to background, and will not draw anything to screen
# between SDL_ACTIVEEVENT lost / gained notifications - you should check for them
# rigth after SDL_Flip(), if (n) then SDL_Flip() will block till app in background (y) or (n)
# This option is reported to be buggy, sometimes failing to restore video state
NonBlockingSwapBuffers=n
# Redefine common hardware keys to SDL keysyms
# BACK hardware key is available on all devices, MENU is available on pre-ICS devices, other keys may be absent
# SEARCH and CALL by default return same keycode as DPAD_CENTER - one of those keys is available on most devices
# Use word NO_REMAP if you want to preserve native functionality for certain key (volume keys are 3-rd and 4-th)
# Keys: TOUCHSCREEN (works only when AppUsesMouse=n), DPAD_CENTER/SEARCH, VOLUMEUP, VOLUMEDOWN, MENU, BACK, CAMERA
RedefinedKeys="RETURN LCTRL NO_REMAP NO_REMAP LCTRL"
# Number of virtual keyboard keys (currently 6 is maximum)
AppTouchscreenKeyboardKeysAmount=4
# Redefine on-screen keyboard keys to SDL keysyms - 6 keyboard keys + 4 multitouch gestures (zoom in/out and rotate left/right)
RedefinedKeysScreenKb="RETURN LCTRL PAGEUP PAGEDOWN LCTRL"
# Names for on-screen keyboard keys, such as Fire, Jump, Run etc, separated by spaces, they are used in SDL config menu
RedefinedKeysScreenKbNames=""
# On-screen keys theme
# 0 = Ultimate Droid by Sean Stieber (green, with gamepad joystick)
# 1 = Simple Theme by Beholder (white, with gamepad joystick)
# 2 = Sun by Sirea (yellow, with round joystick)
# 3 = Keen by Gerstrong (multicolor, with round joystick)
TouchscreenKeysTheme=2
# Redefine gamepad keys to SDL keysyms, button order is:
# A B X Y L1 R1 L2 R2 LThumb RThumb
RedefinedKeysGamepad=""
# How long to show startup menu button, in msec, 0 to disable startup menu
StartupMenuButtonTimeout=3000
# Menu items to hide from startup menu, available menu items:
# SettingsMenu.OkButton SettingsMenu.DummyMenu SettingsMenu.MainMenu SettingsMenuMisc.DownloadConfig SettingsMenuMisc.OptionalDownloadConfig SettingsMenuMisc.AudioConfig SettingsMenuMisc.VideoSettingsConfig SettingsMenuMisc.ShowReadme SettingsMenuMisc.GyroscopeCalibration SettingsMenuMisc.ResetToDefaultsConfig SettingsMenuMouse.MouseConfigMainMenu SettingsMenuMouse.DisplaySizeConfig SettingsMenuMouse.LeftClickConfig SettingsMenuMouse.RightClickConfig SettingsMenuMouse.AdditionalMouseConfig SettingsMenuMouse.JoystickMouseConfig SettingsMenuMouse.TouchPressureMeasurementTool SettingsMenuMouse.CalibrateTouchscreenMenu SettingsMenuKeyboard.KeyboardConfigMainMenu SettingsMenuKeyboard.ScreenKeyboardSizeConfig SettingsMenuKeyboard.ScreenKeyboardDrawSizeConfig SettingsMenuKeyboard.ScreenKeyboardThemeConfig SettingsMenuKeyboard.ScreenKeyboardTransparencyConfig SettingsMenuKeyboard.RemapHwKeysConfig SettingsMenuKeyboard.RemapScreenKbConfig SettingsMenuKeyboard.ScreenGesturesConfig SettingsMenuKeyboard.CustomizeScreenKbLayout
HiddenMenuOptions='OptionalDownloadConfig'
# Menu items to show at startup - this is Java code snippet, leave empty for default
# new SettingsMenuMisc.ShowReadme(), (AppUsesMouse \&\& \! ForceRelativeMouseMode \? new SettingsMenuMouse.DisplaySizeConfig(true) : new SettingsMenu.DummyMenu()), new SettingsMenuMisc.OptionalDownloadConfig(true), new SettingsMenuMisc.GyroscopeCalibration()
# Available menu items:
# SettingsMenu.OkButton SettingsMenu.DummyMenu SettingsMenu.MainMenu SettingsMenuMisc.DownloadConfig SettingsMenuMisc.OptionalDownloadConfig SettingsMenuMisc.AudioConfig SettingsMenuMisc.VideoSettingsConfig SettingsMenuMisc.ShowReadme SettingsMenuMisc.GyroscopeCalibration SettingsMenuMisc.ResetToDefaultsConfig SettingsMenuMouse.MouseConfigMainMenu SettingsMenuMouse.DisplaySizeConfig SettingsMenuMouse.LeftClickConfig SettingsMenuMouse.RightClickConfig SettingsMenuMouse.AdditionalMouseConfig SettingsMenuMouse.JoystickMouseConfig SettingsMenuMouse.TouchPressureMeasurementTool SettingsMenuMouse.CalibrateTouchscreenMenu SettingsMenuKeyboard.KeyboardConfigMainMenu SettingsMenuKeyboard.ScreenKeyboardSizeConfig SettingsMenuKeyboard.ScreenKeyboardDrawSizeConfig SettingsMenuKeyboard.ScreenKeyboardThemeConfig SettingsMenuKeyboard.ScreenKeyboardTransparencyConfig SettingsMenuKeyboard.RemapHwKeysConfig SettingsMenuKeyboard.RemapScreenKbConfig SettingsMenuKeyboard.ScreenGesturesConfig SettingsMenuKeyboard.CustomizeScreenKbLayout
FirstStartMenuOptions=''
# Specify architectures to compile, 'all' or 'y' to compile for all architectures.
# Available architectures: armeabi armeabi-v7a armeabi-v7a-hard x86 mips
MultiABI='n'
# Minimum amount of RAM application requires, in Mb, SDL will print warning to user if it's lower
AppMinimumRAM=
# Optional shared libraries to compile - removing some of them will save space
# MP3 support by libMAD is encumbered by patents and libMAD is GPL-ed
# Available libraries: mad (GPL-ed!) sdl_mixer sdl_image sdl_ttf sdl_net sdl_blitpool sdl_gfx sdl_sound intl xml2 lua jpeg png ogg flac tremor vorbis freetype xerces curl theora fluidsynth lzma lzo2 mikmod openal timidity zzip bzip2 yaml-cpp python boost_date_time boost_filesystem boost_iostreams boost_program_options boost_regex boost_signals boost_system boost_thread glu avcodec avdevice avfilter avformat avresample avutil swscale swresample bzip2
CompiledLibraries="sdl_mixer sdl_image"
# Application uses custom build script AndroidBuild.sh instead of Android.mk (y) or (n)
CustomBuildScript=n
# Aditional CFLAGS for application
AppCflags='-O3'
# Additional LDFLAGS for application
AppLdflags=''
# If application has headers with the same name as system headers, this option tries to fix compiler flags to make it compilable
AppOverlapsSystemHeaders=
# Build only following subdirs (empty will build all dirs, ignored with custom script)
AppSubdirsBuild=''
# Exclude these files from build
AppBuildExclude=''
# Application command line parameters, including app name as 0-th param
AppCmdline=''
# Screen size is used by Google Play to prevent an app to be installed on devices with smaller screens
# Minimum screen size that application supports: (s)mall / (m)edium / (l)arge
MinimumScreenSize=
# Your AdMob Publisher ID, (n) if you don't want advertisements
AdmobPublisherId=
# Your AdMob test device ID, to receive a test ad
AdmobTestDeviceId=
# Your AdMob banner size (BANNER/FULL_BANNER/LEADERBOARD/MEDIUM_RECTANGLE/SMART_BANNER/WIDE_SKYSCRAPER/FULL_WIDTH:Height/Width:AUTO_HEIGHT/Width:Height)
AdmobBannerSize=

View File

@@ -119,13 +119,18 @@ GenerateSubframeTouchEvents=n
# Force relative (laptop) mouse movement mode, useful when both on-screen keyboard and mouse are needed (y) or (n)
ForceRelativeMouseMode=n
# Application needs arrow keys (y) or (n), will show on-screen dpad/joystick (y) or (n)
# Show on-screen dpad/joystick, that will act as arrow keys (y) or (n)
AppNeedsArrowKeys=y
# On-screen dpad/joystick will appear under finger when it touches the screen (y) or (n)
# Joystick always follows finger, so moving mouse requires touching the screen with other finger
FloatingScreenJoystick=y
# Application needs text input (y) or (n), enables button for text input on screen
AppNeedsTextInput=y
# Application uses joystick (y) or (n), the on-screen DPAD will be used as joystick 0 axes 0-1
# This will disable AppNeedsArrowKeys option
AppUsesJoystick=y
# Application uses second on-screen joystick, as SDL joystick 0 axes 2-3 (y)/(n)
@@ -208,7 +213,7 @@ FirstStartMenuOptions='SettingsMenu.DummyMenu'
# Specify architectures to compile, 'all' or 'y' to compile for all architectures.
# Available architectures: armeabi armeabi-v7a armeabi-v7a-hard x86 mips
MultiABI='armeabi-v7a-hard x86 mips armeabi'
MultiABI='armeabi-v7a'
# Minimum amount of RAM application requires, in Mb, SDL will print warning to user if it's lower
AppMinimumRAM=0

View File

@@ -36,9 +36,6 @@ LibSdlVersion=1.2
# Specify screen orientation: (v)ertical/(p)ortrait or (h)orizontal/(l)andscape
ScreenOrientation=h
# Do not allow device to sleep when the application is in foreground, set this for video players or apps which use accelerometer
InhibitSuspend=n
# Video color depth - 16 BPP is the fastest and supported for all modes, 24 bpp is supported only
# with SwVideoMode=y, SDL_OPENGL mode supports everything. (16)/(24)/(32)
VideoDepthBpp=16
@@ -63,9 +60,19 @@ SdlVideoResize=y
# Application resizing will keep 4:3 aspect ratio, with black bars at sides (y)/(n)
SdlVideoResizeKeepAspect=n
# Do not allow device to sleep when the application is in foreground, set this for video players or apps which use accelerometer
InhibitSuspend=n
# Create Android service, so the app is less likely to be killed while in background
CreateService=
# Application does not call SDL_Flip() or SDL_UpdateRects() appropriately, or draws from non-main thread -
# enabling the compatibility mode will force screen update every 100 milliseconds, which is laggy and inefficient (y) or (n)
CompatibilityHacks=n
CompatibilityHacksForceScreenUpdate=n
# Application does not call SDL_Flip() or SDL_UpdateRects() after mouse click (ScummVM and all Amiga emulators do that) -
# force screen update by moving mouse cursor a little after each click (y) or (n)
CompatibilityHacksForceScreenUpdateMouseClick=y
# Application initializes SDL audio/video inside static constructors (which is bad, you won't be able to run ndk-gdb) (y)/(n)
CompatibilityHacksStaticInit=n
@@ -99,6 +106,10 @@ AppUsesMouse=n
# Application needs two-button mouse, will also enable advanced point-and-click features (y) or (n)
AppNeedsTwoButtonMouse=n
# Right mouse button can do long-press/drag&drop action, necessary for some games (y) or (n)
# If you disable it, swiping with two fingers will send mouse wheel events
RightMouseButtonLongPress=
# Show SDL mouse cursor, for applications that do not draw cursor at all (y) or (n)
ShowMouseCursor=n
@@ -108,24 +119,35 @@ GenerateSubframeTouchEvents=
# Force relative (laptop) mouse movement mode, useful when both on-screen keyboard and mouse are needed (y) or (n)
ForceRelativeMouseMode=n
# Application needs arrow keys (y) or (n), will show on-screen dpad/joystick (y) or (n)
# Show on-screen dpad/joystick, that will act as arrow keys (y) or (n)
AppNeedsArrowKeys=y
# On-screen dpad/joystick will appear under finger when it touches the screen (y) or (n)
# Joystick always follows finger, so moving mouse requires touching the screen with other finger
FloatingScreenJoystick=y
# Application needs text input (y) or (n), enables button for text input on screen
AppNeedsTextInput=n
# Application uses joystick (y) or (n), the on-screen DPAD will be used as joystick 0 axes 0-1
# This will disable AppNeedsArrowKeys option
AppUsesJoystick=n
# Application uses second on-screen joystick, as SDL joystick 0 axes 2-3 (y)/(n)
AppUsesSecondJoystick=n
# Application uses third on-screen joystick, as SDL joystick 0 axes 20-21 (y)/(n)
AppUsesThirdJoystick=
# Application uses accelerometer (y) or (n), the accelerometer will be used as joystick 1 axes 0-1 and 5-7
AppUsesAccelerometer=n
# Application uses gyroscope (y) or (n), the gyroscope will be used as joystick 1 axes 2-4
AppUsesGyroscope=n
# Use gyroscope to move mouse cursor (y) or (n), it eats battery, and can be disabled in settings, do not use with AppUsesGyroscope setting
MoveMouseWithGyroscope=
# Application uses multitouch (y) or (n), multitouch events are passed as SDL_JOYBALLMOTION events for the joystick 0
AppUsesMultitouch=n
@@ -137,6 +159,9 @@ AppRecordsAudio=n
# Application needs to access SD card. If your data files are bigger than 5 Mb, enable it. (y) / (n)
AccessSdCard=
# Application needs Internet access. If you disable it, you'll have to bundle all your data files inside .apk (y) / (n)
AccessInternet=
# Immersive mode - Android will hide on-screen Home/Back keys. Looks bad if you invoke Android keyboard. (y) / (n)
ImmersiveMode=
@@ -156,9 +181,6 @@ RedefinedKeys="SPACE SPACE NO_REMAP NO_REMAP SPACE ESCAPE"
# Number of virtual keyboard keys (currently 6 is maximum)
AppTouchscreenKeyboardKeysAmount=1
# Number of virtual keyboard keys that support autofire (currently 2 is maximum)
AppTouchscreenKeyboardKeysAmountAutoFire=0
# Redefine on-screen keyboard keys to SDL keysyms - 6 keyboard keys + 4 multitouch gestures (zoom in/out and rotate left/right)
RedefinedKeysScreenKb="SPACE"
@@ -189,9 +211,9 @@ HiddenMenuOptions='SettingsMenuMisc.OptionalDownloadConfig'
# SettingsMenu.OkButton SettingsMenu.DummyMenu SettingsMenu.MainMenu SettingsMenuMisc.DownloadConfig SettingsMenuMisc.OptionalDownloadConfig SettingsMenuMisc.AudioConfig SettingsMenuMisc.VideoSettingsConfig SettingsMenuMisc.ShowReadme SettingsMenuMisc.GyroscopeCalibration SettingsMenuMisc.ResetToDefaultsConfig SettingsMenuMouse.MouseConfigMainMenu SettingsMenuMouse.DisplaySizeConfig SettingsMenuMouse.LeftClickConfig SettingsMenuMouse.RightClickConfig SettingsMenuMouse.AdditionalMouseConfig SettingsMenuMouse.JoystickMouseConfig SettingsMenuMouse.TouchPressureMeasurementTool SettingsMenuMouse.CalibrateTouchscreenMenu SettingsMenuKeyboard.KeyboardConfigMainMenu SettingsMenuKeyboard.ScreenKeyboardSizeConfig SettingsMenuKeyboard.ScreenKeyboardDrawSizeConfig SettingsMenuKeyboard.ScreenKeyboardThemeConfig SettingsMenuKeyboard.ScreenKeyboardTransparencyConfig SettingsMenuKeyboard.RemapHwKeysConfig SettingsMenuKeyboard.RemapScreenKbConfig SettingsMenuKeyboard.ScreenGesturesConfig SettingsMenuKeyboard.CustomizeScreenKbLayout
FirstStartMenuOptions=''
# Enable multi-ABI binary, with hardware FPU support - it will also work on old devices,
# but .apk size is 2x bigger (y) / (n) / (x86) / (all)
MultiABI=all
# Specify architectures to compile, 'all' or 'y' to compile for all architectures.
# Available architectures: armeabi armeabi-v7a armeabi-v7a-hard x86 mips
MultiABI='armeabi-v7a'
# Minimum amount of RAM application requires, in Mb, SDL will print warning to user if it's lower
AppMinimumRAM=0
@@ -205,7 +227,7 @@ CompiledLibraries="sdl_image sdl_mixer"
CustomBuildScript=n
# Aditional CFLAGS for application
AppCflags='-O3 -DDSI_DATA_DIR=\\"data\\" -DDSI_DIR=\\".\\" -DDSI_SCORE_DIR=\\".\\" -DDSI_PIXMAP_DIR=\\".\\" -include ../../android_debug.h'
AppCflags='-O3 -DDSI_DATA_DIR=\"data\" -DDSI_DIR=\".\" -DDSI_SCORE_DIR=\".\" -DDSI_PIXMAP_DIR=\".\" -include ../../android_debug.h'
# Additional LDFLAGS for application
AppLdflags=''
@@ -232,6 +254,6 @@ AdmobPublisherId=n
# Your AdMob test device ID, to receive a test ad
AdmobTestDeviceId=
# Your AdMob banner size (BANNER/IAB_BANNER/IAB_LEADERBOARD/IAB_MRECT/IAB_WIDE_SKYSCRAPER/SMART_BANNER)
# Your AdMob banner size (BANNER/FULL_BANNER/LEADERBOARD/MEDIUM_RECTANGLE/SMART_BANNER/WIDE_SKYSCRAPER/FULL_WIDTH:Height/Width:AUTO_HEIGHT/Width:Height)
AdmobBannerSize=

View File

@@ -6,8 +6,6 @@ if [ -e dspaceinvadors ] ; then
else
echo "Downloading sources..."
svn checkout svn://svn.code.sf.net/p/dspaceinvadors/code/ dspaceinvadors || exit 1
echo "Patching..."
patch -p0 -d dspaceinvadors < android.diff || exit 1
fi
if [ -e dspaceinvadors/config.h ] ; then

View File

@@ -1,49 +0,0 @@
Index: dsi/hi_score.c
===================================================================
--- dsi/hi_score.c (revision 218)
+++ dsi/hi_score.c (working copy)
@@ -193,7 +193,7 @@
key = SDL_GetKeyState(NULL);
if (key[SDLK_b] == SDL_PRESSED)
leave_state = RUN_INTRO;
- else if (key[SDLK_s] == SDL_PRESSED)
+ else if (key[SDLK_SPACE] == SDL_PRESSED)
leave_state = RUN_GAME;
WaitFrame();
}
Index: dsi/main.c
===================================================================
--- dsi/main.c (revision 218)
+++ dsi/main.c (working copy)
@@ -186,7 +186,7 @@
}
//Open the audio device
- if ( Mix_OpenAudio(11025, AUDIO_U8, 1, 512) < 0 )
+ if ( Mix_OpenAudio(11025, AUDIO_S16, 1, 1024) < 0 )
{
fprintf(stderr,
"Warning: Couldn't set 11025 Hz 8-bit audio\n- Reason: %s\n",
Index: dsi/intro.c
===================================================================
--- dsi/intro.c (revision 218)
+++ dsi/intro.c (working copy)
@@ -75,7 +75,7 @@
leave_state = RUN_QUIT;
}
key = SDL_GetKeyState(NULL);
- if (key[SDLK_s] == SDL_PRESSED)
+ if (key[SDLK_SPACE] == SDL_PRESSED)
leave_state = RUN_GAME;
else if (key[SDLK_v] == SDL_PRESSED)
leave_state = RUN_SCORE;
Index: dsi/sprite.c
===================================================================
--- dsi/sprite.c (revision 218)
+++ dsi/sprite.c (working copy)
@@ -119,4 +119,5 @@
SDL_Delay(next_tick-this_tick);
}
next_tick = this_tick + (1000/FRAMES_PER_SEC);
+ UpdateScreen(); // If we don't update screen on Android, we will not receive any input events
}

View File

@@ -7,10 +7,10 @@ AppName="OpenTTD lowmem"
AppFullName=org.openttd.sdl.lowmem
# Application version code (integer)
AppVersionCode=14029
AppVersionCode=14130
# Application user-visible version name (string)
AppVersionName="1.4.0.29"
AppVersionName="1.4.1.30"
# Specify path to download application data in zip archive in the form 'Description|URL|MirrorURL^Description2|URL2|MirrorURL2^...'
# If you'll start Description with '!' symbol it will be enabled by default, other downloads should be selected by user from startup config menu
@@ -18,13 +18,13 @@ AppVersionName="1.4.0.29"
# If the URL does not contain 'http://' it is treated as file from 'project/jni/application/src/AndroidData' dir -
# these files are put inside .apk package by build system
# Also please avoid 'https://' URLs, many Android devices do not have trust certificates and will fail to connect to SF.net over HTTPS
AppDataDownloadUrl="!!Data files - 20 Mb|http://sourceforge.net/projects/libsdl-android/files/OpenTTD/openttd-data-1.4.0-1.zip/download^!!Config file|:.openttd/openttd.cfg:openttd-1.4.0.27.cfg"
AppDataDownloadUrl="!!Data files - 20 Mb|http://sourceforge.net/projects/libsdl-android/files/OpenTTD/openttd-data-1.4.1.zip/download^!!Config file|:.openttd/openttd.cfg:openttd-1.4.0.30.cfg"
# Reset SDL config when updating application to the new version (y) / (n)
ResetSdlConfigForThisVersion=y
# Delete application data files when upgrading (specify file/dir paths separated by spaces)
DeleteFilesOnUpgrade="baseset .openttd/windows.cfg .openttd/hotkeys.cfg .openttd/openttd.cfg"
DeleteFilesOnUpgrade=""
# Here you may type readme text, which will be shown during startup. Format is:
# Text in English, use \\\\n to separate lines (that's four backslashes)^de:Text in Deutsch^ru:Text in Russian^button:Button that will open some URL:http://url-to-open/

View File

@@ -19,5 +19,5 @@ min_step_size = 40
[gui]
left_mouse_btn_scrolling = true
osk_activation = disabled
auto_scrolling = 2
auto_scrolling = 0
reverse_scroll = true

View File

@@ -7,10 +7,10 @@ AppName="OpenTTD"
AppFullName=org.openttd.sdl
# Application version code (integer)
AppVersionCode=14030
AppVersionCode=14132
# Application user-visible version name (string)
AppVersionName="1.4.0.30"
AppVersionName="1.4.1.32"
# Specify path to download application data in zip archive in the form 'Description|URL|MirrorURL^Description2|URL2|MirrorURL2^...'
# If you'll start Description with '!' symbol it will be enabled by default, other downloads should be selected by user from startup config menu
@@ -18,7 +18,7 @@ AppVersionName="1.4.0.30"
# If the URL does not contain 'http://' it is treated as file from 'project/jni/application/src/AndroidData' dir -
# these files are put inside .apk package by build system
# Also please avoid 'https://' URLs, many Android devices do not have trust certificates and will fail to connect to SF.net over HTTPS
AppDataDownloadUrl="!!Data files - 20 Mb|http://sourceforge.net/projects/libsdl-android/files/OpenTTD/openttd-data-1.4.0-2.zip/download^!!Config file|:.openttd/openttd.cfg:openttd-1.4.0.30.cfg^!MIDI music support (18 Mb)|timidity.zip|http://sourceforge.net/projects/libsdl-android/files/timidity.zip^!!Internationalization files|http://sourceforge.net/projects/libsdl-android/files/icudt52l.zip/download"
AppDataDownloadUrl="!!Data files - 20 Mb|http://sourceforge.net/projects/libsdl-android/files/OpenTTD/openttd-data-1.4.1.zip/download^!!Config file|:.openttd/openttd.cfg:openttd-1.4.0.30.cfg^!MIDI music support (18 Mb)|timidity.zip|http://sourceforge.net/projects/libsdl-android/files/timidity.zip^!!Internationalization files|http://sourceforge.net/projects/libsdl-android/files/icudt52l.zip/download"
# Reset SDL config when updating application to the new version (y) / (n)
ResetSdlConfigForThisVersion=y
@@ -201,7 +201,7 @@ FirstStartMenuOptions=''
# Enable multi-ABI binary, with hardware FPU support - it will also work on old devices,
# but .apk size is 2x bigger (y) / (n) / (x86) / (all)
MultiABI=armeabi-v7a
MultiABI=all
# Minimum amount of RAM application requires, in Mb, SDL will print warning to user if it's lower
AppMinimumRAM=0

View File

@@ -17,4 +17,7 @@ export ARCH=$1
../setEnvironment-$1.sh sh -c "cd openttd-$VER-$1 && env ../src/configure --host=$2 --with-sdl --with-freetype=sdl-config --with-png --with-zlib --with-icu --with-libtimidity=$LOCAL_PATH/../../../obj/local/$ARCH/libtimidity.so --with-lzo2=$LOCAL_PATH/../../../obj/local/$ARCH/liblzo2.so --prefix-dir='.' --data-dir='' --without-allegro --with-fontconfig --with-lzma --endian=LE || echo 'Run: sudo apt-get install liblzma-dev - it is needed only for configure script'"
} || exit 1
../setEnvironment-$1.sh sh -c "cd openttd-$VER-$1 && make -j4 VERBOSE=1 STRIP='' LIBS='-lsdl-1.2 -llzo2 -lpng -ltimidity -lfreetype -lfontconfig -lexpat -licui18n -liculx -licule -licuuc -licudata -lgcc -lz -lc -lgnustl_static -lsupc++'" && cp -f openttd-$VER-$1/objs/release/openttd libapplication-$1.so || exit 1
NCPU=4
uname -s | grep -i "linux" > /dev/null && NCPU=`cat /proc/cpuinfo | grep -c -i processor`
../setEnvironment-$1.sh sh -c "cd openttd-$VER-$1 && make -j$NCPU VERBOSE=1 STRIP='' LIBS='-lsdl-1.2 -llzo2 -lpng -ltimidity -lfreetype -lfontconfig -lexpat -licui18n -liculx -licule -licuuc -licudata -lgcc -lz -lc -lgnustl_static -lsupc++'" && cp -f openttd-$VER-$1/objs/release/openttd libapplication-$1.so || exit 1

View File

@@ -19,3 +19,4 @@ min_step_size = 40
left_mouse_btn_scrolling = true
osk_activation = disabled
auto_scrolling = 0
reverse_scroll = true

View File

@@ -1,21 +1,16 @@
# The application settings for Android libSDL port
AppSettingVersion=19
# libSDL version to use (1.2 or 1.3, specify 1.3 for SDL2)
LibSdlVersion=1.2
# Specify application name (e.x. My Application)
AppName="OpenTyrian"
# Specify reversed site name of application (e.x. com.mysite.myapp)
AppFullName=com.googlecode.opentyrian
# Specify screen orientation: (v)ertical/(p)ortrait or (h)orizontal/(l)andscape
ScreenOrientation=h
# Application version code (integer)
AppVersionCode=2125
# Do not allow device to sleep when the application is in foreground, set this for video players or apps which use accelerometer
InhibitSuspend=n
# Application user-visible version name (string)
AppVersionName="2.1.25"
# Specify path to download application data in zip archive in the form 'Description|URL|MirrorURL^Description2|URL2|MirrorURL2^...'
# If you'll start Description with '!' symbol it will be enabled by default, other downloads should be selected by user from startup config menu
@@ -23,7 +18,23 @@ InhibitSuspend=n
# If the URL does not contain 'http://' it is treated as file from 'project/jni/application/src/AndroidData' dir -
# these files are put inside .apk package by build system
# Also please avoid 'https://' URLs, many Android devices do not have trust certificates and will fail to connect to SF.net over HTTPS
AppDataDownloadUrl="Data files size is 11 Mb|tyrian21-data.zip|http://sourceforge.net/projects/libsdl-android/files/OpenTyrian/tyrian21-data.zip/download|http://sites.google.com/site/xpelyax/Home/tyrian21-data.zip?attredirects=0&d=1|http://sitesproxy.goapk.com/site/xpelyax/Home/tyrian21-data.zip"
AppDataDownloadUrl="!!Data files size is 11 Mb|tyrian21-data.zip^!!Tutorial|tutorial.zip"
# Reset SDL config when updating application to the new version (y) / (n)
ResetSdlConfigForThisVersion=y
# Delete application data files when upgrading (specify file/dir paths separated by spaces)
DeleteFilesOnUpgrade="%"
# Here you may type readme text, which will be shown during startup. Format is:
# Text in English, use \\\\n to separate lines (that's four backslashes)^de:Text in Deutsch^ru:Text in Russian^button:Button that will open some URL:http://url-to-open/
ReadmeText='^You may press "Home" now - the data will be downloaded in background'
# libSDL version to use (1.2/1.3/2.0)
LibSdlVersion=1.2
# Specify screen orientation: (v)ertical/(p)ortrait or (h)orizontal/(l)andscape
ScreenOrientation=h
# Video color depth - 16 BPP is the fastest and supported for all modes, 24 bpp is supported only
# with SwVideoMode=y, SDL_OPENGL mode supports everything. (16)/(24)/(32)
@@ -49,9 +60,19 @@ SdlVideoResize=y
# Application resizing will keep 4:3 aspect ratio, with black bars at sides (y)/(n)
SdlVideoResizeKeepAspect=n
# Do not allow device to sleep when the application is in foreground, set this for video players or apps which use accelerometer
InhibitSuspend=n
# Create Android service, so the app is less likely to be killed while in background
CreateService=
# Application does not call SDL_Flip() or SDL_UpdateRects() appropriately, or draws from non-main thread -
# enabling the compatibility mode will force screen update every 100 milliseconds, which is laggy and inefficient (y) or (n)
CompatibilityHacks=n
CompatibilityHacksForceScreenUpdate=n
# Application does not call SDL_Flip() or SDL_UpdateRects() after mouse click (ScummVM and all Amiga emulators do that) -
# force screen update by moving mouse cursor a little after each click (y) or (n)
CompatibilityHacksForceScreenUpdateMouseClick=y
# Application initializes SDL audio/video inside static constructors (which is bad, you won't be able to run ndk-gdb) (y)/(n)
CompatibilityHacksStaticInit=n
@@ -85,6 +106,10 @@ AppUsesMouse=y
# Application needs two-button mouse, will also enable advanced point-and-click features (y) or (n)
AppNeedsTwoButtonMouse=n
# Right mouse button can do long-press/drag&drop action, necessary for some games (y) or (n)
# If you disable it, swiping with two fingers will send mouse wheel events
RightMouseButtonLongPress=n
# Show SDL mouse cursor, for applications that do not draw cursor at all (y) or (n)
ShowMouseCursor=n
@@ -95,7 +120,7 @@ GenerateSubframeTouchEvents=
ForceRelativeMouseMode=n
# Application needs arrow keys (y) or (n), will show on-screen dpad/joystick (y) or (n)
AppNeedsArrowKeys=n
AppNeedsArrowKeys=y
# Application needs text input (y) or (n), enables button for text input on screen
AppNeedsTextInput=y
@@ -106,12 +131,18 @@ AppUsesJoystick=n
# Application uses second on-screen joystick, as SDL joystick 0 axes 2-3 (y)/(n)
AppUsesSecondJoystick=n
# Application uses third on-screen joystick, as SDL joystick 0 axes 20-21 (y)/(n)
AppUsesThirdJoystick=
# Application uses accelerometer (y) or (n), the accelerometer will be used as joystick 1 axes 0-1 and 5-7
AppUsesAccelerometer=n
# Application uses gyroscope (y) or (n), the gyroscope will be used as joystick 1 axes 2-4
AppUsesGyroscope=n
# Use gyroscope to move mouse cursor (y) or (n), it eats battery, and can be disabled in settings, do not use with AppUsesGyroscope setting
MoveMouseWithGyroscope=
# Application uses multitouch (y) or (n), multitouch events are passed as SDL_JOYBALLMOTION events for the joystick 0
AppUsesMultitouch=n
@@ -120,6 +151,15 @@ AppUsesMultitouch=n
# This option will add additional permission to Android manifest (y)/(n)
AppRecordsAudio=n
# Application needs to access SD card. If your data files are bigger than 5 Mb, enable it. (y) / (n)
AccessSdCard=
# Application needs Internet access. If you disable it, you'll have to bundle all your data files inside .apk (y) / (n)
AccessInternet=
# Immersive mode - Android will hide on-screen Home/Back keys. Looks bad if you invoke Android keyboard. (y) / (n)
ImmersiveMode=
# Application implements Android-specific routines to put to background, and will not draw anything to screen
# between SDL_ACTIVEEVENT lost / gained notifications - you should check for them
# rigth after SDL_Flip(), if (n) then SDL_Flip() will block till app in background (y) or (n)
@@ -136,9 +176,6 @@ RedefinedKeys="SPACE RETURN NO_REMAP NO_REMAP SPACE"
# Number of virtual keyboard keys (currently 6 is maximum)
AppTouchscreenKeyboardKeysAmount=4
# Number of virtual keyboard keys that support autofire (currently 2 is maximum)
AppTouchscreenKeyboardKeysAmountAutoFire=0
# Redefine on-screen keyboard keys to SDL keysyms - 6 keyboard keys + 4 multitouch gestures (zoom in/out and rotate left/right)
RedefinedKeysScreenKb="SPACE RETURN LALT LCTRL"
@@ -169,35 +206,23 @@ HiddenMenuOptions='SettingsMenuMisc.OptionalDownloadConfig SettingsMenuMouse.Dis
# SettingsMenu.OkButton SettingsMenu.DummyMenu SettingsMenu.MainMenu SettingsMenuMisc.DownloadConfig SettingsMenuMisc.OptionalDownloadConfig SettingsMenuMisc.AudioConfig SettingsMenuMisc.VideoSettingsConfig SettingsMenuMisc.ShowReadme SettingsMenuMisc.GyroscopeCalibration SettingsMenuMisc.ResetToDefaultsConfig SettingsMenuMouse.MouseConfigMainMenu SettingsMenuMouse.DisplaySizeConfig SettingsMenuMouse.LeftClickConfig SettingsMenuMouse.RightClickConfig SettingsMenuMouse.AdditionalMouseConfig SettingsMenuMouse.JoystickMouseConfig SettingsMenuMouse.TouchPressureMeasurementTool SettingsMenuMouse.CalibrateTouchscreenMenu SettingsMenuKeyboard.KeyboardConfigMainMenu SettingsMenuKeyboard.ScreenKeyboardSizeConfig SettingsMenuKeyboard.ScreenKeyboardDrawSizeConfig SettingsMenuKeyboard.ScreenKeyboardThemeConfig SettingsMenuKeyboard.ScreenKeyboardTransparencyConfig SettingsMenuKeyboard.RemapHwKeysConfig SettingsMenuKeyboard.RemapScreenKbConfig SettingsMenuKeyboard.ScreenGesturesConfig SettingsMenuKeyboard.CustomizeScreenKbLayout
FirstStartMenuOptions=''
# Enable multi-ABI binary, with hardware FPU support - it will also work on old devices,
# but .apk size is 2x bigger (y) / (n) / (x86) / (all)
MultiABI=all
# Specify architectures to compile, 'all' or 'y' to compile for all architectures.
# Available architectures: armeabi armeabi-v7a armeabi-v7a-hard x86 mips
MultiABI='all'
# Minimum amount of RAM application requires, in Mb, SDL will print warning to user if it's lower
AppMinimumRAM=32
# Application version code (integer)
AppVersionCode=2123
# Application user-visible version name (string)
AppVersionName="2.1.23"
# Reset SDL config when updating application to the new version (y) / (n)
ResetSdlConfigForThisVersion=n
# Delete application data files when upgrading (specify file/dir paths separated by spaces)
DeleteFilesOnUpgrade="%"
AppMinimumRAM=0
# Optional shared libraries to compile - removing some of them will save space
# MP3 support by libMAD is encumbered by patents and libMAD is GPL-ed
# Available libraries: mad (GPL-ed!) sdl_mixer sdl_image sdl_ttf sdl_net sdl_blitpool sdl_gfx sdl_sound intl xml2 lua jpeg png ogg flac tremor vorbis freetype xerces curl theora fluidsynth lzma lzo2 mikmod openal timidity zzip bzip2 yaml-cpp python boost_date_time boost_filesystem boost_iostreams boost_program_options boost_regex boost_signals boost_system boost_thread glu avcodec avdevice avfilter avformat avresample avutil swscale swresample bzip2
CompiledLibraries="sdl_net"
CompiledLibraries="sdl_net sdl_image"
# Application uses custom build script AndroidBuild.sh instead of Android.mk (y) or (n)
CustomBuildScript=n
# Aditional CFLAGS for application
AppCflags='-O3'
AppCflags='-std=c99 -O3 -DTARGET_UNIX -DWITH_NETWORK -Wall -Wextra -Wno-missing-field-initializers'
# Additional LDFLAGS for application
AppLdflags=''
@@ -214,10 +239,6 @@ AppBuildExclude=''
# Application command line parameters, including app name as 0-th param
AppCmdline=''
# Here you may type readme text, which will be shown during startup. Format is:
# Text in English, use \\\\\\\\n to separate lines^de:Text in Deutsch^ru:Text in Russian, and so on (that's four backslashes, nice isn't it?)
ReadmeText='^You may press "Home" now - the data will be downloaded in background'
# Screen size is used by Google Play to prevent an app to be installed on devices with smaller screens
# Minimum screen size that application supports: (s)mall / (m)edium / (l)arge
MinimumScreenSize=s
@@ -228,6 +249,6 @@ AdmobPublisherId=n
# Your AdMob test device ID, to receive a test ad
AdmobTestDeviceId=
# Your AdMob banner size (BANNER/IAB_BANNER/IAB_LEADERBOARD/IAB_MRECT/IAB_WIDE_SKYSCRAPER/SMART_BANNER)
# Your AdMob banner size (BANNER/FULL_BANNER/LEADERBOARD/MEDIUM_RECTANGLE/SMART_BANNER/WIDE_SKYSCRAPER/FULL_WIDTH:Height/Width:AUTO_HEIGHT/Width:Height)
AdmobBannerSize=

View File

@@ -1,8 +1,8 @@
OpenTyrian Classic Development Team
The OpenTyrian Development Team
================================================================================
Carl W. Reinke <mindless2112\100gmail\056com> (Mindless)
Yuri K. Schlesner <yuriks.br@gmail.com> (yuriks)
Yuri K. Schlesner <yuriks@yuriks.net> (yuriks)
Casey A. McCann <syntaxglitch@gmail.com> (syntaxglitch)
== Contributors ================================================================
@@ -24,8 +24,9 @@ Jan "heftig" Steffens clean-up patches
Jason Emery
* Tyrian source code
MAME and DOSBox
* FM emulator code
DOSBox
* FM Sythesis emulator code
AdPlug
* Loudness player
* Loudness player code

View File

@@ -1,4 +1,4 @@
OpenTyrian Classic
OpenTyrian
================================================================================
OpenTyrian is an open-source port of the DOS game Tyrian.

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
@@ -334,7 +334,7 @@ int JE_playRunSkipDump( Uint8 *incomingBuffer, unsigned int IncomingBufferLength
#define ANI_STOP 0x0000
SZ_Init(pBuffer_IN, incomingBuffer, IncomingBufferLength);
SZ_Init(pBuffer_OUT, (Uint8 *)VGAScreen->pixels, VGAScreen->h * VGAScreen->pitch);
SZ_Init(pBuffer_OUT, VGAScreen->pixels, VGAScreen->h * VGAScreen->pitch);
/* 320x200 is the only supported format.
@@ -428,4 +428,3 @@ int JE_playRunSkipDump( Uint8 *incomingBuffer, unsigned int IncomingBufferLength
return(0);
}
// kate: tab-width 4; vim: set noet:

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
@@ -25,4 +25,3 @@ void JE_playAnim( const char *animfile, JE_byte startingframe, JE_byte speed );
#endif /* ANIMLIB_H */
// kate: tab-width 4; vim: set noet:

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
@@ -20,6 +20,7 @@
#include "backgrnd.h"
#include "config.h"
#include "mtrand.h"
#include "varz.h"
#include "video.h"
@@ -44,7 +45,7 @@ JE_byte smoothie_data[9]; /* [1..9] */
void JE_darkenBackground( JE_word neat ) /* wild detail level */
{
Uint8 *s = (Uint8 *)VGAScreen->pixels; /* screen pointer, 8-bit specific */
Uint8 *s = VGAScreen->pixels; /* screen pointer, 8-bit specific */
int x, y;
s += 24;
@@ -278,7 +279,7 @@ void JE_filterScreen( JE_shortint col, JE_shortint int_)
if (col != -99 && filtrationAvail)
{
s = (Uint8 *)VGAScreen->pixels;
s = VGAScreen->pixels;
s += 24;
col <<= 4;
@@ -296,7 +297,7 @@ void JE_filterScreen( JE_shortint col, JE_shortint int_)
if (int_ != -99 && explosionTransparent)
{
s = (Uint8 *)VGAScreen->pixels;
s = VGAScreen->pixels;
s += 24;
for (y = 184; y; y--)
@@ -417,8 +418,8 @@ void iced_blur_filter( SDL_Surface *dst, SDL_Surface *src )
{
assert(src->format->BitsPerPixel == 8 && dst->format->BitsPerPixel == 8);
Uint8 *dst_pixel = (Uint8 *)dst->pixels;
const Uint8 *src_pixel = (Uint8 *)src->pixels;
Uint8 *dst_pixel = dst->pixels;
const Uint8 *src_pixel = src->pixels;
for (int y = 0; y < 184; ++y)
{
@@ -443,8 +444,8 @@ void blur_filter( SDL_Surface *dst, SDL_Surface *src )
{
assert(src->format->BitsPerPixel == 8 && dst->format->BitsPerPixel == 8);
Uint8 *dst_pixel = (Uint8 *)dst->pixels;
const Uint8 *src_pixel = (Uint8 *)src->pixels;
Uint8 *dst_pixel = dst->pixels;
const Uint8 *src_pixel = src->pixels;
for (int y = 0; y < 184; ++y)
{
@@ -465,4 +466,62 @@ void blur_filter( SDL_Surface *dst, SDL_Surface *src )
}
}
// kate: tab-width 4; vim: set noet:
/* Background Starfield */
typedef struct
{
Uint8 color;
JE_word position; // relies on overflow wrap-around
int speed;
} StarfieldStar;
#define MAX_STARS 100
#define STARFIELD_HUE 0x90
static StarfieldStar starfield_stars[MAX_STARS];
int starfield_speed;
void initialize_starfield( void )
{
for (int i = MAX_STARS-1; i >= 0; --i)
{
starfield_stars[i].position = mt_rand() % 320 + mt_rand() % 200 * VGAScreen->pitch;
starfield_stars[i].speed = mt_rand() % 3 + 2;
starfield_stars[i].color = mt_rand() % 16 + STARFIELD_HUE;
}
}
void update_and_draw_starfield( SDL_Surface* surface, int move_speed )
{
Uint8* p = (Uint8*)surface->pixels;
for (int i = MAX_STARS-1; i >= 0; --i)
{
StarfieldStar* star = &starfield_stars[i];
star->position += (star->speed + move_speed) * surface->pitch;
if (star->position < 177 * surface->pitch)
{
if (p[star->position] == 0)
{
p[star->position] = star->color;
}
// If star is bright enough, draw surrounding pixels
if (star->color - 4 >= STARFIELD_HUE)
{
if (p[star->position + 1] == 0)
p[star->position + 1] = star->color - 4;
if (star->position > 0 && p[star->position - 1] == 0)
p[star->position - 1] = star->color - 4;
if (p[star->position + surface->pitch] == 0)
p[star->position + surface->pitch] = star->color - 4;
if (star->position >= surface->pitch && p[star->position - surface->pitch] == 0)
p[star->position - surface->pitch] = star->color - 4;
}
}
}
}

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
@@ -34,6 +34,8 @@ extern JE_byte map1YDelay, map1YDelayMax, map2YDelay, map2YDelayMax;
extern JE_boolean anySmoothies; // if yes, I want one :D
extern JE_byte smoothie_data[9];
extern int starfield_speed;
void JE_darkenBackground( JE_word neat );
void blit_background_row( SDL_Surface *surface, int x, int y, Uint8 **map );
@@ -54,6 +56,8 @@ void blur_filter( SDL_Surface *dst, SDL_Surface *src );
/*smoothies #5 is used for 3*/
/*smoothies #9 is a vertical flip*/
void initialize_starfield( void );
void update_and_draw_starfield( SDL_Surface* surface, int move_speed );
#endif /* BACKGRND_H */
// kate: tab-width 4; vim: set noet:

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
@@ -138,14 +138,8 @@ const JE_EditorItemAvailType initialItemAvail =
JE_boolean smoothies[9] = /* [1..9] */
{ 0, 0, 0, 0, 0, 0, 0, 0, 0 };
JE_byte starShowVGASpecialCode;
/* Stars */
StarDatType starDat[MAX_STARS]; /* [1..Maxstars] */
JE_word starY;
/* CubeData */
JE_word lastCubeMax, cubeMax;
JE_word cubeList[4]; /* [1..4] */
@@ -218,8 +212,7 @@ JE_SaveFilesType saveFiles; /*array[1..saveLevelnum] of savefiletype;*/
JE_SaveGameTemp saveTemp;
JE_word editorLevel; /*Initial value 800*/
AutoFireMode_t autoFireMode = AUTOFIRE_TOUCHSCREEN;
TouchscreenMode_t touchscreenMode = TOUCHSCREEN_SHIP_ABOVE_FINGER;
TouchscreenControlMode_t touchscreenControlMode = TOUCHSCREEN_CONTROL_FINGER;
cJSON *load_json( const char *filename )
{
@@ -280,11 +273,8 @@ bool load_opentyrian_config( void )
if ((setting = cJSON_GetObjectItem(section, "scaler")))
set_scaler_by_name(setting->valuestring);
if ((setting = cJSON_GetObjectItem(section, "autofire")))
autoFireMode = (AutoFireMode_t)setting->valueint;
if ((setting = cJSON_GetObjectItem(section, "touchscreen")))
touchscreenMode = (TouchscreenMode_t)setting->valueint;
if ((setting = cJSON_GetObjectItem(section, "touchscreenmode")))
touchscreenControlMode = setting->valueint;
}
cJSON_Delete(root);
@@ -312,11 +302,8 @@ bool save_opentyrian_config( void )
setting = cJSON_CreateOrGetObjectItem(section, "scaler");
cJSON_SetString(setting, scalers[scaler].name);
setting = cJSON_CreateOrGetObjectItem(section, "autofire");
cJSON_SetNumber(setting, autoFireMode);
setting = cJSON_CreateOrGetObjectItem(section, "touchscreen");
cJSON_SetNumber(setting, touchscreenMode);
setting = cJSON_CreateOrGetObjectItem(section, "touchscreenmode");
cJSON_SetNumber(setting, touchscreenControlMode);
}
save_json(root, "opentyrian.conf");
@@ -326,19 +313,6 @@ bool save_opentyrian_config( void )
return true;
}
void JE_setupStars( void )
{
int z;
for (z = MAX_STARS; z--; )
{
starDat[z].sLoc = (mt_rand() % 320) + (mt_rand() % 200) * VGAScreen->pitch;
starDat[z].sMov = ((mt_rand() % 3) + 2) * VGAScreen->pitch;
starDat[z].sC = (mt_rand() % 16) + (9 * 16);
}
}
static void playeritems_to_pitems( JE_PItemsType pItems, PlayerItems *items, JE_byte initial_episode_num )
{
pItems[0] = items->weapon[FRONT_WEAPON].id;
@@ -403,7 +377,7 @@ void JE_saveGame( JE_byte slot, const char *name )
temp = episodeNum - 1;
if (temp < 1)
{
temp = 4; /* JE: {Episodemax is 4 for completion purposes} */
temp = EPISODE_AVAILABLE; /* JE: {Episodemax is 4 for completion purposes} */
}
saveFiles[slot-1].episode = temp;
}
@@ -430,8 +404,6 @@ void JE_saveGame( JE_byte slot, const char *name )
void JE_loadGame( JE_byte slot )
{
JE_byte temp5;
superTyrian = false;
onePlayerAction = false;
twoPlayerMode = false;
@@ -489,22 +461,22 @@ void JE_loadGame( JE_byte slot )
player[twoPlayerMode ? port : 0].items.weapon[port].power = saveFiles[slot-1].power[port];
}
temp5 = saveFiles[slot-1].episode;
int episode = saveFiles[slot-1].episode;
memcpy(&levelName, &saveFiles[slot-1].levelName, sizeof(levelName));
if (strcmp(levelName, "Completed") == 0)
{
if (temp5 == 4)
if (episode == EPISODE_AVAILABLE)
{
temp5 = 1;
} else if (temp5 < 4) {
temp5++;
episode = 1;
} else if (episode < EPISODE_AVAILABLE) {
episode++;
}
/* Increment 1-3 to 2-4. Episode 4 goes to 1. Episode 5 stands still. */
/* Increment episode. Episode EPISODE_AVAILABLE goes to 1. */
}
JE_initEpisode(temp5);
JE_initEpisode(episode);
saveLevel = mainLevel;
memcpy(&lastLevelName, &levelName, sizeof(levelName));
}
@@ -1050,4 +1022,3 @@ void JE_saveConfiguration( void )
#endif
}
// kate: tab-width 4; vim: set noet:

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
@@ -28,8 +28,6 @@
#define SAVE_FILES_NUM (11 * 2)
#define MAX_STARS 100
/* These are necessary because the size of the structure has changed from the original, but we
need to know the original sizes in order to find things in TYRIAN.SAV */
#define SAVE_FILES_SIZE 2398
@@ -74,13 +72,6 @@ typedef struct
typedef JE_SaveFileType JE_SaveFilesType[SAVE_FILES_NUM]; /* [1..savefilesnum] */
typedef JE_byte JE_SaveGameTemp[SAVE_FILES_SIZE + 4 + 100]; /* [1..sizeof(savefilestype) + 4 + 100] */
typedef struct
{
JE_byte sC;
JE_word sLoc;
JE_word sMov;
} StarDatType;
extern const JE_byte cryptKey[10];
extern const JE_KeySettingType defaultKeySettings;
extern const char defaultHighScoreNames[34][23];
@@ -88,8 +79,6 @@ extern const char defaultTeamNames[22][25];
extern const JE_EditorItemAvailType initialItemAvail;
extern JE_boolean smoothies[9];
extern JE_byte starShowVGASpecialCode;
extern StarDatType starDat[MAX_STARS];
extern JE_word starY;
extern JE_word lastCubeMax, cubeMax;
extern JE_word cubeList[4];
extern JE_boolean gameHasRepeated;
@@ -140,17 +129,8 @@ extern JE_byte processorType;
extern JE_SaveFilesType saveFiles;
extern JE_SaveGameTemp saveTemp;
extern JE_word editorLevel;
enum AutoFireMode_t { AUTOFIRE_TOUCHSCREEN, AUTOFIRE_BUTTON, AUTOFIRE_BUTTON_TOUCH, AUTOFIRE_NONE, AUTOFIRE_LAST };
extern AutoFireMode_t autoFireMode;
enum TouchscreenMode_t {
TOUCHSCREEN_SHIP_ABOVE_FINGER,
TOUCHSCREEN_SHIP_TO_THE_LEFT,
TOUCHSCREEN_SHIP_BELOW_FINGER,
TOUCHSCREEN_FIRE_ONLY,
TOUCHSCREEN_NONE,
TOUCHSCREEN_LAST };
extern TouchscreenMode_t touchscreenMode;
typedef enum { TOUCHSCREEN_CONTROL_FINGER, TOUCHSCREEN_CONTROL_JOYSTICK, TOUCHSCREEN_CONTROL_BOTH, TOUCHSCREEN_CONTROL_LAST } TouchscreenControlMode_t;
extern TouchscreenControlMode_t touchscreenControlMode;
void JE_initProcessorType( void );
void JE_setNewGameSpeed( void );
@@ -158,8 +138,6 @@ const char *get_user_directory( void );
void JE_loadConfiguration( void );
void JE_saveConfiguration( void );
void JE_setupStars( void );
void JE_saveGame( JE_byte slot, const char *name );
void JE_loadGame( JE_byte slot );
@@ -171,4 +149,3 @@ void save_json( cJSON *root, const char *filename );
#endif /* CONFIG_H */
// kate: tab-width 4; vim: set noet:

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
@@ -25,4 +25,3 @@ void JE_destructGame( void );
#endif /* DESTRUCT_H */
// kate: tab-width 4; vim: set noet:

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
@@ -89,4 +89,3 @@ void JE_loadExtraShapes( void )
}
}
// kate: tab-width 4; vim: set noet:

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
@@ -34,4 +34,3 @@ void JE_loadExtraShapes( void );
#endif /* EDITSHIP_H */
// kate: tab-width 4; vim: set noet:

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
@@ -26,7 +26,7 @@
/* MAIN Weapons Data */
JE_WeaponPortType weaponPort;
JE_WeaponType weapons;
JE_WeaponType weapons[WEAP_NUM + 1]; /* [0..weapnum] */
/* Items */
JE_PowerType powerSys;
@@ -96,6 +96,12 @@ void JE_loadItemDat( void )
efread(&weapons[i].shipblastfilter, sizeof(JE_byte), 1, f);
}
#ifdef TYRIAN2000
if (episodeNum <= 3) fseek(f, 0x252A4, SEEK_SET);
if (episodeNum == 4) fseek(f, 0xC1F5E, SEEK_SET);
if (episodeNum == 5) fseek(f, 0x5C5B8, SEEK_SET);
#endif
for (int i = 0; i < PORT_NUM + 1; ++i)
{
fseek(f, 1, SEEK_CUR); /* skip string length */
@@ -111,7 +117,15 @@ void JE_loadItemDat( void )
efread(&weaponPort[i].poweruse, sizeof(JE_word), 1, f);
}
for (int i = 0; i < SPECIAL_NUM + 1; ++i)
int specials_count = SPECIAL_NUM;
#ifdef TYRIAN2000
if (episodeNum <= 3) fseek(f, 0x2662E, SEEK_SET);
if (episodeNum == 4) fseek(f, 0xC32E8, SEEK_SET);
if (episodeNum == 5) fseek(f, 0x5D942, SEEK_SET);
if (episodeNum >= 4) specials_count = SPECIAL_NUM + 8; /*this ugly hack will need a fix*/
#endif
for (int i = 0; i < specials_count + 1; ++i)
{
fseek(f, 1, SEEK_CUR); /* skip string length */
efread(&special[i].name, 1, 30, f);
@@ -122,6 +136,12 @@ void JE_loadItemDat( void )
efread(&special[i].wpn, sizeof(JE_word), 1, f);
}
#ifdef TYRIAN2000
if (episodeNum <= 3) fseek(f, 0x26E21, SEEK_SET);
if (episodeNum == 4) fseek(f, 0xC3ADB, SEEK_SET);
if (episodeNum == 5) fseek(f, 0x5E135, SEEK_SET);
#endif
for (int i = 0; i < POWER_NUM + 1; ++i)
{
fseek(f, 1, SEEK_CUR); /* skip string length */
@@ -133,6 +153,12 @@ void JE_loadItemDat( void )
efread(&powerSys[i].cost, sizeof(JE_word), 1, f);
}
#ifdef TYRIAN2000
if (episodeNum <= 3) fseek(f, 0x26F24, SEEK_SET);
if (episodeNum == 4) fseek(f, 0xC3BDE, SEEK_SET);
if (episodeNum == 5) fseek(f, 0x5E238, SEEK_SET);
#endif
for (int i = 0; i < SHIP_NUM + 1; ++i)
{
fseek(f, 1, SEEK_CUR); /* skip string length */
@@ -147,6 +173,12 @@ void JE_loadItemDat( void )
efread(&ships[i].bigshipgraphic, sizeof(JE_byte), 1, f);
}
#ifdef TYRIAN2000
if (episodeNum <= 3) fseek(f, 0x2722F, SEEK_SET);
if (episodeNum == 4) fseek(f, 0xC3EE9, SEEK_SET);
if (episodeNum == 5) fseek(f, 0x5E543, SEEK_SET);
#endif
for (int i = 0; i < OPTION_NUM + 1; ++i)
{
fseek(f, 1, SEEK_CUR); /* skip string length */
@@ -167,6 +199,12 @@ void JE_loadItemDat( void )
efread(&options[i].icongr, sizeof(JE_byte), 1, f);
}
#ifdef TYRIAN2000
if (episodeNum <= 3) fseek(f, 0x27EF3, SEEK_SET);
if (episodeNum == 4) fseek(f, 0xC4BAD, SEEK_SET);
if (episodeNum == 5) fseek(f, 0x5F207, SEEK_SET);
#endif
for (int i = 0; i < SHIELD_NUM + 1; ++i)
{
fseek(f, 1, SEEK_CUR); /* skip string length */
@@ -264,4 +302,3 @@ unsigned int JE_findNextEpisode( void )
return newEpisode;
}
// kate: tab-width 4; vim: set noet:

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
@@ -28,6 +28,11 @@
#define FIRST_LEVEL 1
#define EPISODE_MAX 5
#ifdef TYRIAN2000
#define EPISODE_AVAILABLE 5
#else
#define EPISODE_AVAILABLE 4
#endif
typedef struct
{
@@ -46,7 +51,7 @@ typedef struct
JE_byte sound;
JE_byte trail;
JE_byte shipblastfilter;
} JE_WeaponType[WEAP_NUM + 1]; /* [0..weapnum] */
} JE_WeaponType;
typedef struct
{
@@ -146,18 +151,18 @@ typedef struct
JE_word eenemydie;
} JE_EnemyDatType[ENEMY_NUM + 1]; /* [0..enemynum] */
extern "C" JE_WeaponPortType weaponPort;
extern "C" JE_WeaponType weapons;
extern "C" JE_PowerType powerSys;
extern "C" JE_ShipType ships;
extern "C" JE_OptionType options[OPTION_NUM + 1]; /* [0..optionnum] */
extern "C" JE_ShieldType shields;
extern "C" JE_SpecialType special;
extern "C" JE_EnemyDatType enemyDat;
extern "C" JE_byte initial_episode_num, episodeNum;
extern "C" JE_boolean episodeAvail[EPISODE_MAX];
extern JE_WeaponPortType weaponPort;
extern JE_WeaponType weapons[WEAP_NUM + 1]; /* [0..weapnum] */
extern JE_PowerType powerSys;
extern JE_ShipType ships;
extern JE_OptionType options[OPTION_NUM + 1]; /* [0..optionnum] */
extern JE_ShieldType shields;
extern JE_SpecialType special;
extern JE_EnemyDatType enemyDat;
extern JE_byte initial_episode_num, episodeNum;
extern JE_boolean episodeAvail[EPISODE_MAX];
extern "C" char episode_file[13], cube_file[13];
extern char episode_file[13], cube_file[13];
extern JE_longint episode1DataLoc;
extern JE_boolean bonusLevel;
@@ -170,4 +175,3 @@ void JE_scanForEpisodes( void );
#endif /* EPISODES_H */
// kate: tab-width 4; vim: set noet:

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
@@ -21,6 +21,8 @@
#include "SDL.h"
#include <errno.h>
#include <stdio.h>
#include <string.h>
const char *custom_data_dir = ".";
@@ -63,7 +65,7 @@ const char *data_dir( void )
// prepend directory and fopen
FILE *dir_fopen( const char *dir, const char *file, const char *mode )
{
char *path = (char *)malloc(strlen(dir) + 1 + strlen(file) + 1);
char *path = malloc(strlen(dir) + 1 + strlen(file) + 1);
sprintf(path, "%s/%s", dir, file);
FILE *f = fopen(path, mode);
@@ -76,11 +78,9 @@ FILE *dir_fopen( const char *dir, const char *file, const char *mode )
// warn when dir_fopen fails
FILE *dir_fopen_warn( const char *dir, const char *file, const char *mode )
{
errno = 0;
FILE *f = dir_fopen(dir, file, mode);
if (!f)
if (f == NULL)
fprintf(stderr, "warning: failed to open '%s': %s\n", file, strerror(errno));
return f;
@@ -89,14 +89,12 @@ FILE *dir_fopen_warn( const char *dir, const char *file, const char *mode )
// die when dir_fopen fails
FILE *dir_fopen_die( const char *dir, const char *file, const char *mode )
{
errno = 0;
FILE *f = dir_fopen(dir, file, mode);
if (f == NULL)
{
fprintf(stderr, "error: failed to open '%s': %s\n", file, strerror(errno));
fprintf(stderr, "error: One or more of the required Tyrian 2.1 data files could not be found.\n"
fprintf(stderr, "error: One or more of the required Tyrian " TYRIAN_VERSION " data files could not be found.\n"
" Please read the README file.\n");
exit(1);
}
@@ -188,5 +186,3 @@ size_t efwrite( void *buffer, size_t size, size_t num, FILE *stream )
return f;
}
#endif
// kate: tab-width 4; vim: set noet:

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
@@ -50,4 +50,3 @@ size_t efwrite( void *buffer, size_t size, size_t num, FILE *stream );
#endif // FILE_H
// kate: tab-width 4; vim: set noet:

View File

@@ -1,54 +0,0 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "fmopl.h"
#include "fm_synth.h"
#include "loudness.h"
#include "opentyr.h"
const unsigned char op_table[9] = {0x00, 0x01, 0x02, 0x08, 0x09, 0x0a, 0x10, 0x11, 0x12};
#define opl 0
void opl_update( OPLSAMPLE *buf, int samples )
{
YM3812UpdateOne(opl, buf, samples);
}
void opl_init( void )
{
YM3812Init(1, 3579545, 11025 * OUTPUT_QUALITY);
}
void opl_deinit( void )
{
YM3812Shutdown();
}
void opl_reset( void )
{
YM3812ResetChip(opl);
}
void opl_write(int reg, int val)
{
YM3812Write(opl, 0, reg);
YM3812Write(opl, 1, val);
}
// kate: tab-width 4; vim: set noet:

View File

@@ -1,35 +0,0 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#ifndef FM_SYNTH_H
#define FM_SYNTH_H
#include "fmopl.h"
#include "opentyr.h"
extern const unsigned char op_table[9]; /* the 9 operators as expected by the OPL2 */
void opl_update( OPLSAMPLE *buf, int samples );
void opl_init( void );
void opl_deinit( void );
void opl_reset( void );
void opl_write( int, int );
#endif /* FM_SYNTH_H */
// kate: tab-width 4; vim: set noet:

File diff suppressed because it is too large Load Diff

View File

@@ -1,253 +0,0 @@
#ifndef __FMOPL_H_
#define __FMOPL_H_
/* --- select emulation chips --- */
#define BUILD_YM3812 1 /* (HAS_YM3812) */
#define BUILD_YM3526 (HAS_YM3526)
#define BUILD_Y8950 (HAS_Y8950)
/* select output bits size of output : 8 or 16 */
#define OPL_SAMPLE_BITS 16
/* compiler dependence */
#ifndef OSD_CPU_H
#define OSD_CPU_H
typedef unsigned char UINT8; /* unsigned 8bit */
typedef unsigned short UINT16; /* unsigned 16bit */
typedef unsigned int UINT32; /* unsigned 32bit */
typedef signed char INT8; /* signed 8bit */
typedef signed short INT16; /* signed 16bit */
typedef signed int INT32; /* signed 32bit */
#endif
#if (OPL_SAMPLE_BITS==16)
typedef INT16 OPLSAMPLE;
#endif
#if (OPL_SAMPLE_BITS==8)
typedef INT8 OPLSAMPLE;
#endif
typedef void (*OPL_TIMERHANDLER)(int channel,double interval_Sec);
typedef void (*OPL_IRQHANDLER)(int param,int irq);
typedef void (*OPL_UPDATEHANDLER)(int param,int min_interval_us);
typedef void (*OPL_PORTHANDLER_W)(int param,unsigned char data);
typedef unsigned char (*OPL_PORTHANDLER_R)(int param);
typedef struct{
UINT32 ar; /* attack rate: AR<<2 */
UINT32 dr; /* decay rate: DR<<2 */
UINT32 rr; /* release rate:RR<<2 */
UINT8 KSR; /* key scale rate */
UINT8 ksl; /* keyscale level */
UINT8 ksr; /* key scale rate: kcode>>KSR */
UINT8 mul; /* multiple: mul_tab[ML] */
/* Phase Generator */
UINT32 Cnt; /* frequency counter */
UINT32 Incr; /* frequency counter step */
UINT8 FB; /* feedback shift value */
INT32 *connect1; /* slot1 output pointer */
INT32 op1_out[2]; /* slot1 output for feedback */
UINT8 CON; /* connection (algorithm) type */
/* Envelope Generator */
UINT8 eg_type; /* percussive/non-percussive mode */
UINT8 state; /* phase type */
UINT32 TL; /* total level: TL << 2 */
INT32 TLL; /* adjusted now TL */
INT32 volume; /* envelope counter */
UINT32 sl; /* sustain level: sl_tab[SL] */
UINT8 eg_sh_ar; /* (attack state) */
UINT8 eg_sel_ar; /* (attack state) */
UINT8 eg_sh_dr; /* (decay state) */
UINT8 eg_sel_dr; /* (decay state) */
UINT8 eg_sh_rr; /* (release state) */
UINT8 eg_sel_rr; /* (release state) */
UINT32 key; /* 0 = KEY OFF, >0 = KEY ON */
/* LFO */
UINT32 AMmask; /* LFO Amplitude Modulation enable mask */
UINT8 vib; /* LFO Phase Modulation enable flag (active high)*/
/* waveform select */
unsigned int wavetable;
} OPL_SLOT;
typedef struct{
OPL_SLOT SLOT[2];
/* phase generator state */
UINT32 block_fnum; /* block+fnum */
UINT32 fc; /* Freq. Increment base */
UINT32 ksl_base; /* KeyScaleLevel Base step */
UINT8 kcode; /* key code (for key scaling) */
} OPL_CH;
/* OPL state */
typedef struct fm_opl_f {
/* FM channel slots */
OPL_CH P_CH[9]; /* OPL/OPL2 chips have 9 channels*/
UINT32 eg_cnt; /* global envelope generator counter */
UINT32 eg_timer; /* global envelope generator counter works at frequency = chipclock/72 */
UINT32 eg_timer_add; /* step of eg_timer */
UINT32 eg_timer_overflow; /* envelope generator timer overlfows every 1 sample (on real chip) */
UINT8 rhythm; /* Rhythm mode */
UINT32 fn_tab[1024]; /* fnumber->increment counter */
/* LFO */
UINT8 lfo_am_depth;
UINT8 lfo_pm_depth_range;
UINT32 lfo_am_cnt;
UINT32 lfo_am_inc;
UINT32 lfo_pm_cnt;
UINT32 lfo_pm_inc;
UINT32 noise_rng; /* 23 bit noise shift register */
UINT32 noise_p; /* current noise 'phase' */
UINT32 noise_f; /* current noise period */
UINT8 wavesel; /* waveform select enable flag */
int T[2]; /* timer counters */
int TC[2];
UINT8 st[2]; /* timer enable */
#if BUILD_Y8950
/* Delta-T ADPCM unit (Y8950) */
YM_DELTAT *deltat;
/* Keyboard and I/O ports interface */
UINT8 portDirection;
UINT8 portLatch;
OPL_PORTHANDLER_R porthandler_r;
OPL_PORTHANDLER_W porthandler_w;
int port_param;
OPL_PORTHANDLER_R keyboardhandler_r;
OPL_PORTHANDLER_W keyboardhandler_w;
int keyboard_param;
#endif
/* external event callback handlers */
OPL_TIMERHANDLER TimerHandler; /* TIMER handler */
int TimerParam; /* TIMER parameter */
OPL_IRQHANDLER IRQHandler; /* IRQ handler */
int IRQParam; /* IRQ parameter */
OPL_UPDATEHANDLER UpdateHandler;/* stream update handler */
int UpdateParam; /* stream update parameter */
UINT8 type; /* chip type */
UINT8 address; /* address register */
UINT8 status; /* status flag */
UINT8 statusmask; /* status mask */
UINT8 mode; /* Reg.08 : CSM,notesel,etc. */
int clock; /* master clock (Hz) */
int rate; /* sampling rate (Hz) */
double freqbase; /* frequency base */
double TimerBase; /* Timer base time (==sampling time)*/
} FM_OPL;
#if BUILD_YM3812
int YM3812Init(int num, int clock, int rate);
void YM3812Shutdown(void);
void YM3812ResetChip(int which);
int YM3812Write(int which, int a, int v);
unsigned char YM3812Read(int which, int a);
int YM3812TimerOver(int which, int c);
void YM3812UpdateOne(int which, OPLSAMPLE *buffer, int length);
void YM3812SetTimerHandler(int which, OPL_TIMERHANDLER TimerHandler, int channelOffset);
void YM3812SetIRQHandler(int which, OPL_IRQHANDLER IRQHandler, int param);
void YM3812SetUpdateHandler(int which, OPL_UPDATEHANDLER UpdateHandler, int param);
#endif
#if BUILD_YM3526
/*
** Initialize YM3526 emulator(s).
**
** 'num' is the number of virtual YM3526's to allocate
** 'clock' is the chip clock in Hz
** 'rate' is sampling rate
*/
int YM3526Init(int num, int clock, int rate);
/* shutdown the YM3526 emulators*/
void YM3526Shutdown(void);
void YM3526ResetChip(int which);
int YM3526Write(int which, int a, int v);
unsigned char YM3526Read(int which, int a);
int YM3526TimerOver(int which, int c);
/*
** Generate samples for one of the YM3526's
**
** 'which' is the virtual YM3526 number
** '*buffer' is the output buffer pointer
** 'length' is the number of samples that should be generated
*/
void YM3526UpdateOne(int which, INT16 *buffer, int length);
void YM3526SetTimerHandler(int which, OPL_TIMERHANDLER TimerHandler, int channelOffset);
void YM3526SetIRQHandler(int which, OPL_IRQHANDLER IRQHandler, int param);
void YM3526SetUpdateHandler(int which, OPL_UPDATEHANDLER UpdateHandler, int param);
#endif
#if BUILD_Y8950
#include "ymdeltat.h"
/* Y8950 port handlers */
void Y8950SetPortHandler(int which, OPL_PORTHANDLER_W PortHandler_w, OPL_PORTHANDLER_R PortHandler_r, int param);
void Y8950SetKeyboardHandler(int which, OPL_PORTHANDLER_W KeyboardHandler_w, OPL_PORTHANDLER_R KeyboardHandler_r, int param);
void Y8950SetDeltaTMemory(int which, void * deltat_mem_ptr, int deltat_mem_size );
int Y8950Init (int num, int clock, int rate);
void Y8950Shutdown (void);
void Y8950ResetChip (int which);
int Y8950Write (int which, int a, int v);
unsigned char Y8950Read (int which, int a);
int Y8950TimerOver (int which, int c);
void Y8950UpdateOne (int which, INT16 *buffer, int length);
void Y8950SetTimerHandler (int which, OPL_TIMERHANDLER TimerHandler, int channelOffset);
void Y8950SetIRQHandler (int which, OPL_IRQHANDLER IRQHandler, int param);
void Y8950SetUpdateHandler (int which, OPL_UPDATEHANDLER UpdateHandler, int param);
#endif
int limit( int val, int max, int min );
void OPL_STATUS_SET(FM_OPL *OPL,int flag);
void OPL_STATUS_RESET(FM_OPL *OPL,int flag);
void OPL_STATUSMASK_SET(FM_OPL *OPL,int flag);
void advance_lfo(FM_OPL *OPL);
void advance(FM_OPL *OPL);
signed int op_calc(UINT32 phase, unsigned int env, signed int pm, unsigned int wave_tab);
signed int op_calc1(UINT32 phase, unsigned int env, signed int pm, unsigned int wave_tab);
void OPL_CALC_CH( OPL_CH *CH );
void OPL_CALC_RH( OPL_CH *CH, unsigned int noise );
void FM_KEYON(OPL_SLOT *SLOT, UINT32 key_set);
void FM_KEYOFF(OPL_SLOT *SLOT, UINT32 key_clr);
void CALC_FCSLOT(OPL_CH *CH,OPL_SLOT *SLOT);
void set_mul(FM_OPL *OPL,int slot,int v);
void set_ksl_tl(FM_OPL *OPL,int slot,int v);
void set_ar_dr(FM_OPL *OPL,int slot,int v);
void set_sl_rr(FM_OPL *OPL,int slot,int v);
void CSMKeyControll(OPL_CH *CH);
#endif
// kate: tab-width 4; vim: set noet:

View File

@@ -0,0 +1,274 @@
/*
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "font.h"
#include "fonthand.h"
#include "sprite.h"
/**
* \file font.c
* \brief Text drawing routines.
*/
/**
* \brief Draws text in a color specified by hue and value and with a drop
* shadow.
*
* A '~' in the text is not drawn but instead toggles highlighting which
* increases \c value by 4.
*
* \li like JE_dString() if (black == false && shadow_dist == 2 && hue == 15)
* \li like JE_textShade() with PART_SHADE if (black == true && shadow_dist == 1)
* \li like JE_outTextAndDarken() if (black == false && shadow_dist == 1)
* \li like JE_outTextAdjust() with shadow if (black == false && shadow_dist == 2)
*
* @param surface destination surface
* @param x initial x-position in pixels; which direction(s) the text is drawn
* from this position depends on the alignment
* @param y initial upper y-position in pixels
* @param text text to be drawn
* @param font style/size of text
* @param alignment left_aligned, centered, or right_aligned
* @param hue hue component of text color
* @param value value component of text color
* @param black if true the shadow is drawn as solid black, if false the shadow
* is drawn by darkening the pixels of the destination surface
* @param shadow_dist distance in pixels that the shadow will be drawn away from
* the text. (This is added to both the x and y positions, so a value of
* 1 causes the shadow to be drawn 1 pixel right and 1 pixel lower than
* the text.)
*/
void draw_font_hv_shadow( SDL_Surface *surface, int x, int y, const char *text, Font font, FontAlignment alignment, Uint8 hue, Sint8 value, bool black, int shadow_dist )
{
draw_font_dark(surface, x + shadow_dist, y + shadow_dist, text, font, alignment, black);
draw_font_hv(surface, x, y, text, font, alignment, hue, value);
}
/**
* \brief Draws text in a color specified by hue and value and with a
* surrounding shadow.
*
* A '~' in the text is not drawn but instead toggles highlighting which
* increases \c value by 4.
*
* \li like JE_textShade() with FULL_SHADE if (black == true && shadow_dist == 1)
*
* @param surface destination surface
* @param x initial x-position in pixels; which direction(s) the text is drawn
* from this position depends on the alignment
* @param y initial upper y-position in pixels
* @param text text to be drawn
* @param font style/size of text
* @param alignment left_aligned, centered, or right_aligned
* @param hue hue component of text color
* @param value value component of text color
* @param black if true the shadow is drawn as solid black, if false the shadow
* is drawn by darkening the pixels of the destination surface
* @param shadow_dist distance in pixels that the shadows will be drawn away
* from the text. (This distance is separately added to and subtracted
* from the x position and y position, resulting in four shadows -- one
* in each cardinal direction. If this shadow distance is small enough,
* this produces a shadow that outlines the text.)
*/
void draw_font_hv_full_shadow( SDL_Surface *surface, int x, int y, const char *text, Font font, FontAlignment alignment, Uint8 hue, Sint8 value, bool black, int shadow_dist )
{
draw_font_dark(surface, x, y - shadow_dist, text, font, alignment, black);
draw_font_dark(surface, x + shadow_dist, y, text, font, alignment, black);
draw_font_dark(surface, x, y + shadow_dist, text, font, alignment, black);
draw_font_dark(surface, x - shadow_dist, y, text, font, alignment, black);
draw_font_hv(surface, x, y, text, font, alignment, hue, value);
}
/**
* \brief Draws text in a color specified by hue and value.
*
* A '~' in the text is not drawn but instead toggles highlighting which
* increases \c value by 4.
*
* \li like JE_outText() with (brightness >= 0)
* \li like JE_outTextAdjust() without shadow
*
* @param surface destination surface
* @param x initial x-position in pixels; which direction(s) the text is drawn
* from this position depends on the alignment
* @param y initial upper y-position in pixels
* @param text text to be drawn
* @param font style/size of text
* @param alignment left_aligned, centered, or right_aligned
* @param hue hue component of text color
* @param value value component of text color
*/
void draw_font_hv( SDL_Surface *surface, int x, int y, const char *text, Font font, FontAlignment alignment, Uint8 hue, Sint8 value )
{
switch (alignment)
{
case left_aligned:
break;
case centered:
x -= JE_textWidth(text, font) / 2;
break;
case right_aligned:
x -= JE_textWidth(text, font);
break;
}
bool highlight = false;
for (; *text != '\0'; ++text)
{
int sprite_id = font_ascii[(unsigned char)*text];
switch (*text)
{
case ' ':
x += 6;
break;
case '~':
highlight = !highlight;
if (highlight)
value += 4;
else
value -= 4;
break;
default:
if (sprite_id != -1 && sprite_exists(font, sprite_id))
{
blit_sprite_hv(surface, x, y, font, sprite_id, hue, value);
x += sprite(font, sprite_id)->width + 1;
}
break;
}
}
}
/**
* \brief Draws blended text in a color specified by hue and value.
*
* Corresponds to blit_sprite_hv_blend()
*
* \li like JE_outTextModify()
*
* @param surface destination surface
* @param x initial x-position in pixels; which direction(s) the text is drawn
* from this position depends on the alignment
* @param y initial upper y-position in pixels
* @param text text to be drawn
* @param font style/size of text
* @param alignment left_aligned, centered, or right_aligned
* @param hue hue component of text color
* @param value value component of text color
*/
void draw_font_hv_blend( SDL_Surface *surface, int x, int y, const char *text, Font font, FontAlignment alignment, Uint8 hue, Sint8 value )
{
switch (alignment)
{
case left_aligned:
break;
case centered:
x -= JE_textWidth(text, font) / 2;
break;
case right_aligned:
x -= JE_textWidth(text, font);
break;
}
for (; *text != '\0'; ++text)
{
int sprite_id = font_ascii[(unsigned char)*text];
switch (*text)
{
case ' ':
x += 6;
break;
case '~':
break;
default:
if (sprite_id != -1 && sprite_exists(font, sprite_id))
{
blit_sprite_hv_blend(surface, x, y, font, sprite_id, hue, value);
x += sprite(font, sprite_id)->width + 1;
}
break;
}
}
}
/**
* \brief Draws darkened text.
*
* Corresponds to blit_sprite_dark()
*
* \li like JE_outText() with (brightness < 0) if (black == true)
*
* @param surface destination surface
* @param x initial x-position in pixels; which direction(s) the text is drawn
* from this position depends on the alignment
* @param y initial upper y-position in pixels
* @param text text to be drawn
* @param font style/size of text
* @param alignment left_aligned, centered, or right_aligned
* @param black if true text is drawn as solid black, if false text is drawn by
* darkening the pixels of the destination surface
*/
void draw_font_dark( SDL_Surface *surface, int x, int y, const char *text, Font font, FontAlignment alignment, bool black )
{
switch (alignment)
{
case left_aligned:
break;
case centered:
x -= JE_textWidth(text, font) / 2;
break;
case right_aligned:
x -= JE_textWidth(text, font);
break;
}
for (; *text != '\0'; ++text)
{
int sprite_id = font_ascii[(unsigned char)*text];
switch (*text)
{
case ' ':
x += 6;
break;
case '~':
break;
default:
if (sprite_id != -1 && sprite_exists(font, sprite_id))
{
blit_sprite_dark(surface, x, y, font, sprite_id, black);
x += sprite(font, sprite_id)->width + 1;
}
break;
}
}
}

View File

@@ -1,171 +0,0 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "font.h"
#include "fonthand.h"
#include "sprite.h"
// like JE_dString() if (black == false && shadow_dist == 2 && hue == 15)
// like JE_textShade() with PART_SHADE if (black == true && shadow_dist == 1)
// like JE_outTextAndDarken() if (black == false && shadow_dist == 1)
// like JE_outTextAdjust() with shadow if (black == false && shadow_dist == 2)
void draw_font_hv_shadow( SDL_Surface *surface, int x, int y, const char *text, Font font, FontAlignment alignment, Uint8 hue, Sint8 value, bool black, int shadow_dist )
{
draw_font_dark(surface, x + shadow_dist, y + shadow_dist, text, font, alignment, black);
draw_font_hv(surface, x, y, text, font, alignment, hue, value);
}
// like JE_textShade() with FULL_SHADE if (black == true && shadow_dist == 1)
void draw_font_hv_full_shadow( SDL_Surface *surface, int x, int y, const char *text, Font font, FontAlignment alignment, Uint8 hue, Sint8 value, bool black, int shadow_dist )
{
draw_font_dark(surface, x, y - shadow_dist, text, font, alignment, black);
draw_font_dark(surface, x + shadow_dist, y, text, font, alignment, black);
draw_font_dark(surface, x, y + shadow_dist, text, font, alignment, black);
draw_font_dark(surface, x - shadow_dist, y, text, font, alignment, black);
draw_font_hv(surface, x, y, text, font, alignment, hue, value);
}
// like JE_outText() with (brightness >= 0)
// like JE_outTextAdjust() without shadow
void draw_font_hv( SDL_Surface *surface, int x, int y, const char *text, Font font, FontAlignment alignment, Uint8 hue, Sint8 value )
{
switch (alignment)
{
case left_aligned:
break;
case centered:
x -= JE_textWidth(text, font) / 2;
break;
case right_aligned:
x -= JE_textWidth(text, font);
break;
}
bool highlight = false;
for (; *text != '\0'; ++text)
{
int sprite_id = font_ascii[(unsigned char)*text];
switch (*text)
{
case ' ':
x += 6;
break;
case '~':
highlight = !highlight;
if (highlight)
value += 4;
else
value -= 4;
break;
default:
if (sprite_id != -1 && sprite_exists(font, sprite_id))
{
blit_sprite_hv(surface, x, y, font, sprite_id, hue, value);
x += sprite(font, sprite_id)->width + 1;
}
break;
}
}
}
// like JE_outTextModify()
void draw_font_hv_blend( SDL_Surface *surface, int x, int y, const char *text, Font font, FontAlignment alignment, Uint8 hue, Sint8 value )
{
switch (alignment)
{
case left_aligned:
break;
case centered:
x -= JE_textWidth(text, font) / 2;
break;
case right_aligned:
x -= JE_textWidth(text, font);
break;
}
for (; *text != '\0'; ++text)
{
int sprite_id = font_ascii[(unsigned char)*text];
switch (*text)
{
case ' ':
x += 6;
break;
case '~':
break;
default:
if (sprite_id != -1 && sprite_exists(font, sprite_id))
{
blit_sprite_hv_blend(surface, x, y, font, sprite_id, hue, value);
x += sprite(font, sprite_id)->width + 1;
}
break;
}
}
}
// like JE_outText() with (brightness < 0) if (black == true)
void draw_font_dark( SDL_Surface *surface, int x, int y, const char *text, Font font, FontAlignment alignment, bool black )
{
switch (alignment)
{
case left_aligned:
break;
case centered:
x -= JE_textWidth(text, font) / 2;
break;
case right_aligned:
x -= JE_textWidth(text, font);
break;
}
for (; *text != '\0'; ++text)
{
int sprite_id = font_ascii[(unsigned char)*text];
switch (*text)
{
case ' ':
x += 6;
break;
case '~':
break;
default:
if (sprite_id != -1 && sprite_exists(font, sprite_id))
{
blit_sprite_dark(surface, x, y, font, sprite_id, black);
x += sprite(font, sprite_id)->width + 1;
}
break;
}
}
}

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
@@ -330,4 +330,3 @@ void JE_outTextGlow( SDL_Surface * screen, int x, int y, const char *s )
textGlowBrightness = 6;
}
// kate: tab-width 4; vim: set noet:

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
@@ -57,4 +57,3 @@ void JE_outTextGlow( SDL_Surface * screen, int x, int y, const char *s );
#endif /* FONTHAND_H */
// kate: tab-width 4; vim: set noet:

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
@@ -16,6 +16,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "backgrnd.h"
#include "config.h"
#include "file.h"
#include "fonthand.h"
@@ -33,6 +34,7 @@
#include "pcxmast.h"
#include "picload.h"
#include "player.h"
#include "shots.h"
#include "sprite.h"
#include "tyrian2.h"
#include "varz.h"
@@ -66,7 +68,7 @@ static JE_MenuChoiceType menuChoices;
static JE_integer col, colC;
static JE_byte lastCurSel;
static JE_integer curMenu;
static JE_byte curSel[MAX_MENU]; /* [1..maxmenu] */
static JE_byte curSel[MENU_MAX]; /* [1..maxmenu] */
static JE_byte curItemType, curItem, cursor;
static JE_boolean leftPower, rightPower, rightPowerAfford;
static JE_byte currentCube;
@@ -83,7 +85,7 @@ static PlayerItems old_items[2]; // TODO: should not be global if possible
static struct cube_struct cube[4];
static const JE_MenuChoiceType menuChoicesDefault = { 7, 9, 8, 0, 0, 13, (SAVE_FILES_NUM / 2) + 2, 0, 0, 6, 4, 6, 7, 5 };
static const JE_byte menuEsc[MAX_MENU] = { 0, 1, 1, 1, 2, 3, 3, 1, 8, 0, 0, 11, 3, 0 };
static const JE_byte menuEsc[MENU_MAX] = { 0, 1, 1, 1, 2, 3, 3, 1, 8, 0, 0, 11, 3, 0 };
static const JE_byte itemAvailMap[7] = { 1, 2, 3, 9, 4, 6, 7 };
static const JE_word planetX[21] = { 200, 150, 240, 300, 270, 280, 320, 260, 220, 150, 160, 210, 80, 240, 220, 180, 310, 330, 150, 240, 200 };
static const JE_word planetY[21] = { 40, 90, 90, 80, 170, 30, 50, 130, 120, 150, 220, 200, 80, 50, 160, 10, 55, 55, 90, 90, 40 };
@@ -171,10 +173,8 @@ void JE_itemScreen( void )
cursor = 1;
curItem = 0;
for (int x = 0; x < MAX_MENU; x++)
{
curSel[x] = 2;
}
for (unsigned int i = 0; i < COUNTOF(curSel); ++i)
curSel[i] = 2;
curMenu = 0;
@@ -324,7 +324,7 @@ void JE_itemScreen( void )
else
{
min = 2;
max = 13;
max = 12;
}
for (int x = min; x <= max; x++)
@@ -380,7 +380,7 @@ void JE_itemScreen( void )
/* keyboard settings menu */
if (curMenu == 5)
{
for (int x = 2; x <= 13; x++)
for (int x = 2; x <= 12; x++)
{
if (x == curSel[curMenu])
{
@@ -395,15 +395,9 @@ void JE_itemScreen( void )
if( x == 12 )
{
char *AutoFireNames[] = { "Touchscreen", "Fire button", "Touch and Button", "None" };
JE_textShade(VGAScreen, 166, 38 + (x - 2)*12, "Auto-Fire", temp2 / 16, temp2 % 16 - 8, DARKEN);
JE_textShade(VGAScreen, 230, 38 + (x - 2)*12, AutoFireNames[autoFireMode], temp2 / 16, temp2 % 16 - 8, DARKEN);
}
else if( x == 13 )
{
char *TouchscreenNames[] = { "Ship above finger", "Ship to the left", "Ship below finger", "Fire only", "None" };
JE_textShade(VGAScreen, 166, 38 + (x - 2)*12, "Touchscreen", temp2 / 16, temp2 % 16 - 8, DARKEN);
JE_textShade(VGAScreen, 230, 38 + (x - 2)*12, TouchscreenNames[touchscreenMode], temp2 / 16, temp2 % 16 - 8, DARKEN);
char *touchscreenControlNames[] = { "Ship follows touch", "Joystick + buttons", "Both" };
JE_textShade(VGAScreen, 166, 38 + (x - 2)*12, "Touch mode", temp2 / 16, temp2 % 16 - 8, DARKEN);
JE_textShade(VGAScreen, 230, 38 + (x - 2)*12, touchscreenControlNames[touchscreenControlMode], temp2 / 16, temp2 % 16 - 8, DARKEN);
}
else
JE_textShade(VGAScreen, 166, 38 + (x - 2)*12, menuInt[curMenu + 1][x-1], temp2 / 16, temp2 % 16 - 8, DARKEN);
@@ -415,7 +409,7 @@ void JE_itemScreen( void )
}
}
menuChoices[5] = 13;
menuChoices[5] = 12;
}
/* Joystick settings menu */
@@ -546,7 +540,7 @@ void JE_itemScreen( void )
temp_cost = 0;
}
temp4 = (temp_cost > player[0].cash) ? 4 : 0; // can player afford current weapon at all
int afford_shade = (temp_cost > player[0].cash) ? 4 : 0; // can player afford current weapon at all
temp = itemAvail[itemAvailMap[curSel[1]-2]-1][tempW-1]; /* Item ID */
switch (curSel[1]-1)
@@ -599,7 +593,7 @@ void JE_itemScreen( void )
{
strcpy(tempStr, miscText[13]);
}
JE_textShade(VGAScreen, 185, tempY, tempStr, temp2 / 16, temp2 % 16 -8-temp4, DARKEN);
JE_textShade(VGAScreen, 185, tempY, tempStr, temp2 / 16, temp2 % 16 - 8 - afford_shade, DARKEN);
/* Draw icon if not DONE. NOTE: None is a normal item with a blank icon. */
if (tempW < menuChoices[curMenu]-1)
@@ -616,7 +610,7 @@ void JE_itemScreen( void )
char buf[20];
snprintf(buf, sizeof buf, "Cost: %d", temp_cost);
JE_textShade(VGAScreen, 187, tempY+10, buf, temp2 / 16, temp2 % 16 - 8 - temp4, DARKEN);
JE_textShade(VGAScreen, 187, tempY+10, buf, temp2 / 16, temp2 % 16 - 8 - afford_shade, DARKEN);
}
}
} /* /weapon upgrade */
@@ -673,8 +667,8 @@ void JE_itemScreen( void )
/* Changing the volume? */
if ((curMenu == 2) || (curMenu == 11))
{
JE_barDrawShadow(VGAScreen, 225, 70, 1, 16, tyrMusicVolume / 12, 3, 13);
JE_barDrawShadow(VGAScreen, 225, 86, 1, 16, fxVolume / 12, 3, 13);
JE_barDrawShadow(VGAScreen, 225, 70, 1, music_disabled ? 12 : 16, tyrMusicVolume / 12, 3, 13);
JE_barDrawShadow(VGAScreen, 225, 86, 1, samples_disabled ? 12 : 16, fxVolume / 12, 3, 13);
}
/* 7 is data cubes menu, 8 is reading a data cube, "firstmenu9" refers to menu 8 because of reindexing */
@@ -1132,34 +1126,34 @@ void JE_itemScreen( void )
if ((mouseY > 20) && (mouseX > 170) && (mouseX < 308) && (curMenu != 8))
{
const JE_byte mouseSelectionY[MAX_MENU] = { 16, 16, 16, 16, 26, 12, 11, 28, 0, 16, 16, 16, 8, 16 };
const JE_byte mouseSelectionY[MENU_MAX] = { 16, 16, 16, 16, 26, 12, 11, 28, 0, 16, 16, 16, 8, 16 };
tempI = (mouseY - 38) / mouseSelectionY[curMenu]+2;
int selection = (mouseY - 38) / mouseSelectionY[curMenu]+2;
if (curMenu == 9)
{
if (tempI > 5)
tempI--;
if (tempI > 3)
tempI--;
if (selection > 5)
selection--;
if (selection > 3)
selection--;
}
if (curMenu == 0)
{
if (tempI > 7)
tempI = 7;
if (selection > 7)
selection = 7;
}
// is play next level screen?
if (curMenu == 3)
{
if (tempI == menuChoices[curMenu] + 1)
tempI = menuChoices[curMenu];
if (selection == menuChoices[curMenu] + 1)
selection = menuChoices[curMenu];
}
if (tempI <= menuChoices[curMenu])
if (selection <= menuChoices[curMenu])
{
if ((curMenu == 4) && (tempI == menuChoices[4]))
if ((curMenu == 4) && (selection == menuChoices[4]))
{
player[0].cash = JE_cashLeft();
curMenu = 1;
@@ -1168,13 +1162,13 @@ void JE_itemScreen( void )
else
{
JE_playSampleNum(S_CLICK);
if (curSel[curMenu] == tempI)
if (curSel[curMenu] == selection)
{
JE_menuFunction(curSel[curMenu]);
}
else
{
if ((curMenu == 5) && (JE_getCost(curSel[1], itemAvail[itemAvailMap[curSel[2]-1]][tempI-1]) > player[0].cash))
if ((curMenu == 4) && (JE_getCost(curSel[1], itemAvail[itemAvailMap[curSel[2]-1]][selection-2]) > player[0].cash))
{
JE_playSampleNum(S_CLINK);
}
@@ -1183,7 +1177,7 @@ void JE_itemScreen( void )
if (curSel[1] == 4)
player[0].weapon_mode = 1;
curSel[curMenu] = tempI;
curSel[curMenu] = selection;
}
// in front or rear weapon upgrade screen?
@@ -1584,6 +1578,7 @@ void JE_itemScreen( void )
} while (!(quit || gameLoaded || jumpSection));
#ifdef WITH_NETWORK
if (!quit && isNetworkGame)
{
JE_barShade(VGAScreen, 3, 3, 316, 196);
@@ -1624,6 +1619,7 @@ void JE_itemScreen( void )
SDL_Delay(16);
}
}
#endif
if (gameLoaded)
fade_black(10);
@@ -1940,7 +1936,7 @@ void JE_drawMenuChoices( void )
tempY -= 16;
}
str = (char *)malloc(strlen(menuInt[curMenu + 1][x-1])+2);
str = malloc(strlen(menuInt[curMenu + 1][x-1])+2);
if (curSel[curMenu] == x)
{
str[0] = '~';
@@ -2200,7 +2196,7 @@ void JE_scaleBitmap( SDL_Surface *dst_bitmap, const SDL_Surface *src_bitmap, in
//Okay, it's time to loop through and add bits of A to a rectangle in B
Uint8 *dst = (Uint8 *)dst_bitmap->pixels; /* 8-bit specific */
Uint8 *dst = dst_bitmap->pixels; /* 8-bit specific */
const Uint8 *src, *src_w; /* 8-bit specific */
dst += y1 * dst_bitmap->pitch + x1;
@@ -2250,7 +2246,7 @@ void JE_initWeaponView( void )
memset(shotRepeat, 1, sizeof(shotRepeat));
memset(shotMultiPos, 0, sizeof(shotMultiPos));
JE_setupStars();
initialize_starfield();
}
void JE_computeDots( void )
@@ -2329,10 +2325,12 @@ void JE_drawMainMenuHelpText( void )
{
int help[16] = { 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 24, 11 };
memcpy(tempStr, mainMenuHelp[help[curSel[curMenu] - 2]], sizeof(tempStr));
} else if (curMenu < 3 || curMenu == 9 || curMenu > 10) {
}
else if (curMenu < 3 || curMenu == 9 || curMenu > 10)
{
memcpy(tempStr, mainMenuHelp[(menuHelp[curMenu][temp])-1], sizeof(tempStr));
} else {
if (curMenu == 5 && curSel[5] == 10)
}
else if (curMenu == 5 && curSel[5] == 10)
{
memcpy(tempStr, mainMenuHelp[25-1], sizeof(tempStr));
}
@@ -2348,7 +2346,7 @@ void JE_drawMainMenuHelpText( void )
{
memcpy(tempStr, mainMenuHelp[17 + curMenu - 3], sizeof(tempStr));
}
}
JE_textShade(VGAScreen, 10, 187, tempStr, 14, 1, DARKEN);
}
@@ -2453,6 +2451,7 @@ JE_boolean JE_quitRequest( void )
JE_playSampleNum(quit_selected ? S_SPRING : S_CLICK);
#ifdef WITH_NETWORK
if (isNetworkGame && quit_selected)
{
network_prepare(PACKET_QUIT);
@@ -2460,6 +2459,7 @@ JE_boolean JE_quitRequest( void )
network_tyrian_halt(0, true);
}
#endif
return quit_selected;
}
@@ -2659,18 +2659,11 @@ void JE_menuFunction( JE_byte select )
break;
case 5: /* keyboard settings */
if (curSelect == 12) /* Auto-Fire mode */
if (curSelect == 12) /* Touchscreen mode */
{
autoFireMode = (AutoFireMode_t)(autoFireMode + 1);
if(autoFireMode >= AUTOFIRE_LAST)
autoFireMode = AUTOFIRE_TOUCHSCREEN;
JE_saveConfiguration();
}
else if (curSelect == 13) /* Touchscreen mode */
{
touchscreenMode = (TouchscreenMode_t)(touchscreenMode + 1);
if(touchscreenMode >= TOUCHSCREEN_LAST)
touchscreenMode = TOUCHSCREEN_SHIP_ABOVE_FINGER;
touchscreenControlMode = touchscreenControlMode + 1;
if(touchscreenControlMode >= TOUCHSCREEN_CONTROL_LAST)
touchscreenControlMode = TOUCHSCREEN_CONTROL_FINGER;
JE_saveConfiguration();
}
else if (curSelect == 10) /* reset to defaults */
@@ -2730,8 +2723,6 @@ void JE_menuFunction( JE_byte select )
if (lastkey_sym != SDLK_ESCAPE && // reserved for menu
lastkey_sym != SDLK_F11 && // reserved for gamma
lastkey_sym != SDLK_s && // reserved for sample mute
lastkey_sym != SDLK_m && // reserved for music mute
lastkey_sym != SDLK_p) // reserved for pause
{
JE_playSampleNum(S_CLICK);
@@ -2804,7 +2795,7 @@ void JE_menuFunction( JE_byte select )
case 3:
case 4:
JE_playSampleNum(S_CURSOR);
{
int temp = curSel[curMenu] - 3;
do {
if (joysticks == 0)
@@ -2818,7 +2809,6 @@ void JE_menuFunction( JE_byte select )
inputDevice[temp]++;
}
} while (inputDevice[temp] == inputDevice[temp == 0 ? 1 : 0]);
}
break;
case 5:
curMenu = 2;
@@ -3059,8 +3049,8 @@ void JE_drawShipSpecs( SDL_Surface * screen, SDL_Surface * temp_screen )
* We can't work in place. In fact we'll need to overlay the result
* To avoid our temp screen dependence this has been rewritten to
* only write one line at a time.*/
dst = (Uint8 *)screen->pixels;
src = (Uint8 *)temp_screen->pixels;
dst = screen->pixels;
src = temp_screen->pixels;
for (int y = 0; y < screen->h; y++)
{
for (int x = 0; x < screen->pitch; x++)
@@ -3151,40 +3141,12 @@ void JE_weaponSimUpdate( void )
void JE_weaponViewFrame( void )
{
Uint8 *s; /* screen pointer, 8-bit specific */
int i;
fill_rectangle_xy(VGAScreen, 8, 8, 143, 182, 0);
/* JE: (* Port Configuration Display *)
(* drawportconfigbuttons;*/
/*===========================STARS==========================*/
/*DRAWSTARS*/
for (i = MAX_STARS; i--;)
{
s = (Uint8 *)VGAScreen->pixels;
starDat[i].sLoc += starDat[i].sMov + VGAScreen->pitch;
if (starDat[i].sLoc < 177 * VGAScreen->pitch)
{
if (*(s + starDat[i].sLoc) == 0)
*(s + starDat[i].sLoc) = starDat[i].sC;
if (starDat[i].sC - 4 >= 9 * 16)
{
if (*(s + starDat[i].sLoc + 1) == 0)
*(s + starDat[i].sLoc + 1) = starDat[i].sC - 4;
if (starDat[i].sLoc > 0 && *(s + starDat[i].sLoc - 1) == 0)
*(s + starDat[i].sLoc - 1) = starDat[i].sC - 4;
if (*(s + starDat[i].sLoc + VGAScreen->pitch) == 0)
*(s + starDat[i].sLoc + VGAScreen->pitch) = starDat[i].sC - 4;
if (starDat[i].sLoc >= VGAScreen->pitch && *(s + starDat[i].sLoc - VGAScreen->pitch) == 0)
*(s + starDat[i].sLoc - VGAScreen->pitch) = starDat[i].sC - 4;
}
}
}
update_and_draw_starfield(VGAScreen, 1);
mouseX = player[0].x;
mouseY = player[0].y;
@@ -3202,7 +3164,7 @@ void JE_weaponViewFrame( void )
item_power = player[0].items.weapon[i].power - 1,
item_mode = (i == REAR_WEAPON) ? player[0].weapon_mode - 1 : 0;
JE_initPlayerShot(item, i, player[0].x, player[0].y, mouseX, mouseY, weaponPort[item].op[item_mode][item_power], 1);
b = player_shot_create(item, i, player[0].x, player[0].y, mouseX, mouseY, weaponPort[item].op[item_mode][item_power], 1);
}
}
@@ -3218,7 +3180,7 @@ void JE_weaponViewFrame( void )
const int x = player[0].sidekick[LEFT_SIDEKICK].x,
y = player[0].sidekick[LEFT_SIDEKICK].y;
JE_initPlayerShot(options[item].wport, SHOT_LEFT_SIDEKICK, x, y, mouseX, mouseY, options[item].wpnum, 1);
b = player_shot_create(options[item].wport, SHOT_LEFT_SIDEKICK, x, y, mouseX, mouseY, options[item].wpnum, 1);
}
}
@@ -3245,87 +3207,11 @@ void JE_weaponViewFrame( void )
const int x = player[0].sidekick[RIGHT_SIDEKICK].x,
y = player[0].sidekick[RIGHT_SIDEKICK].y;
JE_initPlayerShot(options[item].wport, SHOT_RIGHT_SIDEKICK, x, y, mouseX, mouseY, options[item].wpnum, 1);
b = player_shot_create(options[item].wport, SHOT_RIGHT_SIDEKICK, x, y, mouseX, mouseY, options[item].wpnum, 1);
}
}
/* Player Shot Images */
for (int z = 0; z < MAX_PWEAPON; z++)
{
if (shotAvail[z] != 0)
{
shotAvail[z]--;
if (z != MAX_PWEAPON - 1)
{
playerShotData[z].shotXM += playerShotData[z].shotXC;
if (playerShotData[z].shotXM <= 100)
playerShotData[z].shotX += playerShotData[z].shotXM;
playerShotData[z].shotYM += playerShotData[z].shotYC;
playerShotData[z].shotY += playerShotData[z].shotYM;
if (playerShotData[z].shotYM > 100)
{
playerShotData[z].shotY -= 120;
playerShotData[z].shotY += player[0].delta_y_shot_move;
}
if (playerShotData[z].shotComplicated != 0)
{
playerShotData[z].shotDevX += playerShotData[z].shotDirX;
playerShotData[z].shotX += playerShotData[z].shotDevX;
if (abs(playerShotData[z].shotDevX) == playerShotData[z].shotCirSizeX)
playerShotData[z].shotDirX = -playerShotData[z].shotDirX;
playerShotData[z].shotDevY += playerShotData[z].shotDirY;
playerShotData[z].shotY += playerShotData[z].shotDevY;
if (abs(playerShotData[z].shotDevY) == playerShotData[z].shotCirSizeY)
playerShotData[z].shotDirY = -playerShotData[z].shotDirY;
/*Double Speed Circle Shots - add a second copy of above loop*/
}
int tempShotX = playerShotData[z].shotX;
int tempShotY = playerShotData[z].shotY;
if (playerShotData[z].shotX < 0 || playerShotData[z].shotX > 140 ||
playerShotData[z].shotY < 0 || playerShotData[z].shotY > 170)
{
shotAvail[z] = 0;
goto draw_player_shot_loop_end;
}
/* if (playerShotData[z].shotTrail != 255)
{
if (playerShotData[z].shotTrail == 98)
{
JE_setupExplosion(playerShotData[z].shotX - playerShotData[z].shotXM, playerShotData[z].shotY - playerShotData[z].shotYM, playerShotData[z].shotTrail);
} else {
JE_setupExplosion(playerShotData[z].shotX, playerShotData[z].shotY, playerShotData[z].shotTrail);
}
}*/
tempW = playerShotData[z].shotGr + playerShotData[z].shotAni;
if (++playerShotData[z].shotAni == playerShotData[z].shotAniMax)
playerShotData[z].shotAni = 0;
if (tempW < 6000)
{
if (tempW > 1000)
tempW = tempW % 1000;
if (tempW > 500)
blit_sprite2(VGAScreen, tempShotX+1, tempShotY, shapesW2, tempW - 500);
else
blit_sprite2(VGAScreen, tempShotX+1, tempShotY, shapesC1, tempW);
}
}
draw_player_shot_loop_end:
;
}
}
simulate_player_shots();
blit_sprite(VGAScreenSeg, 0, 0, OPTION_SHAPES, 12); // upgrade interface
@@ -3372,4 +3258,3 @@ draw_player_shot_loop_end:
//JE_waitFrameCount(); TODO: didn't do anything?
}
// kate: tab-width 4; vim: set noet:

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
@@ -22,7 +22,7 @@
#include "helptext.h"
#include "opentyr.h"
typedef JE_byte JE_MenuChoiceType[MAX_MENU];
typedef JE_byte JE_MenuChoiceType[MENU_MAX];
JE_longint JE_cashLeft( void );
void JE_itemScreen( void );
@@ -56,4 +56,3 @@ void JE_weaponViewFrame( void );
#endif // GAME_MENU_H
// kate: tab-width 4; vim: set noet:

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
@@ -29,7 +29,7 @@
#include <string.h>
const JE_byte menuHelp[MAX_MENU][11] = /* [1..maxmenu, 1..11] */
const JE_byte menuHelp[MENU_MAX][11] = /* [1..maxmenu, 1..11] */
{
{ 1, 34, 2, 3, 4, 5, 0, 0, 0, 0, 0 },
{ 6, 7, 8, 9, 10, 11, 11, 12, 0, 0, 0 },
@@ -52,29 +52,29 @@ JE_byte helpBoxColor = 12;
JE_byte helpBoxBrightness = 1;
JE_byte helpBoxShadeType = FULL_SHADE;
char helpTxt[MAX_HELP_MESSAGE][231]; /* [1..maxhelpmessage] of string [230]; */
char helpTxt[39][231]; /* [1..39] of string [230] */
char pName[21][16]; /* [1..21] of string [15] */
char miscText[68][42]; /* [1..68] of string [41] */
char miscTextB[5][11]; /* [1..5] of string [10] */
char miscText[HELPTEXT_MISCTEXT_COUNT][42]; /* [1..68] of string [41] */
char miscTextB[HELPTEXT_MISCTEXTB_COUNT][HELPTEXT_MISCTEXTB_SIZE]; /* [1..5] of string [10] */
char keyName[8][18]; /* [1..8] of string [17] */
char menuText[7][21]; /* [1..7] of string [20] */
char menuText[7][HELPTEXT_MENUTEXT_SIZE]; /* [1..7] of string [20] */
char outputs[9][31]; /* [1..9] of string [30] */
char topicName[6][21]; /* [1..6] of string [20] */
char mainMenuHelp[34][66];
char mainMenuHelp[HELPTEXT_MAINMENUHELP_COUNT][66]; /* [1..34] of string [65] */
char inGameText[6][21]; /* [1..6] of string [20] */
char detailLevel[6][13]; /* [1..6] of string [12] */
char gameSpeedText[5][13]; /* [1..5] of string [12] */
char inputDevices[3][13]; /* [1..3] of string [12] */
char networkText[4][22]; /* [1..4] of string [20] */
char networkText[HELPTEXT_NETWORKTEXT_COUNT][HELPTEXT_NETWORKTEXT_SIZE]; /* [1..4] of string [20] */
char difficultyNameB[11][21]; /* [0..9] of string [20] */
char joyButtonNames[5][21]; /* [1..5] of string [20] */
char superShips[11][26]; /* [0..10] of string [25] */
char specialName[9][10]; /* [1..9] of string [9] */
char destructHelp[25][22];
char superShips[HELPTEXT_SUPERSHIPS_COUNT][26]; /* [0..10] of string [25] */
char specialName[HELPTEXT_SPECIALNAME_COUNT][10]; /* [1..9] of string [9] */
char destructHelp[25][22]; /* [1..25] of string [21] */
char weaponNames[17][17]; /* [1..17] of string [16] */
char destructModeName[DESTRUCT_MODES][13]; /* [1..destructmodes] of string [12] */
char shipInfo[13][2][256];
char menuInt[MAX_MENU + 1][11][18]; /* [0..maxmenu, 1..11] of string [17] */
char shipInfo[HELPTEXT_SHIPINFO_COUNT][2][256]; /* [1..13, 1..2] of string */
char menuInt[MENU_MAX+1][11][18]; /* [0..14, 1..11] of string [17] */
void decrypt_pascal_string( char *s, int len )
@@ -174,210 +174,217 @@ void JE_HBox( SDL_Surface *screen, int x, int y, unsigned int messagenum, unsig
void JE_loadHelpText( void )
{
#ifdef TYRIAN2000
const unsigned int menuInt_entries[MENU_MAX + 1] = { -1, 7, 9, 9, -1, -1, 11, -1, -1, -1, 7, 4, 6, 7, 5 };
#else
const unsigned int menuInt_entries[MENU_MAX + 1] = { -1, 7, 9, 8, -1, -1, 11, -1, -1, -1, 6, 4, 6, 7, 5 };
#endif
FILE *f = dir_fopen_die(data_dir(), "tyrian.hdt", "rb");
efread(&episode1DataLoc, sizeof(JE_longint), 1, f);
/*Online Help*/
skip_pascal_string(f);
for (int i = 0; i < MAX_HELP_MESSAGE; ++i)
for (unsigned int i = 0; i < COUNTOF(helpTxt); ++i)
read_encrypted_pascal_string(helpTxt[i], sizeof(helpTxt[i]), f);
skip_pascal_string(f);
/*Planet names*/
skip_pascal_string(f);
for (int i = 0; i < 21; ++i)
for (unsigned int i = 0; i < COUNTOF(pName); ++i)
read_encrypted_pascal_string(pName[i], sizeof(pName[i]), f);
skip_pascal_string(f);
/*Miscellaneous text*/
skip_pascal_string(f);
for (int i = 0; i < 68; ++i)
for (unsigned int i = 0; i < COUNTOF(miscText); ++i)
read_encrypted_pascal_string(miscText[i], sizeof(miscText[i]), f);
skip_pascal_string(f);
/*Little Miscellaneous text*/
skip_pascal_string(f);
for (int i = 0; i < 5; ++i)
for (unsigned int i = 0; i < COUNTOF(miscTextB); ++i)
read_encrypted_pascal_string(miscTextB[i], sizeof(miscTextB[i]), f);
skip_pascal_string(f);
/*Key names*/
skip_pascal_string(f);
for (int i = 0; i < 11; ++i)
for (unsigned int i = 0; i < menuInt_entries[6]; ++i)
read_encrypted_pascal_string(menuInt[6][i], sizeof(menuInt[6][i]), f);
skip_pascal_string(f);
/*Main Menu*/
skip_pascal_string(f);
for (int i = 0; i < 7; ++i)
for (unsigned int i = 0; i < COUNTOF(menuText); ++i)
read_encrypted_pascal_string(menuText[i], sizeof(menuText[i]), f);
skip_pascal_string(f);
/*Event text*/
skip_pascal_string(f);
for (int i = 0; i < 9; ++i)
for (unsigned int i = 0; i < COUNTOF(outputs); ++i)
read_encrypted_pascal_string(outputs[i], sizeof(outputs[i]), f);
skip_pascal_string(f);
/*Help topics*/
skip_pascal_string(f);
for (int i = 0; i < 6; ++i)
for (unsigned int i = 0; i < COUNTOF(topicName); ++i)
read_encrypted_pascal_string(topicName[i], sizeof(topicName[i]), f);
skip_pascal_string(f);
/*Main Menu Help*/
skip_pascal_string(f);
for (int i = 0; i < 34; ++i)
for (unsigned int i = 0; i < COUNTOF(mainMenuHelp); ++i)
read_encrypted_pascal_string(mainMenuHelp[i], sizeof(mainMenuHelp[i]), f);
skip_pascal_string(f);
/*Menu 1 - Main*/
skip_pascal_string(f);
for (int i = 0; i < 7; ++i)
for (unsigned int i = 0; i < menuInt_entries[1]; ++i)
read_encrypted_pascal_string(menuInt[1][i], sizeof(menuInt[1][i]), f);
skip_pascal_string(f);
/*Menu 2 - Items*/
skip_pascal_string(f);
for (int i = 0; i < 9; ++i)
for (unsigned int i = 0; i < menuInt_entries[2]; ++i)
read_encrypted_pascal_string(menuInt[2][i], sizeof(menuInt[2][i]), f);
skip_pascal_string(f);
/*Menu 3 - Options*/
skip_pascal_string(f);
for (int i = 0; i < 8; ++i)
for (unsigned int i = 0; i < menuInt_entries[3]; ++i)
read_encrypted_pascal_string(menuInt[3][i], sizeof(menuInt[3][i]), f);
skip_pascal_string(f);
/*InGame Menu*/
skip_pascal_string(f);
for (int i = 0; i < 6; ++i)
for (unsigned int i = 0; i < COUNTOF(inGameText); ++i)
read_encrypted_pascal_string(inGameText[i], sizeof(inGameText[i]), f);
skip_pascal_string(f);
/*Detail Level*/
skip_pascal_string(f);
for (int i = 0; i < 6; ++i)
for (unsigned int i = 0; i < COUNTOF(detailLevel); ++i)
read_encrypted_pascal_string(detailLevel[i], sizeof(detailLevel[i]), f);
skip_pascal_string(f);
/*Game speed text*/
skip_pascal_string(f);
for (int i = 0; i < 5; ++i)
for (unsigned int i = 0; i < COUNTOF(gameSpeedText); ++i)
read_encrypted_pascal_string(gameSpeedText[i], sizeof(gameSpeedText[i]), f);
skip_pascal_string(f);
// episode names
skip_pascal_string(f);
for (int i = 0; i <= 5; ++i)
for (unsigned int i = 0; i < COUNTOF(episode_name); ++i)
read_encrypted_pascal_string(episode_name[i], sizeof(episode_name[i]), f);
skip_pascal_string(f);
// difficulty names
skip_pascal_string(f);
for (int i = 0; i <= 6; ++i)
for (unsigned int i = 0; i < COUNTOF(difficulty_name); ++i)
read_encrypted_pascal_string(difficulty_name[i], sizeof(difficulty_name[i]), f);
skip_pascal_string(f);
// gameplay mode names
skip_pascal_string(f);
for (int i = 0; i <= 4; ++i)
for (unsigned int i = 0; i < COUNTOF(gameplay_name); ++i)
read_encrypted_pascal_string(gameplay_name[i], sizeof(gameplay_name[i]), f);
skip_pascal_string(f);
/*Menu 10 - 2Player Main*/
skip_pascal_string(f);
for (int i = 0; i < 6; ++i)
for (unsigned int i = 0; i < menuInt_entries[10]; ++i)
read_encrypted_pascal_string(menuInt[10][i], sizeof(menuInt[10][i]), f);
skip_pascal_string(f);
/*Input Devices*/
skip_pascal_string(f);
for (int i = 0; i < 3; ++i)
for (unsigned int i = 0; i < COUNTOF(inputDevices); ++i)
read_encrypted_pascal_string(inputDevices[i], sizeof(inputDevices[i]), f);
skip_pascal_string(f);
/*Network text*/
skip_pascal_string(f);
for (int i = 0; i < 4; ++i)
for (unsigned int i = 0; i < COUNTOF(networkText); ++i)
read_encrypted_pascal_string(networkText[i], sizeof(networkText[i]), f);
skip_pascal_string(f);
/*Menu 11 - 2Player Network*/
skip_pascal_string(f);
for (int i = 0; i < 4; ++i)
for (unsigned int i = 0; i < menuInt_entries[11]; ++i)
read_encrypted_pascal_string(menuInt[11][i], sizeof(menuInt[11][i]), f);
skip_pascal_string(f);
/*HighScore Difficulty Names*/
skip_pascal_string(f);
for (int i = 0; i <= 10; ++i)
for (unsigned int i = 0; i < COUNTOF(difficultyNameB); ++i)
read_encrypted_pascal_string(difficultyNameB[i], sizeof(difficultyNameB[i]), f);
skip_pascal_string(f);
/*Menu 12 - Network Options*/
skip_pascal_string(f);
for (int i = 0; i < 6; ++i)
for (unsigned int i = 0; i < menuInt_entries[12]; ++i)
read_encrypted_pascal_string(menuInt[12][i], sizeof(menuInt[12][i]), f);
skip_pascal_string(f);
/*Menu 13 - Joystick*/
skip_pascal_string(f);
for (int i = 0; i < 7; ++i)
for (unsigned int i = 0; i < menuInt_entries[13]; ++i)
read_encrypted_pascal_string(menuInt[13][i], sizeof(menuInt[13][i]), f);
skip_pascal_string(f);
/*Joystick Button Assignments*/
skip_pascal_string(f);
for (int i = 0; i < 5; ++i)
for (unsigned int i = 0; i < COUNTOF(joyButtonNames); ++i)
read_encrypted_pascal_string(joyButtonNames[i], sizeof(joyButtonNames[i]), f);
skip_pascal_string(f);
/*SuperShips - For Super Arcade Mode*/
skip_pascal_string(f);
for (int i = 0; i <= 10; ++i)
for (unsigned int i = 0; i < COUNTOF(superShips); ++i)
read_encrypted_pascal_string(superShips[i], sizeof(superShips[i]), f);
skip_pascal_string(f);
/*SuperShips - For Super Arcade Mode*/
skip_pascal_string(f);
for (int i = 0; i < 9; ++i)
for (unsigned int i = 0; i < COUNTOF(specialName); ++i)
read_encrypted_pascal_string(specialName[i], sizeof(specialName[i]), f);
skip_pascal_string(f);
/*Secret DESTRUCT game*/
skip_pascal_string(f);
for (int i = 0; i < 25; ++i)
for (unsigned int i = 0; i < COUNTOF(destructHelp); ++i)
read_encrypted_pascal_string(destructHelp[i], sizeof(destructHelp[i]), f);
skip_pascal_string(f);
/*Secret DESTRUCT weapons*/
skip_pascal_string(f);
for (int i = 0; i < 17; ++i)
for (unsigned int i = 0; i < COUNTOF(weaponNames); ++i)
read_encrypted_pascal_string(weaponNames[i], sizeof(weaponNames[i]), f);
skip_pascal_string(f);
/*Secret DESTRUCT modes*/
skip_pascal_string(f);
for (int i = 0; i < DESTRUCT_MODES; ++i)
for (unsigned int i = 0; i < COUNTOF(destructModeName); ++i)
read_encrypted_pascal_string(destructModeName[i], sizeof(destructModeName[i]), f);
skip_pascal_string(f);
/*NEW: Ship Info*/
skip_pascal_string(f);
for (int i = 0; i < 13; ++i)
for (unsigned int i = 0; i < COUNTOF(shipInfo); ++i)
{
read_encrypted_pascal_string(shipInfo[i][0], sizeof(shipInfo[i][0]), f);
read_encrypted_pascal_string(shipInfo[i][1], sizeof(shipInfo[i][1]), f);
}
skip_pascal_string(f);
#ifndef TYRIAN2000
/*Menu 12 - Network Options*/
skip_pascal_string(f);
for (int i = 0; i < 5; ++i)
for (unsigned int i = 0; i < menuInt_entries[14]; ++i)
read_encrypted_pascal_string(menuInt[14][i], sizeof(menuInt[14][i]), f);
#endif
fclose(f);
}
// kate: tab-width 4; vim: set noet:

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
@@ -21,38 +21,66 @@
#include "opentyr.h"
#include <stdio.h>
#define MAX_HELP_MESSAGE 39
#define MAX_MENU 14
#define MENU_MAX 14
#define DESTRUCT_MODES 5
extern const JE_byte menuHelp[MENU_MAX][11]; /* [1..14, 1..11] */
extern JE_byte verticalHeight;
extern JE_byte helpBoxColor, helpBoxBrightness, helpBoxShadeType;
extern char helpTxt[MAX_HELP_MESSAGE][231];
extern char pName[21][16]; /* [1..21] of string [15] */
extern char miscText[68][42]; /* [1..68] of string [41] */
extern char miscTextB[5][11]; /* [1..5] of string [10] */
extern char keyName[8][18]; /* [1..8] of string [17] */
extern char menuText[7][21]; /* [1..7] of string [20] */
extern char outputs[9][31]; /* [1..9] of string [30] */
extern char topicName[6][21]; /* [1..6] of string [20] */
extern char mainMenuHelp[34][66];
extern char inGameText[6][21]; /* [1..6] of string [20] */
extern char detailLevel[6][13]; /* [1..6] of string [12] */
extern char gameSpeedText[5][13]; /* [1..5] of string [12] */
extern char inputDevices[3][13]; /* [1..3] of string [12] */
extern char networkText[4][22]; /* [1..4] of string [20] */
extern char difficultyNameB[11][21]; /* [0..9] of string [20] */
extern char joyButtonNames[5][21]; /* [1..5] of string [20] */
extern char superShips[11][26]; /* [0..10] of string [25] */
extern char specialName[9][10]; /* [1..9] of string [9] */
#ifdef TYRIAN2000
#define HELPTEXT_MISCTEXT_COUNT 72
#define HELPTEXT_MISCTEXTB_COUNT 8
#define HELPTEXT_MISCTEXTB_SIZE 12
#define HELPTEXT_MENUTEXT_SIZE 29
#define HELPTEXT_MAINMENUHELP_COUNT 37
#define HELPTEXT_NETWORKTEXT_COUNT 5
#define HELPTEXT_NETWORKTEXT_SIZE 33
#define HELPTEXT_SUPERSHIPS_COUNT 13
#define HELPTEXT_SPECIALNAME_COUNT 11
#define HELPTEXT_SHIPINFO_COUNT 20
#define HELPTEXT_MENUINT3_COUNT 9
#define HELPTEXT_MENUINT12_COUNT 7
#else
#define HELPTEXT_MISCTEXT_COUNT 68
#define HELPTEXT_MISCTEXTB_COUNT 5
#define HELPTEXT_MISCTEXTB_SIZE 11
#define HELPTEXT_MENUTEXT_SIZE 21
#define HELPTEXT_MAINMENUHELP_COUNT 34
#define HELPTEXT_NETWORKTEXT_COUNT 4
#define HELPTEXT_NETWORKTEXT_SIZE 22
#define HELPTEXT_SUPERSHIPS_COUNT 11
#define HELPTEXT_SPECIALNAME_COUNT 9
#define HELPTEXT_SHIPINFO_COUNT 13
#endif
extern char helpTxt[39][231];
extern char pName[21][16];
extern char miscText[HELPTEXT_MISCTEXT_COUNT][42];
extern char miscTextB[HELPTEXT_MISCTEXTB_COUNT][HELPTEXT_MISCTEXTB_SIZE];
extern char keyName[8][18];
extern char menuText[7][HELPTEXT_MENUTEXT_SIZE];
extern char outputs[9][31];
extern char topicName[6][21];
extern char mainMenuHelp[HELPTEXT_MAINMENUHELP_COUNT][66];
extern char inGameText[6][21];
extern char detailLevel[6][13];
extern char gameSpeedText[5][13];
extern char inputDevices[3][13];
extern char networkText[HELPTEXT_NETWORKTEXT_COUNT][HELPTEXT_NETWORKTEXT_SIZE];
extern char difficultyNameB[11][21];
extern char joyButtonNames[5][21];
extern char superShips[HELPTEXT_SUPERSHIPS_COUNT][26];
extern char specialName[HELPTEXT_SPECIALNAME_COUNT][10];
extern char destructHelp[25][22];
extern char weaponNames[17][17]; /* [1..17] of string [16] */
extern char destructModeName[DESTRUCT_MODES][13]; /* [1..destructmodes] of string [12] */
extern char shipInfo[13][2][256];
extern char menuInt[MAX_MENU+1][11][18]; /* [0..maxmenu, 1..11] of string [17] */
extern const JE_byte menuHelp[MAX_MENU][11]; /* [1..maxmenu, 1..11] */
extern char weaponNames[17][17];
extern char destructModeName[DESTRUCT_MODES][13];
extern char shipInfo[HELPTEXT_SHIPINFO_COUNT][2][256];
extern char menuInt[MENU_MAX+1][11][18];
void read_encrypted_pascal_string( char *s, int size, FILE *f );
void skip_pascal_string( FILE *f );
@@ -63,4 +91,3 @@ void JE_loadHelpText( void );
#endif /* HELPTEXT_H */
// kate: tab-width 4; vim: set noet:

View File

@@ -2,7 +2,7 @@
#define HG_REVISION_H
#ifndef HG_REV
#define HG_REV "8e4c1be1b53f default"
#define HG_REV "0a06d5af473c default"
#endif
#endif // HG_REVISION_H

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
@@ -28,6 +28,8 @@
#include "video.h"
#include <assert.h>
#include <ctype.h>
#include <string.h>
int joystick_axis_threshold( int j, int value );
int check_assigned( SDL_Joystick *joystick_handle, const Joystick_assignment assignment[2] );
@@ -272,7 +274,7 @@ void init_joysticks( void )
SDL_JoystickEventState(SDL_IGNORE);
joysticks = SDL_NumJoysticks();
joystick = (Joystick *)malloc(joysticks * sizeof(*joystick));
joystick = malloc(joysticks * sizeof(*joystick));
for (int j = 0; j < joysticks; j++)
{
@@ -539,17 +541,17 @@ bool detect_joystick_assignment( int j, Joystick_assignment *assignment )
// get initial joystick state to compare against to see if anything was pressed
const int axes = SDL_JoystickNumAxes(joystick[j].handle);
Sint16 *axis = (Sint16 *)malloc(axes * sizeof(*axis));
Sint16 *axis = malloc(axes * sizeof(*axis));
for (int i = 0; i < axes; i++)
axis[i] = SDL_JoystickGetAxis(joystick[j].handle, i);
const int buttons = SDL_JoystickNumButtons(joystick[j].handle);
Uint8 *button = (Uint8 *)malloc(buttons * sizeof(*button));
Uint8 *button = malloc(buttons * sizeof(*button));
for (int i = 0; i < buttons; i++)
button[i] = SDL_JoystickGetButton(joystick[j].handle, i);
const int hats = SDL_JoystickNumHats(joystick[j].handle);
Uint8 *hat = (Uint8 *)malloc(hats * sizeof(*hat));
Uint8 *hat = malloc(hats * sizeof(*hat));
for (int i = 0; i < hats; i++)
hat[i] = SDL_JoystickGetHat(joystick[j].handle, i);
@@ -656,4 +658,3 @@ bool joystick_assignment_cmp( const Joystick_assignment *a, const Joystick_assig
return false;
}
// kate: tab-width 4; vim: set noet:

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
@@ -95,4 +95,3 @@ bool joystick_assignment_cmp( const Joystick_assignment *, const Joystick_assign
#endif /* JOYSTICK_H */
// kate: tab-width 4; vim: set noet:

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
@@ -31,6 +31,8 @@
#include "vga_palette.h"
#include "video.h"
#include <stdio.h>
void jukebox( void )
{
bool trigger_quit = false, // true when user wants to quit
@@ -217,4 +219,3 @@ void jukebox( void )
set_volume(tyrMusicVolume, fxVolume);
}
// kate: tab-width 4; vim: set noet:

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
@@ -25,4 +25,3 @@ void jukebox( void );
#endif /* JUKEBOX_H */
// kate: tab-width 4; vim: set noet:

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
@@ -25,6 +25,7 @@
#include "video_scale.h"
#include "SDL.h"
#include <stdio.h>
JE_boolean ESCPressed;
@@ -38,15 +39,13 @@ Uint16 lastmouse_x, lastmouse_y;
JE_boolean mouse_pressed[3] = {false, false, false};
Uint16 mouse_x, mouse_y;
int numkeys;
Uint8 *keysactive;
Uint8 keysactive[SDLK_LAST];
#ifdef NDEBUG
bool input_grab_enabled = true,
bool input_grab_enabled = true;
#else
bool input_grab_enabled = false,
bool input_grab_enabled = false;
#endif
input_grabbed = false;
void flush_events_buffer( void )
@@ -61,12 +60,15 @@ void wait_input( JE_boolean keyboard, JE_boolean mouse, JE_boolean joystick )
service_SDL_events(false);
while (!((keyboard && keydown) || (mouse && mousedown) || (joystick && joydown)))
{
JE_showVGA(); // Must update screen on Android to get new mouse events
SDL_Delay(SDL_POLL_INTERVAL);
push_joysticks_as_keyboard();
service_SDL_events(false);
#ifdef WITH_NETWORK
if (isNetworkGame)
network_check();
#endif
}
}
@@ -75,18 +77,20 @@ void wait_noinput( JE_boolean keyboard, JE_boolean mouse, JE_boolean joystick )
service_SDL_events(false);
while ((keyboard && keydown) || (mouse && mousedown) || (joystick && joydown))
{
JE_showVGA(); // Must update screen on Android to get new mouse events
SDL_Delay(SDL_POLL_INTERVAL);
poll_joysticks();
service_SDL_events(false);
#ifdef WITH_NETWORK
if (isNetworkGame)
network_check();
#endif
}
}
void init_keyboard( void )
{
keysactive = SDL_GetKeyState(&numkeys);
#ifndef ANDROID
SDL_EnableKeyRepeat(500, 60);
#endif
@@ -97,17 +101,17 @@ void init_keyboard( void )
SDL_EnableUNICODE(1);
}
void input_grab( void )
void input_grab( bool enable )
{
#if defined(TARGET_GP2X) || defined(TARGET_DINGUX) || defined(ANDROID)
input_grabbed = true;
#else
input_grabbed = input_grab_enabled || fullscreen_enabled;
enable = true;
#endif
SDL_ShowCursor(input_grabbed ? SDL_DISABLE : SDL_ENABLE);
input_grab_enabled = enable || fullscreen_enabled;
SDL_ShowCursor(input_grab_enabled ? SDL_DISABLE : SDL_ENABLE);
#ifdef NDEBUG
SDL_WM_GrabInput(input_grabbed ? SDL_GRAB_ON : SDL_GRAB_OFF);
SDL_WM_GrabInput(input_grab_enabled ? SDL_GRAB_ON : SDL_GRAB_OFF);
#endif
}
@@ -121,7 +125,7 @@ JE_word JE_mousePosition( JE_word *mouseX, JE_word *mouseY )
void set_mouse_position( int x, int y )
{
if (input_grabbed)
if (input_grab_enabled)
{
SDL_WarpMouse(x * scalers[scaler].width / vga_width, y * scalers[scaler].height / vga_height);
mouse_x = x;
@@ -144,6 +148,11 @@ void service_SDL_events( JE_boolean clear_new )
{
switch (ev.type)
{
case SDL_ACTIVEEVENT:
if (ev.active.state == SDL_APPINPUTFOCUS && !ev.active.gain)
input_grab(false);
break;
case SDL_MOUSEMOTION:
mouse_x = ev.motion.x * vga_width / scalers[scaler].width;
mouse_y = ev.motion.y * vga_height / scalers[scaler].height;
@@ -170,8 +179,7 @@ void service_SDL_events( JE_boolean clear_new )
/* <ctrl><f10> toggle input grab */
if (ev.key.keysym.sym == SDLK_F10)
{
input_grab_enabled = !input_grab_enabled;
input_grab();
input_grab(!input_grab_enabled);
break;
}
}
@@ -193,19 +201,20 @@ void service_SDL_events( JE_boolean clear_new )
/* <alt><tab> disable input grab and fullscreen */
if (ev.key.keysym.sym == SDLK_TAB)
{
input_grab_enabled = false;
input_grab();
if (!init_scaler(scaler, false) && // try windowed
!init_any_scaler(false) && // try any scaler windowed
!init_scaler(scaler, fullscreen_enabled)) // revert on fail
{
exit(EXIT_FAILURE);
}
input_grab(false);
break;
}
}
keysactive[ev.key.keysym.sym] = 1;
newkey = true;
lastkey_sym = ev.key.keysym.sym;
lastkey_mod = ev.key.keysym.mod;
@@ -213,15 +222,16 @@ void service_SDL_events( JE_boolean clear_new )
keydown = true;
return;
case SDL_KEYUP:
keysactive[ev.key.keysym.sym] = 0;
keydown = false;
return;
case SDL_MOUSEBUTTONDOWN:
if (!input_grabbed)
if (!input_grab_enabled)
{
input_grab_enabled = !input_grab_enabled;
input_grab();
input_grab(true);
break;
}
// intentional fall-though
case SDL_MOUSEBUTTONUP:
if (ev.type == SDL_MOUSEBUTTONDOWN)
{
@@ -258,4 +268,3 @@ void JE_clearKeyboard( void )
// /!\ Doesn't seems important. I think. D:
}
// kate: tab-width 4; vim: set noet:

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
@@ -35,16 +35,15 @@ extern Uint8 lastmouse_but;
extern Uint16 lastmouse_x, lastmouse_y;
extern JE_boolean mouse_pressed[3];
extern Uint16 mouse_x, mouse_y;
extern int numkeys;
extern Uint8 *keysactive;
extern Uint8 keysactive[SDLK_LAST];
extern bool input_grab_enabled, input_grabbed;
extern bool input_grab_enabled;
void flush_events_buffer( void );
void wait_input( JE_boolean keyboard, JE_boolean mouse, JE_boolean joystick );
void wait_noinput( JE_boolean keyboard, JE_boolean mouse, JE_boolean joystick );
void init_keyboard( void );
void input_grab( void );
void input_grab( bool enable );
JE_word JE_mousePosition( JE_word *mouseX, JE_word *mouseY );
void set_mouse_position( int x, int y );
@@ -66,4 +65,3 @@ void JE_clearKeyboard( void );
#endif /* KEYBOARD_H */
// kate: tab-width 4; vim: set noet:

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
@@ -17,13 +17,14 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "file.h"
#include "fm_synth.h"
#include "lds_play.h"
#include "loudness.h"
#include "opentyr.h"
#include <assert.h>
const unsigned char op_table[9] = {0x00, 0x01, 0x02, 0x08, 0x09, 0x0a, 0x10, 0x11, 0x12};
/* A substantial amount of this code has been copied and adapted from adplug.
Thanks, guys! Adplug is awesome! :D */
@@ -105,7 +106,7 @@ bool lds_load( FILE *f, unsigned int music_offset, unsigned int music_size )
efread(&numpatch, 2, 1, f);
free(soundbank);
soundbank = (SoundBank *)malloc(sizeof(SoundBank) * numpatch);
soundbank = malloc(sizeof(SoundBank) * numpatch);
for (unsigned int i = 0; i < numpatch; i++)
{
@@ -149,7 +150,7 @@ bool lds_load( FILE *f, unsigned int music_offset, unsigned int music_size )
efread(&numposi, 2, 1, f);
free(positions);
positions = (Position *)malloc(sizeof(Position) * 9 * numposi);
positions = malloc(sizeof(Position) * 9 * numposi);
for (unsigned int i = 0; i < numposi; i++)
{
@@ -173,7 +174,7 @@ bool lds_load( FILE *f, unsigned int music_offset, unsigned int music_size )
unsigned int remaining = music_size - (ftell(f) - music_offset);
free(patterns);
patterns = (Uint16 *)malloc(sizeof(Uint16) * (remaining / 2));
patterns = malloc(sizeof(Uint16) * (remaining / 2));
for (unsigned int i = 0; i < remaining / 2; i++)
efread(&patterns[i], 2, 1, f);
@@ -207,7 +208,7 @@ void lds_rewind( void )
memset(fmchip, 0, sizeof(fmchip));
/* OPL2 init */
opl_reset(); /* Reset OPL chip */
opl_init(); /* Reset OPL chip */
opl_write(1, 0x20);
opl_write(8, 0);
opl_write(0xbd, regbd);
@@ -765,4 +766,3 @@ void lds_playsound(int inst_number, int channel_number, int tunehigh)
c->nextvol = c->glideto = c->finetune = c->vibcount = c->arp_pos = c->arp_count = 0;
}
// kate: tab-width 4; vim: set noet:

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
@@ -21,6 +21,8 @@
#include "opentyr.h"
#include <stdio.h>
extern bool playing, songlooped;
int lds_update( void );
@@ -70,4 +72,3 @@ void lds_setregs_adv(unsigned char reg, unsigned char mask, unsigned char val);
#endif /* LDS_PLAY_H */
// kate: tab-width 4; vim: set noet:

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
@@ -17,7 +17,6 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "file.h"
#include "fm_synth.h"
#include "lds_play.h"
#include "loudness.h"
#include "nortsong.h"
@@ -61,7 +60,7 @@ bool init_audio( void )
ask.freq = freq;
ask.format = (BYTES_PER_SAMPLE == 2) ? AUDIO_S16SYS : AUDIO_S8;
ask.channels = 1;
ask.samples = 512;
ask.samples = 2048;
ask.callback = audio_cb;
printf("\trequested %d Hz, %d channels, %d samples\n", ask.freq, ask.channels, ask.samples);
@@ -186,8 +185,6 @@ void deinit_audio( void )
channel_len[i] = 0;
}
opl_deinit();
lds_free();
}
@@ -200,7 +197,7 @@ void load_music( void )
efread(&song_count, sizeof(song_count), 1, music_file);
song_offset = (Uint32*)malloc((song_count + 1) * sizeof(song_offset));
song_offset = malloc((song_count + 1) * sizeof(*song_offset));
efread(song_offset, 4, song_count, music_file);
song_offset[song_count] = ftell_eof(music_file);
@@ -252,7 +249,7 @@ void stop_song( void )
void fade_song( void )
{
printf("TODO: %s\n", __FUNCTION__);
/* STUB: we have no implementation of this to port */
}
void set_volume( unsigned int music, unsigned int sample )
@@ -271,7 +268,7 @@ void JE_multiSamplePlay(JE_byte *buffer, JE_word size, JE_byte chan, JE_byte vol
free(channel_buffer[chan]);
channel_len[chan] = size * BYTES_PER_SAMPLE * SAMPLE_SCALING;
channel_buffer[chan] = (OPLSAMPLE*)malloc(channel_len[chan]);
channel_buffer[chan] = malloc(channel_len[chan]);
channel_pos[chan] = channel_buffer[chan];
channel_vol[chan] = vol + 1;
@@ -290,4 +287,3 @@ void JE_multiSamplePlay(JE_byte *buffer, JE_word size, JE_byte chan, JE_byte vol
SDL_UnlockAudio();
}
// kate: tab-width 4; vim: set noet:

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
@@ -19,8 +19,8 @@
#ifndef LOUDNESS_H
#define LOUDNESS_H
#include "fmopl.h"
#include "opentyr.h"
#include "opl.h"
#include "SDL.h"
@@ -33,8 +33,8 @@
#endif
#define SAMPLE_SCALING OUTPUT_QUALITY
#define SAMPLE_TYPE OPLSAMPLE
#define BYTES_PER_SAMPLE (OPL_SAMPLE_BITS / 8)
#define SAMPLE_TYPE Bit16s
#define BYTES_PER_SAMPLE 2
extern float music_volume, sample_volume;
@@ -57,4 +57,3 @@ void JE_multiSamplePlay(JE_byte *buffer, JE_word size, JE_byte chan, JE_byte vol
#endif /* LOUDNESS_H */
// kate: tab-width 4; vim: set noet:

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
@@ -39,4 +39,3 @@ void JE_analyzeLevel( void )
fclose(f);
}
// kate: tab-width 4; vim: set noet:

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
@@ -32,4 +32,3 @@ void JE_analyzeLevel( void );
#endif /* LVLLIB_H */
// kate: tab-width 4; vim: set noet:

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
@@ -171,4 +171,3 @@ TYPE 5: Shape Files
M 1 2 3 4 episode
*/
// kate: tab-width 4; vim: set noet:

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
@@ -21,9 +21,19 @@
#include "opentyr.h"
#define EVENT_MAXIMUM 2500
#ifdef TYRIAN2000
#define WEAP_NUM 818
#define PORT_NUM 60
#define ARMOR_NUM 4
#define POWER_NUM 6
#define ENGINE_NUM 6
#define OPTION_NUM 37
#define SHIP_NUM 18
#define SHIELD_NUM 11
#define SPECIAL_NUM 46
#else
#define WEAP_NUM 780
#define PORT_NUM 42
#define ARMOR_NUM 4
@@ -33,6 +43,7 @@
#define SHIP_NUM 13
#define SHIELD_NUM 10
#define SPECIAL_NUM 46
#endif
#define ENEMY_NUM 850
@@ -46,4 +57,3 @@ extern const JE_char shapeFile[34]; /* [1..34] */
#endif /* LVLMAST_H */
// kate: tab-width 4; vim: set noet:

View File

@@ -1,6 +1,5 @@
/* vim: set noet:
*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
/*
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2008 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
@@ -91,4 +91,3 @@ void JE_playerCollide( Player *this_player, JE_byte playerNum );
#endif /* MAININT_H */
// kate: tab-width 4; vim: set noet:

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
@@ -16,6 +16,12 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include <SDL_video.h>
#include <SDL_image.h>
#include <SDL_screenkeyboard.h>
#include <android/log.h>
#include "config.h"
#include "episodes.h"
#include "fonthand.h"
@@ -29,10 +35,13 @@
#include "sprite.h"
#include "video.h"
char episode_name[6][31], difficulty_name[7][21], gameplay_name[5][26];
char episode_name[6][31], difficulty_name[7][21], gameplay_name[GAMEPLAY_NAME_COUNT][26];
SDL_Rect screen_button_pos_destruct[SDL_ANDROID_SCREENKEYBOARD_BUTTON_NUM];
bool screen_button_pos_destruct_initialized;
bool
select_menuitem_by_touch(JE_byte menu_top, JE_byte menu_spacing, JE_shortint menu_item_count, JE_shortint *current_item)
select_menuitem_by_touch(int menu_top, int menu_spacing, int menu_item_count, int *current_item)
{
if (!mousedown)
return false;
@@ -51,21 +60,156 @@ select_menuitem_by_touch(JE_byte menu_top, JE_byte menu_spacing, JE_shortint men
return true;
}
void android_setup_screen_keys( void )
{
if (touchscreenControlMode == TOUCHSCREEN_CONTROL_FINGER)
{
int W = SDL_ListModes(NULL, 0)[0]->w;
int H = SDL_ListModes(NULL, 0)[0]->h;
SDL_Rect r;
// Rear gun mode button
r.x = 558 * W / 640;
r.y = 46 * H / 400;
r.w = 82 * W / 640;
r.h = 58 * H / 400;
SDL_ANDROID_SetScreenKeyboardButtonPos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_1, &r);
SDL_ANDROID_SetScreenKeyboardButtonImagePos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_1, &r);
// Left sidekick button
r.x = 558 * W / 640;
r.y = 104 * H / 400;
r.w = 82 * W / 640;
r.h = 58 * H / 400;
SDL_ANDROID_SetScreenKeyboardButtonPos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_3, &r);
SDL_ANDROID_SetScreenKeyboardButtonImagePos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_3, &r);
// Right sidekick button
r.x = 558 * W / 640;
r.y = 162 * H / 400;
r.w = 82 * W / 640;
r.h = 58 * H / 400;
SDL_ANDROID_SetScreenKeyboardButtonPos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_2, &r);
SDL_ANDROID_SetScreenKeyboardButtonImagePos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_2, &r);
SDL_ANDROID_SetScreenKeyboardTransparency(SDL_ALPHA_TRANSPARENT);
}
else
{
/* Setup joystick with buttons */
android_setup_screen_keys_destruct();
}
}
void android_cleanup_screen_keys( void )
{
if (!screen_button_pos_destruct_initialized)
{
screen_button_pos_destruct_initialized = true;
for (int i = 0; i < SDL_ANDROID_SCREENKEYBOARD_BUTTON_NUM; i++)
{
SDL_ANDROID_GetScreenKeyboardButtonPos(i, &screen_button_pos_destruct[i]);
}
}
SDL_Rect r = {0, 0, 0, 0}; // Hide all buttons
for (int i = 0; i < SDL_ANDROID_SCREENKEYBOARD_BUTTON_NUM; i++)
{
if (i != SDL_ANDROID_SCREENKEYBOARD_BUTTON_TEXT)
SDL_ANDROID_SetScreenKeyboardButtonPos(i, &r);
}
SDL_ANDROID_SetScreenKeyboardTransparency(192); // Text input button should not be totally transparent
}
void android_setup_screen_keys_destruct( void )
{
SDL_ANDROID_SetScreenKeyboardButtonPos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_0, &screen_button_pos_destruct[SDL_ANDROID_SCREENKEYBOARD_BUTTON_0]);
SDL_ANDROID_SetScreenKeyboardButtonPos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_1, &screen_button_pos_destruct[SDL_ANDROID_SCREENKEYBOARD_BUTTON_1]);
SDL_ANDROID_SetScreenKeyboardButtonPos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_2, &screen_button_pos_destruct[SDL_ANDROID_SCREENKEYBOARD_BUTTON_2]);
SDL_ANDROID_SetScreenKeyboardButtonPos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_3, &screen_button_pos_destruct[SDL_ANDROID_SCREENKEYBOARD_BUTTON_3]);
SDL_ANDROID_SetScreenKeyboardButtonPos(SDL_ANDROID_SCREENKEYBOARD_BUTTON_DPAD, &screen_button_pos_destruct[SDL_ANDROID_SCREENKEYBOARD_BUTTON_DPAD]);
SDL_ANDROID_SetScreenKeyboardTransparency(192);
}
void android_show_tutorial( void )
{
static const char *tutorial_flag_file = "tutorial-shown.flag";
FILE *shown = fopen(tutorial_flag_file, "r");
__android_log_print(ANDROID_LOG_INFO, "Tyrian", "android_show_tutorial: %s: %s", tutorial_flag_file, shown ? "already shown" : "not shown");
if (shown)
{
fclose(shown);
return;
}
__android_log_print(ANDROID_LOG_INFO, "Tyrian", "android_show_tutorial: creating %s", tutorial_flag_file);
shown = fopen(tutorial_flag_file, "w");
if (!shown)
return;
fprintf(shown, "Tutorial was shown - remove this file to show it again\n");
fclose(shown);
static const char *tutorial_files[] = { "tutorial1.png", "tutorial2.png" };
for (int f = 0; f < 2; f++)
{
SDL_Surface *img = IMG_Load(tutorial_files[f]);
__android_log_print(ANDROID_LOG_INFO, "Tyrian", "android_show_tutorial: %s: %p", tutorial_files[f], img);
if (!img)
return;
SDL_Surface *img2 = SDL_ConvertSurface(img, SDL_GetVideoSurface()->format, SDL_SWSURFACE);
SDL_FreeSurface(img);
img = img2;
for (int i = 7; i <= 255; i += 8)
{
SDL_FillRect(SDL_GetVideoSurface(), NULL, SDL_MapRGB(SDL_GetVideoSurface()->format, 0, 0, 0));
SDL_SetAlpha(img, SDL_SRCALPHA, i);
SDL_BlitSurface(img, NULL, SDL_GetVideoSurface(), NULL);
__android_log_print(ANDROID_LOG_INFO, "Tyrian", "android_show_tutorial: blitting with alpha %d", i);
SDL_Flip(SDL_GetVideoSurface());
SDL_Delay(60);
service_SDL_events(false);
}
while (!mousedown)
{
service_SDL_events(false);
SDL_Flip(SDL_GetVideoSurface());
SDL_Delay(40);
}
for (int i = 255; i > 8; i -= 8)
{
SDL_FillRect(SDL_GetVideoSurface(), NULL, 0);
SDL_SetAlpha(img, SDL_SRCALPHA, i);
SDL_BlitSurface(img, NULL, SDL_GetVideoSurface(), NULL);
__android_log_print(ANDROID_LOG_INFO, "Tyrian", "android_show_tutorial: blitting with alpha %d", i);
SDL_Flip(SDL_GetVideoSurface());
SDL_Delay(60);
service_SDL_events(false);
}
SDL_FreeSurface(img);
}
}
bool select_gameplay( void )
{
JE_loadPic(VGAScreen, 2, false);
JE_dString(VGAScreen, JE_fontCenter(gameplay_name[0], FONT_SHAPES), 20, gameplay_name[0], FONT_SHAPES);
const JE_byte menu_top = 30, menu_spacing = 24;
JE_shortint gameplay = 1,
gameplay_max = 4;
int menu_top = 30, menu_spacing = 24;
int gameplay = 1,
gameplay_max = GAMEPLAY_NAME_COUNT - 1;
wait_noinput(true, true, false);
bool fade_in = true;
for (; ; )
{
for (int i = 1; i <= gameplay_max; i++)
{
JE_outTextAdjust(VGAScreen, JE_fontCenter(gameplay_name[i], SMALL_FONT_SHAPES), i * menu_spacing + menu_top, gameplay_name[i], 15, - 4 + (i == gameplay ? 2 : 0) - (i == 4 ? 4 : 0), SMALL_FONT_SHAPES, true);
JE_outTextAdjust(VGAScreen, JE_fontCenter(gameplay_name[i], SMALL_FONT_SHAPES), i * menu_spacing + menu_top, gameplay_name[i], 15, -4 + (i == gameplay ? 2 : 0) - (i == (GAMEPLAY_NAME_COUNT - 1) ? 4 : 0), SMALL_FONT_SHAPES, true);
}
JE_showVGA();
@@ -87,8 +231,7 @@ bool select_gameplay( void )
{
case SDLK_UP:
case SDLK_LCTRL:
gameplay--;
if (gameplay < 1)
if (--gameplay < 1)
{
gameplay = gameplay_max;
}
@@ -96,8 +239,7 @@ bool select_gameplay( void )
break;
case SDLK_DOWN:
case SDLK_LALT:
gameplay++;
if (gameplay > gameplay_max)
if (++gameplay > gameplay_max)
{
gameplay = 1;
}
@@ -106,7 +248,7 @@ bool select_gameplay( void )
case SDLK_RETURN:
case SDLK_SPACE:
if (gameplay == 4)
if (gameplay == GAMEPLAY_NAME_COUNT - 1)
{
JE_playSampleNum(S_SPRING);
/* TODO: NETWORK */
@@ -117,7 +259,7 @@ bool select_gameplay( void )
fade_black(10);
onePlayerAction = (gameplay == 2);
twoPlayerMode = (gameplay == 3);
twoPlayerMode = (gameplay == GAMEPLAY_NAME_COUNT - 2);
return true;
case SDLK_ESCAPE:
@@ -139,10 +281,10 @@ bool select_episode( void )
JE_loadPic(VGAScreen, 2, false);
JE_dString(VGAScreen, JE_fontCenter(episode_name[0], FONT_SHAPES), 20, episode_name[0], FONT_SHAPES);
const JE_byte menu_top = 20, menu_spacing = 30;
JE_shortint episode = 1,
episode_max = EPISODE_MAX - 1;
const int menu_top = 20, menu_spacing = 30;
int episode = 1, episode_max = EPISODE_AVAILABLE;
wait_noinput(true, true, false);
bool fade_in = true;
for (; ; )
{
@@ -220,10 +362,11 @@ bool select_difficulty( void )
JE_loadPic(VGAScreen, 2, false);
JE_dString(VGAScreen, JE_fontCenter(difficulty_name[0], FONT_SHAPES), 20, difficulty_name[0], FONT_SHAPES);
const JE_byte menu_top = 30, menu_spacing = 24;
const int menu_top = 30, menu_spacing = 24;
difficultyLevel = 2;
JE_shortint difficulty_max = 3;
int difficulty_max = 3;
wait_noinput(true, true, false);
bool fade_in = true;
for (; ; )
{
@@ -242,8 +385,12 @@ bool select_difficulty( void )
JE_word temp = 0;
JE_textMenuWait(&temp, false);
if (select_menuitem_by_touch(menu_top, menu_spacing, difficulty_max, &difficultyLevel))
int difficultyLevel_ = difficultyLevel; // Need to pass an int, difficultyLevel is short int
if (select_menuitem_by_touch(menu_top, menu_spacing, difficulty_max, &difficultyLevel_))
{
difficultyLevel = difficultyLevel_;
continue;
}
if (SDL_GetModState() & KMOD_SHIFT)
{
@@ -306,5 +453,3 @@ bool select_difficulty( void )
}
}
}
// kate: tab-width 4; vim: set noet:

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
@@ -21,13 +21,22 @@
#include "opentyr.h"
extern char episode_name[6][31], difficulty_name[7][21], gameplay_name[5][26];
#ifdef TYRIAN2000
#define GAMEPLAY_NAME_COUNT 6
#else
#define GAMEPLAY_NAME_COUNT 5
#endif
extern char episode_name[6][31], difficulty_name[7][21], gameplay_name[GAMEPLAY_NAME_COUNT][26];
bool select_gameplay( void );
bool select_episode( void );
bool select_difficulty( void );
bool select_menuitem_by_touch(JE_byte menu_top, JE_byte menu_spacing, JE_shortint menu_item_count, JE_shortint *current_item);
bool select_menuitem_by_touch(int menu_top, int menu_spacing, int menu_item_count, int *current_item);
void android_setup_screen_keys( void );
void android_cleanup_screen_keys( void );
void android_setup_screen_keys_destruct( void );
void android_show_tutorial( void );
#endif /* MENUS_H */
// kate: tab-width 4; vim: set noet:

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
@@ -115,4 +115,3 @@ void JE_mouseReplace( void )
JE_drawShapeTypeOne(lastMouseX, lastMouseY, mouseGrabShape);
}
// kate: tab-width 4; vim: set noet:

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
@@ -41,4 +41,3 @@ void JE_mouseReplace( void );
#endif /* MOUSE_H */
// kate: tab-width 4; vim: set noet:

View File

@@ -105,4 +105,3 @@ float mt_rand_lt1( void )
return ((float)mt_rand() / ((float)MT_RAND_MAX + 1.0f));
}
// kate: tab-width 4; vim: set noet:

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
@@ -28,4 +28,3 @@ float mt_rand_lt1( void );
#endif /* MTRAND_H */
// kate: tab-width 4; vim: set noet:

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
@@ -114,4 +114,3 @@ const char musicTitle[MUSIC_NUM][48] =
JE_boolean musicFade;
// kate: tab-width 4; vim: set noet:

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
@@ -39,4 +39,3 @@ extern JE_boolean musicFade;
#endif /* MUSMAST_H */
// kate: tab-width 4; vim: set noet:

View File

@@ -1,5 +1,5 @@
/*
* OpenTyrian Classic: A modern cross-platform port of Tyrian
* OpenTyrian: A modern cross-platform port of Tyrian
* Copyright (C) 2007-2009 The OpenTyrian Development Team
*
* This program is free software; you can redistribute it and/or
@@ -30,9 +30,6 @@
#include "varz.h"
#include "video.h"
#include "SDL.h"
#include "SDL_net.h"
#include <assert.h>
/* HERE BE DRAGONS!
@@ -66,27 +63,29 @@ static char empty_string[] = "";
char *network_player_name = empty_string,
*network_opponent_name = empty_string;
UDPsocket socket;
IPaddress ip;
#ifdef WITH_NETWORK
static UDPsocket socket;
static IPaddress ip;
UDPpacket *packet_out_temp, *packet_temp;
UDPpacket *packet_out_temp;
static UDPpacket *packet_temp;
UDPpacket *packet_in[NET_PACKET_QUEUE] = { NULL },
*packet_out[NET_PACKET_QUEUE] = { NULL };
Uint16 last_out_sync = 0, queue_in_sync = 0, queue_out_sync = 0, last_ack_sync = 0;
Uint32 last_in_tick = 0, last_out_tick = 0;
static Uint16 last_out_sync = 0, queue_in_sync = 0, queue_out_sync = 0, last_ack_sync = 0;
static Uint32 last_in_tick = 0, last_out_tick = 0;
UDPpacket *packet_state_in[NET_PACKET_QUEUE] = { NULL },
*packet_state_in_xor[NET_PACKET_QUEUE] = { NULL },
*packet_state_out[NET_PACKET_QUEUE] = { NULL };
UDPpacket *packet_state_in[NET_PACKET_QUEUE] = { NULL };
static UDPpacket *packet_state_in_xor[NET_PACKET_QUEUE] = { NULL };
UDPpacket *packet_state_out[NET_PACKET_QUEUE] = { NULL };
Uint16 last_state_in_sync = 0, last_state_out_sync = 0;
Uint32 last_state_in_tick = 0;
static Uint16 last_state_in_sync = 0, last_state_out_sync = 0;
static Uint32 last_state_in_tick = 0;
bool net_initialized = false;
static bool net_initialized = false;
static bool connected = false, quit = false;
#endif
uint thisPlayerNum = 0; /* Player number on this PC (1 or 2) */
@@ -98,6 +97,41 @@ JE_boolean moveOk;
JE_boolean pauseRequest, skipLevelRequest, helpRequest, nortShipRequest;
JE_boolean yourInGameMenuRequest, inGameMenuRequest;
#ifdef WITH_NETWORK
static void packet_copy( UDPpacket *dst, UDPpacket *src )
{
void *temp = dst->data;
memcpy(dst, src, sizeof(*dst));
dst->data = temp;
memcpy(dst->data, src->data, src->len);
}
static void packets_shift_up( UDPpacket **packet, int max_packets )
{
if (packet[0])
{
SDLNet_FreePacket(packet[0]);
}
for (int i = 0; i < max_packets - 1; i++)
{
packet[i] = packet[i + 1];
}
packet[max_packets - 1] = NULL;
}
static void packets_shift_down( UDPpacket **packet, int max_packets )
{
if (packet[max_packets - 1])
{
SDLNet_FreePacket(packet[max_packets - 1]);
}
for (int i = max_packets - 1; i > 0; i--)
{
packet[i] = packet[i - 1];
}
packet[0] = NULL;
}
// prepare new packet for sending
void network_prepare( Uint16 type )
{
@@ -105,6 +139,20 @@ void network_prepare( Uint16 type )
SDLNet_Write16(last_out_sync, &packet_out_temp->data[2]);
}
// send packet but don't expect acknoledgment of delivery
static bool network_send_no_ack( int len )
{
packet_out_temp->len = len;
if (!SDLNet_UDP_Send(socket, 0, packet_out_temp))
{
printf("SDLNet_UDP_Send: %s\n", SDL_GetError());
return false;
}
return true;
}
// send packet and place it in queue to be acknowledged
bool network_send( int len )
{
@@ -129,18 +177,20 @@ bool network_send( int len )
return temp;
}
// send packet but don't expect acknoledgment of delivery
bool network_send_no_ack( int len )
// send acknowledgement packet
static int network_acknowledge( Uint16 sync )
{
packet_out_temp->len = len;
SDLNet_Write16(PACKET_ACKNOWLEDGE, &packet_out_temp->data[0]);
SDLNet_Write16(sync, &packet_out_temp->data[2]);
network_send_no_ack(4);
if (!SDLNet_UDP_Send(socket, 0, packet_out_temp))
{
printf("SDLNet_UDP_Send: %s\n", SDL_GetError());
return false;
}
return 0;
}
return true;
// activity lately?
static bool network_is_alive( void )
{
return (SDL_GetTicks() - last_in_tick < NET_TIME_OUT || SDL_GetTicks() - last_state_in_tick < NET_TIME_OUT);
}
// poll for new packets received, check that connection is alive, resend queued packets if necessary
@@ -337,16 +387,6 @@ int network_check( void )
return 0;
}
// send acknowledgement packet
int network_acknowledge( Uint16 sync )
{
SDLNet_Write16(PACKET_ACKNOWLEDGE, &packet_out_temp->data[0]);
SDLNet_Write16(sync, &packet_out_temp->data[2]);
network_send_no_ack(4);
return 0;
}
// discard working packet, now processing next packet in queue
bool network_update( void )
{
@@ -368,12 +408,6 @@ bool network_is_sync( void )
return (queue_out_sync - last_ack_sync == 1);
}
// activity lately?
bool network_is_alive( void )
{
return (SDL_GetTicks() - last_in_tick < NET_TIME_OUT || SDL_GetTicks() - last_state_in_tick < NET_TIME_OUT);
}
// prepare new state for sending
void network_state_prepare( void )
@@ -614,7 +648,7 @@ connect_again:
episodes >>= 1;
}
network_opponent_name = (char *)malloc(packet_in[0]->len - 12 + 1);
network_opponent_name = malloc(packet_in[0]->len - 12 + 1);
strcpy(network_opponent_name, (char *)&packet_in[0]->data[12]);
network_update();
@@ -741,40 +775,7 @@ int network_init( void )
return 0;
}
void packet_copy( UDPpacket *dst, UDPpacket *src )
{
void *temp = dst->data;
memcpy(dst, src, sizeof(*dst));
dst->data = (Uint8*)temp;
memcpy(dst->data, src->data, src->len);
}
void packets_shift_up( UDPpacket **packet, int max_packets )
{
if (packet[0])
{
SDLNet_FreePacket(packet[0]);
}
for (int i = 0; i < max_packets - 1; i++)
{
packet[i] = packet[i + 1];
}
packet[max_packets - 1] = NULL;
}
void packets_shift_down( UDPpacket **packet, int max_packets )
{
if (packet[max_packets - 1])
{
SDLNet_FreePacket(packet[max_packets - 1]);
}
for (int i = max_packets - 1; i > 0; i--)
{
packet[i] = packet[i - 1];
}
packet[0] = NULL;
}
#endif
void JE_clearSpecialRequests( void )
{
@@ -785,4 +786,3 @@ void JE_clearSpecialRequests( void )
nortShipRequest = false;
}
// kate: tab-width 4; vim: set noet:

Some files were not shown because too many files have changed in this diff Show More