sources of the Android port

This commit is contained in:
Zeno Rogue 2017-03-23 13:54:10 +01:00
parent 58e053f183
commit 29719a76e6
52 changed files with 4142 additions and 0 deletions

6
hydroid/README.md Normal file
View File

@ -0,0 +1,6 @@
This directory contains the sources of the Android port of HyperRogue.
You should copy the sound and music files from HyperRogue's main directory to
the directories here; this is done by the script `copy.sh`.
Note that the version in Google Play uses the 'low quality' versions of sounds.

View File

@ -0,0 +1,49 @@
# Sets the minimum version of CMake required to build your native library.
# This ensures that a certain set of CMake features is available to
# your build.
cmake_minimum_required(VERSION 3.4.1)
# Specifies a library name, specifies whether the library is STATIC or
# SHARED, and provides relative paths to the source code. You can
# define multiple libraries by adding multiple add.library() commands,
# and CMake builds them for you. When you build your app, Gradle
# automatically packages shared libraries with your APK.
add_library( # Specifies the name of the library.
hyper
# Sets the library as a shared library.
SHARED
# Provides a relative path to your source file(s).
src/main/jni/hyper.cpp )
# GLESv2
find_path(GLES2_INCLUDE_DIR GLES2/gl2.h
HINTS ${ANDROID_NDK})
find_library(GLES2_LIBRARY libGLESv1_CM.so
HINTS ${GLES2_INCLUDE_DIR}/../lib)
target_include_directories(hyper PUBLIC ${GLES2_INCLUDE_DIR})
find_library( # Sets the name of the path variable.
log-lib
# Specifies the name of the NDK library that
# you want CMake to locate.
log )
# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in the
# build script, prebuilt third-party libraries, or system libraries.
target_link_libraries( # Specifies the target library.
hyper
# Links the target library to the log library
# included in the NDK.
${log-lib}
# ${GLES2_LIBRARY}
GLESv1_CM
)

85
hydroid/app/build.gradle Normal file
View File

@ -0,0 +1,85 @@
apply plugin: 'com.android.application'
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
applicationId "com.roguetemple.hyperroid"
minSdkVersion 15
targetSdkVersion 15
// multiDexEnabled true
//javaMaxHeapSize "4g"
externalNativeBuild {
// Encapsulates your CMake build configurations.
cmake {
// Provides a relative path to your CMake build script.
// ldLibs "-lGLESv1_CM -llog"
cFlags "-no-integrated-as"
}
}
ndk {
moduleName "hyper"
ldLibs "GLESv1_CM -llog"
stl "stlport_static"
// abiFilters 'armeabi', 'x86_64'
abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'mips', 'mips64'
// abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a', 'arm64-v8a', 'mips', 'mips64'
}
}
signingConfigs {
release {
storeFile System.getenv("KSTOREFILE")
storePassword System.getenv("KSTOREPWD")
keyAlias System.getenv("KEYALIAS")
keyPassword System.getenv("KEYPWD")
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
signingConfig signingConfigs.release
}
debug {
ndk {
// abiFilters.addAll(["armeabi"])
}
}
}
// Encapsulates your external native build configurations.
externalNativeBuild {
// Encapsulates your CMake build configurations.
cmake {
// Provides a relative path to your CMake build script.
path "CMakeLists.txt"
}
}
compileOptions {
// targetCompatibility 1.8
// sourceCompatibility 1.8
}
lintOptions {
checkReleaseBuilds false
abortOnError false
}
}

View File

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.roguetemple.hyperroid"
android:versionCode="9403" android:versionName="9.4c"
android:installLocation="auto">
<!-- <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> -->
<!-- <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="9" /> -->
<application android:label="@string/app_name"
android:icon="@drawable/icon"
android:allowBackup="true">
<activity android:label="@string/app_name"
android:windowSoftInputMode="adjustResize"
android:configChanges="orientation|keyboardHidden|screenSize"
android:name=".HyperRogue"
android:launchMode="singleTask" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:label="HyperRogue Settings"
android:windowSoftInputMode="adjustResize"
android:configChanges="orientation|keyboardHidden|screenSize"
android:name=".HyperSettings">
</activity>
<service android:name=".ForegroundService" >
</service>
<provider
android:name=".HyperProvider"
android:authorities="com.roguetemple.hyperroid"
android:exported="true"/>
</application>
</manifest>

View File

@ -0,0 +1,420 @@
// taken from Texample,
// http://fractiousg.blogspot.com/201/4/rendering-text-in-opengl-on-android.html
// Zeno Rogue's modifications (for HyperRogue 4.2):
// * to provide a Typeface as an argument, instead of Assets
// * drawAlign to provide alignment in HyperRogue-compatible fashion
// For HyperRogue 5.3:
// * Unicode characters
// This is a OpenGL ES 1.0 dynamic font rendering system. It loads actual font
// files, generates a font map (texture) from them, and allows rendering of
// text strings.
//
// NOTE: the rendering portions of this class uses a sprite batcher in order
// provide decent speed rendering. Also, rendering assumes a BOTTOM-LEFT
// origin, and the (x,y) positions are relative to that, as well as the
// bottom-left of the string to render.
package com.android.texample;
import javax.microedition.khronos.opengles.GL10;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.opengl.GLUtils;
public class GLText {
//
StringBuffer allchars;
void buildAllchars() {
allchars = new StringBuffer();
for(char c=32; c<=126; c++)
allchars.append(c);
allchars.append("°´ÁÄÇÉÍÎÖÚÜßáâäçèéìíîóöøùúüýąćČčĎďĘęĚěğİıŁłńňŘřŚśŞşŠšťůŹźŻżŽžϕЁАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяё");
}
int numChars() {
return allchars.length() + 1;
}
int charIndex(char c) {
int l = allchars.length();
for(int i=0; i<l; i++)
if(allchars.charAt(i) == c)
return i;
return allchars.length();
}
//--Constants--//
public final static char CHAR_NONE = '?'; // Character to Use for Unknown (ASCII Code)
public final static int FONT_SIZE_MIN = 6; // Minumum Font Size (Pixels)
public final static int FONT_SIZE_MAX = 180; // Maximum Font Size (Pixels)
public final static int CHAR_BATCH_SIZE = 100; // Number of Characters to Render Per Batch
//--Members--//
GL10 gl; // GL10 Instance
AssetManager assets; // Asset Manager
SpriteBatch batch; // Batch Renderer
int fontPadX, fontPadY; // Font Padding (Pixels; On Each Side, ie. Doubled on Both X+Y Axis)
float fontHeight; // Font Height (Actual; Pixels)
float fontAscent; // Font Ascent (Above Baseline; Pixels)
float fontDescent; // Font Descent (Below Baseline; Pixels)
int textureId; // Font Texture ID [NOTE: Public for Testing Purposes Only!]
int textureSize; // Texture Size for Font (Square) [NOTE: Public for Testing Purposes Only!]
TextureRegion textureRgn; // Full Texture Region
float charWidthMax; // Character Width (Maximum; Pixels)
float charHeight; // Character Height (Maximum; Pixels)
final float[] charWidths; // Width of Each Character (Actual; Pixels)
TextureRegion[] charRgn; // Region of Each Character (Texture Coordinates)
int cellWidth, cellHeight; // Character Cell Width/Height
int rowCnt, colCnt; // Number of Rows/Columns
float scaleX, scaleY; // Font Scale (X,Y Axis)
float spaceX; // Additional (X,Y Axis) Spacing (Unscaled)
//--Constructor--//
// D: save GL instance + asset manager, create arrays, and initialize the members
// A: gl - OpenGL ES 10 Instance
public GLText(GL10 gl) {
this.gl = gl; // Save the GL10 Instance
buildAllchars();
batch = new SpriteBatch( gl, CHAR_BATCH_SIZE ); // Create Sprite Batch (with Defined Size)
charWidths = new float[numChars()]; // Create the Array of Character Widths
charRgn = new TextureRegion[numChars()]; // Create the Array of Character Regions
// initialize remaining members
fontPadX = 0;
fontPadY = 0;
fontHeight = 0.0f;
fontAscent = 0.0f;
fontDescent = 0.0f;
textureId = -1;
textureSize = 0;
charWidthMax = 0;
charHeight = 0;
cellWidth = 0;
cellHeight = 0;
rowCnt = 0;
colCnt = 0;
scaleX = 1.0f; // Default Scale = 1 (Unscaled)
scaleY = 1.0f; // Default Scale = 1 (Unscaled)
spaceX = 0.0f;
}
//--Load Font--//
// description
// this will load the specified font file, create a texture for the defined
// character range, and setup all required values used to render with it.
// arguments:
// file - Filename of the font (.ttf, .otf) to use. In 'Assets' folder.
// size - Requested pixel size of font (height)
// padX, padY - Extra padding per character (X+Y Axis); to prevent overlapping characters.
public boolean load(Typeface tf, int size, int padX, int padY) {
// setup requested values
fontPadX = padX; // Set Requested X Axis Padding
fontPadY = padY; // Set Requested Y Axis Padding
// load the font and setup paint instance for drawing
// Typeface tf = Typeface.createFromAsset( assets, file ); // Create the Typeface from Font File
Paint paint = new Paint(); // Create Android Paint Instance
paint.setAntiAlias( true ); // Enable Anti Alias
paint.setTextSize( size ); // Set Text Size
paint.setColor( 0xffffffff ); // Set ARGB (White, Opaque)
// paint.setTypeface( tf ); // Set Typeface
paint.setTypeface(tf);
// get font metrics
Paint.FontMetrics fm = paint.getFontMetrics(); // Get Font Metrics
fontHeight = (float)Math.ceil( Math.abs( fm.bottom ) + Math.abs( fm.top ) ); // Calculate Font Height
fontAscent = (float)Math.ceil( Math.abs( fm.ascent ) ); // Save Font Ascent
fontDescent = (float)Math.ceil( Math.abs( fm.descent ) ); // Save Font Descent
// determine the width of each character (including unknown character)
// also determine the maximum character width
char[] s = new char[2]; // Create Character Array
charWidthMax = charHeight = 0; // Reset Character Width/Height Maximums
float[] w = new float[2]; // Working Width Value
int cnt = 0; // Array Counter
for ( int i=0; i<allchars.length(); i++ ) { // FOR Each Character
s[0] = allchars.charAt(i); // Set Character
paint.getTextWidths( s, 0, 1, w ); // Get Character Bounds
charWidths[cnt] = w[0]; // Get Width
if ( charWidths[cnt] > charWidthMax ) // IF Width Larger Than Max Width
charWidthMax = charWidths[cnt]; // Save New Max Width
cnt++; // Advance Array Counter
}
s[0] = CHAR_NONE; // Set Unknown Character
paint.getTextWidths( s, 0, 1, w ); // Get Character Bounds
charWidths[cnt] = w[0]; // Get Width
if ( charWidths[cnt] > charWidthMax ) // IF Width Larger Than Max Width
charWidthMax = charWidths[cnt]; // Save New Max Width
cnt++; // Advance Array Counter
// set character height to font height
charHeight = fontHeight; // Set Character Height
// find the maximum size, validate, and setup cell sizes
cellWidth = (int)charWidthMax + ( 2 * fontPadX ); // Set Cell Width
cellHeight = (int)charHeight + ( 2 * fontPadY ); // Set Cell Height
int maxSize = cellWidth > cellHeight ? cellWidth : cellHeight; // Save Max Size (Width/Height)
if ( maxSize < FONT_SIZE_MIN || maxSize > FONT_SIZE_MAX ) // IF Maximum Size Outside Valid Bounds
return false; // Return Error
// set texture size based on max font size (width or height)
// NOTE: these values are fixed, based on the defined characters. when
// changing start/end characters (CHAR_START/CHAR_END) this will need adjustment too!
if ( maxSize <= 24 ) // IF Max Size is 18 or Less
textureSize = 256; // Set 256 Texture Size
else if ( maxSize <= 40 ) // ELSE IF Max Size is 40 or Less
textureSize = 512; // Set 512 Texture Size
else if ( maxSize <= 80 ) // ELSE IF Max Size is 80 or Less
textureSize = 1024; // Set 1024 Texture Size
else // ELSE IF Max Size is Larger Than 80 (and Less than FONT_SIZE_MAX)
textureSize = 2048; // Set 2048 Texture Size
// create an empty bitmap (alpha only)
Bitmap bitmap = Bitmap.createBitmap( textureSize, textureSize, Bitmap.Config.ALPHA_8 ); // Create Bitmap
Canvas canvas = new Canvas( bitmap ); // Create Canvas for Rendering to Bitmap
bitmap.eraseColor( 0x00000000 ); // Set Transparent Background (ARGB)
// calculate rows/columns
// NOTE: while not required for anything, these may be useful to have :)
colCnt = textureSize / cellWidth; // Calculate Number of Columns
rowCnt = (int)Math.ceil( (float)numChars() / (float)colCnt ); // Calculate Number of Rows
// render each of the characters to the canvas (ie. build the font map)
float x = fontPadX; // Set Start Position (X)
float y = ( cellHeight - 1 ) - fontDescent - fontPadY; // Set Start Position (Y)
for (int i=0; i<allchars.length(); i++) { // FOR Each Character
s[0] = allchars.charAt(i); // Set Character to Draw
canvas.drawText( s, 0, 1, x, y, paint ); // Draw Character
x += cellWidth; // Move to Next Character
if ( ( x + cellWidth - fontPadX ) > textureSize ) { // IF End of Line Reached
x = fontPadX; // Set X for New Row
y += cellHeight; // Move Down a Row
}
}
s[0] = CHAR_NONE; // Set Character to Use for NONE
canvas.drawText( s, 0, 1, x, y, paint ); // Draw Character
// generate a new texture
int[] textureIds = new int[1]; // Array to Get Texture Id
gl.glGenTextures( 1, textureIds, 0 ); // Generate New Texture
textureId = textureIds[0]; // Save Texture Id
// setup filters for texture
gl.glBindTexture( GL10.GL_TEXTURE_2D, textureId ); // Bind Texture
gl.glTexParameterf( GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST ); // Set Minification Filter
gl.glTexParameterf( GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR ); // Set Magnification Filter
gl.glTexParameterf( GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE ); // Set U Wrapping
gl.glTexParameterf( GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE ); // Set V Wrapping
// load the generated bitmap onto the texture
GLUtils.texImage2D( GL10.GL_TEXTURE_2D, 0, bitmap, 0 ); // Load Bitmap to Texture
gl.glBindTexture( GL10.GL_TEXTURE_2D, 0 ); // Unbind Texture
// release the bitmap
bitmap.recycle(); // Release the Bitmap
// setup the array of character texture regions
x = 0; // Initialize X
y = 0; // Initialize Y
for ( int c = 0; c < numChars(); c++ ) { // FOR Each Character (On Texture)
charRgn[c] = new TextureRegion( textureSize, textureSize, x, y, cellWidth-1, cellHeight-1 ); // Create Region for Character
x += cellWidth; // Move to Next Char (Cell)
if ( x + cellWidth > textureSize ) {
x = 0; // Reset X Position to Start
y += cellHeight; // Move to Next Row (Cell)
}
}
// create full texture region
textureRgn = new TextureRegion( textureSize, textureSize, 0, 0, textureSize, textureSize ); // Create Full Texture Region
// return success
return true; // Return Success
}
//--Begin/End Text Drawing--//
// D: call these methods before/after (respectively all draw() calls using a text instance
// NOTE: color is set on a per-batch basis, and fonts should be 8-bit alpha only!!!
// A: red, green, blue - RGB values for font (default = 1.0)
// alpha - optional alpha value for font (default = 1.0)
// R: [none]
public void begin() {
begin( 1.0f, 1.0f, 1.0f, 1.0f ); // Begin with White Opaque
}
public void begin(float alpha) {
begin( 1.0f, 1.0f, 1.0f, alpha ); // Begin with White (Explicit Alpha)
}
public void begin(float red, float green, float blue, float alpha) {
gl.glColor4f( red, green, blue, alpha ); // Set Color+Alpha
gl.glBindTexture( GL10.GL_TEXTURE_2D, textureId ); // Bind the Texture
batch.beginBatch(); // Begin Batch
}
public void end() {
batch.endBatch(); // End Batch
gl.glColor4f( 1.0f, 1.0f, 1.0f, 1.0f ); // Restore Default Color/Alpha
}
//--Draw Text--//
// D: draw text at the specified x,y position
// A: text - the string to draw
// x, y - the x,y position to draw text at (bottom left of text; including descent)
// R: [none]
public void draw(String text, float x, float y) {
float chrHeight = cellHeight * scaleY; // Calculate Scaled Character Height
float chrWidth = cellWidth * scaleX; // Calculate Scaled Character Width
int len = text.length(); // Get String Length
x += ( chrWidth / 2.0f ) - ( fontPadX * scaleX ); // Adjust Start X
y += ( chrHeight / 2.0f ) - ( fontPadY * scaleY ); // Adjust Start Y
for ( int i = 0; i < len; i++ ) { // FOR Each Character in String
int c = charIndex(text.charAt( i )); // Calculate Character Index (Offset by First Char in Font)
batch.drawSprite( x, y, chrWidth, chrHeight, charRgn[c] ); // Draw the Character
x += ( charWidths[c] + spaceX ) * scaleX; // Advance X Position by Scaled Character Width
}
}
//--Draw Text Centered--//
// D: draw text CENTERED at the specified x,y position
// A: text - the string to draw
// x, y - the x,y position to draw text at (bottom left of text)
// R: the total width of the text that was drawn
public float drawC(String text, float x, float y) {
float len = getLength( text ); // Get Text Length
draw( text, x - ( len / 2.0f ), y - ( getCharHeight() / 2.0f ) ); // Draw Text Centered
return len; // Return Length
}
public float drawCX(String text, float x, float y) {
float len = getLength( text ); // Get Text Length
draw( text, x - ( len / 2.0f ), y ); // Draw Text Centered (X-Axis Only)
return len; // Return Length
}
public void drawCY(String text, float x, float y) {
draw( text, x, y - ( getCharHeight() / 2.0f ) ); // Draw Text Centered (Y-Axis Only)
}
public void drawAlign(String text, float x, float y, int align) {
float len = getLength( text ); // Get Text Length
draw( text, x - len * (align / 16.0f), y - ( getCharHeight() / 2.0f ) ); // Draw Text Centered (Y-Axis Only)
}
//--Set Scale--//
// D: set the scaling to use for the font
// A: scale - uniform scale for both x and y axis scaling
// sx, sy - separate x and y axis scaling factors
// R: [none]
public void setScale(float scale) {
scaleX = scaleY = scale; // Set Uniform Scale
}
public void setScale(float sx, float sy) {
scaleX = sx; // Set X Scale
scaleY = sy; // Set Y Scale
}
//--Get Scale--//
// D: get the current scaling used for the font
// A: [none]
// R: the x/y scale currently used for scale
public float getScaleX() {
return scaleX; // Return X Scale
}
public float getScaleY() {
return scaleY; // Return Y Scale
}
//--Set Space--//
// D: set the spacing (unscaled; ie. pixel size) to use for the font
// A: space - space for x axis spacing
// R: [none]
public void setSpace(float space) {
spaceX = space; // Set Space
}
//--Get Space--//
// D: get the current spacing used for the font
// A: [none]
// R: the x/y space currently used for scale
public float getSpace() {
return spaceX; // Return X Space
}
//--Get Length of a String--//
// D: return the length of the specified string if rendered using current settings
// A: text - the string to get length for
// R: the length of the specified string (pixels)
public float getLength(String text) {
float len = 0.0f; // Working Length
int strLen = text.length(); // Get String Length (Characters)
for ( int i = 0; i < strLen; i++ ) { // For Each Character in String (Except Last
int c = charIndex(text.charAt( i )); // Calculate Character Index (Offset by First Char in Font)
len += ( charWidths[c] * scaleX ); // Add Scaled Character Width to Total Length
}
len += ( strLen > 1 ? ( ( strLen - 1 ) * spaceX ) * scaleX : 0 ); // Add Space Length
return len; // Return Total Length
}
//--Get Width/Height of Character--//
// D: return the scaled width/height of a character, or max character width
// NOTE: since all characters are the same height, no character index is required!
// NOTE: excludes spacing!!
// A: chr - the character to get width for
// R: the requested character size (scaled)
public float getCharWidth(char chr) {
return ( charWidths[charIndex(chr)] * scaleX ); // Return Scaled Character Width
}
public float getCharWidthMax() {
return ( charWidthMax * scaleX ); // Return Scaled Max Character Width
}
public float getCharHeight() {
return ( charHeight * scaleY ); // Return Scaled Character Height
}
//--Get Font Metrics--//
// D: return the specified (scaled) font metric
// A: [none]
// R: the requested font metric (scaled)
public float getAscent() {
return ( fontAscent * scaleY ); // Return Font Ascent
}
public float getDescent() {
return ( fontDescent * scaleY ); // Return Font Descent
}
public float getHeight() {
return ( fontHeight * scaleY ); // Return Font Height (Actual)
}
//--Draw Font Texture--//
// D: draw the entire font texture (NOTE: for testing purposes only)
// A: width, height - the width and height of the area to draw to. this is used
// to draw the texture to the top-left corner.
public void drawTexture(int width, int height) {
batch.beginBatch( textureId ); // Begin Batch (Bind Texture)
batch.drawSprite( textureSize / 2, height - ( textureSize / 2 ), textureSize, textureSize, textureRgn ); // Draw
batch.endBatch(); // End Batch
}
}

