Compare commits

3 Commits

75 changed files with 2032 additions and 1179 deletions

2
.gitignore vendored
View File

@@ -1,4 +1,5 @@
.settings
.DS_store
.gradle
.idea
bin
@@ -8,6 +9,7 @@ nbandroid
private
build
app/src/main/res/values/version.xml
app/release
compiler/compiler.obj
compiler/compiler.exe
compiler/test/compiler.exe

1
app/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
/build

View File

@@ -1,11 +1,15 @@
apply plugin: 'com.android.application'
plugins {
id 'com.android.application'
}
apply plugin: "androidx.navigation.safeargs"
//
// Creates version.xml
//
task createVersionXML {
doLast {
def versionP = 'git describe --tags --long --dirty=-x --abbrev=8'
def versionP = 'git describe --tags --long --dirty=-x --always --abbrev=8'
.execute()
versionP.waitFor()
def version = versionP.text.trim()
@@ -35,64 +39,64 @@ preBuild.dependsOn createVersionXML
//
// Convert SVG images from art directory into PNG files.
//
task generateDrawablesFromArt {
doLast {
def buildDir = (new File(project.buildDir,'art')).toString()
def p = ('make -C app/src/main/art RES=../res TMP='+buildDir).execute()
p.consumeProcessOutput()
p.waitFor()
if ( p.exitValue() )
throw new GradleException("Generation of art failed.")
}
}
preBuild.dependsOn generateDrawablesFromArt
//task generateDrawablesFromArt {
// doLast {
// def buildDir = (new File(project.buildDir,'art')).toString()
// def p = ('make -C app/src/main/art RES=../res TMP='+buildDir).execute()
// p.consumeProcessOutput()
// p.waitFor()
// if ( p.exitValue() )
// throw new GradleException("Generation of art failed.")
// }
//}
//preBuild.dependsOn generateDrawablesFromArt
android {
compileSdkVersion 10
buildToolsVersion "21.1.1"
compileSdk 31
defaultConfig {
applicationId "org.vostan.sokoban"
minSdkVersion 10
targetSdkVersion 14
applicationId "org.vostan.banvor"
minSdk 21
targetSdk 31
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
apply from: new File(getRootDir(),'/.secret.gradle')
buildTypes {
release {
runProguard true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'
signingConfig signingConfigs.sokoban_release
}
debug {
applicationIdSuffix ".debug"
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
sourceSets {
/*
main {
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
*/
debug {
main.manifest.srcFile "src/main/AndroidManifest-debug.xml"
}
androidTest.setRoot("src/tests")
buildFeatures {
viewBinding true
}
}
//repositories {}
dependencies {
compile 'com.android.support:support-v4:18.0.0'
def nav_version = "2.3.5"
implementation 'androidx.appcompat:appcompat:1.3.1'
implementation 'com.google.android.material:material:1.4.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.0'
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
// Java language implementation
implementation "androidx.navigation:navigation-fragment:$nav_version"
implementation "androidx.navigation:navigation-ui:$nav_version"
// Feature module Support
implementation "androidx.navigation:navigation-dynamic-features-fragment:$nav_version"
// Testing Navigation
androidTestImplementation "androidx.navigation:navigation-testing:$nav_version"
// Jetpack Compose Integration
implementation "androidx.navigation:navigation-compose:2.4.0-alpha10"
}

View File

@@ -1,20 +0,0 @@
# To enable ProGuard in your project, edit project.properties
# to define the proguard.config property as described in that file.
#
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in ${sdk.dir}/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the ProGuard
# include property in project.properties.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# Add any project specific keep options here:
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}

21
app/proguard-rules.pro vendored Normal file
View File

@@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

View File

@@ -0,0 +1,26 @@
package org.vostan.banvor;
import android.content.Context;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
* Instrumented test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
assertEquals("org.vostan.banvor", appContext.getPackageName());
}
}

View File

@@ -1,30 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.vostan.sokoban"
android:versionCode="0x00010001"
package="org.vostan.banvor"
android:versionName="@string/git_version">
<uses-sdk android:minSdkVersion="10"
android:targetSdkVersion="14"/>
<application android:label="@string/app_name"
<application
android:name=".App"
android:icon="@drawable/icon"
android:name="org.vostan.sokoban.App"
android:theme="@android:style/Theme">
<activity android:name="org.vostan.sokoban.menu.MainActivity"
android:label="@string/app_name"
android:configChanges="keyboardHidden|orientation"
android:screenOrientation="portrait" >
android:roundIcon="@drawable/icon"
android:theme="@style/Theme.Banvor">
<activity
android:name=".WelcomeActivity"
android:exported="true"
android:label="@string/title_activity_welcome"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="org.vostan.sokoban.play.PlayActivity"
android:label="@string/play_activity"
android:configChanges="keyboardHidden|orientation"
android:screenOrientation="portrait" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="org.vostan.sokoban.MainMenu" />
</activity>
</application>
</manifest>

View File

@@ -2,23 +2,23 @@
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="500"
height="500"
id="svg3081"
version="1.1"
inkscape:version="0.48.5 r10040"
inkscape:version="1.1.1 (c3084ef, 2021-09-22)"
sodipodi:docname="floor.svg"
inkscape:export-filename="C:\Users\vahagnk\devel\_private\org.dyndns.vahagn.sokoban\res\drawable\goal.png"
inkscape:export-filename="/Users/vahagnk/devel/banvor/app/src/main/res/drawable/floor.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
inkscape:export-ydpi="90"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs3083">
<linearGradient
@@ -61,7 +61,11 @@
inkscape:label="Glow"
inkscape:menu="Shadows and Glows"
inkscape:menu-tooltip="Glow of object's own color at the edges"
color-interpolation-filters="sRGB">
color-interpolation-filters="sRGB"
x="-0.025040128"
y="-0.025040128"
width="1.0500803"
height="1.0500803">
<feGaussianBlur
id="feGaussianBlur3920"
stdDeviation="5"
@@ -111,20 +115,21 @@
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.83972969"
inkscape:cx="-95.341037"
inkscape:cy="280.19905"
inkscape:cx="458.48087"
inkscape:cy="280.44739"
inkscape:document-units="px"
inkscape:current-layer="layer5"
inkscape:current-layer="g134"
showgrid="true"
inkscape:snap-global="false"
inkscape:window-width="1920"
inkscape:window-height="1018"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-width="1792"
inkscape:window-height="1067"
inkscape:window-x="0"
inkscape:window-y="25"
inkscape:window-maximized="1"
borderlayer="true"
inkscape:showpageshadow="false"
showborder="true">
showborder="true"
inkscape:pagecheckerboard="true">
<inkscape:grid
type="xygrid"
id="grid3093"
@@ -141,22 +146,40 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
id="layer4"
inkscape:label="Back"
style="display:inline"
inkscape:label="White Background"
style="display:none"
sodipodi:insensitive="true">
<path
style="fill:#ffffff;stroke:none;display:inline"
style="display:inline;fill:#ffffff;stroke:none"
d="m -82.674928,577.29025 c 227.680718,1.4e-4 455.361438,0 683.042168,0 0,-215.62937 0,-431.25882 0,-646.888256 -227.68073,0 -455.36145,0 -683.042168,0 0,215.629436 0,431.258886 0,646.888256 z"
id="rect3089"
inkscape:connector-curvature="0" />
</g>
<g
inkscape:groupmode="layer"
id="g134"
inkscape:label="Black Background"
style="display:none"
sodipodi:insensitive="true">
<path
style="display:inline;fill:#ffffff;stroke:none"
d="m -82.674928,577.29025 c 227.680718,1.4e-4 455.361438,0 683.042168,0 0,-215.62937 0,-431.25882 0,-646.888256 -227.68073,0 -455.36145,0 -683.042168,0 0,215.629436 0,431.258886 0,646.888256 z"
id="path132"
inkscape:connector-curvature="0" />
<rect
style="fill:#000000;stroke-width:1.11073"
id="rect641"
width="676.40814"
height="646.63666"
x="-79.787582"
y="-69.069847" />
</g>
<g
inkscape:label="Tiles"
inkscape:groupmode="layer"
@@ -185,7 +208,7 @@
id="rect3091-14-2"
inkscape:connector-curvature="0" />
<path
style="fill:#5f5fd3;fill-opacity:0.99607843;stroke:none"
style="fill:#5f5fd3;fill-opacity:0.996078;stroke:none"
d="m 251.15625,924.03125 c 40.3125,0 80.625,0 120.9375,0 0,-81.70833 0,-163.41667 0,-245.125 -40.3125,0 -80.625,0 -120.9375,0 0,81.70833 0,163.41667 0,245.125 z"
id="rect3091-15-21"
inkscape:connector-curvature="0" />
@@ -240,11 +263,11 @@
inkscape:groupmode="layer"
id="layer3"
inkscape:label="Layer"
style="opacity:0.4424779;display:none"
style="display:none;opacity:0.442478"
transform="translate(0,-552.36217)"
sodipodi:insensitive="true">
<rect
style="opacity:0.63274387;fill:#ffffff;fill-opacity:0.99967316;fill-rule:nonzero;stroke:none"
style="opacity:0.632744;fill:#ffffff;fill-opacity:0.999673;fill-rule:nonzero;stroke:none"
id="rect2997"
width="629.78662"
height="591.32501"
@@ -255,9 +278,10 @@
inkscape:groupmode="layer"
id="layer5"
inkscape:label="Goal"
style="opacity:1;display:inline">
style="display:inline;opacity:1"
sodipodi:insensitive="true">
<rect
style="fill:url(#radialGradient4041);fill-opacity:1;stroke:none;opacity:0.59292035"
style="opacity:0.59292;fill:url(#radialGradient4041);fill-opacity:1;stroke:none"
id="rect3827"
width="676.15387"
height="617.69232"
@@ -267,17 +291,15 @@
inkscape:export-xdpi="90"
inkscape:export-ydpi="90" />
<path
sodipodi:type="arc"
style="fill:#008000;fill-opacity:0.28042328000000000;fill-rule:nonzero;stroke:none;opacity:0.6460177"
style="opacity:0.646018;fill:#008000;fill-opacity:0.280423;fill-rule:nonzero;stroke:none"
id="path4025"
sodipodi:cx="241.15384"
sodipodi:cy="251.92308"
sodipodi:rx="41.153847"
sodipodi:ry="43.46154"
d="m 282.30769,251.92308 a 41.153847,43.46154 0 1 1 -82.3077,0 41.153847,43.46154 0 1 1 82.3077,0 z"
inkscape:export-filename="C:\Users\vahagnk\devel\_private\org.dyndns.vahagn.sokoban\res\drawable\path4025.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90" />
inkscape:export-ydpi="90"
cx="241.15384"
cy="251.92308"
rx="41.153847"
ry="43.46154" />
</g>
<g
inkscape:groupmode="layer"

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

@@ -2,23 +2,23 @@
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg2985"
version="1.1"
inkscape:version="0.48.5 r10040"
inkscape:version="1.1.1 (c3084ef, 2021-09-22)"
width="500"
height="500"
sodipodi:docname="lock.svg"
inkscape:export-filename="C:\Users\vahagnk\devel\_private\org.dyndns.vahagn.sokoban\art\lock.png"
inkscape:export-xdpi="17.258801"
inkscape:export-ydpi="17.258801">
inkscape:export-ydpi="17.258801"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<metadata
id="metadata2991">
<rdf:RDF>
@@ -27,7 +27,6 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
@@ -168,22 +167,25 @@
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1018"
inkscape:window-width="1792"
inkscape:window-height="1067"
id="namedview2987"
showgrid="false"
inkscape:zoom="0.69044441"
inkscape:cx="-748.14943"
inkscape:cy="232.66929"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:cx="210.00967"
inkscape:cy="490.26394"
inkscape:window-x="0"
inkscape:window-y="25"
inkscape:window-maximized="1"
inkscape:current-layer="g3013" />
inkscape:current-layer="g3013"
inkscape:pagecheckerboard="true"
borderlayer="true"
inkscape:showpageshadow="false" />
<g
inkscape:groupmode="layer"
id="layer1"
inkscape:label="box"
style="display:inline"
style="display:none"
sodipodi:insensitive="true">
<rect
y="0.63774103"
@@ -191,10 +193,10 @@
height="499.0787"
width="496.88708"
id="rect4119-2"
style="fill:#ffd42a;fill-opacity:1;stroke:none;display:inline" />
style="display:inline;fill:#ffd42a;fill-opacity:1;stroke:none" />
<path
style="fill:#ffb82a;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642198px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
d="m -0.70529001,0.63774623 83.52302001,0 -1.72616,497.14000377 -81.50446001,0 z"
style="display:inline;fill:#ffb82a;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M -0.70529001,0.63774623 H 82.81773 L 81.09157,497.77775 H -0.41289001 Z"
id="path4184-5"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" />
@@ -202,11 +204,11 @@
sodipodi:nodetypes="ccccc"
inkscape:connector-curvature="0"
id="path4186-8"
d="m 414.41905,0.63774623 83.52302,0 -0.0777,497.14000377 -82.62207,0 z"
style="fill:#ffb82a;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642198px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;display:inline" />
d="m 414.41905,0.63774623 h 83.52302 L 497.86437,497.77775 H 415.2423 Z"
style="display:inline;fill:#ffb82a;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
<path
style="fill:#ffc52a;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642198;stroke-linejoin:round;stroke-opacity:1;display:inline"
d="m -0.41289001,1.7103762 498.27713001,0 0,81.2589048 -498.27713001,0 z"
style="display:inline;fill:#ffc52a;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642;stroke-linejoin:round;stroke-opacity:1"
d="M -0.41289001,1.7103762 H 497.86424 V 82.969281 H -0.41289001 Z"
id="rect4190-8"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" />
@@ -214,44 +216,44 @@
sodipodi:nodetypes="ccccc"
inkscape:connector-curvature="0"
id="path4193-1"
d="m -0.41289001,416.51885 498.27713001,0 0,81.2589 -498.27713001,0 z"
style="fill:#ffc52a;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642198;stroke-linejoin:round;stroke-opacity:1;display:inline" />
d="M -0.41289001,416.51885 H 497.86424 v 81.2589 H -0.41289001 Z"
style="display:inline;fill:#ffc52a;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642;stroke-linejoin:round;stroke-opacity:1" />
<rect
style="fill:#ffdd55;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642198;stroke-linejoin:round;stroke-opacity:1;display:inline"
style="display:inline;fill:#ffdd55;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642;stroke-linejoin:round;stroke-opacity:1"
id="rect4195-4-2"
width="82.565849"
height="333.54956"
x="165.09776"
y="82.969307" />
<rect
style="fill:#ffcc00;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642198;stroke-linejoin:round;stroke-opacity:1;display:inline"
style="display:inline;fill:#ffcc00;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642;stroke-linejoin:round;stroke-opacity:1"
id="rect4195-1"
width="82.565849"
height="333.54956"
x="82.531799"
y="82.969398" />
<rect
style="fill:#ffcc00;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642198;stroke-linejoin:round;stroke-opacity:1;display:inline"
style="display:inline;fill:#ffcc00;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642;stroke-linejoin:round;stroke-opacity:1"
id="rect4195-9-4"
width="82.565849"
height="333.54956"
x="331.98953"
y="82.969307" />
<path
style="fill:#ffba08;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642198;stroke-opacity:1;display:inline"
d="m 18.70922,83.003483 352.41118,333.541907 114.19532,0 L 132.90453,83.003483 z"
style="display:inline;fill:#ffba08;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642;stroke-opacity:1"
d="M 18.70922,83.003483 371.1204,416.54539 H 485.31572 L 132.90453,83.003483 Z"
id="rect4222-6-9"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" />
<path
style="fill:none;stroke:none;display:inline"
d="M 365.99572,0.71343623 413.49073,87.816965 330.01679,87.254405 314.1055,0.77958623 z"
style="display:inline;fill:none;stroke:none"
d="M 365.99572,0.71343623 413.49073,87.816965 330.01679,87.254405 314.1055,0.77958623 Z"
id="path5801-2-9"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" />
<path
style="fill:#ffba08;fill-opacity:1;stroke:#ffaf00;stroke-width:3.07642198;stroke-opacity:1;display:inline"
d="M 365.28087,83.003483 18.52384,416.54539 l 113.17572,0 346.75703,-333.541907 z"
style="display:inline;fill:#ffba08;fill-opacity:1;stroke:#ffaf00;stroke-width:3.07642;stroke-opacity:1"
d="M 365.28087,83.003483 18.52384,416.54539 H 131.69956 L 478.45659,83.003483 Z"
id="rect4222-8"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" />
@@ -272,11 +274,11 @@
inkscape:groupmode="layer"
id="layer2"
inkscape:label="lock"
style="display:none"
style="display:inline"
sodipodi:insensitive="true">
<path
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient3827);fill-opacity:1;stroke:#ff0000;stroke-width:13;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
d="M 279.25,15.34375 C 244.19516,16.280737 205.62169,14.019558 176.28125,36.875 145.74944,58.031778 124.42793,93.306298 125.625,131.09375 c -1.25949,30.25303 -1.54242,60.51254 -2.28125,90.78125 -29.107271,8.83439 -58.911773,28.03569 -66.40625,59.25 -5.949132,47.85073 -5.193718,96.65794 0.84375,144.46875 5.81316,29.47508 34.048591,50.86541 62.09375,57.65625 70.6574,5.2588 141.68427,4.72145 212.5,3.46875 36.0167,-1.89923 79.02601,-1.32552 103.75,-32.375 21.95709,-21.13269 15.57942,-53.75893 17.09375,-81.125 -1.06809,-35.15555 3.16616,-71.38914 -6.75,-105.59375 C 436.50164,241.82253 407.98841,233.30151 386.0625,220.1875 385.31924,179.13486 387.46822,137.91703 383.6875,97 377.68381,59.868714 342.45783,37.770594 311.5625,21.9375 301.55636,16.932984 290.33578,15.305295 279.25,15.34375 z M 254.78125,57.1875 c 35.09884,-0.818972 74.31899,21.760519 82.34375,57.6875 3.94756,36.27398 1.5228,72.90765 2.1875,109.34375 l -163.5625,0 c 0.66778,-35.63012 -2.1258,-71.5459 3.5625,-106.875 4.44807,-36.240113 40.78168,-60.13132 75.46875,-60.15625 z m 6.28125,228.84375 c 4.57444,0.0559 9.10362,1.18725 13.25,3.09375 20.14711,7.7839 34.49677,34.87768 16.59375,52.34375 -20.24236,15.0574 -2.79826,38.70146 -0.0625,57.78125 13.10925,26.0231 -14.10754,37.72869 -35.875,34.0625 -26.15517,4.54421 -33.10596,-19.45003 -23.96875,-39.28125 8.88977,-21.957 12.21901,-45.05648 -7.625,-62 -10.54098,-23.17468 16.0488,-45.52697 37.6875,-46 z"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient3827);fill-opacity:1;stroke:#ff0000;stroke-width:13;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker:none;enable-background:accumulate"
d="M 279.25,15.34375 C 244.19516,16.280737 205.62169,14.019558 176.28125,36.875 145.74944,58.031778 124.42793,93.306298 125.625,131.09375 c -1.25949,30.25303 -1.54242,60.51254 -2.28125,90.78125 -29.107271,8.83439 -58.911773,28.03569 -66.40625,59.25 -5.949132,47.85073 -5.193718,96.65794 0.84375,144.46875 5.81316,29.47508 34.048591,50.86541 62.09375,57.65625 70.6574,5.2588 141.68427,4.72145 212.5,3.46875 36.0167,-1.89923 79.02601,-1.32552 103.75,-32.375 21.95709,-21.13269 15.57942,-53.75893 17.09375,-81.125 -1.06809,-35.15555 3.16616,-71.38914 -6.75,-105.59375 C 436.50164,241.82253 407.98841,233.30151 386.0625,220.1875 385.31924,179.13486 387.46822,137.91703 383.6875,97 377.68381,59.868714 342.45783,37.770594 311.5625,21.9375 301.55636,16.932984 290.33578,15.305295 279.25,15.34375 Z M 254.78125,57.1875 c 35.09884,-0.818972 74.31899,21.760519 82.34375,57.6875 3.94756,36.27398 1.5228,72.90765 2.1875,109.34375 H 175.75 c 0.66778,-35.63012 -2.1258,-71.5459 3.5625,-106.875 4.44807,-36.240113 40.78168,-60.13132 75.46875,-60.15625 z m 6.28125,228.84375 c 4.57444,0.0559 9.10362,1.18725 13.25,3.09375 20.14711,7.7839 34.49677,34.87768 16.59375,52.34375 -20.24236,15.0574 -2.79826,38.70146 -0.0625,57.78125 13.10925,26.0231 -14.10754,37.72869 -35.875,34.0625 -26.15517,4.54421 -33.10596,-19.45003 -23.96875,-39.28125 8.88977,-21.957 12.21901,-45.05648 -7.625,-62 -10.54098,-23.17468 16.0488,-45.52697 37.6875,-46 z"
id="path3903"
inkscape:connector-curvature="0" />
</g>
@@ -289,7 +291,7 @@
<path
inkscape:connector-curvature="0"
id="path3015"
d="M 279.25,15.34375 C 244.19516,16.280737 205.62169,14.019558 176.28125,36.875 145.74944,58.031778 124.42793,93.306298 125.625,131.09375 c -1.25949,30.25303 -1.54242,60.51254 -2.28125,90.78125 -29.107271,8.83439 -58.911773,28.03569 -66.40625,59.25 -5.949132,47.85073 -5.193718,96.65794 0.84375,144.46875 5.81316,29.47508 34.048591,50.86541 62.09375,57.65625 70.6574,5.2588 141.68427,4.72145 212.5,3.46875 36.0167,-1.89923 79.02601,-1.32552 103.75,-32.375 21.95709,-21.13269 15.57942,-53.75893 17.09375,-81.125 -1.06809,-35.15555 3.16616,-71.38914 -6.75,-105.59375 C 436.50164,241.82253 407.98841,233.30151 386.0625,220.1875 385.31924,179.13486 387.46822,137.91703 383.6875,97 377.68381,59.868714 342.45783,37.770594 311.5625,21.9375 301.55636,16.932984 290.33578,15.305295 279.25,15.34375 z M 254.78125,57.1875 c 35.09884,-0.818972 74.31899,21.760519 82.34375,57.6875 3.94756,36.27398 1.5228,72.90765 2.1875,109.34375 l -163.5625,0 c 0.66778,-35.63012 -2.1258,-71.5459 3.5625,-106.875 4.44807,-36.240113 40.78168,-60.13132 75.46875,-60.15625 z m 6.28125,228.84375 c 4.57444,0.0559 9.10362,1.18725 13.25,3.09375 20.14711,7.7839 34.49677,34.87768 16.59375,52.34375 -20.24236,15.0574 -2.79826,38.70146 -0.0625,57.78125 13.10925,26.0231 -14.10754,37.72869 -35.875,34.0625 -26.15517,4.54421 -33.10596,-19.45003 -23.96875,-39.28125 8.88977,-21.957 12.21901,-45.05648 -7.625,-62 -10.54098,-23.17468 16.0488,-45.52697 37.6875,-46 z"
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:url(#linearGradient3809);fill-opacity:1;stroke:#0000ff;stroke-width:13;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans" />
d="M 279.25,15.34375 C 244.19516,16.280737 205.62169,14.019558 176.28125,36.875 145.74944,58.031778 124.42793,93.306298 125.625,131.09375 c -1.25949,30.25303 -1.54242,60.51254 -2.28125,90.78125 -29.107271,8.83439 -58.911773,28.03569 -66.40625,59.25 -5.949132,47.85073 -5.193718,96.65794 0.84375,144.46875 5.81316,29.47508 34.048591,50.86541 62.09375,57.65625 70.6574,5.2588 141.68427,4.72145 212.5,3.46875 36.0167,-1.89923 79.02601,-1.32552 103.75,-32.375 21.95709,-21.13269 15.57942,-53.75893 17.09375,-81.125 -1.06809,-35.15555 3.16616,-71.38914 -6.75,-105.59375 C 436.50164,241.82253 407.98841,233.30151 386.0625,220.1875 385.31924,179.13486 387.46822,137.91703 383.6875,97 377.68381,59.868714 342.45783,37.770594 311.5625,21.9375 301.55636,16.932984 290.33578,15.305295 279.25,15.34375 Z M 254.78125,57.1875 c 35.09884,-0.818972 74.31899,21.760519 82.34375,57.6875 3.94756,36.27398 1.5228,72.90765 2.1875,109.34375 H 175.75 c 0.66778,-35.63012 -2.1258,-71.5459 3.5625,-106.875 4.44807,-36.240113 40.78168,-60.13132 75.46875,-60.15625 z m 6.28125,228.84375 c 4.57444,0.0559 9.10362,1.18725 13.25,3.09375 20.14711,7.7839 34.49677,34.87768 16.59375,52.34375 -20.24236,15.0574 -2.79826,38.70146 -0.0625,57.78125 13.10925,26.0231 -14.10754,37.72869 -35.875,34.0625 -26.15517,4.54421 -33.10596,-19.45003 -23.96875,-39.28125 8.88977,-21.957 12.21901,-45.05648 -7.625,-62 -10.54098,-23.17468 16.0488,-45.52697 37.6875,-46 z"
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:Sans;-inkscape-font-specification:Sans;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;baseline-shift:baseline;text-anchor:start;display:inline;overflow:visible;visibility:visible;fill:url(#linearGradient3809);fill-opacity:1;stroke:#0000ff;stroke-width:13;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker:none;enable-background:accumulate" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

@@ -2,24 +2,25 @@
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="500"
height="500"
id="svg3081"
version="1.1"
inkscape:version="0.48.4 r9939"
inkscape:version="1.1.1 (c3084ef, 2021-09-22)"
sodipodi:docname="wall.svg"
inkscape:export-filename="C:\Users\vahagnk\devel\_private\org.dyndns.vahagn.sokoban\art\wall.png"
inkscape:export-filename="/Users/vahagnk/devel/banvor/app/src/main/res/drawable/wall.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
inkscape:export-ydpi="90"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<title
id="title6770">Banvor Wall</title>
<defs
id="defs3083">
<pattern
@@ -158,7 +159,7 @@
</pattern>
<linearGradient
id="linearGradient5386"
osb:paint="solid">
inkscape:swatch="solid">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
@@ -212,20 +213,24 @@
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:zoom="1.28"
inkscape:cx="187.56837"
inkscape:cy="248.77068"
inkscape:cx="153.125"
inkscape:cy="273.04688"
inkscape:document-units="px"
inkscape:current-layer="layer1"
inkscape:current-layer="layer4"
showgrid="true"
inkscape:snap-global="false"
inkscape:window-width="1920"
inkscape:window-height="1018"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1">
inkscape:window-width="1792"
inkscape:window-height="1067"
inkscape:window-x="0"
inkscape:window-y="25"
inkscape:window-maximized="0"
inkscape:pagecheckerboard="true"
inkscape:showpageshadow="false"
showborder="true"
borderlayer="true">
<inkscape:grid
type="xygrid"
id="grid3093"
@@ -242,23 +247,24 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
<dc:title>Banvor Wall</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
id="layer4"
inkscape:label="Background"
sodipodi:insensitive="true">
inkscape:label="Grey Background"
sodipodi:insensitive="true"
style="display:none">
<rect
style="fill:#e3dbdb;stroke:none;display:inline"
style="display:inline;fill:#e3dbdb;stroke:none"
id="rect3089"
width="500"
height="500"
x="-500"
y="0.78125"
transform="matrix(0,-1,1,0,0,0)"
transform="rotate(-90)"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"
inkscape:export-filename="C:\Users\vahagnk\devel\_private\org.dyndns.vahagn.sokoban\art\wall.png" />
@@ -271,7 +277,7 @@
transform="translate(0,-552.36217)"
sodipodi:insensitive="true">
<rect
style="opacity:0.59292034;fill:url(#pattern4637);fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient5390);stroke-width:0.8192116"
style="opacity:0.59292;fill:url(#pattern4637);fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient5390);stroke-width:0.819212"
id="rect5349"
width="499.18079"
height="499.18079"
@@ -296,7 +302,7 @@
inkscape:export-xdpi="90"
inkscape:export-ydpi="90" />
<path
style="fill:#d40000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
style="display:inline;fill:#d40000;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 496.41257,616.3048 c 2.75154,-65.80684 7.56675,-55.6365 -119.35722,-54.02643 -134.33577,1.7041 -119.19801,-19.19518 -117.69373,56.56288 1.26192,63.55246 -31.0482,55.20698 122.68426,55.041 139.86461,-0.15099 112.2568,-7.11654 114.36669,-57.57745 z"
id="path4651-4"
inkscape:connector-curvature="0"
@@ -305,7 +311,7 @@
inkscape:export-xdpi="90"
inkscape:export-ydpi="90" />
<path
style="fill:#d40000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
style="display:inline;fill:#d40000;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 130.93118,742.01143 c -2.75154,65.80684 -7.56675,55.63649 119.35722,54.02642 134.33577,-1.70409 119.19801,19.19519 117.69373,-56.56287 -1.26192,-63.55246 31.0482,-55.20698 -122.68426,-55.041 -139.86461,0.15098 -112.2568,7.11654 -114.36669,57.57745 z"
id="path4651-0"
inkscape:connector-curvature="0"
@@ -314,7 +320,7 @@
inkscape:export-xdpi="90"
inkscape:export-ydpi="90" />
<path
style="fill:#d40000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
style="display:inline;fill:#d40000;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 621.41257,737.06301 c 2.75154,-65.80684 7.56675,-55.63649 -119.35722,-54.02644 -134.33577,1.70411 -119.19801,-19.19517 -117.69373,56.56289 1.26192,63.55245 -31.0482,55.20698 122.68426,55.041 139.86461,-0.15099 112.2568,-7.11654 114.36669,-57.57745 z"
id="path4651-9"
inkscape:connector-curvature="0"
@@ -323,7 +329,7 @@
inkscape:export-xdpi="90"
inkscape:export-ydpi="90" />
<path
style="fill:#d40000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
style="display:inline;fill:#d40000;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 120.63132,737.06301 c 2.75154,-65.80684 7.56675,-55.63649 -119.35722,-54.02644 -134.33577,1.70411 -119.19801,-19.19517 -117.69373,56.56289 1.26192,63.55245 -31.0482,55.20698 122.68426,55.041 139.86461,-0.15099 112.2568,-7.11654 114.36669,-57.57745 z"
id="path4651-48"
inkscape:connector-curvature="0"
@@ -332,7 +338,7 @@
inkscape:export-xdpi="90"
inkscape:export-ydpi="90" />
<path
style="fill:#d40000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
style="display:inline;fill:#d40000;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 248.75632,865.70746 c 2.75154,-65.80684 7.56675,-55.6365 -119.35722,-54.02643 -134.335768,1.7041 -119.198007,-19.19518 -117.693727,56.56288 1.26192,63.55246 -31.048201,55.20698 122.684257,55.041 139.86461,-0.15099 112.2568,-7.11654 114.36669,-57.57745 z"
id="path4651-8"
inkscape:connector-curvature="0"
@@ -341,7 +347,7 @@
inkscape:export-xdpi="90"
inkscape:export-ydpi="90" />
<path
style="fill:#d40000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
style="display:inline;fill:#d40000;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 496.41257,867.20565 c 2.75154,65.80684 7.56675,55.63649 -119.35722,54.02642 -134.33577,-1.70409 -119.19801,19.19519 -117.69373,-56.56287 1.26192,-63.55246 -31.0482,-55.20698 122.68426,-55.041 139.86461,0.15098 112.2568,7.11654 114.36669,57.57745 z"
id="path4651-2"
inkscape:connector-curvature="0"
@@ -350,7 +356,7 @@
inkscape:export-xdpi="90"
inkscape:export-ydpi="90" />
<path
style="fill:#d40000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
style="display:inline;fill:#d40000;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 371.41257,990.90168 c 2.75154,-65.80684 7.56675,-55.6365 -119.35722,-54.02643 -134.33577,1.7041 -119.19801,-19.19518 -117.69373,56.56288 1.26192,63.55247 -31.0482,55.20697 122.68426,55.04097 139.86461,-0.151 112.2568,-7.1165 114.36669,-57.57742 z"
id="path4651-45"
inkscape:connector-curvature="0"
@@ -359,7 +365,7 @@
inkscape:export-xdpi="90"
inkscape:export-ydpi="90" />
<path
style="fill:#d40000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
style="display:inline;fill:#d40000;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 120.63132,990.92119 c 2.75154,65.80681 7.56675,55.63651 -119.35722,54.02641 -134.33577,-1.7041 -119.19801,19.1952 -117.69373,-56.56286 1.26192,-63.55245 -31.0482,-55.20698 122.68426,-55.041 139.86461,0.15099 112.2568,7.11654 114.36669,57.57745 z"
id="path4651-5"
inkscape:connector-curvature="0"
@@ -368,7 +374,7 @@
inkscape:export-xdpi="90"
inkscape:export-ydpi="90" />
<path
style="fill:#d40000;fill-opacity:1;fill-rule:nonzero;stroke:none;display:inline"
style="display:inline;fill:#d40000;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 622.19382,990.92119 c 2.75154,65.80681 7.56675,55.63651 -119.35722,54.02641 -134.33577,-1.7041 -119.19801,19.1952 -117.69373,-56.56286 1.26192,-63.55245 -31.0482,-55.20698 122.68426,-55.041 139.86461,0.15099 112.2568,7.11654 114.36669,57.57745 z"
id="path4651-1"
inkscape:connector-curvature="0"
@@ -376,9 +382,4 @@
inkscape:export-xdpi="90"
inkscape:export-ydpi="90" />
</g>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="Red"
transform="translate(0,-552.36217)" />
</svg>

Before

Width:  |  Height:  |  Size: 852 KiB

After

Width:  |  Height:  |  Size: 852 KiB

View File

@@ -2,22 +2,22 @@
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="500"
height="500"
id="svg3081"
version="1.1"
inkscape:version="0.48.5 r10040"
inkscape:version="1.1.1 (c3084ef, 2021-09-22)"
sodipodi:docname="worker.svg"
inkscape:export-filename="C:\Users\vahagnk\devel\_private\org.dyndns.vahagn.sokoban\art\worker_select.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
inkscape:export-ydpi="90"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs3083">
<inkscape:perspective
@@ -36,17 +36,20 @@
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.1313708"
inkscape:cx="-34.823458"
inkscape:cy="275.12227"
inkscape:cx="193.12855"
inkscape:cy="285.93632"
inkscape:document-units="px"
inkscape:current-layer="layer3"
showgrid="true"
inkscape:snap-global="false"
inkscape:window-width="1920"
inkscape:window-height="1018"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1">
inkscape:window-width="1307"
inkscape:window-height="969"
inkscape:window-x="0"
inkscape:window-y="25"
inkscape:window-maximized="0"
inkscape:pagecheckerboard="true"
inkscape:showpageshadow="false"
borderlayer="true">
<inkscape:grid
type="xygrid"
id="grid3093"
@@ -63,7 +66,6 @@
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 6.2 KiB

View File

@@ -0,0 +1,51 @@
package org.vostan.banvor;
import android.app.Application;
import android.content.SharedPreferences;
import android.util.Log;
import org.vostan.banvor.game.State;
import org.vostan.banvor.model.PuzzleContainer;
import org.vostan.banvor.model.IPuzzleSource;
public class App extends Application
{
public static final String TAG = "Sokoban";
public static final String PREFS = "org.dyndns.vahagn.sokoban.prefs";
public static final int MIN_LEVEL = 1;
private static App mApp = null;
protected State gameState;
protected SharedPreferences prefs;
/*
*
*/
@Override
public void onCreate()
{
super.onCreate();
mApp = this;
PuzzleContainer pc = new PuzzleContainer();
gameState = new State(pc);
prefs = getSharedPreferences(PREFS, MODE_PRIVATE);
gameState.loadState(prefs);
}
public void storeGameState(){
gameState.storeState(prefs.edit());
}
//
// This is a singleton object.
//
public static App theApp() {
return mApp;
}
public State state(){
return gameState;
}
}

View File

@@ -0,0 +1,129 @@
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.vostan.banvor;
import static org.vostan.banvor.App.theApp;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import org.vostan.banvor.board.PuzzleControl;
import org.vostan.banvor.databinding.FragmentPuzzleBoardBinding;
import org.vostan.banvor.game.State;
/**
*
*/
public class PuzzleBoardFragment extends Fragment
{
private FragmentPuzzleBoardBinding binding;
private State gameState;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
gameState = theApp().state();
binding = FragmentPuzzleBoardBinding.inflate(inflater, container, false);
return binding.getRoot();
}
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
int gameLevel = PuzzleBoardFragmentArgs.fromBundle(getArguments()).getLevel();
gameState.setCurrentLevel(gameLevel);
initAndShowCurrentPuzzle();
binding.gameBoard.setPuzzleControlLister(new PuzzleControl.PuzzleControlLister() {
@Override
public void onSolved() {
PuzzleBoardFragment.this.onSolved();
}
@Override
public void onLongPress() {
}
@Override
public void onTouch() {
}
});
binding.btnPrev.setOnClickListener((View.OnClickListener) view1 -> {
gameState.setCurrentLevel(gameState.getCurrentLevel()-1);
PuzzleBoardFragment.this.initAndShowCurrentPuzzle();
});
binding.btnNext.setOnClickListener((View.OnClickListener) view2 -> {
gameState.setCurrentLevel(gameState.getCurrentLevel()+1);
PuzzleBoardFragment.this.initAndShowCurrentPuzzle();
});
binding.btnReset.setOnClickListener((View.OnClickListener) view3 -> {
PuzzleBoardFragment.this.initAndShowCurrentPuzzle();
});
binding.btnUndo.setOnClickListener((View.OnClickListener) view4 -> {
createNextLevelDialog((d, w) -> {
gameState.advanceCurrentLevel();
initAndShowCurrentPuzzle();
}).show();
});
}
private void initAndShowCurrentPuzzle() {
int gameLevel = gameState.getCurrentLevel();
binding.levelNumber.setText(Integer.toString(gameLevel));
binding.gameBoard.setPuzzle(gameState.getCurrentPuzzle());
}
private void onSolved(){
//
// Since the puzzle is solved, we need to unlock next level if still locked.
//
gameState.levelSolved(gameState.getCurrentLevel());
//
// Bring a dialog for user to choose to continue or stop.
//
// DialogFragment df = new DialogFragment() {
// public Dialog onCreateDialog(Bundle savedInstanceState) {
// return createNextLevelDialog(new DialogInterface.OnClickListener(){
// public void onClick(DialogInterface d, int w){
// gameState.advanceCurrentLevel();
// initAndShowCurrentPuzzle();
// }
// });
// }
// };
// df.show(getChildFragmentManager(), null);
createNextLevelDialog((d, w) -> {
gameState.advanceCurrentLevel();
initAndShowCurrentPuzzle();
}).show();
}
@Override
public void onDestroyView() {
super.onDestroyView();
binding = null;
}
private Dialog createNextLevelDialog(DialogInterface.OnClickListener listener){
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle("Congratulations! You Won!");
builder.setMessage( "Would you like to try the next puzzle?" );
builder.setPositiveButton("Yes, please.", listener);
// Create the AlertDialog object and return it
Dialog dlg = builder.create();
dlg.setCancelable(true);
return dlg;
}
}

View File

@@ -0,0 +1,197 @@
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.vostan.banvor;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.navigation.fragment.NavHostFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import static org.vostan.banvor.App.theApp;
import org.vostan.banvor.databinding.FragmentPuzzleListBinding;
import org.vostan.banvor.game.State;
/**
*
*/
class PuzzlesAdapter extends BaseAdapter
{
private State gameState;
private Context context;
private int icon_size;
private int text_size;
private int text_x;
private int text_y;
private Bitmap lock_icon;
private Bitmap unlock_icon;
private Paint paint;
public PuzzlesAdapter(Context c)
{
super();
gameState = theApp().state();
context = c;
icon_size = (int)c.getResources().getDimension(R.dimen.puzzle_list_icon_size);
text_size = (int)c.getResources().getDimension(R.dimen.puzzle_list_number_size);
text_x = (int)c.getResources().getDimension(R.dimen.puzzle_list_number_x_coord);
text_y = (int)c.getResources().getDimension(R.dimen.puzzle_list_number_y_coord);
//
// Load locked icon
//
Bitmap lock_icon_tmp = BitmapFactory.decodeResource( c.getResources(), R.drawable.lock );
lock_icon = Bitmap.createBitmap(icon_size,icon_size,Bitmap.Config.ARGB_8888);
Canvas lock_canvas = new Canvas(lock_icon);
lock_canvas.drawBitmap(lock_icon_tmp,
new Rect(0,0,lock_icon_tmp.getWidth()-1,lock_icon_tmp.getHeight()-1),
new Rect(0,0, icon_size, icon_size),
null);
//
// Load unlock icon
//
Bitmap unlock_icon_tmp = BitmapFactory.decodeResource( c.getResources(), R.drawable.unlock );
unlock_icon = Bitmap.createBitmap(icon_size,icon_size,Bitmap.Config.ARGB_8888);
Canvas unlock_canvas = new Canvas(unlock_icon);
unlock_canvas.drawBitmap(unlock_icon_tmp,
new Rect(0,0,unlock_icon_tmp.getWidth()-1,unlock_icon_tmp.getHeight()-1),
new Rect(0,0,icon_size, icon_size),
null);
paint = new Paint();
}
@Override
public int getCount()
{
return gameState.getPuzzleCount();
}
@Override
public Object getItem(int position)
{
return null;
}
public int getPositionLevel(int position)
{
return position+1;
}
@Override
public long getItemId(int position)
{
return getPositionLevel(position);
}
// create a new ImageView for each item referenced by the Adapter
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
ImageView imageView;
if (convertView == null)
{ // if it's not recycled, initialize some attributes
imageView = new ImageView(context);
imageView.setLayoutParams(new GridView.LayoutParams(icon_size, icon_size));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
}
else
imageView = (ImageView) convertView;
imageView.setImageBitmap(getIcon(position));
return imageView;
}
private Bitmap getIcon(int position)
{
paint.setColor( Color.WHITE );
paint.setTextSize( text_size );
paint.setTextAlign(Paint.Align.RIGHT);
int level = getPositionLevel(position);
Bitmap icon = ( gameState.isLocked(level) )
? lock_icon.copy(Bitmap.Config.ARGB_8888,true)
: unlock_icon.copy(Bitmap.Config.ARGB_8888,true);
Canvas canvas = new Canvas(icon);
canvas.drawText( Integer.toString(level), text_x, text_y, paint);
return icon;
}
}
/**
*
*/
public class PuzzleListFragment extends Fragment
{
private FragmentPuzzleListBinding binding;
private PuzzlesAdapter puzzleGridAdapter;
private State gameState;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
gameState = theApp().state();
binding = FragmentPuzzleListBinding.inflate(inflater, container, false);
return binding.getRoot();
}
@Override
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
puzzleGridAdapter = new PuzzlesAdapter(getActivity());
binding.puzzleGrid.setAdapter(puzzleGridAdapter);
binding.puzzleGrid.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
int level = puzzleGridAdapter.getPositionLevel(position);
if (!gameState.isLocked(level)){
PuzzleListFragmentDirections.ActionPuzzleListFragmentToPuzzleBoardFragment action =
PuzzleListFragmentDirections.actionPuzzleListFragmentToPuzzleBoardFragment();
action.setLevel(level);
NavHostFragment.findNavController(PuzzleListFragment.this)
.navigate(action);
}
}
});
}
@Override
public void onResume()
{
super.onResume();
if ( binding != null && binding.puzzleGrid != null ) {
puzzleGridAdapter.notifyDataSetChanged();
}
}
@Override
public void onDestroyView () {
super.onDestroyView();
binding = null;
}
}