View File

@ -0,0 +1,125 @@
// taken from Texample,
// http://fractiousg.blogspot.com/201/4/rendering-text-in-opengl-on-android.html
package com.android.texample;
// import android.util.FloatMath;
import javax.microedition.khronos.opengles.GL10;
public class SpriteBatch {
//--Constants--//
final static int VERTEX_SIZE = 4; // Vertex Size (in Components) ie. (X,Y,U,V)
final static int VERTICES_PER_SPRITE = 4; // Vertices Per Sprite
final static int INDICES_PER_SPRITE = 6; // Indices Per Sprite
//--Members--//
GL10 gl; // GL Instance
Vertices vertices; // Vertices Instance Used for Rendering
float[] vertexBuffer; // Vertex Buffer
int bufferIndex; // Vertex Buffer Start Index
int maxSprites; // Maximum Sprites Allowed in Buffer
int numSprites; // Number of Sprites Currently in Buffer
//--Constructor--//
// D: prepare the sprite batcher for specified maximum number of sprites
// A: gl - the gl instance to use for rendering
// maxSprites - the maximum allowed sprites per batch
public SpriteBatch(GL10 gl, int maxSprites) {
this.gl = gl; // Save GL Instance
this.vertexBuffer = new float[maxSprites * VERTICES_PER_SPRITE * VERTEX_SIZE]; // Create Vertex Buffer
this.vertices = new Vertices( gl, maxSprites * VERTICES_PER_SPRITE, maxSprites * INDICES_PER_SPRITE, false, true, false ); // Create Rendering Vertices
this.bufferIndex = 0; // Reset Buffer Index
this.maxSprites = maxSprites; // Save Maximum Sprites
this.numSprites = 0; // Clear Sprite Counter
short[] indices = new short[maxSprites * INDICES_PER_SPRITE]; // Create Temp Index Buffer
int len = indices.length; // Get Index Buffer Length
short j = 0; // Counter
for ( int i = 0; i < len; i+= INDICES_PER_SPRITE, j += VERTICES_PER_SPRITE ) { // FOR Each Index Set (Per Sprite)
indices[i + 0] = (short)( j + 0 ); // Calculate Index 0
indices[i + 1] = (short)( j + 1 ); // Calculate Index 1
indices[i + 2] = (short)( j + 2 ); // Calculate Index 2
indices[i + 3] = (short)( j + 2 ); // Calculate Index 3
indices[i + 4] = (short)( j + 3 ); // Calculate Index 4
indices[i + 5] = (short)( j + 0 ); // Calculate Index 5
}
vertices.setIndices( indices, 0, len ); // Set Index Buffer for Rendering
}
//--Begin Batch--//
// D: signal the start of a batch. set the texture and clear buffer
// NOTE: the overloaded (non-texture) version assumes that the texture is already bound!
// A: textureId - the ID of the texture to use for the batch
// R: [none]
public void beginBatch(int textureId) {
gl.glBindTexture( GL10.GL_TEXTURE_2D, textureId ); // Bind the Texture
numSprites = 0; // Empty Sprite Counter
bufferIndex = 0; // Reset Buffer Index (Empty)
}
public void beginBatch() {
numSprites = 0; // Empty Sprite Counter
bufferIndex = 0; // Reset Buffer Index (Empty)
}
//--End Batch--//
// D: signal the end of a batch. render the batched sprites
// A: [none]
// R: [none]
public void endBatch() {
if ( numSprites > 0 ) { // IF Any Sprites to Render
vertices.setVertices( vertexBuffer, 0, bufferIndex ); // Set Vertices from Buffer
vertices.bind(); // Bind Vertices
vertices.draw( GL10.GL_TRIANGLES, 0, numSprites * INDICES_PER_SPRITE ); // Render Batched Sprites
vertices.unbind(); // Unbind Vertices
}
}
//--Draw Sprite to Batch--//
// D: batch specified sprite to batch. adds vertices for sprite to vertex buffer
// NOTE: MUST be called after beginBatch(), and before endBatch()!
// NOTE: if the batch overflows, this will render the current batch, restart it,
// and then batch this sprite.
// A: x, y - the x,y position of the sprite (center)
// width, height - the width and height of the sprite
// region - the texture region to use for sprite
// R: [none]
public void drawSprite(float x, float y, float width, float height, TextureRegion region) {
if ( numSprites == maxSprites ) { // IF Sprite Buffer is Full
endBatch(); // End Batch
// NOTE: leave current texture bound!!
numSprites = 0; // Empty Sprite Counter
bufferIndex = 0; // Reset Buffer Index (Empty)
}
float halfWidth = width / 2.0f; // Calculate Half Width
float halfHeight = height / 2.0f; // Calculate Half Height
float x1 = x - halfWidth; // Calculate Left X
float y1 = y - halfHeight; // Calculate Bottom Y
float x2 = x + halfWidth; // Calculate Right X
float y2 = y + halfHeight; // Calculate Top Y
vertexBuffer[bufferIndex++] = x1; // Add X for Vertex 0
vertexBuffer[bufferIndex++] = y1; // Add Y for Vertex 0
vertexBuffer[bufferIndex++] = region.u1; // Add U for Vertex 0
vertexBuffer[bufferIndex++] = region.v2; // Add V for Vertex 0
vertexBuffer[bufferIndex++] = x2; // Add X for Vertex 1
vertexBuffer[bufferIndex++] = y1; // Add Y for Vertex 1
vertexBuffer[bufferIndex++] = region.u2; // Add U for Vertex 1
vertexBuffer[bufferIndex++] = region.v2; // Add V for Vertex 1
vertexBuffer[bufferIndex++] = x2; // Add X for Vertex 2
vertexBuffer[bufferIndex++] = y2; // Add Y for Vertex 2
vertexBuffer[bufferIndex++] = region.u2; // Add U for Vertex 2
vertexBuffer[bufferIndex++] = region.v1; // Add V for Vertex 2
vertexBuffer[bufferIndex++] = x1; // Add X for Vertex 3
vertexBuffer[bufferIndex++] = y2; // Add Y for Vertex 3
vertexBuffer[bufferIndex++] = region.u1; // Add U for Vertex 3
vertexBuffer[bufferIndex++] = region.v1; // Add V for Vertex 3
numSprites++; // Increment Sprite Count
}
}

View File

@ -0,0 +1,23 @@
// taken from Texample,
// http://fractiousg.blogspot.com/201/4/rendering-text-in-opengl-on-android.html
package com.android.texample;
class TextureRegion {
//--Members--//
public float u1, v1; // Top/Left U,V Coordinates
public float u2, v2; // Bottom/Right U,V Coordinates
//--Constructor--//
// D: calculate U,V coordinates from specified texture coordinates
// A: texWidth, texHeight - the width and height of the texture the region is for
// x, y - the top/left (x,y) of the region on the texture (in pixels)
// width, height - the width and height of the region on the texture (in pixels)
public TextureRegion(float texWidth, float texHeight, float x, float y, float width, float height) {
this.u1 = x / texWidth; // Calculate U1
this.v1 = y / texHeight; // Calculate V1
this.u2 = this.u1 + ( width / texWidth ); // Calculate U2
this.v2 = this.v1 + ( height / texHeight ); // Calculate V2
}
}

View File

@ -0,0 +1,264 @@
// taken from Texample,
// http://fractiousg.blogspot.com/201/4/rendering-text-in-opengl-on-android.html
package com.android.texample;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.IntBuffer;
import java.nio.ShortBuffer;
import javax.microedition.khronos.opengles.GL10;
public class Vertices {
//--Constants--//
final static int POSITION_CNT_2D = 2; // Number of Components in Vertex Position for 2D
final static int POSITION_CNT_3D = 3; // Number of Components in Vertex Position for 3D
final static int COLOR_CNT = 4; // Number of Components in Vertex Color
final static int TEXCOORD_CNT = 2; // Number of Components in Vertex Texture Coords
final static int NORMAL_CNT = 3; // Number of Components in Vertex Normal
final static int INDEX_SIZE = Short.SIZE / 8; // Index Byte Size (Short.SIZE = bits)
//--Members--//
// NOTE: all members are constant, and initialized in constructor!
final GL10 gl; // GL Instance
final boolean hasColor; // Use Color in Vertices
final boolean hasTexCoords; // Use Texture Coords in Vertices
final boolean hasNormals; // Use Normals in Vertices
public final int positionCnt; // Number of Position Components (2=2D, 3=3D)
public final int vertexStride; // Vertex Stride (Element Size of a Single Vertex)
public final int vertexSize; // Bytesize of a Single Vertex
final IntBuffer vertices; // Vertex Buffer
final ShortBuffer indices; // Index Buffer
public int numVertices; // Number of Vertices in Buffer
public int numIndices; // Number of Indices in Buffer
final int[] tmpBuffer; // Temp Buffer for Vertex Conversion
//--Constructor--//
// D: create the vertices/indices as specified (for 2d/3d)
// A: gl - the gl instance to use
// maxVertices - maximum vertices allowed in buffer
// maxIndices - maximum indices allowed in buffer
// hasColor - use color values in vertices
// hasTexCoords - use texture coordinates in vertices
// hasNormals - use normals in vertices
// use3D - (false, default) use 2d positions (ie. x/y only)
// (true) use 3d positions (ie. x/y/z)
public Vertices(GL10 gl, int maxVertices, int maxIndices, boolean hasColor, boolean hasTexCoords, boolean hasNormals) {
this( gl, maxVertices, maxIndices, hasColor, hasTexCoords, hasNormals, false ); // Call Overloaded Constructor
}
public Vertices(GL10 gl, int maxVertices, int maxIndices, boolean hasColor, boolean hasTexCoords, boolean hasNormals, boolean use3D) {
this.gl = gl; // Save GL Instance
this.hasColor = hasColor; // Save Color Flag
this.hasTexCoords = hasTexCoords; // Save Texture Coords Flag
this.hasNormals = hasNormals; // Save Normals Flag
this.positionCnt = use3D ? POSITION_CNT_3D : POSITION_CNT_2D; // Set Position Component Count
this.vertexStride = this.positionCnt + ( hasColor ? COLOR_CNT : 0 ) + ( hasTexCoords ? TEXCOORD_CNT : 0 ) + ( hasNormals ? NORMAL_CNT : 0 ); // Calculate Vertex Stride
this.vertexSize = this.vertexStride * 4; // Calculate Vertex Byte Size
ByteBuffer buffer = ByteBuffer.allocateDirect( maxVertices * vertexSize ); // Allocate Buffer for Vertices (Max)
buffer.order( ByteOrder.nativeOrder() ); // Set Native Byte Order
this.vertices = buffer.asIntBuffer(); // Save Vertex Buffer
if ( maxIndices > 0 ) { // IF Indices Required
buffer = ByteBuffer.allocateDirect( maxIndices * INDEX_SIZE ); // Allocate Buffer for Indices (MAX)
buffer.order( ByteOrder.nativeOrder() ); // Set Native Byte Order
this.indices = buffer.asShortBuffer(); // Save Index Buffer
}
else // ELSE Indices Not Required
indices = null; // No Index Buffer
numVertices = 0; // Zero Vertices in Buffer
numIndices = 0; // Zero Indices in Buffer
this.tmpBuffer = new int[maxVertices * vertexSize / 4]; // Create Temp Buffer
}
//--Set Vertices--//
// D: set the specified vertices in the vertex buffer
// NOTE: optimized to use integer buffer!
// A: vertices - array of vertices (floats) to set
// offset - offset to first vertex in array
// length - number of floats in the vertex array (total)
// for easy setting use: vtx_cnt * (this.vertexSize / 4)
// R: [none]
public void setVertices(float[] vertices, int offset, int length) {
this.vertices.clear(); // Remove Existing Vertices
int last = offset + length; // Calculate Last Element
for ( int i = offset, j = 0; i < last; i++, j++ ) // FOR Each Specified Vertex
tmpBuffer[j] = Float.floatToRawIntBits( vertices[i] ); // Set Vertex as Raw Integer Bits in Buffer
this.vertices.put( tmpBuffer, 0, length ); // Set New Vertices
this.vertices.flip(); // Flip Vertex Buffer
this.numVertices = length / this.vertexStride; // Save Number of Vertices
//this.numVertices = length / ( this.vertexSize / 4 ); // Save Number of Vertices
}
//--Set Indices--//
// D: set the specified indices in the index buffer
// A: indices - array of indices (shorts) to set
// offset - offset to first index in array
// length - number of indices in array (from offset)
// R: [none]
public void setIndices(short[] indices, int offset, int length) {
this.indices.clear(); // Clear Existing Indices
this.indices.put( indices, offset, length ); // Set New Indices
this.indices.flip(); // Flip Index Buffer
this.numIndices = length; // Save Number of Indices
}
//--Bind--//
// D: perform all required binding/state changes before rendering batches.
// USAGE: call once before calling draw() multiple times for this buffer.
// A: [none]
// R: [none]
public void bind() {
gl.glEnableClientState( GL10.GL_VERTEX_ARRAY ); // Enable Position in Vertices
vertices.position( 0 ); // Set Vertex Buffer to Position
gl.glVertexPointer( positionCnt, GL10.GL_FLOAT, vertexSize, vertices ); // Set Vertex Pointer
if ( hasColor ) { // IF Vertices Have Color
gl.glEnableClientState( GL10.GL_COLOR_ARRAY ); // Enable Color in Vertices
vertices.position( positionCnt ); // Set Vertex Buffer to Color
gl.glColorPointer( COLOR_CNT, GL10.GL_FLOAT, vertexSize, vertices ); // Set Color Pointer
}
if ( hasTexCoords ) { // IF Vertices Have Texture Coords
gl.glEnableClientState( GL10.GL_TEXTURE_COORD_ARRAY ); // Enable Texture Coords in Vertices
vertices.position( positionCnt + ( hasColor ? COLOR_CNT : 0 ) ); // Set Vertex Buffer to Texture Coords (NOTE: position based on whether color is also specified)
gl.glTexCoordPointer( TEXCOORD_CNT, GL10.GL_FLOAT, vertexSize, vertices ); // Set Texture Coords Pointer
}
if ( hasNormals ) {
gl.glEnableClientState( GL10.GL_NORMAL_ARRAY ); // Enable Normals in Vertices
vertices.position( positionCnt + ( hasColor ? COLOR_CNT : 0 ) + ( hasTexCoords ? TEXCOORD_CNT : 0 ) ); // Set Vertex Buffer to Normals (NOTE: position based on whether color/texcoords is also specified)
gl.glNormalPointer( GL10.GL_FLOAT, vertexSize, vertices ); // Set Normals Pointer
}
}
//--Draw--//
// D: draw the currently bound vertices in the vertex/index buffers
// USAGE: can only be called after calling bind() for this buffer.
// A: primitiveType - the type of primitive to draw
// offset - the offset in the vertex/index buffer to start at
// numVertices - the number of vertices (indices) to draw
// R: [none]
public void draw(int primitiveType, int offset, int numVertices) {
if ( indices != null ) { // IF Indices Exist
indices.position( offset ); // Set Index Buffer to Specified Offset
gl.glDrawElements( primitiveType, numVertices, GL10.GL_UNSIGNED_SHORT, indices ); // Draw Indexed
}
else { // ELSE No Indices Exist
gl.glDrawArrays( primitiveType, offset, numVertices ); // Draw Direct (Array)
}
}
//--Unbind--//
// D: clear binding states when done rendering batches.
// USAGE: call once before calling draw() multiple times for this buffer.
// A: [none]
// R: [none]
public void unbind() {
gl.glDisableClientState( GL10.GL_VERTEX_ARRAY ); // Clear Vertex Array State
if ( hasColor ) // IF Vertices Have Color
gl.glDisableClientState( GL10.GL_COLOR_ARRAY ); // Clear Color State
if ( hasTexCoords ) // IF Vertices Have Texture Coords
gl.glDisableClientState( GL10.GL_TEXTURE_COORD_ARRAY ); // Clear Texture Coords State
if ( hasNormals ) // IF Vertices Have Normals
gl.glDisableClientState( GL10.GL_NORMAL_ARRAY ); // Clear Normals State
}
//--Draw Full--//
// D: draw the vertices in the vertex/index buffers
// NOTE: unoptimized version! use bind()/draw()/unbind() for batches
// A: primitiveType - the type of primitive to draw
// offset - the offset in the vertex/index buffer to start at
// numVertices - the number of vertices (indices) to draw
// R: [none]
public void drawFull(int primitiveType, int offset, int numVertices) {
gl.glEnableClientState( GL10.GL_VERTEX_ARRAY ); // Enable Position in Vertices
vertices.position( 0 ); // Set Vertex Buffer to Position
gl.glVertexPointer( positionCnt, GL10.GL_FLOAT, vertexSize, vertices ); // Set Vertex Pointer
if ( hasColor ) { // IF Vertices Have Color
gl.glEnableClientState( GL10.GL_COLOR_ARRAY ); // Enable Color in Vertices
vertices.position( positionCnt ); // Set Vertex Buffer to Color
gl.glColorPointer( COLOR_CNT, GL10.GL_FLOAT, vertexSize, vertices ); // Set Color Pointer
}
if ( hasTexCoords ) { // IF Vertices Have Texture Coords
gl.glEnableClientState( GL10.GL_TEXTURE_COORD_ARRAY ); // Enable Texture Coords in Vertices
vertices.position( positionCnt + ( hasColor ? COLOR_CNT : 0 ) ); // Set Vertex Buffer to Texture Coords (NOTE: position based on whether color is also specified)
gl.glTexCoordPointer( TEXCOORD_CNT, GL10.GL_FLOAT, vertexSize, vertices ); // Set Texture Coords Pointer
}
if ( indices != null ) { // IF Indices Exist
indices.position( offset ); // Set Index Buffer to Specified Offset
gl.glDrawElements( primitiveType, numVertices, GL10.GL_UNSIGNED_SHORT, indices ); // Draw Indexed
}
else { // ELSE No Indices Exist
gl.glDrawArrays( primitiveType, offset, numVertices ); // Draw Direct (Array)
}
if ( hasTexCoords ) // IF Vertices Have Texture Coords
gl.glDisableClientState( GL10.GL_TEXTURE_COORD_ARRAY ); // Clear Texture Coords State
if ( hasColor ) // IF Vertices Have Color
gl.glDisableClientState( GL10.GL_COLOR_ARRAY ); // Clear Color State
gl.glDisableClientState( GL10.GL_VERTEX_ARRAY ); // Clear Vertex Array State
}
//--Set Vertex Elements--//
// D: use these methods to alter the values (position, color, textcoords, normals) for vertices
// WARNING: these do NOT validate any values, ensure that the index AND specified
// elements EXIST before using!!
// A: x, y, z - the x,y,z position to set in buffer
// r, g, b, a - the r,g,b,a color to set in buffer
// u, v - the u,v texture coords to set in buffer
// nx, ny, nz - the x,y,z normal to set in buffer
// R: [none]
void setVtxPosition(int vtxIdx, float x, float y) {
int index = vtxIdx * vertexStride; // Calculate Actual Index
vertices.put( index + 0, Float.floatToRawIntBits( x ) ); // Set X
vertices.put( index + 1, Float.floatToRawIntBits( y ) ); // Set Y
}
void setVtxPosition(int vtxIdx, float x, float y, float z) {
int index = vtxIdx * vertexStride; // Calculate Actual Index
vertices.put( index + 0, Float.floatToRawIntBits( x ) ); // Set X
vertices.put( index + 1, Float.floatToRawIntBits( y ) ); // Set Y
vertices.put( index + 2, Float.floatToRawIntBits( z ) ); // Set Z
}
void setVtxColor(int vtxIdx, float r, float g, float b, float a) {
int index = ( vtxIdx * vertexStride ) + positionCnt; // Calculate Actual Index
vertices.put( index + 0, Float.floatToRawIntBits( r ) ); // Set Red
vertices.put( index + 1, Float.floatToRawIntBits( g ) ); // Set Green
vertices.put( index + 2, Float.floatToRawIntBits( b ) ); // Set Blue
vertices.put( index + 3, Float.floatToRawIntBits( a ) ); // Set Alpha
}
void setVtxColor(int vtxIdx, float r, float g, float b) {
int index = ( vtxIdx * vertexStride ) + positionCnt; // Calculate Actual Index
vertices.put( index + 0, Float.floatToRawIntBits( r ) ); // Set Red
vertices.put( index + 1, Float.floatToRawIntBits( g ) ); // Set Green
vertices.put( index + 2, Float.floatToRawIntBits( b ) ); // Set Blue
}
void setVtxColor(int vtxIdx, float a) {
int index = ( vtxIdx * vertexStride ) + positionCnt; // Calculate Actual Index
vertices.put( index + 3, Float.floatToRawIntBits( a ) ); // Set Alpha
}
void setVtxTexCoords(int vtxIdx, float u, float v) {
int index = ( vtxIdx * vertexStride ) + positionCnt + ( hasColor ? COLOR_CNT : 0 ); // Calculate Actual Index
vertices.put( index + 0, Float.floatToRawIntBits( u ) ); // Set U
vertices.put( index + 1, Float.floatToRawIntBits( v ) ); // Set V
}
void setVtxNormal(int vtxIdx, float x, float y, float z) {
int index = ( vtxIdx * vertexStride ) + positionCnt + ( hasColor ? COLOR_CNT : 0 ) + ( hasTexCoords ? TEXCOORD_CNT : 0 ); // Calculate Actual Index
vertices.put( index + 0, Float.floatToRawIntBits( x ) ); // Set X
vertices.put( index + 1, Float.floatToRawIntBits( y ) ); // Set Y
vertices.put( index + 2, Float.floatToRawIntBits( z ) ); // Set Z
}
}

View File

@ -0,0 +1,59 @@
package com.roguetemple.hyperroid;
import android.app.Notification;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.IBinder;
import android.support.v4.app.NotificationCompat;
import android.util.Log;
import android.widget.Toast;
public class ForegroundService extends Service {
public static String MAIN_ACTION = "com.roguetemple.hyperroid.action.main";
public static String STARTFOREGROUND_ACTION = "com.roguetemple.hyperroid.action.startforeground";
public static String STOPFOREGROUND_ACTION = "com.roguetemple.hyperroid.action.stopforeground";
public static int FOREGROUND_SERVICE = 101;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (intent.getAction().equals(STARTFOREGROUND_ACTION)) {
Intent notificationIntent = new Intent(this, HyperRogue.class);
notificationIntent.setAction(MAIN_ACTION);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
notificationIntent, 0);
Notification notification = new NotificationCompat.Builder(this)
.setContentTitle("HyperRogue")
.setContentText("Game in progress.")
.setTicker("Game in progress. Game in progress. Game in progress.")
.setContentIntent(pendingIntent)
.setSmallIcon(R.drawable.icon)
.setOngoing(true)
.build();
startForeground(FOREGROUND_SERVICE, notification);
}
else if (intent.getAction().equals(STOPFOREGROUND_ACTION)) {
stopForeground(true);
stopSelf();
}
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
// Used only in case of bound services.
return null;
}
}

View File

@ -0,0 +1,69 @@
package com.roguetemple.hyperroid;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.ParcelFileDescriptor;
public class HyperProvider extends ContentProvider {
public static final Uri CONTENT_URI=Uri.parse("content://com.roguetemple.hyperroid/");
@Override
public boolean onCreate() {
File f=new File(getContext().getCacheDir(), "cache.jpg");
return f.exists();
}
@Override
public String getType(Uri uri) {
return "image/jpeg";
}
@Override
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
File f=new File(getContext().getCacheDir(), "cache.jpg");
return ParcelFileDescriptor.open(f,
ParcelFileDescriptor.MODE_READ_ONLY);
}
@Override
public Cursor query(Uri url, String[] projection, String selection,
String[] selectionArgs, String sort) {
throw new RuntimeException("Operation not supported");
}
@Override
public Uri insert(Uri uri, ContentValues initialValues) {
throw new RuntimeException("Operation not supported");
}
@Override
public int update(Uri uri, ContentValues values, String where, String[] whereArgs) {
throw new RuntimeException("Operation not supported");
}
@Override
public int delete(Uri uri, String where, String[] whereArgs) {
throw new RuntimeException("Operation not supported");
}
static public void copy(InputStream in, File dst) throws IOException {
FileOutputStream out=new FileOutputStream(dst);
byte[] buf=new byte[1024];
int len;
while((len=in.read(buf))>0) {
out.write(buf, 0, len);
}
in.close();
out.close();
}
}

View File

@ -0,0 +1,120 @@
package com.roguetemple.hyperroid;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
// import android.graphics.Paint;
// import android.graphics.Path;
import android.graphics.Typeface;
import android.opengl.GLSurfaceView;
// bimport android.widget.Toast;
import com.android.texample.GLText;
public class HyperRenderer implements GLSurfaceView.Renderer {
int width, height;
HyperRogue game;
private GLText glText; // A GLText Instance
int [] graphdata;
int gdpos;
int gdpop() { return graphdata[gdpos++]; }
public void onDrawFrame(GL10 gl) {
if(game.forceCanvas) return;
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
synchronized(game) {
game.hv.updateGame();
game.draw();
graphdata = game.loadMap();
}
if(graphdata == null) return;
// Set to ModelView mode
gl.glMatrixMode( GL10.GL_MODELVIEW ); // Activate Model View Matrix
gl.glLoadIdentity(); // Load Identity Matrix
// enable texture + alpha blending
// NOTE: this is required for text rendering! we could incorporate it into
// the GLText class, but then it would be called multiple times (which impacts performance).
gl.glEnable( GL10.GL_TEXTURE_2D ); // Enable Texture Mapping
gl.glEnable( GL10.GL_BLEND ); // Enable Alpha Blend
gl.glBlendFunc( GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA ); // Set Alpha Blend Function
gl.glMatrixMode( GL10.GL_PROJECTION ); // Activate Projection Matrix
gl.glLoadIdentity(); // Load Identity Matrix
gl.glOrthof( // Set Ortho Projection (Left,Right,Bottom,Top,Front,Back)
0, width,
0, height,
1.0f, -1.0f
);
gdpos = 0;
while(gdpos < graphdata.length) {
switch(gdpop()) {
case 2: {
int x = gdpop();
int y = gdpop();
int al = gdpop();
int col = gdpop() + 0xFF000000;
int size = gdpop();
int b = gdpop();
int n = gdpop();
StringBuffer ss = new StringBuffer();
for(int i=0; i<n; i++) {
char c = (char) gdpop();
ss.append(c);
}
String s = ss.toString();
y = height - y;
glText.setScale(size / 48.0f);
if(b > 0) {
glText.begin(0f, 0f, 0f, 1f);
glText.drawAlign(s, (float)(x-1), (float)y, al);
glText.drawAlign(s, (float)(x+1), (float)y, al);
glText.drawAlign(s, (float)x, (float)(y-1), al);
glText.drawAlign(s, (float)x, (float)(y+1), al);
glText.end();
}
glText.begin(
(col & 0xFF0000) / (float)0xFF0000,
(col & 0xFF00) / (float)0xFF00,
(col & 0xFF) / (float)0xFF,
1.0f );
glText.drawAlign(s, (float) x, (float) y, al);
glText.end();
}
break;
}}
// disable texture + alpha
gl.glDisable( GL10.GL_BLEND ); // Disable Alpha Blend
gl.glDisable( GL10.GL_TEXTURE_2D ); // Disable Texture Mapping
}
public void onSurfaceChanged(GL10 gl, int width, int height) {
gl.glViewport(0, 0, width, height);
// Save width and height
this.width = width; // Save Current Width
this.height = height; // Save Current Height
}
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
glText = new GLText( gl );
glText.load(Typeface.DEFAULT_BOLD, 48, 2, 2 ); // Create Font (Height: 48 Pixels / X+Y Padding 2 Pixels)
}
}

View File