View File

@@ -0,0 +1,77 @@
package org.vostan.banvor;
import android.os.Bundle;
import com.google.android.material.snackbar.Snackbar;
import androidx.appcompat.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;
import org.vostan.banvor.databinding.ActivityWelcomeBinding;
public class WelcomeActivity extends AppCompatActivity {
private AppBarConfiguration appBarConfiguration;
private ActivityWelcomeBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityWelcomeBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
// setSupportActionBar(binding.toolbar);
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_welcome);
// appBarConfiguration = new AppBarConfiguration.Builder(navController.getGraph()).build();
// NavigationUI.setupActionBarWithNavController(this, navController, appBarConfiguration);
// binding.fab.setOnClickListener(new View.OnClickListener() {
// @Override
// public void onClick(View view) {
// Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
// .setAction("Action", null).show();
// }
// });
}
// @Override
// public boolean onCreateOptionsMenu(Menu menu) {
// // Inflate the menu; this adds items to the action bar if it is present.
//// getMenuInflater().inflate(R.menu.menu_main, menu);
// return true;
// }
//
// @Override
// public boolean onOptionsItemSelected(MenuItem item) {
// // Handle action bar item clicks here. The action bar will
// // automatically handle clicks on the Home/Up button, so long
// // as you specify a parent activity in AndroidManifest.xml.
// int id = item.getItemId();
//
// //noinspection SimplifiableIfStatement
// if (id == R.id.puzzle_grid) {
// return true;
// }
//
// return super.onOptionsItemSelected(item);
// }
@Override
public boolean onSupportNavigateUp() {
NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment_content_welcome);
return NavigationUI.navigateUp(navController, appBarConfiguration)
|| super.onSupportNavigateUp();
}
}