@ -0,0 +1,650 @@
package com.roguetemple.hyperroid;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Locale;
import java.util.StringTokenizer;
import javax.microedition.khronos.egl.EGL10;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.egl.EGLDisplay;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.AssetFileDescriptor;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Typeface;
import android.media.MediaPlayer;
import android.net.Uri;
import android.opengl.GLSurfaceView;
import android.opengl.GLSurfaceView.EGLConfigChooser;
import android.os.Bundle;
import android.os.Looper;
import android.preference.PreferenceManager;
import android.text.ClipboardManager;
import android.util.DisplayMetrics;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.widget.FrameLayout;
import android.widget.FrameLayout.LayoutParams;
import android.widget.Toast;
import android.util.Log;
public class HyperRogue extends Activity {
private static final int RESULT_SETTINGS = 1;
private static final boolean isGold = false;
final int SAVESIZE = 261;
private static final int YENDOR_SIZE = 30;
static final int NUMLEADER = 57;
int yendor[];
int scoretable[];
int savedgame[];
HyperView hv;
GLSurfaceView glview;
FrameLayout fl;
public void showHelp(String s) {
final HyperRogue game = this;
final String helptext = s;
if(Looper.myLooper() != Looper.getMainLooper()) {
runOnUiThread(new Runnable() { public void run() { game.showHelp(helptext); }});
return;
}
AlertDialog.Builder builder = new AlertDialog.Builder(this);
AlertDialog ad = builder.create();
ad.setButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
/* builder.setNeutralButton("Share", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// (HyperRogue)(getApplicationContext())
game.shareScore(helptext);
dialog.dismiss();
}
}); */
ad.setMessage(s);
ad.setOwnerActivity(this);
ad.show();
// help = s;
// showDialog(1);
}
String sharescore;
public void shareScore(String s) {
final HyperRogue game = this;
sharescore = s;
String[] items = {
getResources().getString(R.string.sharesam),
getResources().getString(R.string.sharemsg),
getResources().getString(R.string.copymsg)
};
if(Looper.myLooper() != Looper.getMainLooper()) {
runOnUiThread(
new Runnable() {
public void run() {
game.shareScore(sharescore);
}
}
);
return;
}
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(getResources().getText(R.string.sharehow));
builder.setItems(items, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
if(item == 2) {
ClipboardManager man = (ClipboardManager)getSystemService(CLIPBOARD_SERVICE);
if(man != null) man.setText(sharescore);
Toast.makeText(getApplicationContext(), getResources().getText(R.string.copied), Toast.LENGTH_SHORT).show();
}
else {
Intent intent=new Intent(android.content.Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_SUBJECT, "HyperRogue");
intent.putExtra(Intent.EXTRA_TEXT, sharescore);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
if(item == 0) {
try {
String path = getCacheDir().toString() + "/cache.jpg";
FileOutputStream fout = new FileOutputStream(path);
Bitmap bitmap = hv.screenshot();
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fout);
fout.flush();
fout.close();
intent.setType("image/jpeg");
intent.putExtra(Intent.EXTRA_STREAM, Uri.parse(HyperProvider.CONTENT_URI + "hyperrogue.jpg"));
} catch (Exception e) {
Toast.makeText(getApplicationContext(), "Error with the image file", Toast.LENGTH_SHORT).show();
}
}
startActivity(Intent.createChooser(intent, getResources().getText(R.string.sharevia)));
}
}
});
AlertDialog ad = builder.create();
ad.setOwnerActivity(this);
ad.show();
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
File f = getFilesDir();
setFilesDir(f.getAbsolutePath());
initGame();
immersive = getImmersive();
if(immersive) requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);
forceCanvas = false;
hv = (HyperView) findViewById(R.id.ascv);
hv.game = this;
hv.invalidate();
fl = (FrameLayout) findViewById(R.id.framelayout);
applyUserSettings();
UiChangeListener();
}
public native int initGame();
public native int getland();
public native void update(int xres, int yres, int ticks, int mousex, int mousey, boolean clicked);
public native void draw();
public native void drawScreenshot();
public native int[] loadMap();
public native boolean captureBack();
public native boolean keepinmemory();
public native boolean getImmersive();
public native boolean getGL();
public native int getMusicVolume();
public native int getEffVolume();
public native int getLanguage();
public native void syncScore(int id, int val);
public native void setFilesDir(String s);
public native boolean getGoogleConnection();
public native void setGoogleSignin(boolean issigned, boolean isconnecting);
public native void handleKey(int keyCode);
static {
System.loadLibrary("hyper");
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
synchronized(this) { if(captureBack()) return true; }
}
int unicode = 0;
if(keyCode == KeyEvent.KEYCODE_F1) unicode = (123001);
else if(keyCode == KeyEvent.KEYCODE_F2) unicode = (123002);
else if(keyCode == KeyEvent.KEYCODE_F3) unicode = (123003);
else if(keyCode == KeyEvent.KEYCODE_F4) unicode = (123004);
else if(keyCode == KeyEvent.KEYCODE_F5) unicode = (123005);
else if(keyCode == KeyEvent.KEYCODE_F6) unicode = (123006);
else if(keyCode == KeyEvent.KEYCODE_F7) unicode = (123007);
else if(keyCode == KeyEvent.KEYCODE_F10) unicode = (123010);
else if(keyCode == KeyEvent.KEYCODE_ESCAPE) unicode = (123099);
else if(keyCode == KeyEvent.KEYCODE_F12) unicode = (123012);
else if(keyCode == KeyEvent.KEYCODE_HOME) unicode = (123013);
else if(keyCode == KeyEvent.KEYCODE_DPAD_LEFT) unicode = (123014);
else if(keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) unicode = (123015);
else if(keyCode == KeyEvent.KEYCODE_DPAD_UP) unicode = (123021);
else if(keyCode == KeyEvent.KEYCODE_DPAD_DOWN) unicode = (123022);
else if(keyCode == KeyEvent.KEYCODE_PAGE_UP) unicode = (123023);
else if(keyCode == KeyEvent.KEYCODE_PAGE_DOWN) unicode = (123024);
else if(keyCode == KeyEvent.KEYCODE_ENTER) unicode = (123025);
else if(keyCode == KeyEvent.KEYCODE_NUMPAD_1) unicode = (123031);
else if(keyCode == KeyEvent.KEYCODE_NUMPAD_2) unicode = (123032);
else if(keyCode == KeyEvent.KEYCODE_NUMPAD_3) unicode = (123033);
else if(keyCode == KeyEvent.KEYCODE_NUMPAD_4) unicode = (123034);
else if(keyCode == KeyEvent.KEYCODE_NUMPAD_5) unicode = (123035);
else if(keyCode == KeyEvent.KEYCODE_NUMPAD_6) unicode = (123036);
else if(keyCode == KeyEvent.KEYCODE_NUMPAD_7) unicode = (123037);
else if(keyCode == KeyEvent.KEYCODE_NUMPAD_8) unicode = (123038);
else if(keyCode == KeyEvent.KEYCODE_NUMPAD_9) unicode = (123039);
else if(keyCode == KeyEvent.KEYCODE_NUMPAD_DOT) unicode = (123051);
else if(keyCode == KeyEvent.KEYCODE_DEL) unicode = (123052);
else unicode = event.getUnicodeChar();
if(unicode != 0) synchronized(this) { handleKey(unicode); }
return super.onKeyDown(keyCode, event);
}
void openWebsite() {
Runnable r = new Runnable() {
public void run() {
String url = "http://roguetemple.com/z/hyper.php";
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
startActivity(i);
}
};
runOnUiThread(r);
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == RESULT_SETTINGS)
applyUserSettings();
}
public boolean forceCanvas;
int musicvolume, effvolume;
// returns 'true' iff the activity is refreshed
public boolean setLocale(String lang) {
Locale myLocale = new Locale(lang);
Resources res = getResources();
DisplayMetrics dm = res.getDisplayMetrics();
Configuration conf = res.getConfiguration();
String oldlang = conf.locale.getLanguage();
conf.locale = myLocale;
res.updateConfiguration(conf, dm);
if(lang != oldlang) {
// Intent refresh = new Intent(this, HyperRogue.class);
// startActivity(refresh);
// return true;
return false;
}
return false;
}
boolean immersive;
void applyUserSettings() {
if (Looper.myLooper() != Looper.getMainLooper()) {
runOnUiThread(new Runnable() {
public void run() {
applyUserSettings();
}
});
return;
}
int lang = getLanguage();
boolean usegl = getGL();
musicvolume = getMusicVolume();
changevol = true;
effvolume = getEffVolume();
immersive = getImmersive();
boolean reset = false;
if(lang == 0) reset = setLocale("en");
if(lang == 1) reset = setLocale("pl");
if(lang == 2) reset = setLocale("tr");
if(lang == 3) reset = setLocale("cz");
if(lang == 4) reset = setLocale("ru");
if(reset) return; // no point in doing the following twice
if(glview != null && !usegl) {
fl.removeView(glview);
glview = null;
hv.invalidate();
}
if(usegl && glview == null) {
glview = new GLSurfaceView(this);
HyperRenderer hr =new HyperRenderer();
hr.game = this;
glview.setEGLConfigChooser(new HRConfigChooser());
glview.setRenderer(hr);
glview.setZOrderMediaOverlay(true);
LayoutParams lp =new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
fl.addView(glview, lp);
}
if(running) connectGames();
}
MediaPlayer backgroundmusic;
boolean changevol = false;
int lastland;
int curpos[];
float curvol;
@Override
protected void onPause() {
super.onPause();
boolean keep;
synchronized (this) {
// recordscore();
keep = keepinmemory();
}
if (keep) {
Intent startIntent = new Intent(HyperRogue.this, ForegroundService.class);
startIntent.setAction(ForegroundService.STARTFOREGROUND_ACTION);
startService(startIntent);
} else {
Intent stopIntent = new Intent(HyperRogue.this, ForegroundService.class);
stopIntent.setAction(ForegroundService.STOPFOREGROUND_ACTION);
startService(stopIntent);
}
if (backgroundmusic != null) backgroundmusic.stop();
}
// remove for the lite version START
public void UiChangeListener()
{
int currentApiVersion = android.os.Build.VERSION.SDK_INT;
if(currentApiVersion >= 19) {
final View decorView = getWindow().getDecorView();
final int flags =
immersive ?
View.SYSTEM_UI_FLAG_FULLSCREEN |
View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY |
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION :
0;
decorView.setSystemUiVisibility(flags);
decorView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
@Override
public void onSystemUiVisibilityChange(int visibility) {
if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
decorView.setSystemUiVisibility(flags);
}
}
});
}
}
protected void onResume() {
super.onResume();
if(backgroundmusic != null) {
try {backgroundmusic.prepare(); } catch(Exception e) {}
backgroundmusic.start();
}
UiChangeListener();
}
long lastclock;
MediaPlayer sounds[];
private static final int CHANNELS = 4;
protected void playSound(String s, int vol) {
if(effvolume == 0) return;
if (Looper.myLooper() != Looper.getMainLooper()) {
final String final_s = s;
final int final_vol = vol;
runOnUiThread(new Runnable() {
public void run() {
playSound(final_s, final_vol);
}
});
return;
}
try {
if(sounds == null) sounds = new MediaPlayer[CHANNELS];
AssetFileDescriptor afd = getAssets().openFd("sounds/" + s + ".ogg");
int i;
for(i=0; i<CHANNELS; i++)
if(sounds[i] == null || !sounds[i].isPlaying())
break;
if(i == CHANNELS) return;
if(sounds[i] == null) {
sounds[i] = new MediaPlayer();
sounds[i].setOnErrorListener(new MediaPlayer.OnErrorListener()
{
@Override
public boolean onError(MediaPlayer mp, int what, int extra)
{
/* Toast.makeText(getApplicationContext(), String.format("Error(%s%s)", what, extra),
Toast.LENGTH_SHORT).show(); */
return true;
}
});
/* sounds[i].setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
public void onCompletion(MediaPlayer mp) {
mp.release();
};
}); */
} else sounds[i].reset();
sounds[i].setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
afd.close();
sounds[i].prepare();
sounds[i].setVolume((float)(vol * effvolume / 12800.), (float)(vol * effvolume / 12800.));
sounds[i].start();
/* Toast.makeText(getApplicationContext(), "playing " + s
+ " on "+Integer.toString(i)+ " vol "+Integer.toString(vol), Toast.LENGTH_SHORT).show(); */
}
catch(IOException ex) {
}
}
protected void checkMusic() {
if(musicvolume == 0) {
if(backgroundmusic != null) {
backgroundmusic.stop();
backgroundmusic.release();
backgroundmusic = null;
curvol = 0; changevol = true;
lastland = -1;
}
return;
}
int curland = getland();
long curclock = System.currentTimeMillis();
float delta = (curclock - lastclock) / 1000.0f;
lastclock = curclock;
if(lastland == curland) {
if(curvol < 1 || changevol) {
curvol += delta;
if(curvol > 1) curvol = 1;
if(backgroundmusic != null)
backgroundmusic.setVolume(curvol * musicvolume / 128, curvol * musicvolume / 128);
}
}
else if(backgroundmusic == null) {
int id = R.raw.crossroads;
if(curland == 2) id = R.raw.crossroads; // Crossroads
if(curland == 3) id = R.raw.desert; // Desert
if(curland == 4) id = R.raw.icyland; // Icy Land
if(curland == 5) id = R.raw.caves; // Living Cave
if(curland == 6) id = R.raw.jungle; // Jungle
if(curland == 7) id = R.raw.laboratory; // Alchemist Lab
if(curland == 8) id = R.raw.mirror; // Mirror Land
if(curland == 9) id = R.raw.graveyard; // Graveyard
if(curland == 10) id = R.raw.rlyeh; // R'Lyeh
if(curland == 11) id = R.raw.hell; // Hell
if(curland == 12) id = R.raw.icyland; // Cocytus
if(curland == 13) id = R.raw.motion; // Land of Eternal Motion
if(curland == 14) id = R.raw.jungle; // Dry Forest
if(curland == 15) id = R.raw.caves; // Emerald Mine
if(curland == 16) id = R.raw.laboratory; // Vineyard
if(curland == 17) id = R.raw.graveyard; // Dead Cave
if(curland == 18) id = R.raw.motion; // Hive
if(curland == 19) id = R.raw.mirror; // Land of Power
if(curland == 20) id = R.raw.hell; // Camelot
if(curland == 21) id = R.raw.rlyeh; // Temple of Cthulhu
if(curland == 22) id = R.raw.crossroads; // Crossroads II
if(curland == 23) id = R.raw.crossroads; // Caribbean
if(curland == 24) id = R.raw.desert; // Red Rock Valley
if(curland == 25) id = R.raw.hell; // Minefield
if(curland == 26) id = R.raw.caves; // Ocean
if(curland == 27) id = R.raw.rlyeh; // Whirlpool
if(curland == 28) id = R.raw.crossroads; // Palace
if(curland == 29) id = R.raw.caves; // Living Fjord
if(curland == 30) id = R.raw.hell; // Ivory Tower
if(curland == 31) id = R.raw.motion; // Zebra
if(curland == 32) id = R.raw.hell; // Plane of Fire
if(curland == 33) id = R.raw.motion; // Plane of Air
if(curland == 34) id = R.raw.caves; // Plane of Earth
if(curland == 35) id = R.raw.crossroads; // Plane of Water
if(curland == 36) id = R.raw.crossroads; // Crossroads III
if(curland == 39) id = R.raw.laboratory; // Canvas
if(curland == 41) id = R.raw.caves; // Wild West
if(curland == 42) id = R.raw.laboratory; // Land of Storms
if(curland == 43) id = R.raw.jungle; // Overgrown Woods
if(curland == 44) id = R.raw.jungle; // Clearing
if(curland == 45) id = R.raw.graveyard; // Haunted Woods
if(curland == 48) id = R.raw.laboratory; // Windy Plains
if(curland == 49) id = R.raw.hell; // Rose Garden
if(curland == 50) id = R.raw.caves; // Warped Coast
if(curland == 52) id = R.raw.crossroads; // Crossroads IV
if(curland == 53) id = R.raw.laboratory; // Yendorian Forest
if(curland == 54) id = R.raw.crossroads; // Gal<EFBFBD>pagos
if(curland == 55) id = R.raw.caves; // Dragon Chasms
if(curland == 56) id = R.raw.rlyeh; // Kraken Depths
if(curland == 57) id = R.raw.graveyard; // Burial Grounds
if(curland == 58) id = R.raw.desert; // Trollheim
if(curland == 56) id = R.raw.rlyeh; // Kraken Depths
if(curland == 57) id = R.raw.graveyard; // Burial Grounds
if(curland == 58) id = R.raw.desert; // Trollheim
if(curland == 59) id = R.raw.graveyard; // Halloween
if(curland == 60) id = R.raw.desert; // Dungeon
if(curland == 61) id = R.raw.rlyeh; // Lost Mountain
if(curland == 62) id = R.raw.mirror; // Reptiles
if(curland == 63) id = R.raw.rlyeh; // Prairie
if(curland == 64) id = R.raw.mirror; // Bull Dash
if(curland == 65) id = R.raw.mirror; // Crossroads V
if(curland == 66) id = R.raw.laboratory; // CA land
if(id > 0) backgroundmusic = MediaPlayer.create(this, id);
if(backgroundmusic != null) {
backgroundmusic.setLooping(true);
curvol = 0;
backgroundmusic.setVolume(curvol, curvol);
if(curpos != null)
backgroundmusic.seekTo(curpos[curland]);
backgroundmusic.start();
lastland = curland;
}
else curland = 0;
}
else if(curvol <= delta) {
if(curpos == null) curpos = new int[128];
curpos[lastland] = backgroundmusic.getCurrentPosition();
if(backgroundmusic != null) backgroundmusic.stop();
backgroundmusic = null;
}
else {
curvol -= delta;
backgroundmusic.setVolume(curvol * musicvolume / 128, curvol * musicvolume / 128);
}
}
public int getTextWidth(String s, int size) {
Rect bounds = new Rect();
Paint pon = new Paint();
pon.setAntiAlias(true);
pon.setTextSize(size);
pon.setTextAlign(Paint.Align.LEFT);
pon.setTypeface(Typeface.DEFAULT_BOLD);
pon.getTextBounds(s,0,s.length(),bounds);
return bounds.width();
}
}
class HRConfigChooser implements EGLConfigChooser {
private int getValue(EGL10 egl, EGLDisplay display, EGLConfig config, int attr) {
int[] mValue = new int[1];
if (egl.eglGetConfigAttrib(display, config, attr, mValue))
return mValue[0];
return 0;
}
public EGLConfig chooseConfig(EGL10 egl, EGLDisplay display) {
int[] num_config = new int[1];
int[] basic = new int[]{
EGL10.EGL_RED_SIZE, 5,
EGL10.EGL_GREEN_SIZE, 6,
EGL10.EGL_BLUE_SIZE, 5,
EGL10.EGL_STENCIL_SIZE, 1,
EGL10.EGL_NONE
};
egl.eglChooseConfig(display, basic, null, 0, num_config);
if (num_config[0] <= 0) {
basic = new int[]{EGL10.EGL_NONE};
egl.eglChooseConfig(display, basic, null, 0, num_config);
}
if (num_config[0] <= 0) throw new IllegalArgumentException("no config available");
EGLConfig[] configs = new EGLConfig[num_config[0]];
egl.eglChooseConfig(display, basic, configs, num_config[0], num_config);
EGLConfig best = null;
int bestscore = 0;
for (EGLConfig config : configs) {
int d = getValue(egl, display, config, EGL10.EGL_DEPTH_SIZE);
int s = getValue(egl, display, config, EGL10.EGL_STENCIL_SIZE);
int r = getValue(egl, display, config, EGL10.EGL_RED_SIZE);
int g = getValue(egl, display, config, EGL10.EGL_GREEN_SIZE);
int b = getValue(egl, display, config, EGL10.EGL_BLUE_SIZE);
int a = getValue(egl, display, config, EGL10.EGL_ALPHA_SIZE);
int score = 10000;
if (s == 0) score -= 1000;
score -= s;
score -= d;
score -= a;
int all = r + g + b;
if (all < 24) score -= 10 * (24 - all);
score -= 10 * (all - 24);
if (score > bestscore) {
bestscore = score;
best = config;
}
}
return best;
}
}

View File

@ -0,0 +1,12 @@
package com.roguetemple.hyperroid;
import android.os.Bundle;
import android.preference.PreferenceActivity;
public class HyperSettings extends PreferenceActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
}
}

View File

@ -0,0 +1,247 @@
package com.roguetemple.hyperroid;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Typeface;
import android.os.PowerManager;
import android.os.SystemClock;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
public class HyperView extends View {
HyperRogue game;
public HyperView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initView();
}
public HyperView(Context context, AttributeSet attrs) {
super(context, attrs);
initView();
}
int width, height, mousex, mousey;
boolean clicked;
int clickcnt = 0;
Canvas dc;
int[] graphdata;
int gdpos;
int gdpop() { return graphdata[gdpos++]; }
int lasttick, curtick;
int realpha(int col) {
return ((col >> 8) & 0xFFFFFF) + ((col & 0xFF) << 24);
}
public void drawScreen(PorterDuff.Mode mode) {
Paint pon = new Paint();
pon.setXfermode(new PorterDuffXfermode(mode));
pon.setColor(0xC0C0C0C0);
pon.setAntiAlias(true);
pon.setTextSize(8);
pon.setTextAlign(Paint.Align.RIGHT);
pon.setTypeface(Typeface.DEFAULT_BOLD);
// String s = "D " + Integer.toString(graphdata.length) + " T " + Integer.toString(curtick-lasttick);
// dc.drawText(s, width*11/12, height*1/12, pon);
gdpos = 0;
while(gdpos < graphdata.length) {
switch(gdpop()) {
case 2: {
int x = gdpop();
int y = gdpop();
int al = gdpop();
int col = gdpop() + 0xFF000000;
int size = gdpop();
y = y + size/2;
int b = gdpop();
int n = gdpop();
StringBuffer ss = new StringBuffer();
for(int i=0; i<n; i++) {
char c = (char)gdpop();
ss.append(c);
}
pon.setStyle(Paint.Style.FILL);
pon.setColor(col);
pon.setTextSize(size);
pon.setTextAlign(
al == 0 ? Paint.Align.LEFT :
al == 8 ? Paint.Align.CENTER :
Paint.Align.RIGHT);
if(b>0) {
pon.setColor(0xFF000000);
dc.drawText(ss.toString(), x-b, y, pon);
dc.drawText(ss.toString(), x+b, y, pon);
dc.drawText(ss.toString(), x, y-b, pon);
dc.drawText(ss.toString(), x, y+b, pon);
}
pon.setColor(col);
dc.drawText(ss.toString(), x, y, pon);
}
break;
case 1: {
int col = gdpop();
int otl = gdpop();
int num = gdpop();
pon.setColor(realpha(col));
/* for(int i=0; i<num; i++) {
int x2 = gdpop();
int y2 = gdpop();
dc.drawText("x", x2, y2, pon);
} */
Path p = new Path();
int x = gdpop();
int y = gdpop();
p.moveTo(x, y);
for(int i=1; i<num; i++) {
int x2 = gdpop();
int y2 = gdpop();
p.lineTo(x2, y2);
}
p.lineTo(x, y);
pon.setStyle(Paint.Style.FILL);
dc.drawPath(p, pon);
pon.setStyle(Paint.Style.STROKE);
pon.setColor(realpha(otl));
dc.drawPath(p, pon);
break;
}
case 3: {
int col = gdpop();
int num = gdpop();
pon.setColor(realpha(col));
int x = gdpop();
int y = gdpop();
for(int i=1; i<num; i++) {
int x2 = gdpop();
int y2 = gdpop();
dc.drawLine(x, y, x2, y2, pon);
x = x2; y = y2;
}
break;
}
case 4: {
int col = gdpop();
int x = gdpop();
int y = gdpop();
int rad = gdpop();
col += 0xFF000000;
pon.setColor(col);
pon.setStyle(Paint.Style.STROKE);
dc.drawCircle(x, y, rad, pon);
break;
}
}}
}
public void updateGame() {
lasttick = curtick;
curtick = (int)SystemClock.elapsedRealtime();
if(clickcnt > 0) clickcnt--;
game.update(width, height, curtick, mousex, mousey, clicked | ((clickcnt & 1) > 0));
final HyperRogue fgame = game;
game.runOnUiThread(new Runnable() { public void run() { fgame.checkMusic(); }});
}
@Override
public void onDraw(final Canvas canvas) {
super.onDraw(canvas);
PowerManager pm = (PowerManager) game.getSystemService(Context.POWER_SERVICE);
boolean isScreenOn = pm.isScreenOn();
if(!isScreenOn) return;
dc = canvas;
width = getWidth();
height = getHeight();
if(game != null && game.glview == null) {
updateGame();
game.draw();
graphdata = game.loadMap();
drawScreen(PorterDuff.Mode.SRC_ATOP);
invalidate();
}
}
public Bitmap screenshot() {
Bitmap b = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas old = dc;
dc = new Canvas(b);
synchronized(game) {
game.forceCanvas = true;
game.drawScreenshot();
graphdata = game.loadMap();
game.forceCanvas = false;
}
dc.setDensity(old.getDensity());
drawScreen(PorterDuff.Mode.SRC_OVER);
return b;
}
@Override
public boolean onTouchEvent (MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN) {
mousex = (int) event.getX();
mousey = (int) event.getY();
clickcnt += 2;
clicked = true;
}
if(event.getAction() == MotionEvent.ACTION_UP) {
clicked = false;
}
if(event.getAction() == MotionEvent.ACTION_MOVE) {
mousex = (int) event.getX();
mousey = (int) event.getY();
}
return true;
}
public void initView() {
setFocusable(true);
setFocusableInTouchMode(true);
mousex = 0; mousey = 0; clicked = false;
}
}

View File

@ -0,0 +1,304 @@
// Hyperbolic Rogue for Android
// Copyright (C) 2012-2016 Zeno Rogue
// number of times compiled since Oct 30: LOTS+5
// Wed Mar 8, 23:16:40
// Wed Mar 9, 01:14:57
// Web Mar 9, ~12:30
// Web Mar 10, 16:43:30
// it took 20 minutes to compile. Now it takes just 5 minutes for an unknown reason!
// 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.
#define MOBILE
#define ISMOBILE 1
#define ISANDROID 1
#define ISIOS 0
#define GL_ES
#ifndef ANDROID
#define ANDROID
#endif
#define MOBPAR_FORMAL JNIEnv *env, jobject thiz
#define MOBPAR_ACTUAL env, thiz
void gdpush(int t);
#include <jni.h>
void shareScore(MOBPAR_FORMAL);
const char *scorefile, *conffile;
bool settingsChanged = false;
#include "/home/eryx/proj/rogue/hyper/init.cpp"
JNIEnv *whatever;
// #define delref env->DeleteLocalRef(_thiz)
int semaphore = 0;
bool crash = false;
#include <android/log.h>
#define LOCK(s, x) \
semaphore++; const char *xs = x; if(semaphore > 1) { crash = true; \
__android_log_print(ANDROID_LOG_WARN, "HyperRogue", "concurrency crash in %s\n", x); semaphore--; fflush(stdout); return s; }
#define UNLOCK semaphore--; if(crash) { crash = false; __android_log_print(ANDROID_LOG_WARN, "HyperRogue", "concurrency crashed with %s\n", xs); fflush(stdout); }
extern "C" jintArray
Java_com_roguetemple_hyperroid_HyperRogue_loadMap
( MOBPAR_FORMAL)
{
// if(debfile) fprintf(debfile, "loadmap started.\n"), fflush(debfile);
LOCK(NULL, "loadMap")
jintArray result;
result = env->NewIntArray(size(graphdata));
if(result == NULL) return NULL;
env->SetIntArrayRegion(result, 0, size(graphdata), &*graphdata.begin());
// delref;
// env->DeleteLocalRef(result);
// if(debfile) fprintf(debfile, "loadmap finished.\n"), fflush(debfile);
UNLOCK
return result;
}
extern "C" bool
Java_com_roguetemple_hyperroid_HyperRogue_captureBack
( MOBPAR_FORMAL) {
if(cmode == emNormal || cmode == emQuit)
return false;
cmode = emNormal; return true;
}
void uploadAll(MOBPAR_FORMAL);
extern "C" bool
Java_com_roguetemple_hyperroid_HyperRogue_keepinmemory
( MOBPAR_FORMAL) {
saveStats(true);
uploadAll(MOBPAR_ACTUAL);
if(!canmove) return false;
if(items[itOrbSafety]) return false;
return gold() >= 10 || tkills() >= 50;
}
extern "C" int
Java_com_roguetemple_hyperroid_HyperRogue_getland
( MOBPAR_FORMAL)
{
return getCurrentLandForMusic();
}
extern "C" int
Java_com_roguetemple_hyperroid_HyperRogue_getLanguage
( MOBPAR_FORMAL)
{
return vid.language;
}
extern "C" int
Java_com_roguetemple_hyperroid_HyperRogue_getMusicVolume
( MOBPAR_FORMAL)
{
return musicvolume;
}
extern "C" int
Java_com_roguetemple_hyperroid_HyperRogue_getEffVolume
( MOBPAR_FORMAL)
{
return effvolume;
}
extern "C" int
Java_com_roguetemple_hyperroid_HyperRogue_getImmersive(MOBPAR_FORMAL)
{
return vid.full;
}
extern "C" int
Java_com_roguetemple_hyperroid_HyperRogue_getGL(MOBPAR_FORMAL)
{
return vid.usingGL;
}
string sscorefile, sconffile, scachefile;
#include <sys/stat.h>
extern "C" void
Java_com_roguetemple_hyperroid_HyperRogue_setFilesDir(MOBPAR_FORMAL, jstring dir)
{
const char *nativeString = env->GetStringUTFChars(dir, 0);
sscorefile = nativeString; sscorefile += "/hyperrogue.log";
sconffile = nativeString; sconffile += "/hyperrogue.ini";
scachefile = nativeString; scachefile += "/scorecache.txt";
scorefile = sscorefile.c_str();
conffile = sconffile.c_str();
chmod(scorefile, 0777);
chmod(conffile, 0777);
chmod(nativeString, 0777);
env->ReleaseStringUTFChars(dir, nativeString);
}
bool gamerunning;
extern "C"
jint
Java_com_roguetemple_hyperroid_HyperRogue_initGame(MOBPAR_FORMAL) {
// debfile = fopen("/sdcard/hyperdebug.txt", "wt");
// if(!debfile) debfile = fopen("/storage/simulated/0/hyperdebug.txt", "wt");
// if(debfile) fprintf(debfile, "initgame started.\n"), fflush(debfile);
__android_log_print(ANDROID_LOG_VERBOSE, "HyperRogue", "Initializing game, gamerunning = %d\n", gamerunning);
fflush(stdout);
if(gamerunning) return 1;
gamerunning = true;
initAll();
uploadAll(MOBPAR_ACTUAL);
return 0;
}
JNIEnv *tw_env; jobject tw_thiz;
int textwidth(int siz, const string &str) {
jclass cls = tw_env->GetObjectClass(tw_thiz);
jmethodID mid = tw_env->GetMethodID(cls, "getTextWidth", "(Ljava/lang/String;I)I");
jobject jstr = tw_env->NewStringUTF(str.c_str());
int res = tw_env->CallIntMethod(tw_thiz, mid, jstr, siz);
tw_env->DeleteLocalRef(jstr);
tw_env->DeleteLocalRef(cls);
return res;
}
bool doOpenURL;
bool currentlyConnecting() { return false; }
bool currentlyConnected() { return false; }
vector<pair<string, int> > soundsToPlay;
void openURL() {
doOpenURL = true;
}
void shareScore(MOBPAR_FORMAL) {
string s = buildScoreDescription();
jclass cls = env->GetObjectClass(thiz);
jmethodID mid = env->GetMethodID(cls, "shareScore", "(Ljava/lang/String;)V");
jobject str = env->NewStringUTF(s.c_str());
env->CallVoidMethod(thiz, mid, str);
env->DeleteLocalRef(str);
env->DeleteLocalRef(cls);
}
int nticks; int getticks() { return nticks; }
extern "C" void Java_com_roguetemple_hyperroid_HyperRogue_draw(MOBPAR_FORMAL) {
// if(debfile) fprintf(debfile, "draw started.\n"), fflush(debfile);
LOCK(, "draw")
/* static int infoticks;
if(getticks() - infoticks > 10000 && !timerghost) {
addMessage("ticks: " + its(getticks()));
infoticks = getticks();
} */
tw_thiz = thiz; tw_env = env;
mobile_draw(MOBPAR_ACTUAL);
uploadAll(MOBPAR_ACTUAL);
UNLOCK
}
extern "C" void Java_com_roguetemple_hyperroid_HyperRogue_drawScreenshot(MOBPAR_FORMAL) {
dynamicval<bool> d(vid.usingGL, false);
Java_com_roguetemple_hyperroid_HyperRogue_draw(MOBPAR_ACTUAL);
}
extern "C" void Java_com_roguetemple_hyperroid_HyperRogue_handleKey(MOBPAR_FORMAL, jint keycode) {
extra ex;
flashMessages(); mousing = false;
handlekey(keycode, keycode, ex);
}
extern "C" void Java_com_roguetemple_hyperroid_HyperRogue_update
( MOBPAR_FORMAL,
jint xres, jint yres, jint _ticks,
jint _mousex, jint _mousey, jboolean _clicked) {
LOCK(, "update")
// if(debfile) fprintf(debfile, "update started.\n"), fflush(debfile);
if(xres != vid.xres || yres != vid.yres)
vid.killreduction = 0;
vid.xres = xres;
vid.yres = yres;
vid.fsize = (min(vid.xres, vid.yres) * fontscale + 50) / 3200;
mousex = _mousex;
mousey = _mousey;
clicked = _clicked;
nticks = _ticks;
uploadAll(MOBPAR_ACTUAL);
UNLOCK
// delref;
// if(debfile) fprintf(debfile, "update stopped.\n"), fflush(debfile);
}
void playSound(cell *c, const string& fname, int vol) {
soundsToPlay.push_back(make_pair(fname, vol));
}
void uploadAll(JNIEnv *env, jobject thiz) {
jclass cls = env->GetObjectClass(thiz);
for(int i=0; i<size(soundsToPlay); i++) {
jmethodID mid = env->GetMethodID(cls, "playSound", "(Ljava/lang/String;I)V");
jobject str = env->NewStringUTF(soundsToPlay[i].first.c_str());
env->CallVoidMethod(thiz, mid, str, soundsToPlay[i].second);
env->DeleteLocalRef(str);
}
soundsToPlay.clear();
if(settingsChanged) {
jmethodID mid = env->GetMethodID(cls, "applyUserSettings", "()V");
env->CallVoidMethod(thiz, mid);
settingsChanged = false;
}
if(doOpenURL) {
jmethodID mid = env->GetMethodID(cls, "openWebsite", "()V");
env->CallVoidMethod(thiz, mid);
doOpenURL = false;
}
env->DeleteLocalRef(cls);
}
#include <unistd.h>

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" android:orientation="vertical"
android:id="@+id/framelayout">
<com.roguetemple.hyperroid.HyperView
android:id="@+id/ascv"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
></com.roguetemple.hyperroid.HyperView>
</FrameLayout>

View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/settings"
android:title="@string/title_settings"/>
<item android:id="@+id/log"
android:title="@string/title_log"/>
<item android:id="@+id/help"
android:title="@string/title_help"/>
<item android:id="@+id/achieve"
android:title="@string/array_cheat_actionsa"/>
<item android:id="@+id/leader"
android:title="@string/array_cheat_actionsl"/>
<item android:id="@+id/share"
android:title="@string/title_share"/>
<item android:id="@+id/overview"
android:title="@string/title_overview"/>
</menu>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,12 @@
caves.ogg
crossroads.ogg
desert.ogg
graveyard.ogg
hell.ogg
icyland.ogg
jungle.ogg
laboratory.ogg
mirror.ogg
motion.ogg
rlyeh.ogg
t

View File

@ -0,0 +1,182 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="langcode">CZ</string>
<string name="app_name">HyperRogue</string>
<string name="signinother">Chyba při přihlášení</string>
<string name="app_id">480859409970</string>
<string name="signin_other_error">DoÅ¡lo k problému s pÅ™ihlášením, prosím, zkuste to pozdÄji.</string>
<string name="sharesam">sdílet snímek obrazovky a zprávu</string>
<string name="sharemsg">sdílet pouze zprávu</string>
<string name="copymsg">zkopírovat zprávu</string>
<string name="sharehow">Co a jak sdílet?</string>
<string name="sharevia">Sdílet skrze:</string>
<string name="copied">Zkopírováno do schránky</string>
<string name="yourwish">Co si pÅ™ejeÅ¡, lupiÄ<69>i?</string>
<string name="notconnected">Nepřipojeno!</string>
<string name="aboutgold">o HyperRogue Gold</string>
<string name="buy">koupit</string>
<string name="info">informace</string>
<string name="nothanks">ne, dÄkuji</string>
<string name="goldfeatures">
Koupí HyperRogue Gold získáš následují­ výhody:\n\
- achievementy a žebříÄ<C2AD>ky\n\
- Ä<>astÄjší aktualizace (plánují se nové kraje!)\n\
- eukleidovský mód, abys vidÄl, proÄ<6F> záleží na geometrii\n\
- cheaty\n\
</string>
<string name="title_settings">Nastavení</string>
<string name="title_log">Záznamník hry</string>
<string name="title_help">Obrazovka s nápovÄdou</string>
<string name="title_quest">Záznamník úkolů/restart</string>
<string name="title_cheat">HyperRogue Gold</string>
<string name="title_share">Sdílení skóre/snímku obrazovky</string>
<string name="title_overview">přehled krajů</string>
<string name="title_gameservices">Připojit ke Google Game Services</string>
<string name="summary_gameservices">Online achievementy a žebříÄ<C2AD>ky</string>
<string name="title_language">Jazyk</string>
<string name="summary_language">Vyber jazyk (language)</string>
<string name="title_character">Postava</string>
<string name="summary_character">Muž/žena</string>
<string name="title_hsightrange">Viditelnost</string>
<string name="summary_hsightrange">Ä<EFBFBD>ím nižší hodnota, tím rychleji hra pobÄží</string>
<string name="title_hwallmode">Zdi</string>
<string name="summary_hwallmode">Jak zobrazovat zdi?</string>
<string name="title_hmonmode">Netvoři</string>
<string name="summary_hmonmode">Jak zobrazovat netvory a pÅ™edmÄty?</string>
<string name="title_hypermode">Model hyperbolické roviny (pohled)</string>
<string name="summary_hypermode">Kleinův, Poincarého, ...</string>
<string name="title_fontsize">Velikost fontu</string>
<string name="title_flashtime">Délka zobrazení</string>
<string name="summary_flashtime">jak dlouho by mÄly být zobrazeny zprávy</string>
<string name="title_revmove">Obrácený pohyb</string>
<string name="summary_revmove">tlaÄ<EFBFBD> postavu zezadu</string>
<string name="title_nomusic">Hraj bez hudby</string>
<string name="summary_nomusic">do not play any music</string>
<string name="title_immersive">Fullscreen mode</string>
<string name="summary_immersive">swipe inward to display system bars</string>
<string name="title_usegl">Použití OpenGL</string>
<string name="summary_usegl">OpenGL funguje nÄkdy lépe a nÄkdy zase hůře</string>
<string name="title_website">ž na webovou stránku HyperRogue</string>
<string name="summary_website">zahraj si i rychlejší desktopovou verzi!</string>
<string name="array_visionRange4">4 (velmi omezená)</string>
<string name="array_visionRange5">5 (omezená)</string>
<string name="array_visionRange6">6 (o nÄco rychlejší)</string>
<string name="array_visionRange7">7 (úplná)</string>
<string name="array_wallMode0">ASCII (rychlé)</string>
<string name="array_wallMode1">Ä<EFBFBD>erné</string>
<string name="array_wallMode2">obyÄ<EFBFBD>ejné</string>
<string name="array_wallMode3">escherovské (pomalé)</string>
<string name="array_monsterMode0">ASCII (rychlé)</string>
<string name="array_monsterMode1">pouze pÅ™edmÄty</string>
<string name="array_monsterMode2">pÅ™edmÄty a netvoÅ™i</string>
<string name="array_monsterMode3">vysoký kontrast</string>
<string name="array_hyperMode0">Kleinův (0)</string>
<string name="array_hyperMode5">Střední (0,5)</string>
<string name="array_hyperMode10">Poincarého (1)</string>
<string name="array_hyperMode20">vzdálený (2)</string>
<string name="array_fontSize25">Drobná (25%)</string>
<string name="array_fontSize50">Malá (50%)</string>
<string name="array_fontSize75">Menší (75%)</string>
<string name="array_fontSize100">Normální (100%)</string>
<string name="array_fontSize150">tší (150%)</string>
<string name="array_fontSize200">Velká (200%)</string>
<string name="array_fontSize300">HodnÄ velká (300%)</string>
<string name="array_fontSize400">Obrovská (400%)</string>
<string name="array_flashTime0">žádné zprávy</string>
<string name="array_flashTime2">extrémnÄ krátce (25%)</string>
<string name="array_flashTime4">velmi krátce (50%)</string>
<string name="array_flashTime6">krátce (75%)</string>
<string name="array_flashTime8">pomÄrnÄ krátce (100%)</string>
<string name="array_flashTime12">normálnÄ (150%)</string>
<string name="array_flashTime16">pomÄrnÄ dlouho (2x)</string>
<string name="array_flashTime24">dlouho (3x)</string>
<string name="array_flashTime32">velmi dlouho (4x)</string>
<string name="array_flashTime48">hodnÄ dlouho (6x)</string>
<string name="array_flashTime64">extrémnÄ dlouho (8x)</string>
<string name="array_cheat_actionse">Eukleidovský mód</string>
<string name="array_cheat_actionsa">Achievementy</string>
<string name="array_cheat_actionsl">ŽebříÄ<EFBFBD>ky</string>
<string name="array_cheat_actionsb">** cheats are below **</string>
<string name="array_cheat_actionsS">BezpeÄ<EFBFBD>nost (rychlé uložení)</string>
<string name="array_cheat_actionsL">Vyber si kraj ---</string>
<string name="array_cheat_actionsU">--- a teleportuj se tam</string>
<string name="array_cheat_actionsF">­skej moc sféry</string>
<string name="array_cheat_actionsC">hyperkamový úkol</string>
<string name="array_cheat_actionsM">vyvolej Mimiky</string>
<string name="array_cheat_actionsG">vyvolej golema</string>
<string name="array_cheat_actionsZ">otoÄ<EFBFBD> postavu</string>
<string name="array_cheat_actionsJ">zbav se všech pokladů</string>
<string name="array_cheat_actionsP">zruš moc sféry</string>
<string name="array_cheat_actionsO">vyvolej sféry</string>
<string name="array_cheat_actionsD">vyvolej mrtvé sféry</string>
<string name="array_cheat_actionsY">vyvolej Yendorskou sféru</string>
<string name="array_cheat_actionsT">vyvolej poklad</string>
<string name="array_cheat_actionsTx">vyvolej spoustu pokladů</string>
<string name="array_cheat_actionsW">vyvolej PíseÄ<65>ného Ä<>erva</string>
<string name="array_cheat_actionsI">vyvolej BÅ™eÄ<65>Å¥an</string>
<string name="array_cheat_actionsE">vyvolej netvora</string>
<string name="array_cheat_actionsH">vyvolej Tlouky</string>
<string name="array_cheat_actionsB">vyvolej ohniÅ¡tÄ</string>
<string name="array_cheat_actionsK">­skej zabité netvory</string>
<string name="array_character0">muž</string>
<string name="array_character1">žena</string>
<string name="array_leaderboardNames0">Skóre</string>
<string name="array_leaderboardNames1">Diamanty</string>
<string name="array_leaderboardNames3">Koření</string>
<string name="array_leaderboardNames2">Zlato</string>
<string name="array_leaderboardNames4">Rubíny</string>
<string name="array_leaderboardNames6">Střepiny</string>
<string name="array_leaderboardNames10">­rka</string>
<string name="array_leaderboardNames5">Elixíry</string>
<string name="array_leaderboardNames31">Vejce BombarÄ<72>áka</string>
<string name="array_leaderboardNames32">Jantary</string>
<string name="array_leaderboardNames33">Perly</string>
<string name="array_leaderboardNames34">Hyperské koberce</string>
<string name="array_leaderboardNames35">Granáty</string>
<string name="array_leaderboardNames9">Sošky</string>
<string name="array_leaderboardNames18">Kapradinové kvÄty</string>
<string name="array_leaderboardNames26">Červené drahokamy</string>
<string name="array_leaderboardNames27">Pirátské poklady</string>
<string name="array_leaderboardNames7">Totemy</string>
<string name="array_leaderboardNames22">Lahve vína</string>
<string name="array_leaderboardNames23">Smaragdy</string>
<string name="array_leaderboardNames21">Kusy stříbra</string>
<string name="array_leaderboardNames19">Mateří kaÅ¡iÄ<69>ky</string>
<string name="array_leaderboardNames8">Kvítka</string>
<string name="array_leaderboardNames11">Safíry</string>
<string name="array_leaderboardNames20">Mocikamy</string>
<string name="array_leaderboardNames12">Hyperkamy</string>
<string name="array_leaderboardNames14">Hlavní úkol: poÄ<6F>et kol</string>
<string name="array_leaderboardNames13">Hlavní úkol: reálný Ä<>as</string>
<string name="array_leaderboardNames16">Hyperkamový úkol: poÄ<6F>et kol</string>
<string name="array_leaderboardNames15">Hyperkamový úkol: reálný Ä<>as</string>
<string name="array_leaderboardNames17">Yendorské sféry</string>
<string name="array_leaderboardNames24">Grimoáry</string>
<string name="array_leaderboardNames25">Svaté grály</string>
<string name="array_leaderboardNames39">Onyxy</string>
<string name="array_leaderboardNames38">Elementální drahokamy</string>
<string name="array_leaderboardNames37">Figurky</string>
<string name="array_leaderboardNames42">Mutantní semenáÄ<C2A1>ky</string>
<string name="array_leaderboardNames43">Fulgurity</string>
<string name="title_princess">koho zachrauje</string>
<string name="array_prince0">Princ</string>
<string name="array_prince1">Princezna</string>
<string name="array_cheat_actions7">sedmiúhelníkový mód</string>
<string name="array_cheat_actionsy">Mise: Yendor</string>
<string name="array_cheat_actionsc">chaotický mód</string>
<string name="array_leaderboardNames46">Èerné lotosy</string>
<string name="array_leaderboardNames47">Mutantní ovoce</string>
<string name="array_leaderboardNames48">Holubièí pera</string>
<string name="array_leaderboardNames51">Korály</string>
<string name="array_leaderboardNames52">Rùže bez trnù</string>
<string name="array_leaderboardNames53">chaotický mód</string>
<string name="array_leaderboardNames54">Želvièky</string>
<string name="array_leaderboardNames55">Draèí šupiny</string>
<string name="array_leaderboardNames56">Jablka</string>
</resources>

View File