View File

@@ -0,0 +1,68 @@
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.vostan.banvor;
import static org.vostan.banvor.App.theApp;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.navigation.fragment.NavHostFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
//import android.widget.Button;
//import android.widget.TextView;
//import static org.vostan.banvor.App.theApp;
import org.vostan.banvor.databinding.FragmentWelcomeBinding;
import org.vostan.banvor.game.State;
/**
*
*/
public class WelcomeFragment extends Fragment
{
private FragmentWelcomeBinding binding;
private State gameState;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
gameState = theApp().state();
binding = FragmentWelcomeBinding.inflate(inflater, container, false);
return binding.getRoot();
}
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
binding.btnContinue.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
WelcomeFragmentDirections.ActionWelcomeFragmentToPuzzleBoardFragment action =
WelcomeFragmentDirections.actionWelcomeFragmentToPuzzleBoardFragment();
action.setLevel(gameState.getCurrentLevel());
NavHostFragment.findNavController(WelcomeFragment.this)
.navigate(action);
}
});
binding.btnPuzzles.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
NavHostFragment.findNavController(WelcomeFragment.this)
.navigate(R.id.action_WelcomeFragment_to_PuzzleListFragment);
}
});
}
@Override
public void onDestroyView() {
super.onDestroyView();
binding = null;
}
}