@ -0,0 +1,183 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="langcode">PL</string>
<string name="app_name">HyperRogue</string>
<string name="signinother">Porażka logowania</string>
<string name="app_id">480859409970</string>
<string name="signin_other_error">Był problem z logowaniem, spróbuj później.</string>
<string name="sharesam">udostępnij ekran i opis</string>
<string name="sharemsg">udostępnij sam opis</string>
<string name="copymsg">skopiuj opis</string>
<string name="sharehow">Co i jak udostępnić</string>
<string name="sharevia">Udsostępnij poprzez:</string>
<string name="copied">Skopiowano do Schowka</string>
<string name="yourwish">Twoje życzenie?</string>
<string name="notconnected">Nie podłączone!</string>
<string name="aboutgold">o HyperRogue Gold</string>
<string name="buy">kup</string>
<string name="info">info</string>
<string name="nothanks">nie dzięki</string>
<string name="goldfeatures">
Kup HyperRogue Gold, by dostać następujące dodatkowe funkcje:\n\
- osiągnięcia i rankingi\n\
- częstsze aktualizacje (nowe krainy w planach!)\n\
- tryb euklidesowy, by zobaczyć, dlaczego geometria ma znaczenie\n\
- oszustwa\n\
</string>
<string name="title_settings">Ustawienia</string>
<string name="title_log">Dziennik</string>
<string name="title_help">Pomoc</string>
<string name="title_quest">Misja/restart</string>
<string name="title_cheat">HyperRogue Gold</string>
<string name="title_share">Udostępnij wynik/ekran</string>
<string name="title_overview">przegląd krain</string>
<string name="title_gameservices">Połącz z Google Game Services</string>
<string name="summary_gameservices">Osiągnięcia i rankingi online</string>
<string name="title_language">Język</string>
<string name="summary_language">Wybierz język (language)</string>
<string name="title_character">Postać gracza</string>
<string name="summary_character">Mężczyzna albo kobieta</string>
<string name="title_hsightrange">Widoczność</string>
<string name="summary_hsightrange">mniejsza wartość = szybsza gra</string>
<string name="title_hwallmode">Tryb ścian</string>
<string name="summary_hwallmode">Jak pokazywać ściany?</string>
<string name="title_hmonmode">Tryb potworów</string>
<string name="summary_hmonmode">Jak pokazywać potwory i przedmioty?</string>
<string name="title_hypermode">model płaszczyzny hiperbolicznej</string>
<string name="summary_hypermode">Klein, Poincaré, ...</string>
<string name="title_fontsize">Wielkość czcionki</string>
<string name="title_flashtime">Szybkość tekstu</string>
<string name="summary_flashtime">jak długo pokazywać wiadomości</string>
<string name="title_revmove">Ruch odwrócony</string>
<string name="summary_revmove">klikaj za postacią</string>
<string name="title_nomusic">Graj bez muzyki</string>
<string name="summary_nomusic">wyłącz muzykę</string>
<string name="title_immersive">Fullscreen mode</string>
<string name="summary_immersive">swipe inward to display system bars</string>
<string name="title_usegl">Użyj OpenGL</string>
<string name="summary_usegl">OpenGL zazwyczaj działa lepiej</string>
<string name="title_website">Idź na stronę HyperRogue</string>
<string name="summary_website">zagraj również w szybką wersję na komputer!</string>
<string name="array_visionRange4">4 (bardzo ograniczona)</string>
<string name="array_visionRange5">5 (ograniczona)</string>
<string name="array_visionRange6">6 (trochę szybciej)</string>
<string name="array_visionRange7">7 (pełna)</string>
<string name="array_wallMode0">ASCII (szybkie)</string>
<string name="array_wallMode1">czarna</string>
<string name="array_wallMode2">prosta</string>
<string name="array_wallMode3">Escher (wolne)</string>
<string name="array_monsterMode0">ASCII (szybkie)</string>
<string name="array_monsterMode1">tylko przedmioty</string>
<string name="array_monsterMode2">przedmioty i potwory</string>
<string name="array_monsterMode3">wysoki kontrast</string>
<string name="array_hyperMode0">Klein (0)</string>
<string name="array_hyperMode5">pośredni (0.5)</string>
<string name="array_hyperMode10">Poincaré (1)</string>
<string name="array_hyperMode20">odległy (2)</string>
<string name="array_fontSize25">Malutka (25%)</string>
<string name="array_fontSize50">Mała (50%)</string>
<string name="array_fontSize75">Maława (75%)</string>
<string name="array_fontSize100">Normalna (100%)</string>
<string name="array_fontSize150">Duża (150%)</string>
<string name="array_fontSize200">Bardzo duża (200%)</string>
<string name="array_fontSize300">Wielka (300%)</string>
<string name="array_fontSize400">Ogromna (400%)</string>
<string name="array_flashTime0">natychmiastowy</string>
<string name="array_flashTime2">strasznie szybki (25%)</string>
<string name="array_flashTime4">bardzo szybki (50%)</string>
<string name="array_flashTime6">szybki (75%)</string>
<string name="array_flashTime8">dość szybki (100%)</string>
<string name="array_flashTime12">normalny (150%)</string>
<string name="array_flashTime16">raczej wolny (2x)</string>
<string name="array_flashTime24">wolny (3x)</string>
<string name="array_flashTime32">bardzo wolny (4x)</string>
<string name="array_flashTime48">naprawdę wolny (6x)</string>
<string name="array_flashTime64">strasznie wolny (8x)</string>
<string name="array_cheat_actionse">Tryb euklidesowy</string>
<string name="array_cheat_actionsa">Osiągnięcia</string>
<string name="array_cheat_actionsl">Rankingi</string>
<string name="array_cheat_actionsb">** oszustwa poniżej **</string>
<string name="array_cheat_actionsS">Bezpieczeństwo (szybki save)</string>
<string name="array_cheat_actionsL">Wybierz krainę ---</string>
<string name="array_cheat_actionsU">--- i się teleportuj</string>
<string name="array_cheat_actionsF">Moce sfer</string>
<string name="array_cheat_actionsC">Misja Hiperkamień</string>
<string name="array_cheat_actionsM">przywołaj Mimiki</string>
<string name="array_cheat_actionsG">przywołaj Golema</string>
<string name="array_cheat_actionsZ">obróć postać</string>
<string name="array_cheat_actionsJ">utrata skarbów</string>
<string name="array_cheat_actionsP">utrata mocy</string>
<string name="array_cheat_actionsO">przwołaj sfery</string>
<string name="array_cheat_actionsD">przywołaj martwe sfery</string>
<string name="array_cheat_actionsY">przywołaj sferę Yendoru</string>
<string name="array_cheat_actionsT">przywołaj skarby</string>
<string name="array_cheat_actionsTx">przywołaj dużo skarbów</string>
<string name="array_cheat_actionsW">przywołaj Czerwia</string>
<string name="array_cheat_actionsI">przywołaj Bluszcz</string>
<string name="array_cheat_actionsE">przywołaj potwora</string>
<string name="array_cheat_actionsH">przywołaj dudniki</string>
<string name="array_cheat_actionsB">przywołaj ognisko</string>
<string name="array_cheat_actionsK">zdobądź zabicia</string>
<string name="array_character0">mężczyzna</string>
<string name="array_character1">kobieta</string>
<string name="array_leaderboardNames0">Wynik</string>
<string name="array_leaderboardNames1">Diamenty</string>
<string name="array_leaderboardNames3">Przyprawa</string>
<string name="array_leaderboardNames2">Złoto</string>
<string name="array_leaderboardNames4">Rubiny</string>
<string name="array_leaderboardNames6">Odłamki</string>
<string name="array_leaderboardNames10">Pióra</string>
<string name="array_leaderboardNames5">Eliksiry</string>
<string name="array_leaderboardNames31">Jaja Bombardiera</string>
<string name="array_leaderboardNames32">Bursztyny</string>
<string name="array_leaderboardNames33">Perły</string>
<string name="array_leaderboardNames34">Hiperskie Dywany</string>
<string name="array_leaderboardNames35">Granaty</string>
<string name="array_leaderboardNames9">Statuetki</string>
<string name="array_leaderboardNames18">Kwiaty Paproci</string>
<string name="array_leaderboardNames26">Czerwone Kamienie</string>
<string name="array_leaderboardNames27">Skarby Piratów</string>
<string name="array_leaderboardNames7">Totemy</string>
<string name="array_leaderboardNames22">Wino</string>
<string name="array_leaderboardNames23">Szmaragdy</string>
<string name="array_leaderboardNames21">Srebro</string>
<string name="array_leaderboardNames19">Królewskie Mleczko</string>
<string name="array_leaderboardNames8">Czarcie Ziele</string>
<string name="array_leaderboardNames11">Szafiry</string>
<string name="array_leaderboardNames20">Kamienie Mocy</string>
<string name="array_leaderboardNames12">Hiperkamienie</string>
<string name="array_leaderboardNames14">Misja główna: liczba kolejek</string>
<string name="array_leaderboardNames13">Misja główna: czas rzeczywisty</string>
<string name="array_leaderboardNames16">Misja Hiperkamień: liczba kolejek</string>
<string name="array_leaderboardNames15">Misja Hiperkamień: czas rzeczywisty</string>
<string name="array_leaderboardNames17">Sfery Yendoru</string>
<string name="array_leaderboardNames24">Księgi</string>
<string name="array_leaderboardNames25">Święte Graale</string>
<string name="array_leaderboardNames39">Onyksy</string>
<string name="array_leaderboardNames38">Kamienie ywiow</string>
<string name="array_leaderboardNames37">Figurki</string>
<string name="array_leaderboardNames42">Zmutowane sadzonki</string>
<string name="array_leaderboardNames43">Fulguryty</string>
<string name="title_princess">kogo ratujemy</string>
<string name="array_prince0">Książę</string>
<string name="array_prince1">Księżniczka</string>
<string name="array_cheat_actions7">tryb siedmiokątów</string>
<string name="array_cheat_actionsy">Misja Yendor</string>
<string name="array_cheat_actionsc">tryb Chaosu</string>
<string name="array_leaderboardNames46">Czarne Lotosy</string>
<string name="array_leaderboardNames47">Zmutowane Owoce</string>
<string name="array_leaderboardNames48">Gołębie Pióra</string>
<string name="array_leaderboardNames51">Korale</string>
<string name="array_leaderboardNames52">Róże bez Kolców</string>
<string name="array_leaderboardNames53">tryb Chaosu</string>
<string name="array_leaderboardNames54">Żółwie Punkty</string>
<string name="array_leaderboardNames55">Smocze Łuski</string>
<string name="array_leaderboardNames56">Jabłka</string>
</resources>

View File

@ -0,0 +1,177 @@
<resources>
<string name="langcode">RU</string>
<string name="app_name">HyperRogue</string>
<string name="signinother">Ошибка входа</string>
<string name="app_id">480859409970</string>
<string name="signin_other_error">
Возникла проблема со входом; пожалуйста, повторите попытку позже.
</string>
<string name="sharesam">поделитесь скриншотом и сообщением</string>
<string name="sharemsg">поделитесь сообщением</string>
<string name="copymsg">копировать сообщение</string>
<string name="sharehow">Поделитесь, что и как?</string>
<string name="sharevia">Поделиться через:</string>
<string name="copied">копировать в буфер</string>
<string name="yourwish">Чего хочешь, жулик?</string>
<string name="notconnected">Нет соединения!</string>
<string name="aboutgold">про HyperRogue Gold</string>
<string name="buy">купить</string>
<string name="info">инфо</string>
<string name="nothanks">нет, спасибо</string>
<string name="goldfeatures">
Купите HyperRogue Gold, чтобы получить доступ к:\n\ - достижениям и таблице рекордов\n\ - более частым обновлениям (скоро новые земли!)\n\ - Евклидов режим, чтобы увидеть, почему геометрия так важна\n\ - читы\n\
</string>
<string name="title_settings">Настройки</string>
<string name="title_log">Лог игры</string>
<string name="title_help">Помощь</string>
<string name="title_quest">Миссия/начать с начала</string>
<string name="title_cheat">особенности HyperRogue Gold</string>
<string name="title_share">Поделиться счётом/скриншотом</string>
<string name="title_overview">обзор мира</string>
<string name="title_gameservices">Подключено к сервисам Google</string>
<string name="summary_gameservices">Онлайн достижения и таблицы рекордов</string>
<string name="title_language">Язык</string>
<string name="summary_language">Выберите язык</string>
<string name="title_character">Персонаж</string>
<string name="summary_character">Мужской или женский</string>
<string name="title_hsightrange">Радиус видимости</string>
<string name="summary_hsightrange">чем меньше, тем быстрее игра</string>
<string name="title_hwallmode">Режим для стен</string>
<string name="summary_hwallmode">Как отображать стены?</string>
<string name="title_hmonmode">Режим для монстров</string>
<string name="summary_hmonmode">Как отображать монстров и предметы?</string>
<string name="title_hypermode">Модель гиперболической плоскости (вид)</string>
<string name="summary_hypermode">Клейна, Пуанкаре, ...</string>
<string name="title_fontsize">Размер шрифта</string>
<string name="title_flashtime">Время показа сообщений</string>
<string name="summary_flashtime">как долга отображаются сообщения</string>
<string name="title_revmove">Обратить движения</string>
<string name="summary_revmove">нажимайте за персонажем</string>
<string name="title_nomusic">выключить музыку</string>
<string name="summary_nomusic">не играть музыку</string>
<string name="title_immersive">Fullscreen mode</string>
<string name="summary_immersive">swipe inward to display system bars</string>
<string name="title_usegl">Использовать OpenGL</string>
<string name="summary_usegl">OpenGL иногда работает лучше, иногда хуже</string>
<string name="title_website">Перейти на сайт HyperRogue</string>
<string name="summary_website">Играйте не только в мобильную версию!</string>
<string name="array_visionRange4">4 (очень ограничено)</string>
<string name="array_visionRange5">5 (ограничено)</string>
<string name="array_visionRange6">6 (средний)</string>
<string name="array_visionRange7">7 (полный)</string>
<string name="array_wallMode0">ASCII (быстрый)</string>
<string name="array_wallMode1">чёрный</string>
<string name="array_wallMode2">простой</string>
<string name="array_wallMode3">Эшер(медленный)</string>
<string name="array_monsterMode0">ASCII (быстрый)</string>
<string name="array_monsterMode1">только предметы</string>
<string name="array_monsterMode2">предметы и монстры</string>
<string name="array_monsterMode3">высокий контраст</string>
<string name="array_hyperMode0">Клейн (0)</string>
<string name="array_hyperMode5">Средний (0.5)</string>
<string name="array_hyperMode10">Пуанкаре (1)</string>
<string name="array_hyperMode20">Отдалённый (2)</string>
<string name="array_fontSize25">Крохотный (25%)</string>
<string name="array_fontSize50">Маленький (50%)</string>
<string name="array_fontSize75">Уменьшенный (75%)</string>
<string name="array_fontSize100">Обычный (100%)</string>
<string name="array_fontSize150">Увеличенный (150%)</string>
<string name="array_fontSize200">Большой (200%)</string>
<string name="array_fontSize300">Очень большой (300%)</string>
<string name="array_fontSize400">Огромный (400%)</string>
<string name="array_flashTime0">без сообщений</string>
<string name="array_flashTime2">предельно быстро (25%)</string>
<string name="array_flashTime4">очень быстро (50%)</string>
<string name="array_flashTime6">быстро (75%)</string>
<string name="array_flashTime8">довольно быстро (100%)</string>
<string name="array_flashTime12">нормально (150%)</string>
<string name="array_flashTime16">довольно медленно (2x)</string>
<string name="array_flashTime24">медленно (3x)</string>
<string name="array_flashTime32">очень медленно (4x)</string>
<string name="array_flashTime48">совсем медленно (6x)</string>
<string name="array_flashTime64">предельно медленно (8x)</string>
<string name="array_cheat_actionse">Евклидовый режим</string>
<string name="array_cheat_actionsa">Достижения</string>
<string name="array_cheat_actionsl">Таблицы рекордов</string>
<string name="array_cheat_actionsb">** cheats are below **</string>
<string name="array_cheat_actionsS">Сохраниться</string>
<string name="array_cheat_actionsL">Выбрать землю ---</string>
<string name="array_cheat_actionsU">--- и телепортироваться туда</string>
<string name="array_cheat_actionsF">получить силу сфер</string>
<string name="array_cheat_actionsC">Миссия Гиперкамней</string>
<string name="array_cheat_actionsM">призвать двойников</string>
<string name="array_cheat_actionsG">призвать Голема</string>
<string name="array_cheat_actionsZ">повернуться</string>
<string name="array_cheat_actionsJ">потерять все сокровища</string>
<string name="array_cheat_actionsP">потерять силы сфер</string>
<string name="array_cheat_actionsO">призвать сферы</string>
<string name="array_cheat_actionsD">призвать мёртвые сферы</string>
<string name="array_cheat_actionsY">призвать сферы Йендора</string>
<string name="array_cheat_actionsT">призвать сокровища</string>
<string name="array_cheat_actionsTx">призвать много сокровищ</string>
<string name="array_cheat_actionsW">призвать Песчаного червя</string>
<string name="array_cheat_actionsI">призвать Плющ</string>
<string name="array_cheat_actionsE">призвать монстра</string>
<string name="array_cheat_actionsH">призвать Тамперы</string>
<string name="array_cheat_actionsB">призвать Костры</string>
<string name="array_cheat_actionsK">получить убийства</string>
<string name="array_character0">мужской</string>
<string name="array_character1">женский</string>
<string name="array_leaderboardNames0">Очки</string>
<string name="array_leaderboardNames1">Алмазы</string>
<string name="array_leaderboardNames3">Специи</string>
<string name="array_leaderboardNames2">Золото</string>
<string name="array_leaderboardNames4">Рубины</string>
<string name="array_leaderboardNames6">Осколки</string>
<string name="array_leaderboardNames10">Перья</string>
<string name="array_leaderboardNames5">Эликсиры</string>
<string name="array_leaderboardNames31">Яйца бомбардира</string>
<string name="array_leaderboardNames32">Янтари</string>
<string name="array_leaderboardNames33">Жемчужины</string>
<string name="array_leaderboardNames34">Гиперсидские ковры</string>
<string name="array_leaderboardNames35">Гранаты</string>
<string name="array_leaderboardNames9">Статуи</string>
<string name="array_leaderboardNames24">Гримуары</string>
<string name="array_leaderboardNames18">Папоротник</string>
<string name="array_leaderboardNames26">Красные камни</string>
<string name="array_leaderboardNames27">Сокровища пиратов</string>
<string name="array_leaderboardNames7">Тотемы</string>
<string name="array_leaderboardNames22">Вино</string>
<string name="array_leaderboardNames23">Изумруды</string>
<string name="array_leaderboardNames21">Серебро</string>
<string name="array_leaderboardNames19">Молочко</string>
<string name="array_leaderboardNames8">Ромашки</string>
<string name="array_leaderboardNames11">Сапфиры</string>
<string name="array_leaderboardNames20">Камни силы</string>
<string name="array_leaderboardNames12">Гиперкамни</string>
<string name="array_leaderboardNames14">Главная миссия: число ходов</string>
<string name="array_leaderboardNames13">Главная миссия: время</string>
<string name="array_leaderboardNames16">Миссия гиперкамней: число ходов</string>
<string name="array_leaderboardNames15">Миссия гиперкамней: время</string>
<string name="array_leaderboardNames25">Святые Граали</string>
<string name="array_leaderboardNames17">Сферы Йендора</string>
<string name="array_leaderboardNames39">Ониксы</string>
<string name="array_leaderboardNames38">Камни стихий</string>
<string name="array_leaderboardNames37">Фигурки</string>
<string name="array_leaderboardNames42">Саженцы-мутанты</string>
<string name="array_leaderboardNames43">Фульгурити</string>
<string name="title_princess">Принц/Принцесса</string>
<string name="array_prince0">Принц</string>
<string name="array_prince1">Принцесса</string>
<string name="array_cheat_actions7">режим семиугольников</string>
<string name="array_cheat_actionsy">Миссия Йендора</string>
<string name="array_cheat_actionsc">режим Хаоса</string>
<string name="array_leaderboardNames46">Чёрные лотосы</string>
<string name="array_leaderboardNames47">Фрукты-мутанты</string>
<string name="array_leaderboardNames48">Голубиные перья</string>
<string name="array_leaderboardNames51">Кораллы</string>
<string name="array_leaderboardNames52">розы без шипов</string>
<string name="array_leaderboardNames53">режим Хаоса</string>
<string name="array_leaderboardNames54">Tortoise Points</string>
<string name="array_leaderboardNames55">чешуи дракона</string>
<string name="array_leaderboardNames56">Яблоки</string>
</resources>