View File

@@ -2,9 +2,9 @@
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.vostan.sokoban.play;
package org.vostan.banvor.board;
import android.support.v4.view.ViewCompat;
import androidx.core.view.ViewCompat;
import java.util.LinkedList;
/**
@@ -13,92 +13,6 @@ import java.util.LinkedList;
*/
public class Animator implements Runnable
{
protected PuzzleView view;
protected LinkedList<Action> actions = new LinkedList<Action>();
protected boolean stop;
protected int step;
protected Action currentAction;
protected AnimationLister theLister;
public interface AnimationLister
{
public void onAnimationEnd();
}
public Animator( PuzzleView v)
{
view = v;
}
public void setAnimationLister( AnimationLister lister )
{
theLister = lister;
}
public void queue( Action a )
{
actions.addLast(a);
}
public void play()
{
//
// If no actions exist then nothing to do.
//
if ( actions.size() == 0 )
return;
//
// Get the first action an play it.
//
stop = false;
step = 0;
currentAction = actions.removeFirst();
ViewCompat.postOnAnimation(view, this);
}
public void stop()
{
stop = true;
view.removeCallbacks(this);
if ( theLister != null )
theLister.onAnimationEnd();
}
public void clear()
{
actions.clear();
currentAction = null;
}
public void run()
{
if ( currentAction == null )
return;
else if ( currentAction.steps > step )
{
currentAction.intermediate(this,step);
step++;
ViewCompat.postOnAnimation(view, this);
}
else
{
currentAction.last(this);
step = 0;
currentAction = null;
if ( !stop && actions.size() > 0 )
{
currentAction = actions.removeFirst();
step = 0;
ViewCompat.postOnAnimation(view, this);
}
else
{
if ( theLister != null )
theLister.onAnimationEnd();
}
}
}
public static abstract class Action
{
public int steps;
@@ -205,4 +119,90 @@ public class Animator implements Runnable
public void last( Animator ap )
{}
}
protected PuzzleView view;
protected LinkedList<Action> actions = new LinkedList<Action>();
protected boolean stop;
protected int step;
protected Action currentAction;
protected AnimationLister theLister;
public interface AnimationLister
{
public void onAnimationEnd();
}
public Animator( PuzzleView v)
{
view = v;
}
public void setAnimationLister( AnimationLister lister )
{
theLister = lister;
}
public void queue( Action a )
{
actions.addLast(a);
}
public void play()
{
//
// If no actions exist then nothing to do.
//
if ( actions.size() == 0 )
return;
//
// Get the first action an play it.
//
stop = false;
step = 0;
currentAction = actions.removeFirst();
ViewCompat.postOnAnimation(view, this);
}
public void stop()
{
stop = true;
view.removeCallbacks(this);
if ( theLister != null )
theLister.onAnimationEnd();
}
public void clear()
{
actions.clear();
currentAction = null;
}
public void run()
{
if ( currentAction == null )
return;
else if ( currentAction.steps > step )
{
currentAction.intermediate(this,step);
step++;
ViewCompat.postOnAnimation(view, this);
}
else
{
currentAction.last(this);
step = 0;
currentAction = null;
if ( !stop && actions.size() > 0 )
{
currentAction = actions.removeFirst();
step = 0;
ViewCompat.postOnAnimation(view, this);
}
else
{
if ( theLister != null )
theLister.onAnimationEnd();
}
}
}
}