View File

@ -0,0 +1,181 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="langcode">TR</string>
<string name="app_name">HyperRogue</string>
<string name="signinother">Giriţ hatasý</string>
<string name="app_id">480859409970</string>
<string name="signin_other_error">Giriţte bir hata gerçekleţti, lütfen daha sonra tekrar dene.</string>
<string name="sharesam">ekraný ve mesajý paylaţ</string>
<string name="sharemsg">sadece mesajý paylaţ</string>
<string name="copymsg">mesajý kopyala</string>
<string name="sharehow">Neyi nasýl paylaţacaksýn?</string>
<string name="sharevia">Å¢unun aracýlýÄýyla paylaÅ£:</string>
<string name="copied">Panoya kopyalandý.</string>
<string name="yourwish">Ã<EFBFBD>steÄin nedir Seyyah?</string>
<string name="notconnected">BaÄlý deÄil!</string>
<string name="aboutgold">HyperRogue Gold hakkýnda</string>
<string name="buy">satýn al</string>
<string name="info">bilgi</string>
<string name="nothanks">istemiyorum</string>
<string name="goldfeatures">Hyperrogue Gold\'u aÅ£aÄýdaki özelliklere kavuÅ£mak için al:\n\
- baţarýmlar ve listeler\n\
- daha sýk güncellemeler (yeni diyarlar planda!)\n\
- geometrinin neden önemli olduÄunu anlamak için bir Ãklid modu\n\
- hile özellikleri\n\
</string>
<string name="title_settings">Ayarlar</string>
<string name="title_log">Oyun geçmiţi</string>
<string name="title_help">Yardýmý görüntüle</string>
<string name="title_quest">görev bilgisi/yeniden baţlat</string>
<string name="title_cheat">HyperRogue Gold özellikleri</string>
<string name="title_share">Ekran görüntüsü veya puan paylaţ</string>
<string name="title_overview">dünya önizlemesi</string>
<string name="title_gameservices">Google Oyun Servislerine baÄŸlan.</string>
<string name="summary_gameservices">Çevrimiçi başarımlar ve listeler.</string>
<string name="title_language">Dil</string>
<string name="summary_language">Dilini Seç (language)</string>
<string name="title_character">Oyuncu karakteri</string>
<string name="summary_character">Erkek veya kadın</string>
<string name="title_hsightrange">görüş uzaklığı</string>
<string name="summary_hsightrange">oyunun daha hızlı çalışması için düşük bir değer seç.</string>
<string name="title_hwallmode">Duvar modu</string>
<string name="summary_hwallmode">Duvarlar nasıl gözüksün?</string>
<string name="title_hmonmode">Canavar modu</string>
<string name="summary_hmonmode">Canavarlar ve eşyalar nasıl gözüksün?</string>
<string name="title_hypermode">Hiperbolik düzlem görünümü</string>
<string name="summary_hypermode">Klein, Poincaré, ...</string>
<string name="title_fontsize">Font büyüklüğü</string>
<string name="title_flashtime">Görüntü beklemesi</string>
<string name="summary_flashtime">mesajların ne kadar gösterileceğini seç.</string>
<string name="title_revmove">ters hareket</string>
<string name="summary_revmove">karakteri arkadan ittir</string>
<string name="title_nomusic">Müziği kapat</string>
<string name="summary_nomusic">hiçbir müziği çalma</string>
<string name="title_immersive">Fullscreen mode</string>
<string name="summary_immersive">swipe inward to display system bars</string>
<string name="title_usegl">OpenGL kullan.</string>
<string name="summary_usegl">OpenGL bazen daha iyi, bazen daha kötü çalışır.</string>
<string name="title_website">HyperRogue websitesine git.</string>
<string name="summary_website">daha hızlı olan masaüstü versiyonunu da oyna!</string>
<string name="array_visionRange4">4 (çok sınırlı)</string>
<string name="array_visionRange5">5 (sınırlı)</string>
<string name="array_visionRange6">6 (biraz hızlı)</string>
<string name="array_visionRange7">7 (tam)</string>
<string name="array_wallMode0">ASCII (hızlı)</string>
<string name="array_wallMode1">Siyah</string>
<string name="array_wallMode2">düz</string>
<string name="array_wallMode3">Escher (slow)</string>
<string name="array_monsterMode0">ASCII (hızlı)</string>
<string name="array_monsterMode1">sadece eÅŸyalar</string>
<string name="array_monsterMode2">eÅŸyalar ve canavarlar</string>
<string name="array_monsterMode3">yüksek kontrast</string>
<string name="array_hyperMode0">Klein (0)</string>
<string name="array_hyperMode5">Orta (0.5)</string>
<string name="array_hyperMode10">Poincaré (1)</string>
<string name="array_hyperMode20">uzak (2)</string>
<string name="array_fontSize25">Çok Küçük (25%)</string>
<string name="array_fontSize50">Ufak (50%)</string>
<string name="array_fontSize75">Küçük (75%)</string>
<string name="array_fontSize100">Normal (100%)</string>
<string name="array_fontSize150">Ä°ri (150%)</string>
<string name="array_fontSize200">Büyük (200%)</string>
<string name="array_fontSize300">Çok Büyük (300%)</string>
<string name="array_fontSize400">Devasa (400%)</string>
<string name="array_flashTime0">mesaj yok</string>
<string name="array_flashTime2">aşırı çabuk (25%)</string>
<string name="array_flashTime4">çok çabuk (50%)</string>
<string name="array_flashTime6">çabuk (75%)</string>
<string name="array_flashTime8">biraz çabuk (100%)</string>
<string name="array_flashTime12">normal (150%)</string>
<string name="array_flashTime16">biraz yavaÅŸ (2x)</string>
<string name="array_flashTime24">yavaÅŸ (3x)</string>
<string name="array_flashTime32">çok yavaş (4x)</string>
<string name="array_flashTime48">epey yavaÅŸ (6x)</string>
<string name="array_flashTime64">aşırı yavaş (8x)</string>
<string name="array_cheat_actionse">Ãklid Modu</string>
<string name="array_cheat_actionsa">Başarımlar</string>
<string name="array_cheat_actionsl">listeler</string>
<string name="array_cheat_actionsb">** cheats are below **</string>
<string name="array_cheat_actionsS">Güvenlik (hızlı kayıt)</string>
<string name="array_cheat_actionsL">Diyar seç ---</string>
<string name="array_cheat_actionsU">--- ve oraya ışınlan.</string>
<string name="array_cheat_actionsF">küre güçleri kazan</string>
<string name="array_cheat_actionsC">Aşkıntaş Görevi</string>
<string name="array_cheat_actionsM">Taklitçiler çıkar</string>
<string name="array_cheat_actionsG">Golem çıkar</string>
<string name="array_cheat_actionsZ">karakteri döndür</string>
<string name="array_cheat_actionsJ">tüm hazineyi kaybet</string>
<string name="array_cheat_actionsP">küre güçlerini tüket</string>
<string name="array_cheat_actionsO">küre çıkar</string>
<string name="array_cheat_actionsD">ölü küre çıkar</string>
<string name="array_cheat_actionsY">Yendorun Küresini çıkar</string>
<string name="array_cheat_actionsT">hazine çıkar</string>
<string name="array_cheat_actionsTx">çok hazine çıkar</string>
<string name="array_cheat_actionsW">Kumkurdu çıkar</string>
<string name="array_cheat_actionsI">Sarmaşık çıkar</string>
<string name="array_cheat_actionsE">Bir canavar çıkar</string>
<string name="array_cheat_actionsH">Gümleyen çıkar</string>
<string name="array_cheat_actionsB">Kampateşi çıkar</string>
<string name="array_cheat_actionsK">leÅŸler kazan.</string>
<string name="array_character0">erkek</string>
<string name="array_character1">kadın</string>
<string name="array_leaderboardNames0">Puan</string>
<string name="array_leaderboardNames1">Elmas</string>
<string name="array_leaderboardNames3">Baharat</string>
<string name="array_leaderboardNames2">Altın</string>
<string name="array_leaderboardNames4">Yakut</string>
<string name="array_leaderboardNames6">Parça</string>
<string name="array_leaderboardNames10">Telek</string>
<string name="array_leaderboardNames5">Ä°ksir</string>
<string name="array_leaderboardNames31">Bombacıkuş Yumurtaları</string>
<string name="array_leaderboardNames32">Kehribarlar</string>
<string name="array_leaderboardNames33">Ä°nciler</string>
<string name="array_leaderboardNames34">Hypersian Carpets</string>
<string name="array_leaderboardNames35">Garnets</string>
<string name="array_leaderboardNames9">Heykel</string>
<string name="array_leaderboardNames18">EÄŸrelti</string>
<string name="array_leaderboardNames26">Kızıl Mücevherler</string>
<string name="array_leaderboardNames27">Korsan Hazineleri</string>
<string name="array_leaderboardNames7">Totem</string>
<string name="array_leaderboardNames22">Wine</string>
<string name="array_leaderboardNames23">Emeralds</string>
<string name="array_leaderboardNames21">Silver</string>
<string name="array_leaderboardNames19">Royal Jellies</string>
<string name="array_leaderboardNames8">Papatya</string>
<string name="array_leaderboardNames11">Zümrüt</string>
<string name="array_leaderboardNames20">Powerstones</string>
<string name="array_leaderboardNames12">Aşkıntaş</string>
<string name="array_leaderboardNames14">Ana Görev: tur sayısı</string>
<string name="array_leaderboardNames13">Ana Görev: gerçek zaman</string>
<string name="array_leaderboardNames16">Aşkıntaş Görevi: tur sayısı</string>
<string name="array_leaderboardNames15">Hyperstone Quest: gerçek zaman</string>
<string name="array_leaderboardNames17">Yendor Küresi</string>
<string name="array_leaderboardNames24">Kara Kitaplar</string>
<string name="array_leaderboardNames25">Kutsal Kâseler</string>
<string name="array_leaderboardNames39">Akikler</string>
<string name="array_leaderboardNames38">Unsurtaşları</string>
<string name="array_leaderboardNames37">FildiÅŸi Kuleler</string>
<string name="array_leaderboardNames42">Mutant Saplings</string>
<string name="array_leaderboardNames43">Fulgurites</string>
<string name="title_princess">Save whom</string>
<string name="array_prince0">Prince</string>
<string name="array_prince1">Princess</string>
<string name="array_cheat_actions7">heptagonal mode</string>
<string name="array_cheat_actionsy">Yendor Ek Görevi</string>
<string name="array_cheat_actionsc">Chaos mode</string>
<string name="array_leaderboardNames46">Black Lotuses</string>
<string name="array_leaderboardNames47">Mutant Fruits</string>
<string name="array_leaderboardNames48">White Dove Feathers</string>
<string name="array_leaderboardNames51">Corals</string>
<string name="array_leaderboardNames52">Thornless Roses</string>
<string name="array_leaderboardNames53">Chaos Mode</string>
<string name="array_leaderboardNames54">Tortoise Points</string>
<string name="array_leaderboardNames55">Dragon Scales</string>
<string name="array_leaderboardNames56">Apples</string>
</resources>

View File

@ -0,0 +1,293 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="visionRange">
<item name="4">@string/array_visionRange4</item>
<item name="5">@string/array_visionRange5</item>
<item name="6">@string/array_visionRange6</item>
<item name="7">@string/array_visionRange7</item>
</string-array>
<string-array name="wallMode">
<item name="0">@string/array_wallMode0</item>
<item name="1">@string/array_wallMode1</item>
<item name="2">@string/array_wallMode2</item>
<item name="3">@string/array_wallMode3</item>
</string-array>
<string-array name="monsterMode">
<item name="0">@string/array_monsterMode0</item>
<item name="1">@string/array_monsterMode1</item>
<item name="2">@string/array_monsterMode2</item>
<item name="3">@string/array_monsterMode3</item>
</string-array>
<string-array name="visionRangeValues" translatable="false">
<item name="4">4</item>
<item name="5">5</item>
<item name="6">6</item>
<item name="7">7</item>
</string-array>
<string-array name="flashTimeValues" translatable="false">
<item name="0">0</item>
<item name="2">2</item>
<item name="4">4</item>
<item name="6">6</item>
<item name="8">8</item>
<item name="12">12</item>
<item name="16">16</item>
<item name="24">24</item>
<item name="32">32</item>
<item name="48">48</item>
<item name="64">64</item>
</string-array>
<string-array name="monsterModeValues" translatable="false">
<item name="0">0</item>
<item name="1">1</item>
<item name="2">2</item>
<item name="3">3</item>
</string-array>
<string-array name="wallModeValues" translatable="false">
<item name="0">0</item>
<item name="1">1</item>
<item name="2">2</item>
<item name="3">3</item>
</string-array>
<string-array name="hyperMode">
<item name="0">@string/array_hyperMode0</item>
<item name="5">@string/array_hyperMode5</item>
<item name="10">@string/array_hyperMode10</item>
<item name="20">@string/array_hyperMode20</item>
</string-array>
<string-array name="hyperModeValues" translatable="false">
<item name="0">0</item>
<item name="5">0.5</item>
<item name="10">1</item>
<item name="20">2</item>
</string-array>
<string-array name="fontSize">
<item name="25">@string/array_fontSize25</item>
<item name="50">@string/array_fontSize50</item>
<item name="75">@string/array_fontSize75</item>
<item name="100">@string/array_fontSize100</item>
<item name="150">@string/array_fontSize150</item>
<item name="200">@string/array_fontSize200</item>
<item name="300">@string/array_fontSize300</item>
<item name="400">@string/array_fontSize400</item>
</string-array>
<string-array name="flashTime">
<item name="0">@string/array_flashTime0</item>
<item name="2">@string/array_flashTime2</item>
<item name="4">@string/array_flashTime4</item>
<item name="6">@string/array_flashTime6</item>
<item name="8">@string/array_flashTime8</item>
<item name="12">@string/array_flashTime12</item>
<item name="16">@string/array_flashTime16</item>
<item name="24">@string/array_flashTime24</item>
<item name="32">@string/array_flashTime32</item>
<item name="48">@string/array_flashTime48</item>
<item name="64">@string/array_flashTime64</item>
</string-array>
<string-array name="fontSizeValues" translatable="false">
<item name="25">25</item>
<item name="50">50</item>
<item name="75">75</item>
<item name="100">100</item>
<item name="150">150</item>
<item name="200">200</item>
<item name="300">300</item>
<item name="400">400</item>
</string-array>
<string-array name="cheat_actions">
<item name="e">@string/array_cheat_actionse</item>
<item name="c">@string/array_cheat_actionsc</item>
<item name="7">@string/array_cheat_actions7</item>
<item name="y">@string/array_cheat_actionsy</item>
<item name="a">@string/array_cheat_actionsa</item>
<item name="l">@string/array_cheat_actionsl</item>
<item name=".">@string/array_cheat_actionsb</item>
<item name="S">@string/array_cheat_actionsS</item>
<item name="L">@string/array_cheat_actionsL</item>
<item name="U">@string/array_cheat_actionsU</item>
<item name="F">@string/array_cheat_actionsF</item>
<item name="C">@string/array_cheat_actionsC</item>
<item name="M">@string/array_cheat_actionsM</item>
<item name="G">@string/array_cheat_actionsG</item>
<item name="Z">@string/array_cheat_actionsZ</item>
<item name="J">@string/array_cheat_actionsJ</item>
<item name="P">@string/array_cheat_actionsP</item>
<item name="O">@string/array_cheat_actionsO</item>
<item name="D">@string/array_cheat_actionsD</item>
<item name="Y">@string/array_cheat_actionsY</item>
<item name="T">@string/array_cheat_actionsT</item>
<item name="Tx">@string/array_cheat_actionsTx</item>
<item name="W">@string/array_cheat_actionsW</item>
<item name="I">@string/array_cheat_actionsI</item>
<item name="E">@string/array_cheat_actionsE</item>
<item name="H">@string/array_cheat_actionsH</item>
<item name="B">@string/array_cheat_actionsB</item>
<item name="K">@string/array_cheat_actionsK</item>
</string-array>
<string-array name="cheat_action_values" translatable="false">
<item name="e">e</item>
<item name="c">c</item>
<item name="7">7</item>
<item name="y">y</item>
<item name="a">a</item>
<item name="l">l</item>
<item name=".">.</item>
<item name="S">S</item>
<item name="L">L</item>
<item name="U">U</item>
<item name="F">F</item>
<item name="C">C</item>
<item name="M">M</item>
<item name="G">G</item>
<item name="Z">Z</item>
<item name="J">J</item>
<item name="P">P</item>
<item name="O">O</item>
<item name="D">D</item>
<item name="Y">Y</item>
<item name="T">T</item>
<item name="Tx">Tx</item>
<item name="W">W</item>
<item name="I">I</item>
<item name="E">E</item>
<item name="H">H</item>
<item name="B">B</item>
<item name="K">K</item>
</string-array>
<string-array name="languageValues" translatable="false">
<item name="0">0</item>
<item name="1">1</item>
<item name="2">2</item>
<item name="3">3</item>
<item name="4">4</item>
<item name="5">5</item>
</string-array>
<string-array name="language" translatable="false">
<item name="0">EN</item>
<item name="1">PL</item>
<item name="2">TR (7.1)</item>
<item name="3">CZ</item>
<item name="4">RU</item>
<item name="5">DE (7.1, kein UI)</item>
</string-array>
<string-array name="characterValues" translatable="false">
<item name="0">male</item>
<item name="1">female</item>
</string-array>
<string-array name="character">
<item name="0">@string/array_character0</item>
<item name="1">@string/array_character1</item>
</string-array>
<string-array name="princessValues" translatable="false">
<item name="0">prince</item>
<item name="1">princess</item>
</string-array>
<string-array name="princess">
<item name="0">@string/array_prince0</item>
<item name="1">@string/array_prince1</item>
</string-array>
<string-array name="leaderboardNames">
<item name="0">@string/array_leaderboardNames0</item>
<item name="1">@string/array_leaderboardNames1</item>
<item name="3">@string/array_leaderboardNames3</item>
<item name="2">@string/array_leaderboardNames2</item>
<item name="4">@string/array_leaderboardNames4</item>
<item name="10">@string/array_leaderboardNames10</item>
<item name="6">@string/array_leaderboardNames6</item>
<item name="5">@string/array_leaderboardNames5</item>
<item name="31">@string/array_leaderboardNames31</item>
<item name="32">@string/array_leaderboardNames32</item>
<item name="33">@string/array_leaderboardNames33</item>
<item name="39">@string/array_leaderboardNames39</item>
<item name="34">@string/array_leaderboardNames34</item>
<item name="35">@string/array_leaderboardNames35</item>
<item name="9">@string/array_leaderboardNames9</item>
<item name="24">@string/array_leaderboardNames24</item>
<item name="18">@string/array_leaderboardNames18</item>
<item name="26">@string/array_leaderboardNames26</item>
<item name="27">@string/array_leaderboardNames27</item>
<item name="38">@string/array_leaderboardNames38</item>
<item name="37">@string/array_leaderboardNames37</item>
<item name="42">@string/array_leaderboardNames42</item>
<item name="43">@string/array_leaderboardNames43</item>
<item name="7">@string/array_leaderboardNames7</item>
<item name="22">@string/array_leaderboardNames22</item>
<item name="23">@string/array_leaderboardNames23</item>
<item name="21">@string/array_leaderboardNames21</item>
<item name="19">@string/array_leaderboardNames19</item>
<item name="8">@string/array_leaderboardNames8</item>
<item name="11">@string/array_leaderboardNames11</item>
<item name="20">@string/array_leaderboardNames20</item>
<item name="12">@string/array_leaderboardNames12</item>
<item name="14">@string/array_leaderboardNames14</item>
<item name="13">@string/array_leaderboardNames13</item>
<item name="16">@string/array_leaderboardNames16</item>
<item name="15">@string/array_leaderboardNames15</item>
<item name="25">@string/array_leaderboardNames25</item>
<item name="17">@string/array_leaderboardNames17</item>
<item name="46">@string/array_leaderboardNames46</item>
<item name="47">@string/array_leaderboardNames47</item>
<item name="48">@string/array_leaderboardNames48</item>
<item name="51">@string/array_leaderboardNames51</item>
<item name="52">@string/array_leaderboardNames52</item>
<item name="53">@string/array_leaderboardNames53</item>
<item name="54">@string/array_leaderboardNames54</item>
<item name="55">@string/array_leaderboardNames55</item>
<item name="56">@string/array_leaderboardNames56</item>
<item name="40">@string/array_cheat_actionsy</item>
</string-array>
<string-array name="leaderboardNamesOrder" translatable="false">
<item name="0">0</item>
<item name="1">1</item>
<item name="3">3</item>
<item name="2">2</item>
<item name="4">4</item>
<item name="10">10</item>
<item name="6">6</item>
<item name="5">5</item>
<item name="31">31</item>
<item name="32">32</item>
<item name="33">33</item>
<item name="39">39</item>
<item name="34">34</item>
<item name="35">35</item>
<item name="9">9</item>
<item name="24">24</item>
<item name="18">18</item>
<item name="26">26</item>
<item name="27">27</item>
<item name="38">38</item>
<item name="37">37</item>
<item name="42">42</item>
<item name="43">43</item>
<item name="7">7</item>
<item name="22">22</item>
<item name="23">23</item>
<item name="21">21</item>
<item name="19">19</item>
<item name="8">8</item>
<item name="11">11</item>
<item name="20">20</item>
<item name="12">12</item>
<item name="14">14</item>
<item name="13">13</item>
<item name="16">16</item>
<item name="15">15</item>
<item name="25">25</item>
<item name="17">17</item>
<item name="46">46</item>
<item name="47">47</item>
<item name="48">48</item>
<item name="51">51</item>
<item name="52">52</item>
<item name="53">53</item>
<item name="54">54</item>
<item name="55">55</item>
<item name="56">56</item>
<item name="40">40</item>
</string-array>
</resources>