View File

@@ -1,11 +1,13 @@
package org.vostan.sokoban.play;
package org.vostan.banvor.board;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.FragmentActivity;
import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.FragmentActivity;
import android.util.AttributeSet;
import android.view.View;
import android.view.Window;
import android.view.animation.Animation;
@@ -13,11 +15,11 @@ import android.view.animation.AnimationUtils;
import android.widget.FrameLayout;
import android.widget.TextView;
import org.vostan.sokoban.App;
import org.vostan.banvor.App;
import static org.vostan.sokoban.App.theApp;
import org.vostan.sokoban.R;
import org.vostan.sokoban.Puzzle;
import static org.vostan.banvor.App.theApp;
import org.vostan.banvor.R;
import org.vostan.banvor.model.Puzzle;
public class PlayActivity extends FragmentActivity
implements PuzzleControl.PuzzleControlLister
@@ -41,16 +43,17 @@ public class PlayActivity extends FragmentActivity
//
// Create and set up the puzzle_view.
//
puzzle_view = new PuzzleControl( this );
// puzzle_view = new PuzzleControl(this, new AttributeSet() {
// });
setContentView( puzzle_view );
puzzle_view.setPuzzleControlLister( this );
//
// Create action bar.
//
FrameLayout rootLayout = (FrameLayout)findViewById(android.R.id.content);
View.inflate(this, R.layout.puzzle_view_title, rootLayout);
title_text = (TextView)findViewById(R.id.title_text);
title_view = findViewById(R.id.puzzle_view_title_layout);
View.inflate(this, R.layout.fragment_puzzle_board, rootLayout);
title_text = (TextView)findViewById(R.id.level_text);
// title_view = findViewById(R.id.puzzle_view_title_layout);
//
// Load the puzzle.
//
@@ -62,9 +65,9 @@ public class PlayActivity extends FragmentActivity
//
// Advance current level and achieved level.
//
final int nextl = theApp().getCurrentLevel()+1;
theApp().advanceAchivedLevel(nextl);
theApp().setCurrentLevel(nextl);
final int nextl = theApp().state().getCurrentLevel()+1;
// theApp().state().(nextl);
theApp().state().setCurrentLevel(nextl);
//
// Bring a dialog for user to choose to continue or stop.
//
@@ -146,9 +149,9 @@ public class PlayActivity extends FragmentActivity
// If current level is less than achived level the move to next
// puzzle.
//
if ( theApp().getCurrentLevel() > App.MIN_LEVEL )
if ( theApp().state().getCurrentLevel() > App.MIN_LEVEL )
{
theApp().setCurrentLevel( theApp().getCurrentLevel()-1 );
theApp().state().setCurrentLevel( theApp().state().getCurrentLevel()-1 );
loadCurrentPuzzle();
puzzle_view.invalidate();
}
@@ -163,9 +166,9 @@ public class PlayActivity extends FragmentActivity
// If current level is less than achived level the move to next
// puzzle.
//
if ( theApp().getCurrentLevel() < theApp().getAchivedLevel() )
if ( theApp().state().getCurrentLevel() < theApp().state().getHighestSolvedLevel() )
{
theApp().setCurrentLevel( theApp().getCurrentLevel()+1 );
theApp().state().setCurrentLevel( theApp().state().getCurrentLevel()+1 );
loadCurrentPuzzle();
puzzle_view.invalidate();
@@ -189,13 +192,13 @@ public class PlayActivity extends FragmentActivity
private void loadCurrentPuzzle()
{
puzzle = theApp().getCurrentPuzzle();
puzzle = theApp().state().getCurrentPuzzle();
puzzle_view.setPuzzle(puzzle);
updateTitle();
}
public void updateTitle()
{
String title = "Level " + new Integer(theApp().getCurrentLevel()).toString();
String title = "Level " + new Integer(theApp().state().getCurrentLevel()).toString();
setTitle(title);
}
public void setTitle(CharSequence title)

View File

@@ -2,14 +2,17 @@
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.vostan.sokoban.play;
package org.vostan.banvor.board;
import android.content.Context;
import android.graphics.Point;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import org.vostan.sokoban.Puzzle;
import org.vostan.banvor.game.PuzzleLogic;
import org.vostan.banvor.model.Puzzle;
//import android.support.v4.view.GestureDetectorCompat;
@@ -39,9 +42,9 @@ public class PuzzleControl extends PuzzleView
public void onTouch();
}
public PuzzleControl(Context c)
public PuzzleControl(Context c, AttributeSet attributeSet)
{
super(c);
super(c,attributeSet);
logic = new PuzzleLogic();
animator = new Animator( this );
animator.setAnimationLister(this);

View File

@@ -1,4 +1,4 @@
package org.vostan.sokoban.play;
package org.vostan.banvor.board;
import android.content.Context;
import android.graphics.Bitmap;
@@ -9,13 +9,15 @@ import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.RectF;
import android.support.v4.view.ViewCompat;
import androidx.core.view.ViewCompat;
import android.util.AttributeSet;
import android.view.View;
import static java.lang.Math.*;
import org.vostan.sokoban.Puzzle;
import static org.vostan.sokoban.Puzzle.*;
import org.vostan.sokoban.R;
import org.vostan.banvor.model.Puzzle;
import static org.vostan.banvor.model.Puzzle.*;
import org.vostan.banvor.R;
/**
*/
@@ -38,9 +40,9 @@ public class PuzzleView extends View
private Rect tile_src = new Rect();
private RectF tile_dest = new RectF();
public PuzzleView(Context context)
public PuzzleView(Context context, AttributeSet attributeSet)
{
super(context);
super(context, attributeSet);
setFocusable(true);
//
@@ -53,24 +55,22 @@ public class PuzzleView extends View
// a.recycle();
}
public void setPuzzle( Puzzle p )
{
public void setPuzzle( Puzzle p ){
puzzle = p;
board.set(0,0,puzzle.getColumnCount(),puzzle.getRowCount());
viewport.set(board);
tile_size.set(0,0);
calcTransforms();
initTiles();
invalidate();
}
public Puzzle getPuzzle()
{
public Puzzle getPuzzle(){
return puzzle;
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh)
{
protected void onSizeChanged(int w, int h, int oldw, int oldh){
screen.set(0, 0, w, h);
tile_size.set(0,0);
calcTransforms();
@@ -78,8 +78,7 @@ public class PuzzleView extends View
}
public void scaleViewport( float focusX, float focusY, float scale )
{
public void scaleViewport( float focusX, float focusY, float scale ){
float left = scale*(focusX - screen.left);
float right = scale*(screen.right - focusX);
float top = scale*(focusY - screen.top);
@@ -91,14 +90,12 @@ public class PuzzleView extends View
ViewCompat.postInvalidateOnAnimation(this);
}
public void scaleViewportDone()
{
public void scaleViewportDone(){
//initTiles();
ViewCompat.postInvalidateOnAnimation(this);
}
public void scrollViewport( float distanceX, float distanceY )
{
public void scrollViewport( float distanceX, float distanceY ){
viewport.set( screen.left+distanceX,
screen.top+distanceY,
screen.right+distanceX,

View File

@@ -2,15 +2,16 @@
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.vostan.sokoban.play;
package org.vostan.banvor.game;
import static java.lang.Math.*;
import java.util.Arrays;
import org.vostan.sokoban.Puzzle;
import org.vostan.banvor.board.Animator;
import org.vostan.banvor.model.Puzzle;
/**
*
* @author vahagnk
*/
public class PuzzleLogic
{

View File

@@ -0,0 +1,134 @@
package org.vostan.banvor.game;
import static org.vostan.banvor.App.theApp;
import android.content.SharedPreferences;
import android.util.Log;
import androidx.annotation.NonNull;
import org.vostan.banvor.model.IPuzzleSource;
import org.vostan.banvor.model.Puzzle;
public class State {
public static final String TAG = "Sokoban.Sate";
public static final String CUR_LEVEL = "current_level";
public static final String HIGH_LEVEL = "highest_unlocked_level";
protected IPuzzleSource mPuzzleSource;
protected int mCurrentLevel;
protected int mHighestUnlockedLevel;
public static final int MIN_LEVEL = 1;
protected int mMaxLevel;
public State(@NonNull IPuzzleSource ps){
mPuzzleSource = ps;
mCurrentLevel = 0;
mHighestUnlockedLevel = 0;
mMaxLevel = mPuzzleSource.getCount();
}
//
// These are to save the game state and restore it.
//
public void storeState(@NonNull SharedPreferences.Editor prefs){
prefs.putInt(CUR_LEVEL, mCurrentLevel);
prefs.putInt(HIGH_LEVEL, mHighestUnlockedLevel);
prefs.apply();
if ( !prefs.commit() ) {
Log.d(TAG, "prefs.edit().commit() failed.");
}
}
public void loadState(@NonNull SharedPreferences prefs){
mCurrentLevel = prefs.getInt(CUR_LEVEL, MIN_LEVEL);
mHighestUnlockedLevel = prefs.getInt(HIGH_LEVEL, MIN_LEVEL);
}
//
// Provide amount of puzzles.
//
public final int getPuzzleCount()
{
return mPuzzleSource.getCount();
}
//
// Puzzles.
//
public Puzzle getPuzzle(int level )
{
return mPuzzleSource.getPuzzle( level-1 );
}
public Puzzle getCurrentPuzzle()
{
return getPuzzle( getCurrentLevel() );
}
public Puzzle getPrevPuzzle()
{
if ( mCurrentLevel != MIN_LEVEL ) {
return getPuzzle(getCurrentLevel() - 1);
}
else {
return null;
}
}
public Puzzle getNextPuzzle()
{
if ( mCurrentLevel != mHighestUnlockedLevel) {
return getPuzzle(getCurrentLevel() + 1);
}
else {
return null;
}
}
//
// Level Unlock logic
//
public Boolean isLocked(int level){
return level > mHighestUnlockedLevel;
}
private void unlockLevel( int l )
{
if ( l > mMaxLevel){
l = mMaxLevel;
}
if ( l > mHighestUnlockedLevel) {
mHighestUnlockedLevel = l;
}
theApp().storeGameState();
}
public void levelSolved(int l){
unlockLevel(l+1);
}
//
// Provide highest solved puzzle.
//
public final int getHighestSolvedLevel(){
return mHighestUnlockedLevel;
}
//
// Provide last played puzzle.
//
public final int getCurrentLevel(){
return mCurrentLevel;
}
//
// Set the current puzzle level.
//
public void setCurrentLevel( int l ) {
if ( l > mHighestUnlockedLevel){
l = MIN_LEVEL;
}
else if ( l < MIN_LEVEL ) {
l = mHighestUnlockedLevel;
}
mCurrentLevel = l;
theApp().storeGameState();
}
public void advanceCurrentLevel(){
setCurrentLevel(mCurrentLevel+1);
}
}

View File

@@ -0,0 +1,6 @@
package org.vostan.banvor.model;
public class Coord {
public int x;
public int y;
}

View File

@@ -0,0 +1,6 @@
package org.vostan.banvor.model;
public interface IPuzzleSource {
public int getCount();
public Puzzle getPuzzle( int i );
}

View File

@@ -1,4 +1,4 @@
package org.vostan.sokoban;
package org.vostan.banvor.model;
//import java.lang.Exception;
import java.io.*;
@@ -7,7 +7,7 @@ import android.util.Log;
import java.util.LinkedList;
import static org.vostan.sokoban.App.TAG;
import static org.vostan.banvor.App.TAG;
public class Puzzle
{

View File

@@ -1,12 +1,13 @@
package org.vostan.sokoban;
package org.vostan.banvor.model;
import java.io.InputStream;
import java.io.IOException;
import static org.vostan.sokoban.App.theApp;
import static org.vostan.banvor.App.theApp;
import org.vostan.banvor.model.Puzzle;
import org.vostan.sokoban.R;
import org.vostan.banvor.R;
public class PuzzleContainer
public class PuzzleContainer implements IPuzzleSource
{
protected int count;

View File

@@ -1,123 +0,0 @@
package org.vostan.sokoban;
import android.app.Application;
import android.content.SharedPreferences;
import android.util.Log;
public class App extends Application
{
public static final String TAG = "Sokoban";
public static final String PREFS = "org.dyndns.vahagn.sokoban.prefs";
public static final int MIN_LEVEL = 1;
private static App mApp = null;
protected PuzzleContainer pc;
protected int current_level;
protected int achieved_level;
protected int max_level;
protected SharedPreferences prefs;
protected SharedPreferences.Editor prefsEdit;
/*
*
*/
@Override
public void onCreate()
{
super.onCreate();
mApp = this;
pc = new PuzzleContainer();
prefs = getSharedPreferences(PREFS, MODE_PRIVATE);
prefsEdit = prefs.edit();
max_level = pc.getCount();
current_level = prefs.getInt("current_level", MIN_LEVEL);
achieved_level = prefs.getInt("achieved_level", MIN_LEVEL+10);
}
//
// This is a singleton object.
//
public static App theApp()
{
return mApp;
}
//
// Puzzles.
//
public Puzzle getPuzzle( int level )
{
return pc.getPuzzle( level-1 );
}
public Puzzle getCurrentPuzzle()
{
return getPuzzle( getCurrentLevel() );
}
public Puzzle getPrevPuzzle()
{
if ( current_level != MIN_LEVEL )
return getPuzzle( getCurrentLevel()-1 );
else
return null;
}
public Puzzle getNextPuzzle()
{
if ( current_level != achieved_level )
return getPuzzle( getCurrentLevel()+1 );
else
return null;
}
//
// Provide amount of puzzles.
//
public final int getPuzzleCount()
{
return max_level;
}
//
// Provide highest solved puzzle.
//
public final int getAchivedLevel()
{
return achieved_level;
}
//
// Provide last played puzzle.
//
public final int getCurrentLevel()
{
return current_level;
}
//
// Set the current puzzle level.
//
public void setCurrentLevel( int l )
{
if ( l > achieved_level )
l = MIN_LEVEL;
if ( l < MIN_LEVEL )
l = achieved_level;
if ( l != current_level )
{
current_level = l;
prefsEdit.putInt("current_level", current_level);
prefsEdit.apply();
if ( !prefs.edit().commit() )
Log.d(TAG, "prefs.edit().commit() failed.");
}
}
//
// Set achieved level.
//
public void advanceAchivedLevel( int l )
{
if ( l > max_level )
l = max_level;
if ( l > achieved_level )
{
achieved_level = l;
prefsEdit.putInt("achieved_level", achieved_level);
prefsEdit.apply();
if ( !prefs.edit().commit() )
Log.d(TAG, "prefs.edit().commit() failed.");
}
}
}

View File

@@ -1,119 +0,0 @@
package org.vostan.sokoban.menu;
import org.vostan.sokoban.play.PlayActivity;
import android.content.Intent;
import android.view.View;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.Window;
import org.vostan.sokoban.R;
import static org.vostan.sokoban.App.theApp;
public class MainActivity extends FragmentActivity
{
protected final String TAG = "SokobanMenu";
protected final String LEVEL= "org.dyndns.vahagn.sokoban.LEVEL";
protected MainFragment mainFragment;
protected PuzzleListFragment puzzleListFragment;
protected float puzzleListXScroll;
protected float puzzleListXScrollMax;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
setContentView(R.layout.main_activity);
mainFragment = new MainFragment();
puzzleListFragment = new PuzzleListFragment();
puzzleListFragment.setOnPuzzleListAction(new PuzzleListFragment.OnPuzzleListAction() {
public boolean onPuzzleGridDown() {
return onPuzzleGridDown1();
}
public boolean onPuzzleGridXScroll(float x) {
return onPuzzleGridXScroll1(x);
}
public void onPuzzleLevelClicked(int level) {
onPuzzleClicked1(level);
}
});
puzzleListXScrollMax = getWindowManager().getDefaultDisplay().getWidth();
//
// Set initila fragment.
//
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.fragment_container, mainFragment);
// fragmentTransaction.add(R.id.fragment_container, puzzleListFragment);
fragmentTransaction.commit();
}
//@Override
public void onConfigurationChanged()
{
// super.onConfigurationChanged();
// setContentView(R.layout-l.menu);
}
public void onStartCurrentPuzzle(View v)
{
Intent intent = new Intent(this, PlayActivity.class);
startActivity( intent );
}
public void onPuzzleListShow(View v)
{
getSupportFragmentManager()
.beginTransaction()
.setCustomAnimations(R.animator.fragment_slide_left_enter,
R.animator.fragment_slide_left_exit)
.replace(R.id.fragment_container, puzzleListFragment)
.commit();
}
public boolean onPuzzleGridDown1()
{
puzzleListXScroll = 0;
return true;
}
public boolean onPuzzleGridXScroll1( float x )
{
puzzleListXScroll += x;
/*
getSupportFragmentManager()
.beginTransaction()
.setCustomAnimations(R.animator.fragment_slide_right_enter,
R.animator.fragment_slide_right_exit)
.commit();
*/
if ( -puzzleListXScroll/puzzleListXScrollMax > 0.5 )
{
getSupportFragmentManager()
.beginTransaction()
.setCustomAnimations(R.animator.fragment_slide_right_enter,
R.animator.fragment_slide_right_exit)
.replace(R.id.fragment_container, mainFragment)
.commit();
}
return true;
}
public void onPuzzleClicked1( int level )
{
if ( level <= theApp().getAchivedLevel() )
{
theApp().setCurrentLevel(level);
Intent intent = new Intent(this, PlayActivity.class);
startActivity( intent );
}
}
}

View File

@@ -1,39 +0,0 @@
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.vostan.sokoban.menu;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import static org.vostan.sokoban.App.theApp;
import org.vostan.sokoban.R;
/**
*
* @author vahagnk
*/
public class MainFragment extends Fragment
{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle icicle)
{
super.onCreate(icicle);
View v = inflater.inflate(R.layout.main_fragment, container, false);
if ( theApp().getAchivedLevel() == 1 )
((Button)v.findViewById(R.id.btn_start)).setText(R.string.btn_start_begin);
//
// Set Footer.
//
String str = getString(R.string.copyright) + "\n"
+getString(R.string.version_tag) + " " + getString(R.string.git_version);
((TextView)v.findViewById(R.id.footer_txt)).setText(str);
return v;
}
}

View File

@@ -1,183 +0,0 @@
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package org.vostan.sokoban.menu;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.TypedValue;
import android.view.GestureDetector;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import org.vostan.sokoban.R;
import static org.vostan.sokoban.App.theApp;
/**
*
*/
public class PuzzleListFragment extends Fragment
{
protected GridView puzzleGrid;
protected PuzzlesAdapter puzzleGridAdapter;
protected GestureDetector gridViewXScrollDetector;
protected OnPuzzleListAction actionListener;
/*
* These are events which the fragments delegates to activity.
*/
public interface OnPuzzleListAction
{
public boolean onPuzzleGridDown();
public boolean onPuzzleGridXScroll( float x );
public void onPuzzleLevelClicked( int level );
}
public void setOnPuzzleListAction( OnPuzzleListAction l )
{
actionListener = l;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle icicle)
{
super.onCreate(icicle);
View v = inflater.inflate(R.layout.puzzle_list_fragment, container, false);
//
// Configure GridView.
//
puzzleGrid = (GridView)v.findViewById(R.id.puzzle_grid);
puzzleGridAdapter = new PuzzlesAdapter(getActivity());
puzzleGrid.setAdapter( puzzleGridAdapter );
puzzleGrid.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position, long id)
{
onPuzzleClicked(v,(int)id);
}
});
puzzleGrid.setOnTouchListener( new View.OnTouchListener() {
public boolean onTouch(View view, MotionEvent me) {
gridViewXScrollDetector.onTouchEvent( me );
return false;
}
});
gridViewXScrollDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener() {
public boolean onDown(MotionEvent e) {
return (actionListener!=null) ? actionListener.onPuzzleGridDown() : false;
}
public boolean onScroll(MotionEvent e1, MotionEvent e2, float dx, float dy) {
return (actionListener!=null) ? actionListener.onPuzzleGridXScroll(dx) : false;
}
});
return v;
}
@Override
public void onResume()
{
super.onResume();
if ( puzzleGrid != null )
puzzleGridAdapter.notifyDataSetChanged();
}
public void onPuzzleClicked(View v, int level )
{
if (actionListener!=null)
actionListener.onPuzzleLevelClicked(level);
}
public class PuzzlesAdapter extends BaseAdapter
{
private Context context;
private int icon_size;
private int text_x;
private int text_y;
private Bitmap lock_icon;
private Bitmap unlock_icon;
private Paint paint;
public PuzzlesAdapter(Context c)
{
context = c;
icon_size = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_MM, 10, getResources().getDisplayMetrics() );
int text_size = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_MM, 4, getResources().getDisplayMetrics() );
text_x = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_MM, 9, getResources().getDisplayMetrics() );
text_y = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_MM, 9, getResources().getDisplayMetrics() );
Bitmap lock_icon_tmp = BitmapFactory.decodeResource( getResources(), R.drawable.lock );
lock_icon = Bitmap.createBitmap(icon_size,icon_size,Bitmap.Config.ARGB_8888);
Canvas lock_canvas = new Canvas(lock_icon);
lock_canvas.drawBitmap(lock_icon_tmp,
new Rect(0,0,lock_icon_tmp.getWidth()-1,lock_icon_tmp.getHeight()-1),
new Rect(0,0,icon_size, icon_size),
null);
Bitmap unlock_icon_tmp = BitmapFactory.decodeResource( getResources(), R.drawable.unlock );
unlock_icon = Bitmap.createBitmap(icon_size,icon_size,Bitmap.Config.ARGB_8888);
Canvas unlock_canvas = new Canvas(unlock_icon);
unlock_canvas.drawBitmap(unlock_icon_tmp,
new Rect(0,0,unlock_icon_tmp.getWidth()-1,unlock_icon_tmp.getHeight()-1),
new Rect(0,0,icon_size, icon_size),
null);
paint = new Paint();
paint.setColor( Color.WHITE );
paint.setTextSize( text_size );
paint.setTextAlign(Paint.Align.RIGHT);
}
public int getCount()
{
return theApp().getPuzzleCount();
}
public Object getItem(int position)
{
return null;
}
public long getItemId(int position)
{
return position+1;
}
// create a new ImageView for each item referenced by the Adapter
public View getView(int position, View convertView, ViewGroup parent)
{
ImageView imageView;
if (convertView == null)
{ // if it's not recycled, initialize some attributes
imageView = new ImageView(context);
imageView.setLayoutParams(new GridView.LayoutParams(icon_size, icon_size));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
}
else
imageView = (ImageView) convertView;
int id = (int)getItemId(position);
Bitmap icon = ( id <= theApp().getAchivedLevel() )
? unlock_icon.copy(Bitmap.Config.ARGB_8888,true)
: lock_icon.copy(Bitmap.Config.ARGB_8888,true);
Canvas canvas = new Canvas(icon);
canvas.drawText( Integer.toString(id), text_x, text_y, paint);
imageView.setImageBitmap(icon);
return imageView;
}
}
}

View File

@@ -0,0 +1,30 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
<aapt:attr name="android:fillColor">
<gradient
android:endX="85.84757"
android:endY="92.4963"
android:startX="42.9492"
android:startY="49.59793"
android:type="linear">
<item
android:color="#44000000"
android:offset="0.0" />
<item
android:color="#00000000"
android:offset="1.0" />
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
android:strokeWidth="1"
android:strokeColor="#00000000" />
</vector>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 991 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 41 KiB

View File

@@ -0,0 +1,170 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#3DDC84"
android:pathData="M0,0h108v108h-108z" />
<path
android:fillColor="#00000000"
android:pathData="M9,0L9,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,0L19,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,0L29,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,0L39,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,0L49,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,0L59,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,0L69,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,0L79,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M89,0L89,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M99,0L99,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,9L108,9"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,19L108,19"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,29L108,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,39L108,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,49L108,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,59L108,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,69L108,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,79L108,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,89L108,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,99L108,99"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,29L89,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,39L89,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,49L89,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,59L89,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,69L89,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,79L89,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,19L29,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,19L39,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,19L49,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,19L59,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,19L69,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,19L79,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
</vector>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

@@ -0,0 +1,54 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".WelcomeActivity">
<!--com.google.android.material.appbar.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppBarOverlay">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/PopupOverlay" />
</com.google.android.material.appbar.AppBarLayout-->
<include
layout="@layout/content_welcome"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!--fragment
android:id="@+id/welcome_fragment"
android:name="org.vostan.banvor.WelcomeFragment"
android:layout_width="0dp"
android:layout_height="0dp"
app:defaultNavHost="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:navGraph="@layout/fragment_welcome" /-->
<!--com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_marginEnd="@dimen/fab_margin"
android:layout_marginBottom="16dp"
app:srcCompat="@android:drawable/ic_dialog_email" /-->
<!-- <androidx.fragment.app.FragmentContainerView-->
<!-- android:id="@+id/fragmentContainerView"-->
<!-- android:name="org.vostan.banvor.WelcomeFragment"-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="match_parent" />-->
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<fragment
android:id="@+id/nav_host_fragment_content_welcome"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="0dp"
android:layout_height="0dp"
app:defaultNavHost="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:navGraph="@navigation/nav_graph" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,119 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".PuzzleBoardFragment">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/blure"
android:orientation="vertical"
tools:layout_editor_absoluteX="1dp"
tools:layout_editor_absoluteY="1dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="0"
android:orientation="horizontal">
<TextView
android:id="@+id/level_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0"
android:gravity="center_vertical"
android:paddingLeft="5dp"
android:textColor="@color/puzzle_title"
android:textScaleX="1"
android:textSize="40dp"
android:textStyle="bold"
android:typeface="normal"
android:text="Level"/>
<TextView
android:id="@+id/level_number"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="0"
android:paddingLeft="10dp"
android:textColor="@color/puzzle_title"
android:textScaleX="1"
android:textSize="40dp"
android:textStyle="bold"
android:typeface="normal"
android:text="XX" />
<View
android:id="@+id/view"
android:layout_width="1dp"
android:layout_height="match_parent"
android:layout_weight="1" />
<ImageButton
android:id="@+id/btn_prev"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_margin="0dp"
android:layout_weight="0"
android:background="@color/transparent"
android:scaleType="fitCenter"
android:src="@drawable/prev" />
<ImageButton
android:src="@drawable/next"
android:scaleType="fitCenter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="0"
android:layout_margin="0dp"
android:background="@color/transparent"
android:id="@+id/btn_next"/>
<ImageButton
android:id="@+id/btn_reset"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_margin="0dp"
android:layout_weight="0"
android:background="@color/transparent"
android:scaleType="fitCenter"
android:src="@drawable/reset" />
<ImageButton
android:id="@+id/btn_undo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_margin="3dp"
android:layout_weight="0"
android:background="@color/transparent"
android:scaleType="fitCenter"
android:src="@drawable/undo"
android:visibility="gone"
tools:visibility="visible" />
</LinearLayout>
<!-- <View-->
<!-- android:layout_width="0dp"-->
<!-- android:layout_height="match_parent"-->
<!-- android:layout_weight="1" />-->
<org.vostan.banvor.board.PuzzleControl
android:id="@+id/game_board"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
/>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/splash"
tools:context=".PuzzleListFragment">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/transparent"
android:orientation="vertical"
tools:layout_editor_absoluteX="1dp"
tools:layout_editor_absoluteY="1dp">
<!-- <androidx.recyclerview.widget.RecyclerView-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="match_parent"-->
<!-- android:layout_weight="1"-->
<!-- android:background="@color/transparent"-->
<!-- tools:itemCount="3" />-->
<View
android:layout_width="match_parent"
android:layout_height="20dp"
android:layout_weight="2"
android:background="@color/transparent" />
<GridView
android:id="@+id/puzzle_grid"
android:layout_width="match_parent"
android:layout_height="70dp"
android:layout_weight="7"
android:verticalSpacing="10dp"
android:columnWidth="@dimen/puzzle_list_icon_size"
android:numColumns="auto_fit"
android:stretchMode="columnWidth"
android:gravity="center"
android:background="@color/blure"/>
<View
android:layout_width="match_parent"
android:layout_height="10dp"
android:layout_weight="1"
android:background="@color/transparent" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,107 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/splash"
tools:context=".WelcomeFragment">
<!--View
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_gravity="top"
android:layout_weight="1"
android:gravity="center" /-->
<!--Button
android:id="@+id/btn_start"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/main_menu_btn_vmargin"
android:layout_marginBottom="@dimen/main_menu_btn_vmargin"
android:layout_marginLeft="@dimen/main_menu_btn_hmargin"
android:layout_marginRight="@dimen/main_menu_btn_hmargin"
android:layout_gravity="center"
android:layout_weight="0"
android:padding="@dimen/main_menu_btn_padding"
android:background="@color/main_menu_btn_bg"
android:textColor="@color/main_menu_btn_text"
android:textSize="@dimen/main_menu_text_size"
android:text="@string/btn_start_continue"
android:onClick="onStartCurrentPuzzle" /-->
<!--Button
android:id="@+id/btn_puzzles"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/main_menu_btn_vmargin"
android:layout_marginBottom="@dimen/main_menu_btn_vmargin"
android:layout_marginLeft="@dimen/main_menu_btn_hmargin"
android:layout_marginRight="@dimen/main_menu_btn_hmargin"
android:layout_gravity="center"
android:layout_weight="0"
android:padding="@dimen/main_menu_btn_padding"
android:background="@color/main_menu_btn_bg"
android:textColor="@color/main_menu_btn_text"
android:textSize="@dimen/main_menu_text_size"
android:text="@string/btn_puzzles"
android:onClick="onPuzzleListShow" /-->
<!--View
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_gravity="bottom"
android:layout_weight="1"
android:gravity="center" /-->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/transparent"
android:orientation="vertical"
tools:layout_editor_absoluteX="1dp"
tools:layout_editor_absoluteY="1dp">
<View
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="10"
android:background="?android:attr/listDivider" />
<Button
android:id="@+id/btn_continue"
android:layout_width="match_parent"
android:layout_height="80dp"
android:background="@color/welcome_btn_bg"
android:text="@string/btn_start_continue" />
<View
android:layout_width="match_parent"
android:layout_height="10dp"
android:background="?android:attr/listDivider" />
<Button
android:id="@+id/btn_puzzles"
android:layout_width="match_parent"
android:layout_height="80dp"
android:background="@color/welcome_btn_bg"
android:text="@string/btn_puzzles" />
<View
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="?android:attr/listDivider" />
<TextView
android:id="@+id/footer_txt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:background="@color/transparent"
android:gravity="center"
android:text="@string/git_version"
android:textColor="@color/on_primary" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
</LinearLayout>

View File

@@ -1,61 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/splash"
android:gravity="center_vertical">
<View
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_gravity="top"
android:layout_weight="1"
android:gravity="center" />
<Button
android:id="@+id/btn_start"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/main_menu_btn_vmargin"
android:layout_marginBottom="@dimen/main_menu_btn_vmargin"
android:layout_marginLeft="@dimen/main_menu_btn_hmargin"
android:layout_marginRight="@dimen/main_menu_btn_hmargin"
android:layout_gravity="center"
android:layout_weight="0"
android:padding="@dimen/main_menu_btn_padding"
android:background="@color/main_menu_btn_bg"
android:textColor="@color/main_menu_btn_text"
android:textSize="@dimen/main_menu_text_size"
android:text="@string/btn_start_continue"
android:onClick="onStartCurrentPuzzle" />
<Button
android:id="@+id/btn_puzzles"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/main_menu_btn_vmargin"
android:layout_marginBottom="@dimen/main_menu_btn_vmargin"
android:layout_marginLeft="@dimen/main_menu_btn_hmargin"
android:layout_marginRight="@dimen/main_menu_btn_hmargin"
android:layout_gravity="center"
android:layout_weight="0"
android:padding="@dimen/main_menu_btn_padding"
android:background="@color/main_menu_btn_bg"
android:textColor="@color/main_menu_btn_text"
android:textSize="@dimen/main_menu_text_size"
android:text="@string/btn_puzzles"
android:onClick="onPuzzleListShow" />
<View
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_gravity="bottom"
android:layout_weight="1"
android:gravity="center" />
<TextView
android:id="@+id/footer_txt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/git_version"
android:layout_gravity="bottom"
android:layout_weight="0"
android:gravity="center" />
</LinearLayout>

View File

@@ -1,17 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<GridView
android:id="@+id/puzzle_grid"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:horizontalSpacing="2mm"
android:verticalSpacing="2mm"
android:columnWidth="10mm"
android:numColumns="auto_fit"
android:stretchMode="columnWidth"
android:gravity="center" />
</LinearLayout>

View File

@@ -1,71 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/puzzle_view_title_layout"
android:orientation="horizontal"
android:gravity="center_horizontal"
android:background="#60404040"
android:layout_height="48dp"
android:layout_width="match_parent">
<!--ImageButton
android:src="@drawable/prev"
android:scaleType="fitCenter"
android:layout_width="wrap_content"
android:layout_height="20dp"
android:layout_gravity="center_vertical"
android:layout_weight="0"
android:layout_margin="3dp"
android:background="#00000000"
android:onClick="onPrev"
android:id="@+id/prev_btn"/-->
<TextView
android:text="Level"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="0"
android:textSize="40dp"
android:paddingLeft="5dp"
android:textScaleX="1"
android:textColor="#FFE680"
android:textStyle="bold"
android:typeface="normal"
android:gravity="center_vertical"
android:id="@+id/title_text"/>
<View
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"/>
<ImageButton
android:src="@drawable/undo"
android:scaleType="fitCenter"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:layout_weight="0"
android:layout_margin="3dp"
android:background="#00000000"
android:onClick="onUndo"
android:id="@+id/undo_btn"/>
<ImageButton
android:src="@drawable/reset"
android:scaleType="fitCenter"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:layout_weight="0"
android:layout_margin="3dp"
android:background="#00000000"
android:onClick="onReset"
android:id="@+id/reset_btn"/>
<!--ImageButton
android:src="@drawable/next"
android:scaleType="fitCenter"
android:layout_width="wrap_content"
android:layout_height="20dp"
android:layout_gravity="center_vertical"
android:layout_weight="0"
android:layout_margin="3dp"
android:background="#00000000"
android:onClick="onNext"
android:id="@+id/next_btn"/-->
</LinearLayout>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 982 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

View File

@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/nav_graph"
app:startDestination="@id/WelcomeFragment">
<fragment
android:id="@+id/WelcomeFragment"
android:name="org.vostan.banvor.WelcomeFragment"
android:label="@string/welcome_fragment_label"
tools:layout="@layout/fragment_welcome">
<action
android:id="@+id/action_WelcomeFragment_to_PuzzleListFragment"
app:destination="@id/PuzzleListFragment"
app:enterAnim="@anim/nav_default_enter_anim"
app:exitAnim="@anim/nav_default_exit_anim" />
<action
android:id="@+id/action_WelcomeFragment_to_PuzzleBoardFragment"
app:destination="@id/PuzzleBoardFragment" />
</fragment>
<fragment
android:id="@+id/PuzzleListFragment"
android:name="org.vostan.banvor.PuzzleListFragment"
android:label="fragment_puzzle_list"
tools:layout="@layout/fragment_puzzle_list">
<action
android:id="@+id/action_PuzzleListFragment_to_PuzzleBoardFragment"
app:destination="@id/PuzzleBoardFragment" />
</fragment>
<fragment
android:id="@+id/PuzzleBoardFragment"
android:name="org.vostan.banvor.PuzzleBoardFragment"
android:label="fragment_puzzle_board"
tools:layout="@layout/fragment_puzzle_board" >
<argument
android:name="level"
app:argType="integer"
android:defaultValue="1" />
</fragment>
</navigation>

View File

@@ -0,0 +1,3 @@
<resources>
<dimen name="fab_margin">48dp</dimen>
</resources>

View File

@@ -0,0 +1,17 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.Banvor" parent="Theme.MaterialComponents.DayNight.NoActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/secondary</item>
<item name="colorPrimaryVariant">@color/secondary_variant</item>
<item name="colorOnPrimary">@color/on_secondary</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/primary</item>
<item name="colorSecondaryVariant">@color/primary_variant</item>
<item name="colorOnSecondary">@color/on_primary</item>
<!-- Status bar color. -->
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
<item name="android:background">@color/secondary_bg</item>
</style>
</resources>

View File

@@ -0,0 +1,3 @@
<resources>
<dimen name="fab_margin">200dp</dimen>
</resources>

View File

@@ -0,0 +1,3 @@
<resources>
<dimen name="fab_margin">48dp</dimen>
</resources>

View File

@@ -18,6 +18,18 @@
*/
-->
<resources>
<color name="main_menu_btn_bg">#80404040</color>
<color name="transparent">#00000000</color>
<color name="blure">#80000000</color>
<color name="welcome_btn_bg">#40FFFFFF</color>
<color name="main_menu_btn_text">#C0C0C0C0</color>
<color name="puzzle_title">#FFFFE680</color>
<color name="primary">#FFC107</color>
<color name="primary_bg">#000000</color>
<color name="primary_variant">#FF5722</color>
<color name="secondary">#913213</color>
<color name="secondary_bg">#000000</color>
<color name="secondary_variant">#AA6601</color>
<color name="on_secondary">#661C17</color>
<color name="on_primary">#FF5722</color>
</resources>

View File

@@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
<?xml version="1.0" encoding="utf-8"?><!--
/*
**
** Copyright 2008, The Android Open Source Project
@@ -23,4 +22,11 @@
<dimen name="main_menu_btn_hmargin">10pt</dimen>
<dimen name="main_menu_btn_vmargin">2pt</dimen>
<dimen name="main_menu_btn_padding">10pt</dimen>
<dimen name="fab_margin">16dp</dimen>
<dimen name="puzzle_list_icon_size">100dp</dimen>
<dimen name="puzzle_list_number_size">50dp</dimen>
<!-- Puzzle number is aligned to right of this coordinate. -->
<dimen name="puzzle_list_number_x_coord">95dp</dimen>
<dimen name="puzzle_list_number_y_coord">95dp</dimen>
</resources>

View File

@@ -9,4 +9,9 @@
<string name="btn_puzzles">Puzzles</string>
<string name="version_tag">Version:</string>
<string name="copyright">(c) 2013 Vahagn Khachatryan</string>
<string name="title_activity_welcome">WelcomeActivity</string>
<!-- Strings used for fragments for navigation -->
<string name="welcome_fragment_label">Welcome Fragment</string>
<string name="puzzle_list_fragment_label">Puzzle List Fragment</string>
</resources>

View File

@@ -0,0 +1,26 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.Banvor" parent="Theme.MaterialComponents.DayNight.NoActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/primary</item>
<item name="colorPrimaryVariant">@color/primary_variant</item>
<item name="colorOnPrimary">@color/on_primary</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/secondary</item>
<item name="colorSecondaryVariant">@color/secondary_variant</item>
<item name="colorOnSecondary">@color/on_secondary</item>
<!-- Status bar color. -->
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
<item name="android:background">@color/primary_bg</item>
</style>
<style name="NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
<style name="AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />
<style name="PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />
</resources>

View File

@@ -0,0 +1,17 @@
package org.vostan.banvor;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Example local unit test, which will execute on the development machine (host).
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
public class ExampleUnitTest {
@Test
public void addition_isCorrect() {
assertEquals(4, 2 + 2);
}
}

View File

@@ -1,15 +1,20 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()
google()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.13.2'
classpath "com.android.tools.build:gradle:7.0.2"
def nav_version = "2.3.5"
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:$nav_version"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
task clean(type: Delete) {
delete rootProject.buildDir
}

19
gradle.properties Normal file
View File

@@ -0,0 +1,19 @@
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
# AndroidX package structure to make it clearer which packages are bundled with the
# Android operating system, and which are packaged with your app"s APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn
android.useAndroidX=true
# Automatically convert third-party libraries to use AndroidX
android.enableJetifier=true

Binary file not shown.

View File

@@ -1,6 +1,6 @@
#Wed Apr 10 15:27:10 PDT 2013
#Mon Sep 20 22:54:36 BST 2021
distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.1-all.zip
zipStoreBase=GRADLE_USER_HOME

113
gradlew vendored
View File

@@ -1,4 +1,20 @@
#!/usr/bin/env bash
#!/usr/bin/env sh
#
# Copyright 2015 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
##############################################################################
##
@@ -6,12 +22,30 @@
##
##############################################################################
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""
# 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\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
@@ -30,6 +64,7 @@ die ( ) {
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
@@ -40,33 +75,14 @@ case "`uname`" in
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=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
@@ -90,7 +106,7 @@ location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
@@ -110,11 +126,13 @@ 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
# For Cygwin or MSYS, switch paths to Windows format before running java
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
@@ -138,27 +156,30 @@ if $cygwin ; then
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
i=`expr $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" ;;
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=("$@")
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
APP_ARGS=`save "$@"`
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
exec "$JAVACMD" "$@"

53
gradlew.bat vendored
View File

@@ -1,3 +1,19 @@
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@@ -8,20 +24,23 @@
@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 Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@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="-Xmx64m" "-Xms64m"
@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
if "%ERRORLEVEL%" == "0" goto execute
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
@@ -35,7 +54,7 @@ goto fail
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
if exist "%JAVA_EXE%" goto execute
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
@@ -45,34 +64,14 @@ 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%
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end
@rem End local scope for the variables with windows NT shell

BIN
keys/private_key.pepk Normal file

Binary file not shown.

BIN
keys/signing_key Normal file

Binary file not shown.

View File

@@ -1 +1,10 @@
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
jcenter() // Warning: this repository is going to shut down soon
}
}
rootProject.name = "banvor"
include ':app'