View File

@ -0,0 +1,182 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="langcode">EN</string>
<string name="app_name">HyperRogue</string>
<string name="signinother">Signin failure</string>
<string name="app_id">480859409970</string>
<string name="signin_other_error">There was an issue with sign in, please try again later.</string>
<string name="sharesam">share screenshot and message</string>
<string name="sharemsg">share message only</string>
<string name="copymsg">copy message</string>
<string name="sharehow">Share what and how?</string>
<string name="sharevia">Share via:</string>
<string name="copied">Copied to Clipboard</string>
<string name="yourwish">Your wish, Rogue?</string>
<string name="notconnected">Not connected!</string>
<string name="aboutgold">about HyperRogue Gold</string>
<string name="buy">buy</string>
<string name="info">info</string>
<string name="nothanks">no thanks</string>
<string name="goldfeatures">
Buy HyperRogue Gold to get the following additional features:\n\
- achievements and leaderboards\n\
- more frequent updates (new lands planned!)\n\
- an Euclidean mode, to see why the geometry matters\n\
- cheating features\n\
</string>
<string name="title_settings">Settings</string>
<string name="title_log">Game log</string>
<string name="title_help">View the help screen</string>
<string name="title_quest">Quest log/restart</string>
<string name="title_cheat">HyperRogue Gold features</string>
<string name="title_share">Share score/screenshot</string>
<string name="title_overview">World Overview</string>
<string name="title_gameservices">Connect to Google Game Services</string>
<string name="summary_gameservices">Online achievements and leaderboards</string>
<string name="title_language">Language</string>
<string name="summary_language">Select your language</string>
<string name="title_character">Player character</string>
<string name="summary_character">Male or female</string>
<string name="title_hsightrange">Sight range</string>
<string name="summary_hsightrange">use a lower value to make the game run faster</string>
<string name="title_hwallmode">Wall mode</string>
<string name="summary_hwallmode">How to display walls?</string>
<string name="title_hmonmode">Monster mode</string>
<string name="summary_hmonmode">How to display monsters and items?</string>
<string name="title_hypermode">Hyperbolic plane model (view)</string>
<string name="summary_hypermode">Klein, Poincaré, ...</string>
<string name="title_fontsize">Font size</string>
<string name="title_flashtime">Flash time</string>
<string name="summary_flashtime">for how long should the messages be shown</string>
<string name="title_revmove">Reverse movement</string>
<string name="summary_revmove">push the character from behind</string>
<string name="title_nomusic">Play without music</string>
<string name="summary_nomusic">do not play any music</string>
<string name="title_immersive">Fullscreen mode</string>
<string name="summary_immersive">swipe inward to display system bars</string>
<string name="title_usegl">Use OpenGL</string>
<string name="summary_usegl">OpenGL sometimes works better, sometimes worse</string>
<string name="title_website">Go to the HyperRogue website</string>
<string name="summary_website">play the faster desktop version too!</string>
<string name="array_visionRange4">4 (very restricted)</string>
<string name="array_visionRange5">5 (restricted)</string>
<string name="array_visionRange6">6 (slightly faster)</string>
<string name="array_visionRange7">7 (full)</string>
<string name="array_wallMode0">ASCII (fast)</string>
<string name="array_wallMode1">Black</string>
<string name="array_wallMode2">plain</string>
<string name="array_wallMode3">Escher (slow)</string>
<string name="array_monsterMode0">ASCII (fast)</string>
<string name="array_monsterMode1">items only</string>
<string name="array_monsterMode2">items and monsters</string>
<string name="array_monsterMode3">high contrast</string>
<string name="array_hyperMode0">Klein (0)</string>
<string name="array_hyperMode5">Middle (0.5)</string>
<string name="array_hyperMode10">Poincaré (1)</string>
<string name="array_hyperMode20">distant (2)</string>
<string name="array_fontSize25">Tiny (25%)</string>
<string name="array_fontSize50">Small (50%)</string>
<string name="array_fontSize75">Smallish (75%)</string>
<string name="array_fontSize100">Normal (100%)</string>
<string name="array_fontSize150">Large (150%)</string>
<string name="array_fontSize200">Big (200%)</string>
<string name="array_fontSize300">Very big (300%)</string>
<string name="array_fontSize400">Huge (400%)</string>
<string name="array_flashTime0">no messages</string>
<string name="array_flashTime2">extremely quick (25%)</string>
<string name="array_flashTime4">very quick (50%)</string>
<string name="array_flashTime6">quick (75%)</string>
<string name="array_flashTime8">rather quick (100%)</string>
<string name="array_flashTime12">normal (150%)</string>
<string name="array_flashTime16">rather slow (2x)</string>
<string name="array_flashTime24">slow (3x)</string>
<string name="array_flashTime32">very slow (4x)</string>
<string name="array_flashTime48">really slow (6x)</string>
<string name="array_flashTime64">extremely slow (8x)</string>
<string name="array_cheat_actionse">Euclidean mode</string>
<string name="array_cheat_actionsa">Achievements</string>
<string name="array_cheat_actionsl">Leaderboards</string>
<string name="array_cheat_actionsb">** cheats are below **</string>
<string name="array_cheat_actionsS">Safety (quick save)</string>
<string name="array_cheat_actionsL">Select the land ---</string>
<string name="array_cheat_actionsU">--- and teleport there</string>
<string name="array_cheat_actionsF">gain orb powers</string>
<string name="array_cheat_actionsC">Hyperstone Quest</string>
<string name="array_cheat_actionsM">summon Mimics</string>
<string name="array_cheat_actionsG">summon a Golem</string>
<string name="array_cheat_actionsZ">rotate the character</string>
<string name="array_cheat_actionsJ">lose all treasure</string>
<string name="array_cheat_actionsP">deplete orb powers</string>
<string name="array_cheat_actionsO">summon orbs</string>
<string name="array_cheat_actionsD">summon dead orbs</string>
<string name="array_cheat_actionsY">summon Orb of Yendor</string>
<string name="array_cheat_actionsT">summon treasure</string>
<string name="array_cheat_actionsTx">summon lots of treasure</string>
<string name="array_cheat_actionsW">summon Sand Worm</string>
<string name="array_cheat_actionsI">summon Ivy</string>
<string name="array_cheat_actionsE">summon a Monster</string>
<string name="array_cheat_actionsH">summon Thumpers</string>
<string name="array_cheat_actionsB">summon Bonfire</string>
<string name="array_cheat_actionsK">gain kills</string>
<string name="array_character0">male</string>
<string name="array_character1">female</string>
<string name="array_leaderboardNames0">Score</string>
<string name="array_leaderboardNames1">Diamonds</string>
<string name="array_leaderboardNames3">Spice</string>
<string name="array_leaderboardNames2">Gold</string>
<string name="array_leaderboardNames4">Rubies</string>
<string name="array_leaderboardNames10">Feathers</string>
<string name="array_leaderboardNames6">Shards</string>
<string name="array_leaderboardNames5">Elixirs</string>
<string name="array_leaderboardNames31">Bomberbird Eggs</string>
<string name="array_leaderboardNames32">Ambers</string>
<string name="array_leaderboardNames33">Pearls</string>
<string name="array_leaderboardNames39">Onyxes</string>
<string name="array_leaderboardNames34">Hypersian Rugs</string>
<string name="array_leaderboardNames35">Garnets</string>
<string name="array_leaderboardNames9">Statues</string>
<string name="array_leaderboardNames24">Grimoires</string>
<string name="array_leaderboardNames18">Fern Flowers</string>
<string name="array_leaderboardNames26">Red Gems</string>
<string name="array_leaderboardNames27">Pirate Treasures</string>
<string name="array_leaderboardNames38">Elemental Gems</string>
<string name="array_leaderboardNames37">Ivory Figurines</string>
<string name="array_leaderboardNames42">Mutant Saplings</string>
<string name="array_leaderboardNames43">Fulgurites</string>
<string name="array_leaderboardNames7">Totems</string>
<string name="array_leaderboardNames22">Wine</string>
<string name="array_leaderboardNames23">Emeralds</string>
<string name="array_leaderboardNames21">Silver</string>
<string name="array_leaderboardNames19">Royal Jellies</string>
<string name="array_leaderboardNames8">Daisies</string>
<string name="array_leaderboardNames11">Sapphires</string>
<string name="array_leaderboardNames20">Powerstones</string>
<string name="array_leaderboardNames12">Hyperstones</string>
<string name="array_leaderboardNames14">Main Quest: number of turns</string>
<string name="array_leaderboardNames13">Main Quest: real time</string>
<string name="array_leaderboardNames16">Hyperstone Quest: number of turns</string>
<string name="array_leaderboardNames15">Hyperstone Quest: real time</string>
<string name="array_leaderboardNames25">Holy Grails</string>
<string name="array_leaderboardNames17">Orbs of Yendor</string>
<string name="title_princess">Save whom</string>
<string name="array_prince0">Prince</string>
<string name="array_prince1">Princess</string>
<string name="array_cheat_actions7">heptagonal mode</string>
<string name="array_cheat_actionsy">Yendor Challenge</string>
<string name="array_cheat_actionsc">Chaos mode</string>
<string name="array_leaderboardNames46">Black Lotuses</string>
<string name="array_leaderboardNames47">Mutant Fruits</string>
<string name="array_leaderboardNames48">White Dove Feathers</string>
<string name="array_leaderboardNames51">Corals</string>
<string name="array_leaderboardNames52">Thornless Roses</string>
<string name="array_leaderboardNames53">Chaos Mode</string>
<string name="array_leaderboardNames54">Tortoise Points</string>
<string name="array_leaderboardNames55">Dragon Scales</string>
<string name="array_leaderboardNames56">Apples</string>
</resources>

View File

@ -0,0 +1,113 @@
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<CheckBoxPreference
android:key="gameservices"
android:title="@string/title_gameservices"
android:summary="@string/summary_gameservices"
android:defaultValue="false"
></CheckBoxPreference>
<ListPreference
android:key="language"
android:title="@string/title_language"
android:summary="@string/summary_language"
android:defaultValue="0"
android:entries="@array/language"
android:entryValues="@array/languageValues"
></ListPreference>
<ListPreference
android:key="character"
android:title="@string/title_character"
android:summary="@string/summary_character"
android:defaultValue="male"
android:entries="@array/character"
android:entryValues="@array/characterValues"
></ListPreference>
<ListPreference
android:key="princess"
android:title="@string/title_princess"
android:defaultValue="princess"
android:entries="@array/princess"
android:entryValues="@array/princessValues"
></ListPreference>
<ListPreference
android:key="hsightrange"
android:title="@string/title_hsightrange"
android:summary="@string/summary_hsightrange"
android:defaultValue="7"
android:entries="@array/visionRange"
android:entryValues="@array/visionRangeValues"
></ListPreference>
<ListPreference
android:key="hwallmode"
android:title="@string/title_hwallmode"
android:summary="@string/summary_hwallmode"
android:defaultValue="3"
android:entries="@array/wallMode"
android:entryValues="@array/wallModeValues"
></ListPreference>
<ListPreference
android:key="hmonmode"
android:title="@string/title_hmonmode"
android:summary="@string/summary_hmonmode"
android:defaultValue="2"
android:entries="@array/monsterMode"
android:entryValues="@array/monsterModeValues"
></ListPreference>
<ListPreference
android:key="hypermode"
android:title="@string/title_hypermode"
android:summary="@string/summary_hypermode"
android:defaultValue="1"
android:entries="@array/hyperMode"
android:entryValues="@array/hyperModeValues"
></ListPreference>
<ListPreference
android:key="fontsize"
android:title="@string/title_fontsize"
android:defaultValue="100"
android:entries="@array/fontSize"
android:entryValues="@array/fontSizeValues"
></ListPreference>
<ListPreference
android:key="flashtime"
android:title="@string/title_flashtime"
android:summary="@string/summary_flashtime"
android:defaultValue="12"
android:entries="@array/flashTime"
android:entryValues="@array/flashTimeValues"
></ListPreference>
<CheckBoxPreference
android:key="revmove"
android:title="@string/title_revmove"
android:summary="@string/summary_revmove"
android:defaultValue="false"
></CheckBoxPreference>
<CheckBoxPreference
android:key="nomusic"
android:title="@string/title_nomusic"
android:summary="@string/summary_nomusic"
android:defaultValue="false"
></CheckBoxPreference>
<CheckBoxPreference
android:key="immersive"
android:title="@string/title_immersive"
android:summary="@string/summary_immersive"
android:defaultValue="false"
></CheckBoxPreference>
<CheckBoxPreference
android:key="usegl"
android:title="@string/title_usegl"
android:summary="@string/summary_usegl"
android:defaultValue="true"
></CheckBoxPreference>
<Preference
android:title="@string/title_website"
android:summary="@string/summary_website"
>
<intent android:action="android.intent.action.VIEW"
android:data="http://www.roguetemple.com/z/hyper.php"
/>
</Preference>
</PreferenceScreen>

15
hydroid/build.gradle Normal file
View File

@ -0,0 +1,15 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.0'
}
}
allprojects {
repositories {
jcenter()
}
}

7
hydroid/copy.sh Executable file
View File

@ -0,0 +1,7 @@
#!/bin/sh
mkdir app/src/main/assets/sounds
cp ../sounds/* app/src/main/assets/sounds/
mkdir app/src/main/res/raw/
for x in caves crossroads desert graveyard hell icyland jungle laboratory mirror rlyeh
do cp ../music/hr3-$x.ogg app/src/main/res/raw/$x.ogg
done

Binary file not shown.

View File

@ -0,0 +1,6 @@
#Thu Feb 09 18:36:08 CET 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip

164
hydroid/gradlew vendored Normal file
View File

@ -0,0 +1,164 @@
#!/usr/bin/env bash
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn ( ) {
echo "$*"
}
die ( ) {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
esac
# For Cygwin, ensure paths are in UNIX format before anything is touched.
if $cygwin ; then
[ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
fi
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >&-
APP_HOME="`pwd -P`"
cd "$SAVED" >&-
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
function splitJvmOpts() {
JVM_OPTS=("$@")
}
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"

90
hydroid/gradlew.bat vendored Normal file
View File

@ -0,0 +1,90 @@
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windowz variants
if not "%OS%" == "Windows_NT" goto win9xME_args
if "%@eval[2+2]" == "4" goto 4NT_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
goto execute
:4NT_args
@rem Get arguments from the 4NT Shell from JP Software
set CMD_LINE_ARGS=%$
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega

19
hydroid/hyperroid.iml Normal file
View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<module external.linked.project.id="hyperroid" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$" external.system.id="GRADLE" external.system.module.group="" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="java-gradle" name="Java-Gradle">
<configuration>
<option name="BUILD_FOLDER_PATH" value="$MODULE_DIR$/build" />
<option name="BUILDABLE" value="false" />
</configuration>
</facet>
</component>
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_7" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/.gradle" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

1
hydroid/settings.gradle Normal file
View File

@ -0,0 +1 @@
include ':app'

21
hydroid/work.iml Normal file
View File

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<module external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$" external.system.id="GRADLE" external.system.module.group="" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="java-gradle" name="Java-Gradle">
<configuration>
<option name="BUILD_FOLDER_PATH" value="$MODULE_DIR$/build" />
</configuration>
</facet>
</component>
<component name="NewModuleRootManager" inherit-compiler-output="false">
<output url="file://$MODULE_DIR$/build/classes/main" />
<output-test url="file://$MODULE_DIR$/build/classes/test" />
<exclude-output />
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/.gradle" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>