Compare commits
17 Commits
v2
...
c172905788
| Author | SHA1 | Date | |
|---|---|---|---|
| c172905788 | |||
| 66d04087f8 | |||
| faa6ccc296 | |||
| 0a4f131e2b | |||
| 56679bd1be | |||
| 0c0938d651 | |||
| 0eee6f58e8 | |||
| f68a4ca706 | |||
| 0653507928 | |||
| e112d78439 | |||
| 8cbc732965 | |||
| b9cfbaf4df | |||
| a7fec27c0f | |||
| 4ae3528c29 | |||
| e0f000c7db | |||
| 880a85e2cc | |||
| 00e7a7f392 |
2
.gitignore
vendored
@@ -1,4 +1,5 @@
|
|||||||
.settings
|
.settings
|
||||||
|
.DS_store
|
||||||
.gradle
|
.gradle
|
||||||
.idea
|
.idea
|
||||||
bin
|
bin
|
||||||
@@ -8,6 +9,7 @@ nbandroid
|
|||||||
private
|
private
|
||||||
build
|
build
|
||||||
app/src/main/res/values/version.xml
|
app/src/main/res/values/version.xml
|
||||||
|
app/release
|
||||||
compiler/compiler.obj
|
compiler/compiler.obj
|
||||||
compiler/compiler.exe
|
compiler/compiler.exe
|
||||||
compiler/test/compiler.exe
|
compiler/test/compiler.exe
|
||||||
|
|||||||
117
app/build.gradle
@@ -2,37 +2,10 @@ plugins {
|
|||||||
id 'com.android.application'
|
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'
|
|
||||||
.execute()
|
|
||||||
versionP.waitFor()
|
|
||||||
def version = versionP.text.trim()
|
|
||||||
if ( versionP.exitValue() )
|
|
||||||
throw new GradleException("Couldn't extract version. Git exited unexpectedly.")
|
|
||||||
|
|
||||||
def githashP = 'git rev-parse HEAD'.execute()
|
//This is needed for SVG->PNG
|
||||||
githashP.waitFor()
|
//apply plugin: 'com.trello.victor'
|
||||||
def githash = githashP.text.trim()
|
|
||||||
if ( githashP.exitValue() )
|
|
||||||
throw new GradleException("Couldn't extract git_hash. Git exited unexpectedly.")
|
|
||||||
|
|
||||||
def builddate = new Date()
|
|
||||||
def versionFile = new FileWriter("app/src/main/res/values/version.xml")
|
|
||||||
versionFile.println( '<?xml version="1.0" encoding="utf-8"?>' )
|
|
||||||
versionFile.println( '<resources>' )
|
|
||||||
versionFile.println( '<string name="git_version">' << version << '</string>' )
|
|
||||||
versionFile.println( '<string name="git_hash">' << githash << '</string>' )
|
|
||||||
versionFile.println( '<string name="build_date">' << builddate << '</string>' )
|
|
||||||
versionFile.println( '<string name="version_code">0x00010001</string>' )
|
|
||||||
versionFile.println( '</resources>' )
|
|
||||||
versionFile.close()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
preBuild.dependsOn createVersionXML
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Convert SVG images from art directory into PNG files.
|
// Convert SVG images from art directory into PNG files.
|
||||||
@@ -49,36 +22,114 @@ preBuild.dependsOn createVersionXML
|
|||||||
//}
|
//}
|
||||||
//preBuild.dependsOn generateDrawablesFromArt
|
//preBuild.dependsOn generateDrawablesFromArt
|
||||||
|
|
||||||
|
static String gitVersion() {
|
||||||
|
def versionP = 'git describe --tags --long --dirty=-x --always --abbrev=8'
|
||||||
|
.execute()
|
||||||
|
versionP.waitFor()
|
||||||
|
if (versionP.exitValue())
|
||||||
|
throw new GradleException("Couldn't extract version. Git exited unexpectedly.")
|
||||||
|
return versionP.text.trim()
|
||||||
|
}
|
||||||
|
|
||||||
|
static String gitHash() {
|
||||||
|
def hashP = 'git rev-parse HEAD'.execute()
|
||||||
|
hashP.waitFor()
|
||||||
|
if (hashP.exitValue())
|
||||||
|
throw new GradleException("Couldn't extract git_hash. Git exited unexpectedly.")
|
||||||
|
return hashP.text.trim()
|
||||||
|
}
|
||||||
|
|
||||||
|
static Integer gitVersionCode() {
|
||||||
|
def gitP = 'git rev-list v2..HEAD --count'.execute()
|
||||||
|
gitP.waitFor()
|
||||||
|
if (gitP.exitValue())
|
||||||
|
throw new GradleException("Couldn't extract number of commit after v2.")
|
||||||
|
return gitP.text.trim().toInteger()
|
||||||
|
}
|
||||||
|
|
||||||
|
static String buildDate() {
|
||||||
|
def date = new Date()
|
||||||
|
return date.toString()
|
||||||
|
}
|
||||||
|
|
||||||
android {
|
android {
|
||||||
|
signingConfigs {
|
||||||
|
release {
|
||||||
|
storeFile file('keys/signing_key')
|
||||||
|
keyAlias 'key0'
|
||||||
|
}
|
||||||
|
}
|
||||||
compileSdk 31
|
compileSdk 31
|
||||||
|
|
||||||
|
// sourceSets {
|
||||||
|
// main {
|
||||||
|
// svg.srcDir 'src/main/art'
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId "org.vostan.banvor"
|
applicationId "org.vostan.banvor"
|
||||||
minSdk 21
|
minSdk 21
|
||||||
targetSdk 31
|
targetSdk 31
|
||||||
versionCode 1
|
versionCode gitVersionCode()
|
||||||
versionName "1.0"
|
versionName gitVersion()
|
||||||
|
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
|
resValue "bool", "debug_visible", "false"
|
||||||
|
resValue "string", "git_version", gitVersion()
|
||||||
|
resValue "string", "git_hash", gitHash()
|
||||||
|
resValue "string", "build_date", buildDate()
|
||||||
|
// resValue "string", "version_code", "0x00020001"
|
||||||
}
|
}
|
||||||
|
|
||||||
buildTypes {
|
buildTypes {
|
||||||
release {
|
release {
|
||||||
minifyEnabled false
|
minifyEnabled false
|
||||||
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
|
||||||
|
manifestPlaceholders = [
|
||||||
|
appIcon: "@drawable/icon",
|
||||||
|
appIconRound: "@drawable/icon",
|
||||||
|
appName: "@string/app_name"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
debug {
|
||||||
|
applicationIdSuffix ".debug"
|
||||||
|
resValue "bool", "debug_visible", "true"
|
||||||
|
manifestPlaceholders = [
|
||||||
|
appIcon: "@drawable/icon_debug",
|
||||||
|
appIconRound: "@drawable/icon_debug",
|
||||||
|
appName: "@string/app_name_debug"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
compileOptions {
|
compileOptions {
|
||||||
sourceCompatibility JavaVersion.VERSION_1_8
|
sourceCompatibility JavaVersion.VERSION_1_8
|
||||||
targetCompatibility JavaVersion.VERSION_1_8
|
targetCompatibility JavaVersion.VERSION_1_8
|
||||||
}
|
}
|
||||||
|
buildFeatures {
|
||||||
|
viewBinding true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
def nav_version = "2.3.5"
|
||||||
|
|
||||||
implementation 'androidx.appcompat:appcompat:1.3.1'
|
implementation 'androidx.appcompat:appcompat:1.3.1'
|
||||||
implementation 'com.google.android.material:material:1.4.0'
|
implementation 'com.google.android.material:material:1.4.0'
|
||||||
|
implementation 'androidx.constraintlayout:constraintlayout:2.1.0'
|
||||||
|
|
||||||
|
// This is for unit tests.
|
||||||
testImplementation 'junit:junit:4.+'
|
testImplementation 'junit:junit:4.+'
|
||||||
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
|
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
|
||||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
|
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"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,30 +2,25 @@
|
|||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
package="org.vostan.banvor"
|
package="org.vostan.banvor"
|
||||||
android:versionName="@string/git_version">
|
android:versionName="@string/git_version">
|
||||||
<!--uses-sdk android:minSdkVersion="10"
|
|
||||||
android:targetSdkVersion="14"/-->
|
<application
|
||||||
<application android:label="@string/app_name"
|
android:name=".App"
|
||||||
android:icon="@drawable/icon"
|
android:icon="${appIcon}"
|
||||||
android:roundIcon="@drawable/icon"
|
android:label="${appName}"
|
||||||
android:name="org.vostan.banvor.App"
|
android:roundIcon="${appIconRound}"
|
||||||
android:theme="@android:style/Theme">
|
android:theme="@style/Theme.Banvor"
|
||||||
<activity android:name="org.vostan.banvor.menu.MainActivity"
|
android:allowBackup="true"
|
||||||
android:label="@string/app_name"
|
android:fullBackupOnly="true">
|
||||||
android:configChanges="keyboardHidden|orientation"
|
<activity
|
||||||
android:screenOrientation="portrait"
|
android:name=".WelcomeActivity"
|
||||||
android:exported="true">
|
android:exported="true"
|
||||||
|
android:label="${appName}"
|
||||||
|
>
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.intent.action.MAIN" />
|
<action android:name="android.intent.action.MAIN" />
|
||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
<activity android:name="org.vostan.banvor.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.banvor.MainMenu" />
|
|
||||||
</activity>
|
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
</manifest>
|
</manifest>
|
||||||
568
app/src/main/art/feature_graphics.svg
Normal file
@@ -0,0 +1,568 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
width="1024"
|
||||||
|
height="500"
|
||||||
|
id="svg2"
|
||||||
|
version="1.1"
|
||||||
|
inkscape:version="1.1.1 (c3084ef, 2021-09-22)"
|
||||||
|
sodipodi:docname="feature_graphics.svg"
|
||||||
|
inkscape:export-filename="/Users/vahagnk/devel/banvor/app/src/main/art/google_store/feature_graphics_1024x500.png"
|
||||||
|
inkscape:export-xdpi="96"
|
||||||
|
inkscape:export-ydpi="96"
|
||||||
|
style="enable-background:new"
|
||||||
|
shape-rendering="crispEdges"
|
||||||
|
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="defs4">
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="linearGradient3907">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#d4aa00;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop3909" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#d4aa00;stop-opacity:0;"
|
||||||
|
offset="1"
|
||||||
|
id="stop3911" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="linearGradient3889">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#d4aa00;stop-opacity:1"
|
||||||
|
offset="0"
|
||||||
|
id="stop3891" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#ffcc00;stop-opacity:1"
|
||||||
|
offset="1"
|
||||||
|
id="stop3893" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="linearGradient3873">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#d4aa00;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop3875" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#ffcc00;stop-opacity:1"
|
||||||
|
offset="1"
|
||||||
|
id="stop3877" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="linearGradient3820">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#d4aa00;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop3822" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#d4aa00;stop-opacity:0;"
|
||||||
|
offset="1"
|
||||||
|
id="stop3824" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient5747"
|
||||||
|
inkscape:swatch="solid">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#ffaf00;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop5749" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="linearGradient4174">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#ff6600;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop4176" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#ff6600;stop-opacity:0;"
|
||||||
|
offset="1"
|
||||||
|
id="stop4178" />
|
||||||
|
</linearGradient>
|
||||||
|
<inkscape:perspective
|
||||||
|
sodipodi:type="inkscape:persp3d"
|
||||||
|
inkscape:vp_x="82.586264 : -545.7676 : 1"
|
||||||
|
inkscape:vp_y="-244.85435 : 416.29552 : 0"
|
||||||
|
inkscape:vp_z="422.0517 : -413.13828 : 1"
|
||||||
|
inkscape:persp3d-origin="303.9121 : -573.12148 : 1"
|
||||||
|
id="perspective4083" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient3935-5"
|
||||||
|
id="linearGradient3941-5"
|
||||||
|
x1="1009.9149"
|
||||||
|
y1="348.48212"
|
||||||
|
x2="935.27228"
|
||||||
|
y2="293.99295"
|
||||||
|
gradientUnits="userSpaceOnUse" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="linearGradient3935-5">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#ffdd55;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop3937-1" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#ffdd55;stop-opacity:0;"
|
||||||
|
offset="1"
|
||||||
|
id="stop3939-7" />
|
||||||
|
</linearGradient>
|
||||||
|
<filter
|
||||||
|
id="filter3977"
|
||||||
|
inkscape:label="Blur content"
|
||||||
|
inkscape:menu="Blurs"
|
||||||
|
inkscape:menu-tooltip="Blur the contents of objects, preserving the outline"
|
||||||
|
color-interpolation-filters="sRGB">
|
||||||
|
<feColorMatrix
|
||||||
|
id="feColorMatrix3979"
|
||||||
|
values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 "
|
||||||
|
result="result7" />
|
||||||
|
<feGaussianBlur
|
||||||
|
id="feGaussianBlur3981"
|
||||||
|
result="result6"
|
||||||
|
stdDeviation="5" />
|
||||||
|
<feComposite
|
||||||
|
id="feComposite3983"
|
||||||
|
in2="result7"
|
||||||
|
operator="atop"
|
||||||
|
in="result6"
|
||||||
|
result="result91" />
|
||||||
|
<feComposite
|
||||||
|
id="feComposite3985"
|
||||||
|
in2="result91"
|
||||||
|
operator="in" />
|
||||||
|
</filter>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient4174"
|
||||||
|
id="linearGradient4180"
|
||||||
|
x1="351.92871"
|
||||||
|
y1="105.8901"
|
||||||
|
x2="356.59912"
|
||||||
|
y2="109.88838"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(1.437626,0,0,1.2124367,54.20684,-367.94536)" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient3820"
|
||||||
|
id="linearGradient3826"
|
||||||
|
x1="219.39218"
|
||||||
|
y1="160.0825"
|
||||||
|
x2="239.30128"
|
||||||
|
y2="169.15221"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(1.161917,0,0,1.2124367,243.45704,-370.37753)" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient3873"
|
||||||
|
id="linearGradient3879"
|
||||||
|
x1="130.11363"
|
||||||
|
y1="818.83948"
|
||||||
|
x2="159.09091"
|
||||||
|
y2="979.63489"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(1.161917,0,0,1.2124367,243.91254,-468.707)" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient3889"
|
||||||
|
id="linearGradient3895"
|
||||||
|
x1="213.63637"
|
||||||
|
y1="743.83948"
|
||||||
|
x2="330.11365"
|
||||||
|
y2="814.86218"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(1.161917,0,0,1.2124367,243.91254,-468.707)" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient3907"
|
||||||
|
id="linearGradient3913"
|
||||||
|
x1="188.96198"
|
||||||
|
y1="195.47263"
|
||||||
|
x2="206.80421"
|
||||||
|
y2="230.84761"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(1.161917,0,0,1.2124367,243.91254,-351.36504)" />
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="0.585"
|
||||||
|
inkscape:cx="211.96581"
|
||||||
|
inkscape:cy="409.40171"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
inkscape:current-layer="layer6"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:snap-smooth-nodes="false"
|
||||||
|
inkscape:object-paths="true"
|
||||||
|
inkscape:snap-global="false"
|
||||||
|
inkscape:object-nodes="false"
|
||||||
|
inkscape:snap-intersection-paths="false"
|
||||||
|
inkscape:window-width="1792"
|
||||||
|
inkscape:window-height="1067"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="25"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:snap-nodes="true"
|
||||||
|
showguides="true"
|
||||||
|
inkscape:guide-bbox="true"
|
||||||
|
inkscape:pagecheckerboard="true"
|
||||||
|
inkscape:showpageshadow="false"
|
||||||
|
lock-margins="false"
|
||||||
|
width="500px">
|
||||||
|
<inkscape:grid
|
||||||
|
type="xygrid"
|
||||||
|
id="grid5923"
|
||||||
|
empspacing="5"
|
||||||
|
visible="true"
|
||||||
|
enabled="true"
|
||||||
|
snapvisiblegridlinesonly="true" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<metadata
|
||||||
|
id="metadata7">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer7"
|
||||||
|
inkscape:label="big_box"
|
||||||
|
style="display:inline;opacity:0.29646"
|
||||||
|
transform="translate(0,300)"
|
||||||
|
sodipodi:insensitive="true">
|
||||||
|
<rect
|
||||||
|
y="-297.77899"
|
||||||
|
x="272.26917"
|
||||||
|
height="499.0787"
|
||||||
|
width="496.88708"
|
||||||
|
id="rect4119-2"
|
||||||
|
style="display:inline;fill:#ffd42a;fill-opacity:1;stroke:none" />
|
||||||
|
<path
|
||||||
|
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 270.50883,-297.77899 h 83.52302 l -1.72616,497.14 h -81.50446 z"
|
||||||
|
id="path4184-5"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="ccccc" />
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="ccccc"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path4186-8"
|
||||||
|
d="m 685.63317,-297.77899 h 83.52302 l -0.0777,497.14 h -82.62207 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="display:inline;fill:#ffc52a;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642;stroke-linejoin:round;stroke-opacity:1"
|
||||||
|
d="m 270.80123,-296.70636 h 498.27713 v 81.25891 H 270.80123 Z"
|
||||||
|
id="rect4190-8"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="ccccc" />
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="ccccc"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path4193-1"
|
||||||
|
d="m 270.80123,118.10211 h 498.27713 v 81.2589 H 270.80123 Z"
|
||||||
|
style="display:inline;fill:#ffc52a;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642;stroke-linejoin:round;stroke-opacity:1" />
|
||||||
|
<rect
|
||||||
|
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="436.31189"
|
||||||
|
y="-215.44743" />
|
||||||
|
<rect
|
||||||
|
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="353.74591"
|
||||||
|
y="-215.44733" />
|
||||||
|
<rect
|
||||||
|
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="603.20361"
|
||||||
|
y="-215.44743" />
|
||||||
|
<path
|
||||||
|
style="display:inline;fill:#ffba08;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642;stroke-opacity:1"
|
||||||
|
d="m 289.92334,-215.41325 352.41118,333.5419 h 114.19532 l -352.41119,-333.5419 z"
|
||||||
|
id="rect4222-6-9"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="ccccc" />
|
||||||
|
<path
|
||||||
|
style="display:inline;fill:#fab826;fill-opacity:1;stroke:#ffaf00;stroke-width:3.07642;stroke-opacity:1"
|
||||||
|
d="m 636.49499,-215.41325 -346.75703,333.5419 h 113.17572 l 346.75703,-333.5419 z"
|
||||||
|
id="rect4222-8"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="ccccc" />
|
||||||
|
<path
|
||||||
|
style="display:inline;fill:none;stroke:none"
|
||||||
|
d="m 637.20984,-297.7033 47.49501,87.10353 -83.47394,-0.56256 -15.91129,-86.47482 z"
|
||||||
|
id="path5801-2-9"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="ccccc" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer6"
|
||||||
|
inkscape:label="title"
|
||||||
|
style="display:inline">
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff9600;fill-opacity:1;stroke:none"
|
||||||
|
x="-543.33936"
|
||||||
|
y="250.59174"
|
||||||
|
id="text3062"
|
||||||
|
transform="matrix(0,-0.93246631,1.0724248,0,0,0)"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan3064"
|
||||||
|
x="-543.33936"
|
||||||
|
y="250.59174"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:133.209px;line-height:1.25;font-family:'Andale Mono';-inkscape-font-specification:'Andale Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#ff9600;fill-opacity:1">Բանւոր</tspan></text>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer2"
|
||||||
|
inkscape:label="second_plane"
|
||||||
|
style="display:inline"
|
||||||
|
transform="translate(0,-252.36218)"
|
||||||
|
sodipodi:insensitive="true">
|
||||||
|
<path
|
||||||
|
style="fill:url(#linearGradient3879);fill-opacity:1;stroke:none"
|
||||||
|
d="m 353.6982,507.77074 c 0,0 37.66562,58.70316 45.50734,92.33064 8.69161,37.27203 0.26059,115.07862 0.26059,115.07862 9.64081,25.3101 37.13051,18.0683 40.08464,-0.048 0,0 7.6977,-77.30978 -0.25948,-114.59484 -8.5677,-40.14589 -49.92401,-111.85138 -49.92401,-111.85138 z"
|
||||||
|
id="path4015"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="csccscc" />
|
||||||
|
<path
|
||||||
|
style="fill:url(#linearGradient3895);fill-opacity:1;stroke:none"
|
||||||
|
d="m 451.53876,413.07558 30.90388,-26.63904 c 0,0 29.3937,65.77281 57.9456,87.14893 27.16621,20.33869 77.40935,20.44538 77.40935,20.44538 16.64517,9.49353 16.61054,38.884 -14.37674,34.19491 -11.80483,-1.78633 -60.98194,-1.75168 -92.5934,-26.30905 -28.75005,-22.33442 -59.28869,-88.84113 -59.28869,-88.84113 z"
|
||||||
|
id="path4017"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="ccscssc" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer3"
|
||||||
|
inkscape:label="box"
|
||||||
|
style="display:inline"
|
||||||
|
transform="translate(0,300)"
|
||||||
|
sodipodi:insensitive="true">
|
||||||
|
<rect
|
||||||
|
y="-10.216553"
|
||||||
|
x="571.04797"
|
||||||
|
height="189.63731"
|
||||||
|
width="194.64587"
|
||||||
|
id="rect4119"
|
||||||
|
style="display:inline;fill:#ffd42a;fill-opacity:1;stroke:none" />
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="ccccc"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path4121"
|
||||||
|
d="m 610.65518,-50.16527 -39.6072,39.94872 194.64588,-10e-6 -39.93747,-39.89529 z"
|
||||||
|
style="display:inline;fill:#ff9600;fill-opacity:1;stroke:none" />
|
||||||
|
<path
|
||||||
|
style="fill:#ffb82a;fill-opacity:1;stroke:#ffa600;stroke-width:1.18691px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 570.35841,-10.21656 h 32.71853 l -0.67621,188.90069 h -31.92777 z"
|
||||||
|
id="path4184"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="ccccc" />
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="ccccc"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path4186"
|
||||||
|
d="m 732.97533,-10.21656 h 32.71853 l -0.0305,188.90069 h -32.36559 z"
|
||||||
|
style="fill:#ffb82a;fill-opacity:1;stroke:#ffa600;stroke-width:1.18691px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
|
||||||
|
<path
|
||||||
|
style="fill:#ffc52a;fill-opacity:1;stroke:#ffa600;stroke-width:1.18691;stroke-linejoin:round;stroke-opacity:1"
|
||||||
|
d="M 570.47296,-9.809 H 765.66338 V 21.06736 H 570.47296 Z"
|
||||||
|
id="rect4190"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="ccccc" />
|
||||||
|
<path
|
||||||
|
sodipodi:nodetypes="ccccc"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
id="path4193"
|
||||||
|
d="m 570.47296,147.80778 h 195.19042 v 30.87635 H 570.47296 Z"
|
||||||
|
style="fill:#ffc52a;fill-opacity:1;stroke:#ffa600;stroke-width:1.18691;stroke-linejoin:round;stroke-opacity:1" />
|
||||||
|
<rect
|
||||||
|
style="display:inline;fill:#ffdd55;fill-opacity:1;stroke:#ffa600;stroke-width:1.18691;stroke-linejoin:round;stroke-opacity:1"
|
||||||
|
id="rect4195-4"
|
||||||
|
width="32.343575"
|
||||||
|
height="126.74043"
|
||||||
|
x="635.30847"
|
||||||
|
y="21.067352" />
|
||||||
|
<rect
|
||||||
|
style="display:inline;fill:#ffcc00;fill-opacity:1;stroke:#ffa600;stroke-width:1.18691;stroke-linejoin:round;stroke-opacity:1"
|
||||||
|
id="rect4195"
|
||||||
|
width="32.343575"
|
||||||
|
height="126.74043"
|
||||||
|
x="602.96497"
|
||||||
|
y="21.067383" />
|
||||||
|
<rect
|
||||||
|
style="display:inline;fill:#ffcc00;fill-opacity:1;stroke:#ffa600;stroke-width:1.18691;stroke-linejoin:round;stroke-opacity:1"
|
||||||
|
id="rect4195-9"
|
||||||
|
width="32.343575"
|
||||||
|
height="126.74043"
|
||||||
|
x="700.68518"
|
||||||
|
y="21.067352" />
|
||||||
|
<path
|
||||||
|
style="display:inline;fill:#ffba08;fill-opacity:1;stroke:#ffa600;stroke-width:1.18691;stroke-opacity:1"
|
||||||
|
d="m 577.96367,21.08035 138.05026,126.73752 h 44.73381 L 622.69747,21.08035 Z"
|
||||||
|
id="rect4222-6"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="ccccc" />
|
||||||
|
<path
|
||||||
|
style="fill:#fab826;fill-opacity:1;stroke:#ffaf00;stroke-width:1.18691;stroke-opacity:1"
|
||||||
|
d="M 713.72641,21.08035 577.89106,147.81787 h 44.33437 L 758.06081,21.08035 Z"
|
||||||
|
id="rect4222"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="ccccc" />
|
||||||
|
<path
|
||||||
|
style="fill:#aa4400;stroke:none"
|
||||||
|
d="M 632.06882,-50.15534 604.21211,-9.809 h 31.10207 l 17.00384,-40.33693 z"
|
||||||
|
id="path5801"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="ccccc" />
|
||||||
|
<path
|
||||||
|
style="fill:#ff6600;stroke:none"
|
||||||
|
d="m 635.84163,-9.809 16.78684,-40.33679 21.10779,0.01 -5.90794,40.32709 z"
|
||||||
|
id="path5803"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="ccccc" />
|
||||||
|
<path
|
||||||
|
style="display:inline;fill:#ff7f2a;stroke:none"
|
||||||
|
d="m 699.57529,-9.809 -6.40565,-40.23712 -19.12278,-0.0898 -5.86864,40.33002 z"
|
||||||
|
id="path5803-6"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="ccccc" />
|
||||||
|
<path
|
||||||
|
style="display:inline;fill:none;stroke:none"
|
||||||
|
d="m 713.9808,-49.818 18.59488,40.02713 -32.68108,-0.25851 -6.22946,-39.73823 z"
|
||||||
|
id="path5801-2"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="ccccc" />
|
||||||
|
<path
|
||||||
|
style="fill:#d4aa00;stroke:none"
|
||||||
|
d="m 732.4348,-9.809 0.0873,-4.67444 32.70213,0.25851 0.24774,4.65329 z"
|
||||||
|
id="path5855"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="ccccc" />
|
||||||
|
<path
|
||||||
|
style="fill:#ffcc00;stroke:none"
|
||||||
|
d="m 732.52216,-14.48344 -22.27583,-37.3704 0.0599,1.73482 22.25514,40.32804 z"
|
||||||
|
id="path5857"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="ccccc" />
|
||||||
|
<path
|
||||||
|
style="fill:#ff9600;fill-opacity:1;stroke:none"
|
||||||
|
d="m 732.52216,-14.48344 32.70215,0.25851 -39.05814,-37.66825 h -15.94328 z"
|
||||||
|
id="path5859"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="ccccc" />
|
||||||
|
<path
|
||||||
|
style="fill:#d4aa00;fill-opacity:1;stroke:none"
|
||||||
|
d="m 571.27493,-10.17032 v 0 l 32.26901,0.40752 -0.20102,-3.20718 -32.03678,-0.46042 z"
|
||||||
|
id="path5891"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="cccccc" />
|
||||||
|
<path
|
||||||
|
style="fill:#ff9600;fill-opacity:1;stroke:none"
|
||||||
|
d="m 603.64188,-12.96674 -32.226,-0.34915 40.16321,-38.57729 h 19.74096 z"
|
||||||
|
id="path5893"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="ccccc" />
|
||||||
|
<path
|
||||||
|
style="fill:#aa8800;fill-opacity:1;stroke:none"
|
||||||
|
d="m 603.35265,-12.81443 27.9674,-39.07875 v 1.95445 l -27.77481,40.41628 z"
|
||||||
|
id="path5897"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="ccccc" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
inkscape:label="first_plane"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
style="display:inline"
|
||||||
|
transform="translate(0,-252.36218)"
|
||||||
|
sodipodi:insensitive="true">
|
||||||
|
<path
|
||||||
|
style="display:inline;fill:#ffcc00;fill-opacity:1;stroke:none"
|
||||||
|
d="m 522.37902,300.82417 c -28.81097,4.95816 -35.62107,17.32969 -38.59418,42.98726 -0.84369,7.28135 -6.72484,12.94213 -10.94805,18.80498 -34.04568,47.26343 -82.69132,82.04844 -115.02219,130.60522 -1.64085,2.46434 -2.92805,5.20323 -3.91665,8.02112 -12.00244,34.21113 -8.88044,73.53413 -23.94302,106.40081 -16.99264,37.07811 -58.64489,90.01657 -58.64489,90.01657 -7.87617,25.83267 13.80572,36.09707 31.59904,25.73567 0,0 46.41951,-53.94426 64.45365,-92.66343 17.21715,-36.96515 20.86431,-67.23006 39.59603,-103.38438 15.49462,-29.90624 63.56196,-70.62478 63.56196,-70.62478 0,0 18.918,39.34961 35.24386,60.45235 24.152,18.9697 55.39841,34.75724 72.87061,40.51414 21.55786,-0.69033 24.3167,-29.10645 11.68481,-33.65069 -26.56735,-9.55738 -33.37885,-13.88582 -59.71068,-38.31372 -21.84827,-20.26861 -40.54096,-81.15157 -40.54096,-81.15157 0,0 9.23873,-15.60517 14.46726,-18.63833 5.97992,-3.46914 8.93604,1.02613 18.0281,0.47777 30.36625,-3.12338 38.40952,-22.96684 38.40952,-42.60173 1.73462,-30.49483 -8.26611,-36.24423 -38.59422,-42.98726 z"
|
||||||
|
id="path3933-1"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="csssssccssccccscsccc" />
|
||||||
|
<rect
|
||||||
|
style="fill:#d45500;fill-opacity:1;stroke:none"
|
||||||
|
id="rect4182"
|
||||||
|
width="25.747025"
|
||||||
|
height="1.6119893e-06"
|
||||||
|
x="630.77808"
|
||||||
|
y="534.87097" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer5"
|
||||||
|
inkscape:label="face"
|
||||||
|
style="display:inline"
|
||||||
|
transform="translate(0,300)"
|
||||||
|
sodipodi:insensitive="true">
|
||||||
|
<path
|
||||||
|
style="fill:url(#linearGradient3826);fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||||
|
d="m 559.71618,-201.78176 c 2.12289,19.11962 -18.80171,35.81718 -35.27952,35.81718 -16.47782,0 -22.96478,-5.15605 -27.26471,-11.27249 -6.29753,-8.95796 10.76394,17.41252 40.22748,4.45232 11.6126,-5.10804 22.03985,-18.45209 22.31675,-28.99701 z"
|
||||||
|
id="path3033"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="csssc" />
|
||||||
|
<path
|
||||||
|
style="fill:url(#linearGradient3913);fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||||
|
d="m 474.85784,-86.92176 c -7.50913,-13.91844 -6.72686,-12.25509 -8.48593,-16.15108 -0.5375,-1.19044 -2.81412,-7.4956 -4.5498,-17.18416 3.34901,10.02437 7.89294,19.9273 13.03573,33.33524 z"
|
||||||
|
id="path3830"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="cscc" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer4"
|
||||||
|
inkscape:label="hat"
|
||||||
|
style="display:inline"
|
||||||
|
transform="translate(0,300)"
|
||||||
|
sodipodi:insensitive="true">
|
||||||
|
<path
|
||||||
|
style="fill:#d45500;fill-opacity:1;stroke:none"
|
||||||
|
d="m 567.34257,-229.08509 c 0,22.32034 -22.43256,6.21762 -44.37134,6.21762 -21.93876,0 -42.0475,16.10272 -42.0475,-6.21762 0,-22.32035 20.10874,-40.41456 42.0475,-40.41456 21.93878,0 44.37134,18.09421 44.37134,40.41456 z"
|
||||||
|
id="path4163"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="sssss" />
|
||||||
|
<path
|
||||||
|
style="fill:url(#linearGradient4180);fill-opacity:1;stroke:none"
|
||||||
|
d="m 561.5429,-231.15764 c 0,17.1695 -16.99832,6.15717 -37.01744,6.15717 -20.01914,0 -40.12588,11.01233 -40.12588,-6.15717 0,-17.16949 18.55253,-35.93787 38.57166,-35.93787 20.01913,0 38.57166,18.76838 38.57166,35.93787 z"
|
||||||
|
id="path4167"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="sssss" />
|
||||||
|
<path
|
||||||
|
style="fill:#d45500;fill-opacity:1;stroke:none"
|
||||||
|
d="m 582.86087,-218.30736 c 1.99925,3.79536 2.46806,4.24908 -10.42746,2.1241 -11.1239,-2.85652 -15.3929,1.10151 -15.3929,-8.34171 0,-9.44322 16.00482,-2.27706 20.35836,0.51814 2.93281,2.24407 4.33459,3.55921 5.462,5.69947 z"
|
||||||
|
id="path4171"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="scscs" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 22 KiB |
@@ -2,23 +2,23 @@
|
|||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
<svg
|
<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"
|
width="500"
|
||||||
height="500"
|
height="500"
|
||||||
id="svg3081"
|
id="svg3081"
|
||||||
version="1.1"
|
version="1.1"
|
||||||
inkscape:version="0.48.5 r10040"
|
inkscape:version="1.1.1 (c3084ef, 2021-09-22)"
|
||||||
sodipodi:docname="floor.svg"
|
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-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
|
<defs
|
||||||
id="defs3083">
|
id="defs3083">
|
||||||
<linearGradient
|
<linearGradient
|
||||||
@@ -61,7 +61,11 @@
|
|||||||
inkscape:label="Glow"
|
inkscape:label="Glow"
|
||||||
inkscape:menu="Shadows and Glows"
|
inkscape:menu="Shadows and Glows"
|
||||||
inkscape:menu-tooltip="Glow of object's own color at the edges"
|
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
|
<feGaussianBlur
|
||||||
id="feGaussianBlur3920"
|
id="feGaussianBlur3920"
|
||||||
stdDeviation="5"
|
stdDeviation="5"
|
||||||
@@ -111,20 +115,21 @@
|
|||||||
inkscape:pageopacity="0.0"
|
inkscape:pageopacity="0.0"
|
||||||
inkscape:pageshadow="2"
|
inkscape:pageshadow="2"
|
||||||
inkscape:zoom="0.83972969"
|
inkscape:zoom="0.83972969"
|
||||||
inkscape:cx="-95.341037"
|
inkscape:cx="458.48087"
|
||||||
inkscape:cy="280.19905"
|
inkscape:cy="280.44739"
|
||||||
inkscape:document-units="px"
|
inkscape:document-units="px"
|
||||||
inkscape:current-layer="layer5"
|
inkscape:current-layer="g134"
|
||||||
showgrid="true"
|
showgrid="true"
|
||||||
inkscape:snap-global="false"
|
inkscape:snap-global="false"
|
||||||
inkscape:window-width="1920"
|
inkscape:window-width="1792"
|
||||||
inkscape:window-height="1018"
|
inkscape:window-height="1067"
|
||||||
inkscape:window-x="-8"
|
inkscape:window-x="0"
|
||||||
inkscape:window-y="-8"
|
inkscape:window-y="25"
|
||||||
inkscape:window-maximized="1"
|
inkscape:window-maximized="1"
|
||||||
borderlayer="true"
|
borderlayer="true"
|
||||||
inkscape:showpageshadow="false"
|
inkscape:showpageshadow="false"
|
||||||
showborder="true">
|
showborder="true"
|
||||||
|
inkscape:pagecheckerboard="true">
|
||||||
<inkscape:grid
|
<inkscape:grid
|
||||||
type="xygrid"
|
type="xygrid"
|
||||||
id="grid3093"
|
id="grid3093"
|
||||||
@@ -141,22 +146,40 @@
|
|||||||
<dc:format>image/svg+xml</dc:format>
|
<dc:format>image/svg+xml</dc:format>
|
||||||
<dc:type
|
<dc:type
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
<dc:title />
|
|
||||||
</cc:Work>
|
</cc:Work>
|
||||||
</rdf:RDF>
|
</rdf:RDF>
|
||||||
</metadata>
|
</metadata>
|
||||||
<g
|
<g
|
||||||
inkscape:groupmode="layer"
|
inkscape:groupmode="layer"
|
||||||
id="layer4"
|
id="layer4"
|
||||||
inkscape:label="Back"
|
inkscape:label="White Background"
|
||||||
style="display:inline"
|
style="display:none"
|
||||||
sodipodi:insensitive="true">
|
sodipodi:insensitive="true">
|
||||||
<path
|
<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"
|
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"
|
id="rect3089"
|
||||||
inkscape:connector-curvature="0" />
|
inkscape:connector-curvature="0" />
|
||||||
</g>
|
</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
|
<g
|
||||||
inkscape:label="Tiles"
|
inkscape:label="Tiles"
|
||||||
inkscape:groupmode="layer"
|
inkscape:groupmode="layer"
|
||||||
@@ -185,7 +208,7 @@
|
|||||||
id="rect3091-14-2"
|
id="rect3091-14-2"
|
||||||
inkscape:connector-curvature="0" />
|
inkscape:connector-curvature="0" />
|
||||||
<path
|
<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"
|
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"
|
id="rect3091-15-21"
|
||||||
inkscape:connector-curvature="0" />
|
inkscape:connector-curvature="0" />
|
||||||
@@ -240,11 +263,11 @@
|
|||||||
inkscape:groupmode="layer"
|
inkscape:groupmode="layer"
|
||||||
id="layer3"
|
id="layer3"
|
||||||
inkscape:label="Layer"
|
inkscape:label="Layer"
|
||||||
style="opacity:0.4424779;display:none"
|
style="display:none;opacity:0.442478"
|
||||||
transform="translate(0,-552.36217)"
|
transform="translate(0,-552.36217)"
|
||||||
sodipodi:insensitive="true">
|
sodipodi:insensitive="true">
|
||||||
<rect
|
<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"
|
id="rect2997"
|
||||||
width="629.78662"
|
width="629.78662"
|
||||||
height="591.32501"
|
height="591.32501"
|
||||||
@@ -255,9 +278,10 @@
|
|||||||
inkscape:groupmode="layer"
|
inkscape:groupmode="layer"
|
||||||
id="layer5"
|
id="layer5"
|
||||||
inkscape:label="Goal"
|
inkscape:label="Goal"
|
||||||
style="opacity:1;display:inline">
|
style="display:inline;opacity:1"
|
||||||
|
sodipodi:insensitive="true">
|
||||||
<rect
|
<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"
|
id="rect3827"
|
||||||
width="676.15387"
|
width="676.15387"
|
||||||
height="617.69232"
|
height="617.69232"
|
||||||
@@ -267,17 +291,15 @@
|
|||||||
inkscape:export-xdpi="90"
|
inkscape:export-xdpi="90"
|
||||||
inkscape:export-ydpi="90" />
|
inkscape:export-ydpi="90" />
|
||||||
<path
|
<path
|
||||||
sodipodi:type="arc"
|
style="opacity:0.646018;fill:#008000;fill-opacity:0.280423;fill-rule:nonzero;stroke:none"
|
||||||
style="fill:#008000;fill-opacity:0.28042328000000000;fill-rule:nonzero;stroke:none;opacity:0.6460177"
|
|
||||||
id="path4025"
|
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-filename="C:\Users\vahagnk\devel\_private\org.dyndns.vahagn.sokoban\res\drawable\path4025.png"
|
||||||
inkscape:export-xdpi="90"
|
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>
|
||||||
<g
|
<g
|
||||||
inkscape:groupmode="layer"
|
inkscape:groupmode="layer"
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
BIN
app/src/main/art/google_store/feature_graphics_1024x500.png
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
app/src/main/art/google_store/icon_512x512.png
Normal file
|
After Width: | Height: | Size: 36 KiB |
@@ -2,25 +2,24 @@
|
|||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
<svg
|
<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"
|
width="500"
|
||||||
height="500"
|
height="500"
|
||||||
id="svg2"
|
id="svg2"
|
||||||
version="1.1"
|
version="1.1"
|
||||||
inkscape:version="0.48.5 r10040"
|
inkscape:version="1.1.1 (c3084ef, 2021-09-22)"
|
||||||
sodipodi:docname="icon.svg"
|
sodipodi:docname="icon.svg"
|
||||||
enable-background="new"
|
enable-background="new"
|
||||||
inkscape:export-filename="C:\Users\vahagnk\devel\_private\org.dyndns.vahagn.sokoban\res\drawable-xhdpi\icon_debug.png"
|
inkscape:export-filename="/Users/vahagnk/devel/banvor/app/src/main/art/google_store_icon.png"
|
||||||
inkscape:export-xdpi="17.280001"
|
inkscape:export-xdpi="98.304001"
|
||||||
inkscape:export-ydpi="17.280001">
|
inkscape:export-ydpi="98.304001"
|
||||||
|
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
|
<defs
|
||||||
id="defs4">
|
id="defs4">
|
||||||
<linearGradient
|
<linearGradient
|
||||||
@@ -73,7 +72,7 @@
|
|||||||
</linearGradient>
|
</linearGradient>
|
||||||
<linearGradient
|
<linearGradient
|
||||||
id="linearGradient5747"
|
id="linearGradient5747"
|
||||||
osb:paint="solid">
|
inkscape:swatch="solid">
|
||||||
<stop
|
<stop
|
||||||
style="stop-color:#ffaf00;stop-opacity:1;"
|
style="stop-color:#ffaf00;stop-opacity:1;"
|
||||||
offset="0"
|
offset="0"
|
||||||
@@ -203,9 +202,9 @@
|
|||||||
inkscape:pageopacity="0.0"
|
inkscape:pageopacity="0.0"
|
||||||
inkscape:pageshadow="2"
|
inkscape:pageshadow="2"
|
||||||
inkscape:zoom="1.19"
|
inkscape:zoom="1.19"
|
||||||
inkscape:cx="27.238825"
|
inkscape:cx="165.54622"
|
||||||
inkscape:cy="201.98681"
|
inkscape:cy="202.10084"
|
||||||
inkscape:document-units="px"
|
inkscape:document-units="mm"
|
||||||
inkscape:current-layer="layer6"
|
inkscape:current-layer="layer6"
|
||||||
showgrid="true"
|
showgrid="true"
|
||||||
inkscape:snap-smooth-nodes="false"
|
inkscape:snap-smooth-nodes="false"
|
||||||
@@ -213,14 +212,17 @@
|
|||||||
inkscape:snap-global="true"
|
inkscape:snap-global="true"
|
||||||
inkscape:object-nodes="false"
|
inkscape:object-nodes="false"
|
||||||
inkscape:snap-intersection-paths="false"
|
inkscape:snap-intersection-paths="false"
|
||||||
inkscape:window-width="1680"
|
inkscape:window-width="1792"
|
||||||
inkscape:window-height="988"
|
inkscape:window-height="1067"
|
||||||
inkscape:window-x="-8"
|
inkscape:window-x="0"
|
||||||
inkscape:window-y="-8"
|
inkscape:window-y="25"
|
||||||
inkscape:window-maximized="1"
|
inkscape:window-maximized="1"
|
||||||
inkscape:snap-nodes="true"
|
inkscape:snap-nodes="true"
|
||||||
showguides="true"
|
showguides="true"
|
||||||
inkscape:guide-bbox="true">
|
inkscape:guide-bbox="true"
|
||||||
|
inkscape:pagecheckerboard="true"
|
||||||
|
inkscape:showpageshadow="false"
|
||||||
|
showborder="true">
|
||||||
<inkscape:grid
|
<inkscape:grid
|
||||||
type="xygrid"
|
type="xygrid"
|
||||||
id="grid5923"
|
id="grid5923"
|
||||||
@@ -237,7 +239,6 @@
|
|||||||
<dc:format>image/svg+xml</dc:format>
|
<dc:format>image/svg+xml</dc:format>
|
||||||
<dc:type
|
<dc:type
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
<dc:title />
|
|
||||||
</cc:Work>
|
</cc:Work>
|
||||||
</rdf:RDF>
|
</rdf:RDF>
|
||||||
</metadata>
|
</metadata>
|
||||||
@@ -245,7 +246,7 @@
|
|||||||
inkscape:groupmode="layer"
|
inkscape:groupmode="layer"
|
||||||
id="layer7"
|
id="layer7"
|
||||||
inkscape:label="BigBox"
|
inkscape:label="BigBox"
|
||||||
style="opacity:0.2964602;display:none"
|
style="display:inline;opacity:0.29646"
|
||||||
sodipodi:insensitive="true">
|
sodipodi:insensitive="true">
|
||||||
<rect
|
<rect
|
||||||
y="2.2209995"
|
y="2.2209995"
|
||||||
@@ -253,10 +254,10 @@
|
|||||||
height="499.0787"
|
height="499.0787"
|
||||||
width="496.88708"
|
width="496.88708"
|
||||||
id="rect4119-2"
|
id="rect4119-2"
|
||||||
style="fill:#ffd42a;fill-opacity:1;stroke:none;display:inline" />
|
style="display:inline;fill:#ffd42a;fill-opacity:1;stroke:none" />
|
||||||
<path
|
<path
|
||||||
style="fill:#ffb82a;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642198px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
|
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 2.5088277,2.2210102 83.5230193,0 -1.726158,497.1399998 -81.5044619,0 z"
|
d="M 2.5088277,2.2210102 H 86.031847 L 84.305689,499.36101 H 2.8012271 Z"
|
||||||
id="path4184-5"
|
id="path4184-5"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
sodipodi:nodetypes="ccccc" />
|
sodipodi:nodetypes="ccccc" />
|
||||||
@@ -264,11 +265,11 @@
|
|||||||
sodipodi:nodetypes="ccccc"
|
sodipodi:nodetypes="ccccc"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
id="path4186-8"
|
id="path4186-8"
|
||||||
d="m 417.63317,2.2210102 83.52302,0 -0.0777,497.1399998 -82.62207,0 z"
|
d="m 417.63317,2.2210102 h 83.52302 l -0.0777,497.1399998 h -82.62207 z"
|
||||||
style="fill:#ffb82a;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642198px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;display:inline" />
|
style="display:inline;fill:#ffb82a;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
|
||||||
<path
|
<path
|
||||||
style="fill:#ffc52a;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642198;stroke-linejoin:round;stroke-opacity:1;display:inline"
|
style="display:inline;fill:#ffc52a;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642;stroke-linejoin:round;stroke-opacity:1"
|
||||||
d="m 2.8012271,3.2936415 498.2771329,0 0,81.2589055 -498.2771329,0 z"
|
d="M 2.8012271,3.2936415 H 501.07836 V 84.552547 H 2.8012271 Z"
|
||||||
id="rect4190-8"
|
id="rect4190-8"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
sodipodi:nodetypes="ccccc" />
|
sodipodi:nodetypes="ccccc" />
|
||||||
@@ -276,44 +277,44 @@
|
|||||||
sodipodi:nodetypes="ccccc"
|
sodipodi:nodetypes="ccccc"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
id="path4193-1"
|
id="path4193-1"
|
||||||
d="m 2.8012271,418.10211 498.2771329,0 0,81.2589 -498.2771329,0 z"
|
d="M 2.8012271,418.10211 H 501.07836 v 81.2589 H 2.8012271 Z"
|
||||||
style="fill:#ffc52a;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642198;stroke-linejoin:round;stroke-opacity:1;display:inline" />
|
style="display:inline;fill:#ffc52a;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642;stroke-linejoin:round;stroke-opacity:1" />
|
||||||
<rect
|
<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"
|
id="rect4195-4-2"
|
||||||
width="82.565849"
|
width="82.565849"
|
||||||
height="333.54956"
|
height="333.54956"
|
||||||
x="168.31187"
|
x="168.31187"
|
||||||
y="84.552574" />
|
y="84.552574" />
|
||||||
<rect
|
<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"
|
id="rect4195-1"
|
||||||
width="82.565849"
|
width="82.565849"
|
||||||
height="333.54956"
|
height="333.54956"
|
||||||
x="85.745911"
|
x="85.745911"
|
||||||
y="84.552666" />
|
y="84.552666" />
|
||||||
<rect
|
<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"
|
id="rect4195-9-4"
|
||||||
width="82.565849"
|
width="82.565849"
|
||||||
height="333.54956"
|
height="333.54956"
|
||||||
x="335.20364"
|
x="335.20364"
|
||||||
y="84.552574" />
|
y="84.552574" />
|
||||||
<path
|
<path
|
||||||
style="fill:#ffba08;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642198;stroke-opacity:1;display:inline"
|
style="display:inline;fill:#ffba08;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642;stroke-opacity:1"
|
||||||
d="m 21.923338,84.586749 352.411182,333.541901 114.19532,0 L 136.11865,84.586749 z"
|
d="M 21.923338,84.586749 374.33452,418.12865 H 488.52984 L 136.11865,84.586749 Z"
|
||||||
id="rect4222-6-9"
|
id="rect4222-6-9"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
sodipodi:nodetypes="ccccc" />
|
sodipodi:nodetypes="ccccc" />
|
||||||
<path
|
<path
|
||||||
style="fill:#fab826;fill-opacity:1;stroke:#ffaf00;stroke-width:3.07642198;stroke-opacity:1;display:inline"
|
style="display:inline;fill:#fab826;fill-opacity:1;stroke:#ffaf00;stroke-width:3.07642;stroke-opacity:1"
|
||||||
d="M 368.49499,84.586749 21.737955,418.12865 l 113.175725,0 346.75703,-333.541901 z"
|
d="M 368.49499,84.586749 21.737955,418.12865 H 134.91368 L 481.67071,84.586749 Z"
|
||||||
id="rect4222-8"
|
id="rect4222-8"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
sodipodi:nodetypes="ccccc" />
|
sodipodi:nodetypes="ccccc" />
|
||||||
<path
|
<path
|
||||||
style="fill:none;stroke:none;display:inline"
|
style="display:inline;fill:none;stroke:none"
|
||||||
d="M 369.20984,2.296704 416.70485,89.400231 333.23091,88.837671 317.31962,2.3628486 z"
|
d="M 369.20984,2.296704 416.70485,89.400231 333.23091,88.837671 317.31962,2.3628486 Z"
|
||||||
id="path5801-2-9"
|
id="path5801-2-9"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
sodipodi:nodetypes="ccccc" />
|
sodipodi:nodetypes="ccccc" />
|
||||||
@@ -322,21 +323,21 @@
|
|||||||
inkscape:groupmode="layer"
|
inkscape:groupmode="layer"
|
||||||
id="layer6"
|
id="layer6"
|
||||||
inkscape:label="Debug"
|
inkscape:label="Debug"
|
||||||
style="display:inline"
|
style="display:none"
|
||||||
sodipodi:insensitive="true">
|
sodipodi:insensitive="true">
|
||||||
<g
|
<g
|
||||||
id="g3905"
|
id="g3905"
|
||||||
transform="matrix(2.2212804,0,0,2.3274208,-529.54915,-235.51353)"
|
transform="matrix(2.2212804,0,0,2.3274208,-529.54915,-235.51353)"
|
||||||
style="fill:#ff0000;fill-opacity:0.36507939;stroke:none">
|
style="fill:#ff0000;fill-opacity:0.365079;stroke:none">
|
||||||
<path
|
<path
|
||||||
id="Selection #4"
|
id="Selection #4"
|
||||||
d="m 264.53125,126.46875 c -4.33805,-0.0576 -8.61719,3.71125 -8.125,12.53125 0.66,11.68 3.4825,24.69 9.0625,35 3.66634,9.32507 13.0186,14.43224 17.5625,21.4375 1.59,2.61 1.38125,6.5725 1.28125,9.5625 -0.05,1.84 -0.10625,4.0975 -1.15625,5.6875 -1.6,2.38 1.3125,3 -8.6875,3 l -25,0 c -10,0 -10,15 0,15 l 30,0 c 6.4,0.16 7.77,-0.13875 8,8.28125 0.13,4.84 -8.2625,9.5325 -12.0625,11.8125 -15.25031,9.72362 -23.93379,21.43976 -26.625,38.21875 -0.87,5.55 -2.44125,14.81 3.96875,17.25 3.96,1.51 8.89375,-0.255 10.34375,-4.375 L 265.625,284 c 7.68921,-14.25194 18.84375,-25.3125 28.84375,-25.3125 l 5,0 c 5,5 32.4,31.41 45,35 l 0,-75 c 0,-4.214 2.66703,-6.64779 5.75,-7.3125 0.54062,-0.11656 1.10201,-0.18026 1.65625,-0.1875 0.30775,-0.004 0.63136,0.002 0.9375,0.0312 0.0106,10e-4 0.0207,-0.001 0.0312,0 0.0533,0.005 0.10307,0.0248 0.15625,0.0312 0.23376,0.0298 0.48871,0.0754 0.71875,0.125 0.25757,0.0547 0.49953,0.108 0.75,0.1875 2.74711,0.88121 4.96875,3.26291 4.96875,7.125 l 0,75 c 12.6,-3.59 40,-30 45,-35 l 5,0 c 10,0 21.15454,11.06056 28.84375,25.3125 l 2.53125,15.875 c 1.45,4.12 6.38375,5.885 10.34375,4.375 6.41,-2.44 4.83875,-11.7 3.96875,-17.25 -2.69121,-16.77899 -11.37469,-28.49513 -26.625,-38.21875 -3.8,-2.28 -12.1925,-6.9725 -12.0625,-11.8125 0.23,-8.42 1.6,-8.12125 8,-8.28125 l 30,0 c 10,0 10,-15 0,-15 l -25,0 c -10,0 -7.0875,-0.62 -8.6875,-3 -1.05,-1.59 -1.10625,-3.8475 -1.15625,-5.6875 -0.1,-2.99 -0.30875,-6.9525 1.28125,-9.5625 4.5439,-7.00526 13.89616,-12.11243 17.5625,-21.4375 5.58,-10.31 8.4025,-23.32 9.0625,-35 0.49219,-8.82 -3.78695,-12.58885 -8.125,-12.53125 -2.27231,0.0302 -4.565,1.12031 -6.1875,3.0625 C 430.998,132.15125 431.58,140.96 431,145 c -2.22,15.45 -1.515,17.41 -11.625,30 -14.89167,14.29404 -39.82403,21.40669 -64.90625,21.71875 l 0,-0.0312 c -0.83523,0.0197 -1.66396,0.0266 -2.5,0.0312 -0.84123,-0.005 -1.69083,-0.0114 -2.53125,-0.0312 l 0,0.0312 C 324.36577,196.4012 299.41676,189.28813 284.53125,175 c -10.11,-12.59 -9.405,-14.55 -11.625,-30 -0.58,-4.04 0.002,-12.84875 -2.1875,-15.46875 -1.6225,-1.94219 -3.91519,-3.03235 -6.1875,-3.0625 z"
|
d="m 264.53125,126.46875 c -4.33805,-0.0576 -8.61719,3.71125 -8.125,12.53125 0.66,11.68 3.4825,24.69 9.0625,35 3.66634,9.32507 13.0186,14.43224 17.5625,21.4375 1.59,2.61 1.38125,6.5725 1.28125,9.5625 -0.05,1.84 -0.10625,4.0975 -1.15625,5.6875 -1.6,2.38 1.3125,3 -8.6875,3 h -25 c -10,0 -10,15 0,15 h 30 c 6.4,0.16 7.77,-0.13875 8,8.28125 0.13,4.84 -8.2625,9.5325 -12.0625,11.8125 -15.25031,9.72362 -23.93379,21.43976 -26.625,38.21875 -0.87,5.55 -2.44125,14.81 3.96875,17.25 3.96,1.51 8.89375,-0.255 10.34375,-4.375 L 265.625,284 c 7.68921,-14.25194 18.84375,-25.3125 28.84375,-25.3125 h 5 c 5,5 32.4,31.41 45,35 v -75 c 0,-4.214 2.66703,-6.64779 5.75,-7.3125 0.54062,-0.11656 1.10201,-0.18026 1.65625,-0.1875 0.30775,-0.004 0.63136,0.002 0.9375,0.0312 0.0106,10e-4 0.0207,-0.001 0.0312,0 0.0533,0.005 0.10307,0.0248 0.15625,0.0312 0.23376,0.0298 0.48871,0.0754 0.71875,0.125 0.25757,0.0547 0.49953,0.108 0.75,0.1875 2.74711,0.88121 4.96875,3.26291 4.96875,7.125 v 75 c 12.6,-3.59 40,-30 45,-35 h 5 c 10,0 21.15454,11.06056 28.84375,25.3125 l 2.53125,15.875 c 1.45,4.12 6.38375,5.885 10.34375,4.375 6.41,-2.44 4.83875,-11.7 3.96875,-17.25 -2.69121,-16.77899 -11.37469,-28.49513 -26.625,-38.21875 -3.8,-2.28 -12.1925,-6.9725 -12.0625,-11.8125 0.23,-8.42 1.6,-8.12125 8,-8.28125 h 30 c 10,0 10,-15 0,-15 h -25 c -10,0 -7.0875,-0.62 -8.6875,-3 -1.05,-1.59 -1.10625,-3.8475 -1.15625,-5.6875 -0.1,-2.99 -0.30875,-6.9525 1.28125,-9.5625 4.5439,-7.00526 13.89616,-12.11243 17.5625,-21.4375 5.58,-10.31 8.4025,-23.32 9.0625,-35 0.49219,-8.82 -3.78695,-12.58885 -8.125,-12.53125 -2.27231,0.0302 -4.565,1.12031 -6.1875,3.0625 C 430.998,132.15125 431.58,140.96 431,145 c -2.22,15.45 -1.515,17.41 -11.625,30 -14.89167,14.29404 -39.82403,21.40669 -64.90625,21.71875 v -0.0312 c -0.83523,0.0197 -1.66396,0.0266 -2.5,0.0312 -0.84123,-0.005 -1.69083,-0.0114 -2.53125,-0.0312 v 0.0312 C 324.36577,196.4012 299.41676,189.28813 284.53125,175 c -10.11,-12.59 -9.405,-14.55 -11.625,-30 -0.58,-4.04 0.002,-12.84875 -2.1875,-15.46875 -1.6225,-1.94219 -3.91519,-3.03235 -6.1875,-3.0625 z"
|
||||||
style="fill:#ff0000;fill-opacity:0.36507939;stroke:none"
|
style="fill:#ff0000;fill-opacity:0.365079;stroke:none"
|
||||||
inkscape:connector-curvature="0" />
|
inkscape:connector-curvature="0" />
|
||||||
<path
|
<path
|
||||||
id="path3862"
|
id="path3862"
|
||||||
d="m 347.65625,103.34375 c -9.48344,2.07571 -16.71892,10.22816 -17.5,20.21875 -17.80948,5.15553 -30.125,16.29235 -30.125,29.1875 0,17.80423 23.48386,32.21875 52.46875,32.21875 28.98489,0 52.46875,-14.41452 52.46875,-32.21875 0,-12.93887 -12.4054,-24.08642 -30.3125,-29.21875 -0.7555,-9.49386 -7.35456,-17.32688 -16.15625,-19.84375 4.12235,2.1741 6.9375,6.61131 6.9375,11.71875 0,7.25653 -5.69061,13.125 -12.71875,13.125 -7.02814,0 -12.71875,-5.86847 -12.71875,-13.125 0,-5.392 3.1563,-10.03743 7.65625,-12.0625 z"
|
d="m 347.65625,103.34375 c -9.48344,2.07571 -16.71892,10.22816 -17.5,20.21875 -17.80948,5.15553 -30.125,16.29235 -30.125,29.1875 0,17.80423 23.48386,32.21875 52.46875,32.21875 28.98489,0 52.46875,-14.41452 52.46875,-32.21875 0,-12.93887 -12.4054,-24.08642 -30.3125,-29.21875 -0.7555,-9.49386 -7.35456,-17.32688 -16.15625,-19.84375 4.12235,2.1741 6.9375,6.61131 6.9375,11.71875 0,7.25653 -5.69061,13.125 -12.71875,13.125 -7.02814,0 -12.71875,-5.86847 -12.71875,-13.125 0,-5.392 3.1563,-10.03743 7.65625,-12.0625 z"
|
||||||
style="fill:#ff0000;fill-opacity:0.36507939;stroke:none"
|
style="fill:#ff0000;fill-opacity:0.365079;stroke:none"
|
||||||
inkscape:connector-curvature="0" />
|
inkscape:connector-curvature="0" />
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
@@ -2,23 +2,23 @@
|
|||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
<svg
|
<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"
|
id="svg2985"
|
||||||
version="1.1"
|
version="1.1"
|
||||||
inkscape:version="0.48.5 r10040"
|
inkscape:version="1.1.1 (c3084ef, 2021-09-22)"
|
||||||
width="500"
|
width="500"
|
||||||
height="500"
|
height="500"
|
||||||
sodipodi:docname="lock.svg"
|
sodipodi:docname="lock.svg"
|
||||||
inkscape:export-filename="C:\Users\vahagnk\devel\_private\org.dyndns.vahagn.sokoban\art\lock.png"
|
inkscape:export-filename="C:\Users\vahagnk\devel\_private\org.dyndns.vahagn.sokoban\art\lock.png"
|
||||||
inkscape:export-xdpi="17.258801"
|
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
|
<metadata
|
||||||
id="metadata2991">
|
id="metadata2991">
|
||||||
<rdf:RDF>
|
<rdf:RDF>
|
||||||
@@ -27,7 +27,6 @@
|
|||||||
<dc:format>image/svg+xml</dc:format>
|
<dc:format>image/svg+xml</dc:format>
|
||||||
<dc:type
|
<dc:type
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
<dc:title />
|
|
||||||
</cc:Work>
|
</cc:Work>
|
||||||
</rdf:RDF>
|
</rdf:RDF>
|
||||||
</metadata>
|
</metadata>
|
||||||
@@ -168,22 +167,25 @@
|
|||||||
guidetolerance="10"
|
guidetolerance="10"
|
||||||
inkscape:pageopacity="0"
|
inkscape:pageopacity="0"
|
||||||
inkscape:pageshadow="2"
|
inkscape:pageshadow="2"
|
||||||
inkscape:window-width="1920"
|
inkscape:window-width="1792"
|
||||||
inkscape:window-height="1018"
|
inkscape:window-height="1067"
|
||||||
id="namedview2987"
|
id="namedview2987"
|
||||||
showgrid="false"
|
showgrid="false"
|
||||||
inkscape:zoom="0.69044441"
|
inkscape:zoom="0.69044441"
|
||||||
inkscape:cx="-748.14943"
|
inkscape:cx="210.00967"
|
||||||
inkscape:cy="232.66929"
|
inkscape:cy="490.26394"
|
||||||
inkscape:window-x="-8"
|
inkscape:window-x="0"
|
||||||
inkscape:window-y="-8"
|
inkscape:window-y="25"
|
||||||
inkscape:window-maximized="1"
|
inkscape:window-maximized="1"
|
||||||
inkscape:current-layer="g3013" />
|
inkscape:current-layer="g3013"
|
||||||
|
inkscape:pagecheckerboard="true"
|
||||||
|
borderlayer="true"
|
||||||
|
inkscape:showpageshadow="false" />
|
||||||
<g
|
<g
|
||||||
inkscape:groupmode="layer"
|
inkscape:groupmode="layer"
|
||||||
id="layer1"
|
id="layer1"
|
||||||
inkscape:label="box"
|
inkscape:label="box"
|
||||||
style="display:inline"
|
style="display:none"
|
||||||
sodipodi:insensitive="true">
|
sodipodi:insensitive="true">
|
||||||
<rect
|
<rect
|
||||||
y="0.63774103"
|
y="0.63774103"
|
||||||
@@ -191,10 +193,10 @@
|
|||||||
height="499.0787"
|
height="499.0787"
|
||||||
width="496.88708"
|
width="496.88708"
|
||||||
id="rect4119-2"
|
id="rect4119-2"
|
||||||
style="fill:#ffd42a;fill-opacity:1;stroke:none;display:inline" />
|
style="display:inline;fill:#ffd42a;fill-opacity:1;stroke:none" />
|
||||||
<path
|
<path
|
||||||
style="fill:#ffb82a;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642198px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
|
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 83.52302001,0 -1.72616,497.14000377 -81.50446001,0 z"
|
d="M -0.70529001,0.63774623 H 82.81773 L 81.09157,497.77775 H -0.41289001 Z"
|
||||||
id="path4184-5"
|
id="path4184-5"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
sodipodi:nodetypes="ccccc" />
|
sodipodi:nodetypes="ccccc" />
|
||||||
@@ -202,11 +204,11 @@
|
|||||||
sodipodi:nodetypes="ccccc"
|
sodipodi:nodetypes="ccccc"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
id="path4186-8"
|
id="path4186-8"
|
||||||
d="m 414.41905,0.63774623 83.52302,0 -0.0777,497.14000377 -82.62207,0 z"
|
d="m 414.41905,0.63774623 h 83.52302 L 497.86437,497.77775 H 415.2423 Z"
|
||||||
style="fill:#ffb82a;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642198px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;display:inline" />
|
style="display:inline;fill:#ffb82a;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
|
||||||
<path
|
<path
|
||||||
style="fill:#ffc52a;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642198;stroke-linejoin:round;stroke-opacity:1;display:inline"
|
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 498.27713001,0 0,81.2589048 -498.27713001,0 z"
|
d="M -0.41289001,1.7103762 H 497.86424 V 82.969281 H -0.41289001 Z"
|
||||||
id="rect4190-8"
|
id="rect4190-8"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
sodipodi:nodetypes="ccccc" />
|
sodipodi:nodetypes="ccccc" />
|
||||||
@@ -214,44 +216,44 @@
|
|||||||
sodipodi:nodetypes="ccccc"
|
sodipodi:nodetypes="ccccc"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
id="path4193-1"
|
id="path4193-1"
|
||||||
d="m -0.41289001,416.51885 498.27713001,0 0,81.2589 -498.27713001,0 z"
|
d="M -0.41289001,416.51885 H 497.86424 v 81.2589 H -0.41289001 Z"
|
||||||
style="fill:#ffc52a;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642198;stroke-linejoin:round;stroke-opacity:1;display:inline" />
|
style="display:inline;fill:#ffc52a;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642;stroke-linejoin:round;stroke-opacity:1" />
|
||||||
<rect
|
<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"
|
id="rect4195-4-2"
|
||||||
width="82.565849"
|
width="82.565849"
|
||||||
height="333.54956"
|
height="333.54956"
|
||||||
x="165.09776"
|
x="165.09776"
|
||||||
y="82.969307" />
|
y="82.969307" />
|
||||||
<rect
|
<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"
|
id="rect4195-1"
|
||||||
width="82.565849"
|
width="82.565849"
|
||||||
height="333.54956"
|
height="333.54956"
|
||||||
x="82.531799"
|
x="82.531799"
|
||||||
y="82.969398" />
|
y="82.969398" />
|
||||||
<rect
|
<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"
|
id="rect4195-9-4"
|
||||||
width="82.565849"
|
width="82.565849"
|
||||||
height="333.54956"
|
height="333.54956"
|
||||||
x="331.98953"
|
x="331.98953"
|
||||||
y="82.969307" />
|
y="82.969307" />
|
||||||
<path
|
<path
|
||||||
style="fill:#ffba08;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642198;stroke-opacity:1;display:inline"
|
style="display:inline;fill:#ffba08;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642;stroke-opacity:1"
|
||||||
d="m 18.70922,83.003483 352.41118,333.541907 114.19532,0 L 132.90453,83.003483 z"
|
d="M 18.70922,83.003483 371.1204,416.54539 H 485.31572 L 132.90453,83.003483 Z"
|
||||||
id="rect4222-6-9"
|
id="rect4222-6-9"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
sodipodi:nodetypes="ccccc" />
|
sodipodi:nodetypes="ccccc" />
|
||||||
<path
|
<path
|
||||||
style="fill:none;stroke:none;display:inline"
|
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"
|
d="M 365.99572,0.71343623 413.49073,87.816965 330.01679,87.254405 314.1055,0.77958623 Z"
|
||||||
id="path5801-2-9"
|
id="path5801-2-9"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
sodipodi:nodetypes="ccccc" />
|
sodipodi:nodetypes="ccccc" />
|
||||||
<path
|
<path
|
||||||
style="fill:#ffba08;fill-opacity:1;stroke:#ffaf00;stroke-width:3.07642198;stroke-opacity:1;display:inline"
|
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 l 113.17572,0 346.75703,-333.541907 z"
|
d="M 365.28087,83.003483 18.52384,416.54539 H 131.69956 L 478.45659,83.003483 Z"
|
||||||
id="rect4222-8"
|
id="rect4222-8"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
sodipodi:nodetypes="ccccc" />
|
sodipodi:nodetypes="ccccc" />
|
||||||
@@ -272,11 +274,11 @@
|
|||||||
inkscape:groupmode="layer"
|
inkscape:groupmode="layer"
|
||||||
id="layer2"
|
id="layer2"
|
||||||
inkscape:label="lock"
|
inkscape:label="lock"
|
||||||
style="display:none"
|
style="display:inline"
|
||||||
sodipodi:insensitive="true">
|
sodipodi:insensitive="true">
|
||||||
<path
|
<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"
|
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 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"
|
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"
|
id="path3903"
|
||||||
inkscape:connector-curvature="0" />
|
inkscape:connector-curvature="0" />
|
||||||
</g>
|
</g>
|
||||||
@@ -289,7 +291,7 @@
|
|||||||
<path
|
<path
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
id="path3015"
|
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"
|
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="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" />
|
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>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
@@ -2,25 +2,24 @@
|
|||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
<svg
|
<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"
|
width="500"
|
||||||
height="800"
|
height="800"
|
||||||
id="svg2"
|
id="svg2"
|
||||||
version="1.1"
|
version="1.1"
|
||||||
inkscape:version="0.48.5 r10040"
|
inkscape:version="1.1.1 (c3084ef, 2021-09-22)"
|
||||||
sodipodi:docname="splash.svg"
|
sodipodi:docname="splash.svg"
|
||||||
inkscape:export-filename="C:\Users\vahagnk\devel\_private\org.dyndns.vahagn.sokoban\art\icon3_36.png"
|
inkscape:export-filename="/Users/vahagnk/devel/banvor/app/src/main/res/drawable/splash3.png"
|
||||||
inkscape:export-xdpi="6.48"
|
inkscape:export-xdpi="95.999992"
|
||||||
inkscape:export-ydpi="6.48"
|
inkscape:export-ydpi="95.999992"
|
||||||
style="enable-background:new">
|
style="enable-background:new"
|
||||||
|
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
|
<defs
|
||||||
id="defs4">
|
id="defs4">
|
||||||
<linearGradient
|
<linearGradient
|
||||||
@@ -73,7 +72,7 @@
|
|||||||
</linearGradient>
|
</linearGradient>
|
||||||
<linearGradient
|
<linearGradient
|
||||||
id="linearGradient5747"
|
id="linearGradient5747"
|
||||||
osb:paint="solid">
|
inkscape:swatch="solid">
|
||||||
<stop
|
<stop
|
||||||
style="stop-color:#ffaf00;stop-opacity:1;"
|
style="stop-color:#ffaf00;stop-opacity:1;"
|
||||||
offset="0"
|
offset="0"
|
||||||
@@ -153,7 +152,7 @@
|
|||||||
x2="356.59912"
|
x2="356.59912"
|
||||||
y2="109.88838"
|
y2="109.88838"
|
||||||
gradientUnits="userSpaceOnUse"
|
gradientUnits="userSpaceOnUse"
|
||||||
gradientTransform="matrix(1.437626,0,0,1.2124367,-213.79316,-215.94536)" />
|
gradientTransform="matrix(1.8235767,0,0,1.7248932,-329.75054,-281.4867)" />
|
||||||
<linearGradient
|
<linearGradient
|
||||||
inkscape:collect="always"
|
inkscape:collect="always"
|
||||||
xlink:href="#linearGradient3820"
|
xlink:href="#linearGradient3820"
|
||||||
@@ -163,7 +162,7 @@
|
|||||||
x2="239.30128"
|
x2="239.30128"
|
||||||
y2="169.15221"
|
y2="169.15221"
|
||||||
gradientUnits="userSpaceOnUse"
|
gradientUnits="userSpaceOnUse"
|
||||||
gradientTransform="matrix(1.161917,0,0,1.2124367,-24.542962,-218.37753)" />
|
gradientTransform="matrix(1.4738498,0,0,1.7248932,-89.693493,-284.94688)" />
|
||||||
<linearGradient
|
<linearGradient
|
||||||
inkscape:collect="always"
|
inkscape:collect="always"
|
||||||
xlink:href="#linearGradient3873"
|
xlink:href="#linearGradient3873"
|
||||||
@@ -173,7 +172,7 @@
|
|||||||
x2="159.09091"
|
x2="159.09091"
|
||||||
y2="979.63489"
|
y2="979.63489"
|
||||||
gradientUnits="userSpaceOnUse"
|
gradientUnits="userSpaceOnUse"
|
||||||
gradientTransform="matrix(1.161917,0,0,1.2124367,-24.087456,-316.707)" />
|
gradientTransform="matrix(1.4738498,0,0,1.7248932,-89.115701,-658.30188)" />
|
||||||
<linearGradient
|
<linearGradient
|
||||||
inkscape:collect="always"
|
inkscape:collect="always"
|
||||||
xlink:href="#linearGradient3889"
|
xlink:href="#linearGradient3889"
|
||||||
@@ -183,7 +182,7 @@
|
|||||||
x2="330.11365"
|
x2="330.11365"
|
||||||
y2="814.86218"
|
y2="814.86218"
|
||||||
gradientUnits="userSpaceOnUse"
|
gradientUnits="userSpaceOnUse"
|
||||||
gradientTransform="matrix(1.161917,0,0,1.2124367,-24.087456,-316.707)" />
|
gradientTransform="matrix(1.4738498,0,0,1.7248932,-89.115701,-658.30188)" />
|
||||||
<linearGradient
|
<linearGradient
|
||||||
inkscape:collect="always"
|
inkscape:collect="always"
|
||||||
xlink:href="#linearGradient3907"
|
xlink:href="#linearGradient3907"
|
||||||
@@ -193,7 +192,53 @@
|
|||||||
x2="206.80421"
|
x2="206.80421"
|
||||||
y2="230.84761"
|
y2="230.84761"
|
||||||
gradientUnits="userSpaceOnUse"
|
gradientUnits="userSpaceOnUse"
|
||||||
gradientTransform="matrix(1.161917,0,0,1.2124367,-24.087456,-199.36504)" />
|
gradientTransform="matrix(1.4738498,0,0,1.7248932,-89.115701,-257.89844)" />
|
||||||
|
<filter
|
||||||
|
style="color-interpolation-filters:sRGB;"
|
||||||
|
inkscape:label="Out of Focus"
|
||||||
|
id="filter513"
|
||||||
|
x="-0.18900891"
|
||||||
|
y="-0.31270109"
|
||||||
|
width="1.3780178"
|
||||||
|
height="1.6254022">
|
||||||
|
<feFlood
|
||||||
|
flood-opacity="1"
|
||||||
|
flood-color="rgb(255,255,255)"
|
||||||
|
result="flood"
|
||||||
|
id="feFlood499" />
|
||||||
|
<feColorMatrix
|
||||||
|
in="SourceGraphic"
|
||||||
|
values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 -0.2125 -0.7154 -0.0721 1 0 "
|
||||||
|
result="colormatrix1"
|
||||||
|
id="feColorMatrix501" />
|
||||||
|
<feGaussianBlur
|
||||||
|
in="colormatrix1"
|
||||||
|
stdDeviation="15.6225 19.3755"
|
||||||
|
result="blur"
|
||||||
|
id="feGaussianBlur503" />
|
||||||
|
<feColorMatrix
|
||||||
|
in="blur"
|
||||||
|
values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 42.8135 -42.2018 "
|
||||||
|
result="colormatrix2"
|
||||||
|
id="feColorMatrix505" />
|
||||||
|
<feBlend
|
||||||
|
in="colormatrix2"
|
||||||
|
in2="flood"
|
||||||
|
mode="normal"
|
||||||
|
result="blend"
|
||||||
|
id="feBlend507" />
|
||||||
|
<feComposite
|
||||||
|
in="blend"
|
||||||
|
in2="blend"
|
||||||
|
operator="arithmetic"
|
||||||
|
k2="0.511976"
|
||||||
|
result="composite1"
|
||||||
|
id="feComposite509" />
|
||||||
|
<feComposite
|
||||||
|
in2="SourceGraphic"
|
||||||
|
operator="in"
|
||||||
|
id="feComposite511" />
|
||||||
|
</filter>
|
||||||
</defs>
|
</defs>
|
||||||
<sodipodi:namedview
|
<sodipodi:namedview
|
||||||
id="base"
|
id="base"
|
||||||
@@ -202,25 +247,28 @@
|
|||||||
borderopacity="1.0"
|
borderopacity="1.0"
|
||||||
inkscape:pageopacity="0.0"
|
inkscape:pageopacity="0.0"
|
||||||
inkscape:pageshadow="2"
|
inkscape:pageshadow="2"
|
||||||
inkscape:zoom="1.17"
|
inkscape:zoom="0.585"
|
||||||
inkscape:cx="210.243"
|
inkscape:cx="211.96581"
|
||||||
inkscape:cy="455.05609"
|
inkscape:cy="409.40171"
|
||||||
inkscape:document-units="px"
|
inkscape:document-units="px"
|
||||||
inkscape:current-layer="layer6"
|
inkscape:current-layer="layer4"
|
||||||
showgrid="false"
|
showgrid="false"
|
||||||
inkscape:snap-smooth-nodes="false"
|
inkscape:snap-smooth-nodes="false"
|
||||||
inkscape:object-paths="true"
|
inkscape:object-paths="true"
|
||||||
inkscape:snap-global="false"
|
inkscape:snap-global="false"
|
||||||
inkscape:object-nodes="false"
|
inkscape:object-nodes="false"
|
||||||
inkscape:snap-intersection-paths="false"
|
inkscape:snap-intersection-paths="false"
|
||||||
inkscape:window-width="1680"
|
inkscape:window-width="1792"
|
||||||
inkscape:window-height="1028"
|
inkscape:window-height="1067"
|
||||||
inkscape:window-x="1672"
|
inkscape:window-x="0"
|
||||||
inkscape:window-y="-8"
|
inkscape:window-y="25"
|
||||||
inkscape:window-maximized="1"
|
inkscape:window-maximized="1"
|
||||||
inkscape:snap-nodes="true"
|
inkscape:snap-nodes="true"
|
||||||
showguides="true"
|
showguides="true"
|
||||||
inkscape:guide-bbox="true">
|
inkscape:guide-bbox="true"
|
||||||
|
inkscape:pagecheckerboard="true"
|
||||||
|
inkscape:showpageshadow="false"
|
||||||
|
borderlayer="true">
|
||||||
<inkscape:grid
|
<inkscape:grid
|
||||||
type="xygrid"
|
type="xygrid"
|
||||||
id="grid5923"
|
id="grid5923"
|
||||||
@@ -237,7 +285,6 @@
|
|||||||
<dc:format>image/svg+xml</dc:format>
|
<dc:format>image/svg+xml</dc:format>
|
||||||
<dc:type
|
<dc:type
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
<dc:title />
|
|
||||||
</cc:Work>
|
</cc:Work>
|
||||||
</rdf:RDF>
|
</rdf:RDF>
|
||||||
</metadata>
|
</metadata>
|
||||||
@@ -245,18 +292,19 @@
|
|||||||
inkscape:groupmode="layer"
|
inkscape:groupmode="layer"
|
||||||
id="layer7"
|
id="layer7"
|
||||||
inkscape:label="big_box"
|
inkscape:label="big_box"
|
||||||
style="opacity:0.2964602;display:none"
|
style="display:none;opacity:0.29646"
|
||||||
transform="translate(0,300)">
|
transform="translate(0,300)"
|
||||||
|
sodipodi:insensitive="true">
|
||||||
<rect
|
<rect
|
||||||
y="-145.77899"
|
y="-145.26665"
|
||||||
x="4.2691622"
|
x="-83.509636"
|
||||||
height="499.0787"
|
height="664.37396"
|
||||||
width="496.88708"
|
width="664.49176"
|
||||||
id="rect4119-2"
|
id="rect4119-2"
|
||||||
style="fill:#ffd42a;fill-opacity:1;stroke:none;display:inline" />
|
style="display:inline;fill:#ffd42a;fill-opacity:1;stroke:none;stroke-width:1.33426" />
|
||||||
<path
|
<path
|
||||||
style="fill:#ffb82a;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642198px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
|
style="display:inline;fill:#ffb82a;fill-opacity:1;stroke:#ffa600;stroke-width:4.10472px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
d="m 2.5088277,-145.77899 83.5230193,0 -1.726158,497.14 -81.5044619,0 z"
|
d="M -85.863748,-145.26664 H 25.832371 L 23.523965,516.52653 H -85.472719 Z"
|
||||||
id="path4184-5"
|
id="path4184-5"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
sodipodi:nodetypes="ccccc" />
|
sodipodi:nodetypes="ccccc" />
|
||||||
@@ -264,11 +312,11 @@
|
|||||||
sodipodi:nodetypes="ccccc"
|
sodipodi:nodetypes="ccccc"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
id="path4186-8"
|
id="path4186-8"
|
||||||
d="m 417.63317,-145.77899 83.52302,0 -0.0777,497.14 -82.62207,0 z"
|
d="M 469.28594,-145.26664 H 580.98206 L 580.8782,516.52653 H 470.38692 Z"
|
||||||
style="fill:#ffb82a;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642198px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;display:inline" />
|
style="display:inline;fill:#ffb82a;fill-opacity:1;stroke:#ffa600;stroke-width:4.10472px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
|
||||||
<path
|
<path
|
||||||
style="fill:#ffc52a;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642198;stroke-linejoin:round;stroke-opacity:1;display:inline"
|
style="display:inline;fill:#ffc52a;fill-opacity:1;stroke:#ffa600;stroke-width:4.10472;stroke-linejoin:round;stroke-opacity:1"
|
||||||
d="m 2.8012271,-144.70636 498.2771329,0 0,81.258907 -498.2771329,0 z"
|
d="M -85.472719,-143.83876 H 580.87798 V -35.666831 H -85.472719 Z"
|
||||||
id="rect4190-8"
|
id="rect4190-8"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
sodipodi:nodetypes="ccccc" />
|
sodipodi:nodetypes="ccccc" />
|
||||||
@@ -276,44 +324,44 @@
|
|||||||
sodipodi:nodetypes="ccccc"
|
sodipodi:nodetypes="ccccc"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
id="path4193-1"
|
id="path4193-1"
|
||||||
d="m 2.8012271,270.10211 498.2771329,0 0,81.2589 -498.2771329,0 z"
|
d="M -85.472719,408.35462 H 580.87798 V 516.52653 H -85.472719 Z"
|
||||||
style="fill:#ffc52a;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642198;stroke-linejoin:round;stroke-opacity:1;display:inline" />
|
style="display:inline;fill:#ffc52a;fill-opacity:1;stroke:#ffa600;stroke-width:4.10472;stroke-linejoin:round;stroke-opacity:1" />
|
||||||
<rect
|
<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:4.10472;stroke-linejoin:round;stroke-opacity:1"
|
||||||
id="rect4195-4-2"
|
id="rect4195-4-2"
|
||||||
width="82.565849"
|
width="110.41608"
|
||||||
height="333.54956"
|
height="444.02145"
|
||||||
x="168.31187"
|
x="135.86623"
|
||||||
y="-63.447426" />
|
y="-35.666794" />
|
||||||
<rect
|
<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:4.10472;stroke-linejoin:round;stroke-opacity:1"
|
||||||
id="rect4195-1"
|
id="rect4195-1"
|
||||||
width="82.565849"
|
width="110.41608"
|
||||||
height="333.54956"
|
height="444.02145"
|
||||||
x="85.745911"
|
x="25.449986"
|
||||||
y="-63.447334" />
|
y="-35.666672" />
|
||||||
<rect
|
<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:4.10472;stroke-linejoin:round;stroke-opacity:1"
|
||||||
id="rect4195-9-4"
|
id="rect4195-9-4"
|
||||||
width="82.565849"
|
width="110.41608"
|
||||||
height="333.54956"
|
height="444.02145"
|
||||||
x="335.20364"
|
x="359.05215"
|
||||||
y="-63.447426" />
|
y="-35.666794" />
|
||||||
<path
|
<path
|
||||||
style="fill:#ffba08;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642198;stroke-opacity:1;display:inline"
|
style="display:inline;fill:#ffba08;fill-opacity:1;stroke:#ffa600;stroke-width:4.10472;stroke-opacity:1"
|
||||||
d="m 21.923338,-63.413251 352.411182,333.541901 114.19532,0 -352.41119,-333.541901 z"
|
d="M -59.900541,-35.621302 411.38225,408.38995 H 564.09673 L 92.813925,-35.621302 Z"
|
||||||
id="rect4222-6-9"
|
id="rect4222-6-9"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
sodipodi:nodetypes="ccccc" />
|
sodipodi:nodetypes="ccccc" />
|
||||||
<path
|
<path
|
||||||
style="fill:#fab826;fill-opacity:1;stroke:#ffaf00;stroke-width:3.07642198;stroke-opacity:1;display:inline"
|
style="display:inline;fill:#fab826;fill-opacity:1;stroke:#ffaf00;stroke-width:4.10472;stroke-opacity:1"
|
||||||
d="M 368.49499,-63.413251 21.737955,270.12865 l 113.175725,0 346.75703,-333.541901 z"
|
d="M 403.57299,-35.621302 -60.148455,408.38995 H 91.202503 L 554.92395,-35.621302 Z"
|
||||||
id="rect4222-8"
|
id="rect4222-8"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
sodipodi:nodetypes="ccccc" />
|
sodipodi:nodetypes="ccccc" />
|
||||||
<path
|
<path
|
||||||
style="fill:none;stroke:none;display:inline"
|
style="display:inline;fill:none;stroke:none;stroke-width:1.33426"
|
||||||
d="m 369.20984,-145.7033 47.49501,87.103531 -83.47394,-0.56256 -15.91129,-86.474821 z"
|
d="M 404.52897,-145.16588 468.04449,-29.213591 356.41401,-29.96247 335.13568,-145.07783 Z"
|
||||||
id="path5801-2-9"
|
id="path5801-2-9"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
sodipodi:nodetypes="ccccc" />
|
sodipodi:nodetypes="ccccc" />
|
||||||
@@ -321,20 +369,21 @@
|
|||||||
<g
|
<g
|
||||||
inkscape:groupmode="layer"
|
inkscape:groupmode="layer"
|
||||||
id="layer6"
|
id="layer6"
|
||||||
inkscape:label="title">
|
inkscape:label="title"
|
||||||
|
style="display:inline"
|
||||||
|
sodipodi:insensitive="true">
|
||||||
<text
|
<text
|
||||||
xml:space="preserve"
|
xml:space="preserve"
|
||||||
style="font-size:74.00489044px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ff9600;fill-opacity:1;stroke:none;font-family:Sans"
|
style="font-style:normal;font-weight:normal;line-height:0%;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#ff9600;fill-opacity:1;stroke:none"
|
||||||
x="0.66347247"
|
x="7.0980215"
|
||||||
y="120.67854"
|
y="120.67854"
|
||||||
id="text3062"
|
id="text3062"
|
||||||
sodipodi:linespacing="125%"
|
|
||||||
transform="scale(0.93246631,1.0724248)"><tspan
|
transform="scale(0.93246631,1.0724248)"><tspan
|
||||||
sodipodi:role="line"
|
sodipodi:role="line"
|
||||||
id="tspan3064"
|
id="tspan3064"
|
||||||
x="0.66347247"
|
x="7.0980215"
|
||||||
y="120.67854"
|
y="120.67854"
|
||||||
style="font-size:133.20880127px;font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;fill:#ff9600;fill-opacity:1;font-family:FreeSans;-inkscape-font-specification:FreeSans Semi-Bold">Բանվոր</tspan></text>
|
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:133.209px;line-height:1.25;font-family:'Andale Mono';-inkscape-font-specification:'Andale Mono, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#ff9600;fill-opacity:1">Բանւոր</tspan></text>
|
||||||
</g>
|
</g>
|
||||||
<g
|
<g
|
||||||
inkscape:groupmode="layer"
|
inkscape:groupmode="layer"
|
||||||
@@ -344,14 +393,14 @@
|
|||||||
transform="translate(0,-252.36218)"
|
transform="translate(0,-252.36218)"
|
||||||
sodipodi:insensitive="true">
|
sodipodi:insensitive="true">
|
||||||
<path
|
<path
|
||||||
style="fill:url(#linearGradient3879);fill-opacity:1;stroke:none"
|
style="fill:url(#linearGradient3879);fill-opacity:1;stroke:none;stroke-width:1.34336"
|
||||||
d="m 85.698199,659.77074 c 0,0 37.665621,58.70316 45.507341,92.33064 8.69161,37.27203 0.26059,115.07862 0.26059,115.07862 9.64081,25.3101 37.13051,18.0683 40.08464,-0.048 0,0 7.6977,-77.30978 -0.25948,-114.59484 -8.5677,-40.14589 -49.92401,-111.85138 -49.92401,-111.85138 z"
|
d="m 50.14343,730.90027 c 0,0 47.777473,83.51501 57.72442,131.3557 11.02498,53.02567 0.33054,163.71853 0.33054,163.71853 12.22901,36.0078 47.09871,25.7051 50.84592,-0.068 0,0 9.76425,-109.98601 -0.32915,-163.03021 -10.8678,-57.11422 -63.32679,-159.1272 -63.32679,-159.1272 z"
|
||||||
id="path4015"
|
id="path4015"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
sodipodi:nodetypes="csccscc" />
|
sodipodi:nodetypes="csccscc" />
|
||||||
<path
|
<path
|
||||||
style="fill:url(#linearGradient3895);fill-opacity:1;stroke:none"
|
style="fill:url(#linearGradient3895);fill-opacity:1;stroke:none;stroke-width:1.34336"
|
||||||
d="m 183.53876,565.07558 30.90388,-26.63904 c 0,0 29.3937,65.77281 57.9456,87.14893 27.16621,20.33869 77.40935,20.44538 77.40935,20.44538 16.64517,9.49353 16.61054,38.884 -14.37674,34.19491 -11.80483,-1.78633 -60.98194,-1.75168 -92.5934,-26.30905 -28.75005,-22.33442 -59.28869,-88.84113 -59.28869,-88.84113 z"
|
d="m 174.25065,596.18064 39.20044,-37.89847 c 0,0 37.28484,93.57277 73.50189,123.98386 34.45936,28.93517 98.19096,29.08696 98.19096,29.08696 21.11379,13.50612 21.06988,55.31897 -18.23637,48.64794 -14.97401,-2.54133 -77.35338,-2.49205 -117.45137,-37.42899 -36.4684,-31.77444 -75.20555,-126.3913 -75.20555,-126.3913 z"
|
||||||
id="path4017"
|
id="path4017"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
sodipodi:nodetypes="ccscssc" />
|
sodipodi:nodetypes="ccscssc" />
|
||||||
@@ -364,21 +413,21 @@
|
|||||||
transform="translate(0,300)"
|
transform="translate(0,300)"
|
||||||
sodipodi:insensitive="true">
|
sodipodi:insensitive="true">
|
||||||
<rect
|
<rect
|
||||||
y="141.78345"
|
y="227.44206"
|
||||||
x="303.048"
|
x="325.84378"
|
||||||
height="189.63731"
|
height="269.79065"
|
||||||
width="194.64587"
|
width="246.90125"
|
||||||
id="rect4119"
|
id="rect4119"
|
||||||
style="fill:#ffd42a;fill-opacity:1;stroke:none;display:inline" />
|
style="display:inline;fill:#ffd42a;fill-opacity:1;stroke:none;stroke-width:1.34336" />
|
||||||
<path
|
<path
|
||||||
sodipodi:nodetypes="ccccc"
|
sodipodi:nodetypes="ccccc"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
id="path4121"
|
id="path4121"
|
||||||
d="m 342.65518,101.83473 -39.6072,39.94872 194.64588,-10e-6 -39.93747,-39.89529 z"
|
d="m 376.08405,170.60839 -50.2403,56.8337 246.90126,-2e-5 -50.65924,-56.75768 z"
|
||||||
style="fill:#ff9600;fill-opacity:1;stroke:none;display:inline" />
|
style="display:inline;fill:#ff9600;fill-opacity:1;stroke:none;stroke-width:1.34336" />
|
||||||
<path
|
<path
|
||||||
style="fill:#ffb82a;fill-opacity:1;stroke:#ffa600;stroke-width:1.18690801px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
style="fill:#ffb82a;fill-opacity:1;stroke:#ffa600;stroke-width:1.59444px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
d="m 302.35841,141.78344 32.71853,0 -0.67621,188.90069 -31.92777,0 z"
|
d="m 324.96905,227.44207 h 41.50228 l -0.85774,268.74268 h -40.49923 z"
|
||||||
id="path4184"
|
id="path4184"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
sodipodi:nodetypes="ccccc" />
|
sodipodi:nodetypes="ccccc" />
|
||||||
@@ -386,11 +435,11 @@
|
|||||||
sodipodi:nodetypes="ccccc"
|
sodipodi:nodetypes="ccccc"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
id="path4186"
|
id="path4186"
|
||||||
d="m 464.97533,141.78344 32.71853,0 -0.0305,188.90069 -32.36559,0 z"
|
d="m 531.24273,227.44207 h 41.50228 l -0.0387,268.74268 h -41.05458 z"
|
||||||
style="fill:#ffb82a;fill-opacity:1;stroke:#ffa600;stroke-width:1.18690801px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
|
style="fill:#ffb82a;fill-opacity:1;stroke:#ffa600;stroke-width:1.59444px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
|
||||||
<path
|
<path
|
||||||
style="fill:#ffc52a;fill-opacity:1;stroke:#ffa600;stroke-width:1.18690801;stroke-linejoin:round;stroke-opacity:1"
|
style="fill:#ffc52a;fill-opacity:1;stroke:#ffa600;stroke-width:1.59444;stroke-linejoin:round;stroke-opacity:1"
|
||||||
d="m 302.47296,142.191 195.19042,0 0,30.87636 -195.19042,0 z"
|
d="m 325.11436,228.0219 h 247.59199 v 43.92675 H 325.11436 Z"
|
||||||
id="rect4190"
|
id="rect4190"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
sodipodi:nodetypes="ccccc" />
|
sodipodi:nodetypes="ccccc" />
|
||||||
@@ -398,98 +447,98 @@
|
|||||||
sodipodi:nodetypes="ccccc"
|
sodipodi:nodetypes="ccccc"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
id="path4193"
|
id="path4193"
|
||||||
d="m 302.47296,299.80778 195.19042,0 0,30.87635 -195.19042,0 z"
|
d="m 325.11436,452.258 h 247.59199 v 43.92675 H 325.11436 Z"
|
||||||
style="fill:#ffc52a;fill-opacity:1;stroke:#ffa600;stroke-width:1.18690801;stroke-linejoin:round;stroke-opacity:1" />
|
style="fill:#ffc52a;fill-opacity:1;stroke:#ffa600;stroke-width:1.59444;stroke-linejoin:round;stroke-opacity:1" />
|
||||||
<rect
|
<rect
|
||||||
style="fill:#ffdd55;fill-opacity:1;stroke:#ffa600;stroke-width:1.18690801;stroke-linejoin:round;stroke-opacity:1;display:inline"
|
style="display:inline;fill:#ffdd55;fill-opacity:1;stroke:#ffa600;stroke-width:1.59444;stroke-linejoin:round;stroke-opacity:1"
|
||||||
id="rect4195-4"
|
id="rect4195-4"
|
||||||
width="32.343575"
|
width="41.026657"
|
||||||
height="126.74043"
|
height="180.30936"
|
||||||
x="367.3085"
|
x="407.3559"
|
||||||
y="173.06735" />
|
y="271.94864" />
|
||||||
<rect
|
<rect
|
||||||
style="fill:#ffcc00;fill-opacity:1;stroke:#ffa600;stroke-width:1.18690801;stroke-linejoin:round;stroke-opacity:1;display:inline"
|
style="display:inline;fill:#ffcc00;fill-opacity:1;stroke:#ffa600;stroke-width:1.59444;stroke-linejoin:round;stroke-opacity:1"
|
||||||
id="rect4195"
|
id="rect4195"
|
||||||
width="32.343575"
|
width="41.026657"
|
||||||
height="126.74043"
|
height="180.30936"
|
||||||
x="334.965"
|
x="366.32935"
|
||||||
y="173.06738" />
|
y="271.9487" />
|
||||||
<rect
|
<rect
|
||||||
style="fill:#ffcc00;fill-opacity:1;stroke:#ffa600;stroke-width:1.18690801;stroke-linejoin:round;stroke-opacity:1;display:inline"
|
style="display:inline;fill:#ffcc00;fill-opacity:1;stroke:#ffa600;stroke-width:1.59444;stroke-linejoin:round;stroke-opacity:1"
|
||||||
id="rect4195-9"
|
id="rect4195-9"
|
||||||
width="32.343575"
|
width="41.026657"
|
||||||
height="126.74043"
|
height="180.30936"
|
||||||
x="432.68518"
|
x="490.28384"
|
||||||
y="173.06735" />
|
y="271.94864" />
|
||||||
<path
|
<path
|
||||||
style="fill:#ffba08;fill-opacity:1;stroke:#ffa600;stroke-width:1.18690801;stroke-opacity:1;display:inline"
|
style="display:inline;fill:#ffba08;fill-opacity:1;stroke:#ffa600;stroke-width:1.59444;stroke-opacity:1"
|
||||||
d="m 309.96367,173.08035 138.05026,126.73752 44.73381,0 -138.05027,-126.73752 z"
|
d="m 334.61606,271.96715 175.11175,180.3052 h 56.74322 L 391.35925,271.96715 Z"
|
||||||
id="rect4222-6"
|
id="rect4222-6"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
sodipodi:nodetypes="ccccc" />
|
sodipodi:nodetypes="ccccc" />
|
||||||
<path
|
<path
|
||||||
style="fill:#fab826;fill-opacity:1;stroke:#ffaf00;stroke-width:1.18690801;stroke-opacity:1"
|
style="fill:#fab826;fill-opacity:1;stroke:#ffaf00;stroke-width:1.59444;stroke-opacity:1"
|
||||||
d="m 445.72641,173.08035 -135.83535,126.73752 44.33437,0 135.83538,-126.73752 z"
|
d="M 506.82617,271.96715 334.52396,452.27235 H 390.7605 L 563.06275,271.96715 Z"
|
||||||
id="rect4222"
|
id="rect4222"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
sodipodi:nodetypes="ccccc" />
|
sodipodi:nodetypes="ccccc" />
|
||||||
<path
|
<path
|
||||||
style="fill:#aa4400;stroke:none"
|
style="fill:#aa4400;stroke:none;stroke-width:1.34336"
|
||||||
d="m 364.06882,101.84466 -27.85671,40.34634 31.10207,0 17.00384,-40.33693 z"
|
d="m 403.24648,170.62251 -35.33523,57.39939 h 39.45186 l 21.56875,-57.386 z"
|
||||||
id="path5801"
|
id="path5801"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
sodipodi:nodetypes="ccccc" />
|
sodipodi:nodetypes="ccccc" />
|
||||||
<path
|
<path
|
||||||
style="fill:#ff6600;stroke:none"
|
style="fill:#ff6600;stroke:none;stroke-width:1.34336"
|
||||||
d="m 367.84163,142.191 16.78684,-40.33679 21.10779,0.01 -5.90794,40.32709 z"
|
d="m 408.03215,228.0219 21.2935,-57.3858 26.77447,0.0142 -7.49402,57.372 z"
|
||||||
id="path5803"
|
id="path5803"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
sodipodi:nodetypes="ccccc" />
|
sodipodi:nodetypes="ccccc" />
|
||||||
<path
|
<path
|
||||||
style="fill:#ff7f2a;stroke:none;display:inline"
|
style="display:inline;fill:#ff7f2a;stroke:none;stroke-width:1.34336"
|
||||||
d="m 431.57529,142.191 -6.40565,-40.23712 -19.12278,-0.0898 -5.86864,40.33002 z"
|
d="m 488.87599,228.0219 -8.12534,-57.244 -24.25655,-0.12776 -7.44416,57.37617 z"
|
||||||
id="path5803-6"
|
id="path5803-6"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
sodipodi:nodetypes="ccccc" />
|
sodipodi:nodetypes="ccccc" />
|
||||||
<path
|
<path
|
||||||
style="fill:none;stroke:none;display:inline"
|
style="display:inline;fill:none;stroke:none;stroke-width:1.34336"
|
||||||
d="m 445.9808,102.182 18.59488,40.02713 -32.68108,-0.25851 -6.22946,-39.73823 z"
|
d="m 507.14886,171.10243 23.58693,56.94526 -41.45476,-0.36778 -7.90185,-56.53424 z"
|
||||||
id="path5801-2"
|
id="path5801-2"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
sodipodi:nodetypes="ccccc" />
|
sodipodi:nodetypes="ccccc" />
|
||||||
<path
|
<path
|
||||||
style="fill:#d4aa00;stroke:none"
|
style="fill:#d4aa00;stroke:none;stroke-width:1.34336"
|
||||||
d="m 464.4348,142.191 0.0873,-4.67444 32.70213,0.25851 0.24774,4.65329 z"
|
d="m 530.55709,228.0219 0.11073,-6.65016 41.48147,0.36777 0.31424,6.62007 z"
|
||||||
id="path5855"
|
id="path5855"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
sodipodi:nodetypes="ccccc" />
|
sodipodi:nodetypes="ccccc" />
|
||||||
<path
|
<path
|
||||||
style="fill:#ffcc00;stroke:none"
|
style="fill:#ffcc00;stroke:none;stroke-width:1.34336"
|
||||||
d="m 464.52216,137.51656 -22.27583,-37.3704 0.0599,1.73482 22.25514,40.32804 z"
|
d="m 530.66791,221.37174 -28.25609,-53.16563 0.076,2.46808 28.22984,57.37335 z"
|
||||||
id="path5857"
|
id="path5857"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
sodipodi:nodetypes="ccccc" />
|
sodipodi:nodetypes="ccccc" />
|
||||||
<path
|
<path
|
||||||
style="fill:#ff9600;fill-opacity:1;stroke:none"
|
style="fill:#ff9600;fill-opacity:1;stroke:none;stroke-width:1.34336"
|
||||||
d="m 464.52216,137.51656 32.70215,0.25851 -39.05814,-37.66825 -15.94328,0 z"
|
d="m 530.66791,221.37174 41.48149,0.36777 -49.54384,-53.58936 h -20.22347 z"
|
||||||
id="path5859"
|
id="path5859"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
sodipodi:nodetypes="ccccc" />
|
sodipodi:nodetypes="ccccc" />
|
||||||
<path
|
<path
|
||||||
style="fill:#d4aa00;fill-opacity:1;stroke:none"
|
style="fill:#d4aa00;fill-opacity:1;stroke:none;stroke-width:1.34336"
|
||||||
d="m 303.27493,141.82968 0,0 32.26901,0.40752 -0.20102,-3.20718 -32.03678,-0.46042 z"
|
d="m 326.13163,227.50786 v 0 l 40.93207,0.57977 -0.25498,-4.56275 -40.6375,-0.65503 z"
|
||||||
id="path5891"
|
id="path5891"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
sodipodi:nodetypes="cccccc" />
|
sodipodi:nodetypes="cccccc" />
|
||||||
<path
|
<path
|
||||||
style="fill:#ff9600;fill-opacity:1;stroke:none"
|
style="fill:#ff9600;fill-opacity:1;stroke:none;stroke-width:1.34336"
|
||||||
d="m 335.64188,139.03326 -32.226,-0.34915 40.16321,-38.57729 19.74096,0 z"
|
d="m 367.18793,223.52949 -40.8775,-0.49673 50.94557,-54.88261 h 25.04069 z"
|
||||||
id="path5893"
|
id="path5893"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
sodipodi:nodetypes="ccccc" />
|
sodipodi:nodetypes="ccccc" />
|
||||||
<path
|
<path
|
||||||
style="fill:#aa8800;fill-opacity:1;stroke:none"
|
style="fill:#aa8800;fill-opacity:1;stroke:none;stroke-width:1.34336"
|
||||||
d="m 335.35265,139.18557 27.9674,-39.07875 0,1.95445 -27.77481,40.41628 z"
|
d="m 366.82107,223.74617 35.47562,-55.59602 v 2.78052 l -35.23134,57.49889 z"
|
||||||
id="path5897"
|
id="path5897"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
sodipodi:nodetypes="ccccc" />
|
sodipodi:nodetypes="ccccc" />
|
||||||
@@ -502,18 +551,18 @@
|
|||||||
transform="translate(0,-252.36218)"
|
transform="translate(0,-252.36218)"
|
||||||
sodipodi:insensitive="true">
|
sodipodi:insensitive="true">
|
||||||
<path
|
<path
|
||||||
style="fill:#ffcc00;fill-opacity:1;stroke:none;display:inline"
|
style="display:inline;fill:#ffcc00;fill-opacity:1;stroke:none;stroke-width:1.34336"
|
||||||
d="m 254.37902,452.82417 c -28.81097,4.95816 -35.62107,17.32969 -38.59418,42.98726 -0.84369,7.28135 -6.72484,12.94213 -10.94805,18.80498 -34.04568,47.26343 -82.69132,82.04844 -115.022188,130.60522 -1.640852,2.46434 -2.928048,5.20323 -3.916653,8.02112 C 73.895506,687.45388 77.017507,726.77688 61.954928,759.64356 44.962286,796.72167 3.3100375,849.66013 3.3100375,849.66013 -4.5661323,875.4928 17.115761,885.7572 34.90908,875.3958 c 0,0 46.419511,-53.94426 64.45365,-92.66343 17.21715,-36.96515 20.86431,-67.23006 39.59603,-103.38438 15.49462,-29.90624 63.56196,-70.62478 63.56196,-70.62478 0,0 18.918,39.34961 35.24386,60.45235 24.152,18.9697 55.39841,34.75724 72.87061,40.51414 21.55786,-0.69033 24.3167,-29.10645 11.68481,-33.65069 -26.56735,-9.55738 -33.37885,-13.88582 -59.71068,-38.31372 -21.84827,-20.26861 -40.54096,-81.15157 -40.54096,-81.15157 0,0 9.23873,-15.60517 14.46726,-18.63833 5.97992,-3.46914 8.93604,1.02613 18.0281,0.47777 30.36625,-3.12338 38.40952,-22.96684 38.40952,-42.60173 1.73462,-30.49483 -8.26611,-36.24423 -38.59422,-42.98726 z"
|
d="m 264.10893,436.48432 c -36.54566,7.05381 -45.18403,24.65437 -48.9553,61.15654 -1.0702,10.35893 -8.53022,18.41233 -13.88721,26.75322 -43.18572,67.24009 -104.890947,116.72755 -145.901484,185.80766 -2.081361,3.50593 -3.714122,7.40246 -4.968132,11.41138 -15.224663,48.67103 -11.264519,104.61454 -30.370855,151.37286 -21.5545495,52.74978 -74.388919,128.06352 -74.388919,128.06352 -9.990636,36.7513 17.512061,51.3541 40.082241,36.6133 0,0 58.881468,-76.74468 81.757121,-131.82915 21.839329,-52.58907 26.465628,-95.64595 50.226128,-147.08148 19.65436,-42.54661 80.62605,-100.47551 80.62605,-100.47551 0,0 23.99679,55.98137 44.70555,86.00353 30.63595,26.98756 70.27088,49.44796 92.43375,57.6381 27.34534,-0.98211 30.84485,-41.40876 14.82174,-47.8737 -33.69972,-13.59697 -42.33986,-19.75489 -75.74083,-54.50765 -27.71374,-28.83547 -51.42474,-115.45161 -51.42474,-115.45161 0,0 11.719,-22.20095 18.35119,-26.51612 7.58532,-4.93543 11.33504,1.45983 22.868,0.67971 38.51849,-4.44354 48.72109,-32.67416 48.72109,-60.60806 2.2003,-43.38397 -10.48527,-51.56346 -48.95539,-61.15654 z"
|
||||||
id="path3933-1"
|
id="path3933-1"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
sodipodi:nodetypes="csssssccssccccscsccc" />
|
sodipodi:nodetypes="csssssccssccccscsccc" />
|
||||||
<rect
|
<rect
|
||||||
style="fill:#d45500;fill-opacity:1;stroke:none"
|
style="fill:#d45500;fill-opacity:1;stroke:none;stroke-width:1.34336"
|
||||||
id="rect4182"
|
id="rect4182"
|
||||||
width="25.747025"
|
width="32.659168"
|
||||||
height="1.6119893e-006"
|
height="2.2933232e-06"
|
||||||
x="362.77811"
|
x="401.60925"
|
||||||
y="686.87097" />
|
y="769.45483" />
|
||||||
</g>
|
</g>
|
||||||
<g
|
<g
|
||||||
inkscape:groupmode="layer"
|
inkscape:groupmode="layer"
|
||||||
@@ -523,14 +572,14 @@
|
|||||||
transform="translate(0,300)"
|
transform="translate(0,300)"
|
||||||
sodipodi:insensitive="true">
|
sodipodi:insensitive="true">
|
||||||
<path
|
<path
|
||||||
style="fill:url(#linearGradient3826);fill-opacity:1;fill-rule:nonzero;stroke:none"
|
style="fill:url(#linearGradient3826);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.34336"
|
||||||
d="m 291.71618,-49.781761 c 2.12289,19.119621 -18.80171,35.817181 -35.27952,35.817181 -16.47782,0 -22.96478,-5.15605 -27.26471,-11.27249 -6.29753,-8.95796 10.76394,17.41252 40.22748,4.45232 11.6126,-5.10804 22.03985,-18.452092 22.31675,-28.997011 z"
|
d="m 311.46979,-45.091308 c 2.69279,27.200844 -23.8493,50.9559017 -44.75081,50.9559017 -20.90151,0 -29.12998,-7.3353383 -34.58429,-16.0369927 -7.98819,-12.74419 13.65366,24.772208 51.02709,6.334167 14.73017,-7.267038 27.95675,-26.251173 28.30801,-41.253076 z"
|
||||||
id="path3033"
|
id="path3033"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
sodipodi:nodetypes="csssc" />
|
sodipodi:nodetypes="csssc" />
|
||||||
<path
|
<path
|
||||||
style="fill:url(#linearGradient3913);fill-opacity:1;fill-rule:nonzero;stroke:none"
|
style="fill:url(#linearGradient3913);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.34336"
|
||||||
d="m 206.85784,65.07824 c -7.50913,-13.91844 -6.72686,-12.25509 -8.48593,-16.15108 -0.5375,-1.19044 -2.81412,-7.4956 -4.5498,-17.18416 3.34901,10.02437 7.89294,19.9273 13.03573,33.33524 z"
|
d="m 203.83005,118.31616 c -9.52507,-19.801295 -8.53278,-17.4349 -10.7641,-22.977599 -0.6818,-1.693598 -3.56961,-10.663739 -5.77125,-24.447327 4.24809,14.261335 10.01191,28.349901 16.53535,47.424926 z"
|
||||||
id="path3830"
|
id="path3830"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
sodipodi:nodetypes="cscc" />
|
sodipodi:nodetypes="cscc" />
|
||||||
@@ -543,20 +592,20 @@
|
|||||||
transform="translate(0,300)"
|
transform="translate(0,300)"
|
||||||
sodipodi:insensitive="true">
|
sodipodi:insensitive="true">
|
||||||
<path
|
<path
|
||||||
style="fill:#d45500;fill-opacity:1;stroke:none"
|
style="fill:#d45500;fill-opacity:1;stroke:none;stroke-width:1.34336"
|
||||||
d="m 299.34257,-77.08509 c 0,22.320337 -22.43256,6.21762 -44.37134,6.21762 -21.93876,0 -42.0475,16.102717 -42.0475,-6.21762 0,-22.32035 20.10874,-40.41456 42.0475,-40.41456 21.93878,0 44.37134,18.09421 44.37134,40.41456 z"
|
d="m 321.14358,-83.934838 c 0,31.754395 -28.45489,8.8456 -56.28345,8.8456 -27.82851,0 -53.33571,22.908795 -53.33571,-8.8456 0,-31.754402 25.5072,-57.496432 53.33571,-57.496432 27.82856,0 56.28345,25.74203 56.28345,57.496432 z"
|
||||||
id="path4163"
|
id="path4163"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
sodipodi:nodetypes="sssss" />
|
sodipodi:nodetypes="sssss" />
|
||||||
<path
|
<path
|
||||||
style="fill:url(#linearGradient4180);fill-opacity:1;stroke:none"
|
style="fill:url(#linearGradient4180);fill-opacity:1;stroke:none;stroke-width:1.34336"
|
||||||
d="m 293.5429,-79.15764 c 0,17.1695 -16.99832,6.15717 -37.01744,6.15717 -20.01914,0 -40.12588,11.01233 -40.12588,-6.15717 0,-17.16949 18.55253,-35.93787 38.57166,-35.93787 20.01913,0 38.57166,18.76838 38.57166,35.93787 z"
|
d="m 313.78691,-86.883386 c 0,24.426474 -21.56177,8.759601 -46.95529,8.759601 -25.39356,0 -50.89822,15.666873 -50.89822,-8.759601 0,-24.426454 23.53321,-51.127594 48.92676,-51.127594 25.39353,0 48.92675,26.70114 48.92675,51.127594 z"
|
||||||
id="path4167"
|
id="path4167"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
sodipodi:nodetypes="sssss" />
|
sodipodi:nodetypes="sssss" />
|
||||||
<path
|
<path
|
||||||
style="fill:#d45500;fill-opacity:1;stroke:none"
|
style="fill:#d45500;fill-opacity:1;stroke:none;stroke-width:1.34336"
|
||||||
d="m 314.86087,-66.30736 c 1.99925,3.79536 2.46806,4.24908 -10.42746,2.1241 -11.1239,-2.85652 -15.3929,1.10151 -15.3929,-8.34171 0,-9.44322 16.00482,-2.27706 20.35836,0.51814 2.93281,2.24407 4.33459,3.55921 5.462,5.69947 z"
|
d="m 340.82798,-68.601722 c 2.53598,5.399531 3.13064,6.045024 -13.22686,3.021884 -14.11025,-4.063875 -19.52534,1.567082 -19.52534,-11.867469 0,-13.434556 20.30154,-3.239498 25.82385,0.737141 3.72017,3.192562 5.49826,5.063567 6.92835,8.108444 z"
|
||||||
id="path4171"
|
id="path4171"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
sodipodi:nodetypes="scscs" />
|
sodipodi:nodetypes="scscs" />
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 24 KiB |
@@ -2,24 +2,25 @@
|
|||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
<svg
|
<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"
|
width="500"
|
||||||
height="500"
|
height="500"
|
||||||
id="svg3081"
|
id="svg3081"
|
||||||
version="1.1"
|
version="1.1"
|
||||||
inkscape:version="0.48.4 r9939"
|
inkscape:version="1.1.1 (c3084ef, 2021-09-22)"
|
||||||
sodipodi:docname="wall.svg"
|
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-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
|
<defs
|
||||||
id="defs3083">
|
id="defs3083">
|
||||||
<pattern
|
<pattern
|
||||||
@@ -158,7 +159,7 @@
|
|||||||
</pattern>
|
</pattern>
|
||||||
<linearGradient
|
<linearGradient
|
||||||
id="linearGradient5386"
|
id="linearGradient5386"
|
||||||
osb:paint="solid">
|
inkscape:swatch="solid">
|
||||||
<stop
|
<stop
|
||||||
style="stop-color:#000000;stop-opacity:1;"
|
style="stop-color:#000000;stop-opacity:1;"
|
||||||
offset="0"
|
offset="0"
|
||||||
@@ -212,20 +213,24 @@
|
|||||||
pagecolor="#ffffff"
|
pagecolor="#ffffff"
|
||||||
bordercolor="#666666"
|
bordercolor="#666666"
|
||||||
borderopacity="1.0"
|
borderopacity="1.0"
|
||||||
inkscape:pageopacity="0.0"
|
inkscape:pageopacity="0"
|
||||||
inkscape:pageshadow="2"
|
inkscape:pageshadow="2"
|
||||||
inkscape:zoom="1.28"
|
inkscape:zoom="1.28"
|
||||||
inkscape:cx="187.56837"
|
inkscape:cx="153.125"
|
||||||
inkscape:cy="248.77068"
|
inkscape:cy="273.04688"
|
||||||
inkscape:document-units="px"
|
inkscape:document-units="px"
|
||||||
inkscape:current-layer="layer1"
|
inkscape:current-layer="layer4"
|
||||||
showgrid="true"
|
showgrid="true"
|
||||||
inkscape:snap-global="false"
|
inkscape:snap-global="false"
|
||||||
inkscape:window-width="1920"
|
inkscape:window-width="1792"
|
||||||
inkscape:window-height="1018"
|
inkscape:window-height="1067"
|
||||||
inkscape:window-x="-8"
|
inkscape:window-x="0"
|
||||||
inkscape:window-y="-8"
|
inkscape:window-y="25"
|
||||||
inkscape:window-maximized="1">
|
inkscape:window-maximized="0"
|
||||||
|
inkscape:pagecheckerboard="true"
|
||||||
|
inkscape:showpageshadow="false"
|
||||||
|
showborder="true"
|
||||||
|
borderlayer="true">
|
||||||
<inkscape:grid
|
<inkscape:grid
|
||||||
type="xygrid"
|
type="xygrid"
|
||||||
id="grid3093"
|
id="grid3093"
|
||||||
@@ -242,23 +247,24 @@
|
|||||||
<dc:format>image/svg+xml</dc:format>
|
<dc:format>image/svg+xml</dc:format>
|
||||||
<dc:type
|
<dc:type
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
<dc:title></dc:title>
|
<dc:title>Banvor Wall</dc:title>
|
||||||
</cc:Work>
|
</cc:Work>
|
||||||
</rdf:RDF>
|
</rdf:RDF>
|
||||||
</metadata>
|
</metadata>
|
||||||
<g
|
<g
|
||||||
inkscape:groupmode="layer"
|
inkscape:groupmode="layer"
|
||||||
id="layer4"
|
id="layer4"
|
||||||
inkscape:label="Background"
|
inkscape:label="Grey Background"
|
||||||
sodipodi:insensitive="true">
|
sodipodi:insensitive="true"
|
||||||
|
style="display:none">
|
||||||
<rect
|
<rect
|
||||||
style="fill:#e3dbdb;stroke:none;display:inline"
|
style="display:inline;fill:#e3dbdb;stroke:none"
|
||||||
id="rect3089"
|
id="rect3089"
|
||||||
width="500"
|
width="500"
|
||||||
height="500"
|
height="500"
|
||||||
x="-500"
|
x="-500"
|
||||||
y="0.78125"
|
y="0.78125"
|
||||||
transform="matrix(0,-1,1,0,0,0)"
|
transform="rotate(-90)"
|
||||||
inkscape:export-xdpi="90"
|
inkscape:export-xdpi="90"
|
||||||
inkscape:export-ydpi="90"
|
inkscape:export-ydpi="90"
|
||||||
inkscape:export-filename="C:\Users\vahagnk\devel\_private\org.dyndns.vahagn.sokoban\art\wall.png" />
|
inkscape:export-filename="C:\Users\vahagnk\devel\_private\org.dyndns.vahagn.sokoban\art\wall.png" />
|
||||||
@@ -271,7 +277,7 @@
|
|||||||
transform="translate(0,-552.36217)"
|
transform="translate(0,-552.36217)"
|
||||||
sodipodi:insensitive="true">
|
sodipodi:insensitive="true">
|
||||||
<rect
|
<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"
|
id="rect5349"
|
||||||
width="499.18079"
|
width="499.18079"
|
||||||
height="499.18079"
|
height="499.18079"
|
||||||
@@ -296,7 +302,7 @@
|
|||||||
inkscape:export-xdpi="90"
|
inkscape:export-xdpi="90"
|
||||||
inkscape:export-ydpi="90" />
|
inkscape:export-ydpi="90" />
|
||||||
<path
|
<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"
|
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"
|
id="path4651-4"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
@@ -305,7 +311,7 @@
|
|||||||
inkscape:export-xdpi="90"
|
inkscape:export-xdpi="90"
|
||||||
inkscape:export-ydpi="90" />
|
inkscape:export-ydpi="90" />
|
||||||
<path
|
<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"
|
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"
|
id="path4651-0"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
@@ -314,7 +320,7 @@
|
|||||||
inkscape:export-xdpi="90"
|
inkscape:export-xdpi="90"
|
||||||
inkscape:export-ydpi="90" />
|
inkscape:export-ydpi="90" />
|
||||||
<path
|
<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"
|
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"
|
id="path4651-9"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
@@ -323,7 +329,7 @@
|
|||||||
inkscape:export-xdpi="90"
|
inkscape:export-xdpi="90"
|
||||||
inkscape:export-ydpi="90" />
|
inkscape:export-ydpi="90" />
|
||||||
<path
|
<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"
|
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"
|
id="path4651-48"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
@@ -332,7 +338,7 @@
|
|||||||
inkscape:export-xdpi="90"
|
inkscape:export-xdpi="90"
|
||||||
inkscape:export-ydpi="90" />
|
inkscape:export-ydpi="90" />
|
||||||
<path
|
<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"
|
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"
|
id="path4651-8"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
@@ -341,7 +347,7 @@
|
|||||||
inkscape:export-xdpi="90"
|
inkscape:export-xdpi="90"
|
||||||
inkscape:export-ydpi="90" />
|
inkscape:export-ydpi="90" />
|
||||||
<path
|
<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"
|
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"
|
id="path4651-2"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
@@ -350,7 +356,7 @@
|
|||||||
inkscape:export-xdpi="90"
|
inkscape:export-xdpi="90"
|
||||||
inkscape:export-ydpi="90" />
|
inkscape:export-ydpi="90" />
|
||||||
<path
|
<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"
|
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"
|
id="path4651-45"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
@@ -359,7 +365,7 @@
|
|||||||
inkscape:export-xdpi="90"
|
inkscape:export-xdpi="90"
|
||||||
inkscape:export-ydpi="90" />
|
inkscape:export-ydpi="90" />
|
||||||
<path
|
<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"
|
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"
|
id="path4651-5"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
@@ -368,7 +374,7 @@
|
|||||||
inkscape:export-xdpi="90"
|
inkscape:export-xdpi="90"
|
||||||
inkscape:export-ydpi="90" />
|
inkscape:export-ydpi="90" />
|
||||||
<path
|
<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"
|
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"
|
id="path4651-1"
|
||||||
inkscape:connector-curvature="0"
|
inkscape:connector-curvature="0"
|
||||||
@@ -376,9 +382,4 @@
|
|||||||
inkscape:export-xdpi="90"
|
inkscape:export-xdpi="90"
|
||||||
inkscape:export-ydpi="90" />
|
inkscape:export-ydpi="90" />
|
||||||
</g>
|
</g>
|
||||||
<g
|
|
||||||
inkscape:groupmode="layer"
|
|
||||||
id="layer2"
|
|
||||||
inkscape:label="Red"
|
|
||||||
transform="translate(0,-552.36217)" />
|
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 852 KiB After Width: | Height: | Size: 852 KiB |
@@ -2,22 +2,22 @@
|
|||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
<svg
|
<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"
|
width="500"
|
||||||
height="500"
|
height="500"
|
||||||
id="svg3081"
|
id="svg3081"
|
||||||
version="1.1"
|
version="1.1"
|
||||||
inkscape:version="0.48.5 r10040"
|
inkscape:version="1.1.1 (c3084ef, 2021-09-22)"
|
||||||
sodipodi:docname="worker.svg"
|
sodipodi:docname="worker.svg"
|
||||||
inkscape:export-filename="C:\Users\vahagnk\devel\_private\org.dyndns.vahagn.sokoban\art\worker_select.png"
|
inkscape:export-filename="C:\Users\vahagnk\devel\_private\org.dyndns.vahagn.sokoban\art\worker_select.png"
|
||||||
inkscape:export-xdpi="90"
|
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
|
<defs
|
||||||
id="defs3083">
|
id="defs3083">
|
||||||
<inkscape:perspective
|
<inkscape:perspective
|
||||||
@@ -36,17 +36,20 @@
|
|||||||
inkscape:pageopacity="0.0"
|
inkscape:pageopacity="0.0"
|
||||||
inkscape:pageshadow="2"
|
inkscape:pageshadow="2"
|
||||||
inkscape:zoom="1.1313708"
|
inkscape:zoom="1.1313708"
|
||||||
inkscape:cx="-34.823458"
|
inkscape:cx="193.12855"
|
||||||
inkscape:cy="275.12227"
|
inkscape:cy="285.93632"
|
||||||
inkscape:document-units="px"
|
inkscape:document-units="px"
|
||||||
inkscape:current-layer="layer3"
|
inkscape:current-layer="layer3"
|
||||||
showgrid="true"
|
showgrid="true"
|
||||||
inkscape:snap-global="false"
|
inkscape:snap-global="false"
|
||||||
inkscape:window-width="1920"
|
inkscape:window-width="1307"
|
||||||
inkscape:window-height="1018"
|
inkscape:window-height="969"
|
||||||
inkscape:window-x="-8"
|
inkscape:window-x="0"
|
||||||
inkscape:window-y="-8"
|
inkscape:window-y="25"
|
||||||
inkscape:window-maximized="1">
|
inkscape:window-maximized="0"
|
||||||
|
inkscape:pagecheckerboard="true"
|
||||||
|
inkscape:showpageshadow="false"
|
||||||
|
borderlayer="true">
|
||||||
<inkscape:grid
|
<inkscape:grid
|
||||||
type="xygrid"
|
type="xygrid"
|
||||||
id="grid3093"
|
id="grid3093"
|
||||||
@@ -63,7 +66,6 @@
|
|||||||
<dc:format>image/svg+xml</dc:format>
|
<dc:format>image/svg+xml</dc:format>
|
||||||
<dc:type
|
<dc:type
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
<dc:title />
|
|
||||||
</cc:Work>
|
</cc:Work>
|
||||||
</rdf:RDF>
|
</rdf:RDF>
|
||||||
</metadata>
|
</metadata>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 6.2 KiB |
@@ -2,7 +2,9 @@ package org.vostan.banvor;
|
|||||||
|
|
||||||
import android.app.Application;
|
import android.app.Application;
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.util.Log;
|
|
||||||
|
import org.vostan.banvor.game.State;
|
||||||
|
import org.vostan.banvor.game.PuzzleContainer;
|
||||||
|
|
||||||
public class App extends Application
|
public class App extends Application
|
||||||
{
|
{
|
||||||
@@ -11,12 +13,8 @@ public class App extends Application
|
|||||||
public static final int MIN_LEVEL = 1;
|
public static final int MIN_LEVEL = 1;
|
||||||
|
|
||||||
private static App mApp = null;
|
private static App mApp = null;
|
||||||
protected PuzzleContainer pc;
|
protected State gameState;
|
||||||
protected int current_level;
|
|
||||||
protected int achieved_level;
|
|
||||||
protected int max_level;
|
|
||||||
protected SharedPreferences prefs;
|
protected SharedPreferences prefs;
|
||||||
protected SharedPreferences.Editor prefsEdit;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
@@ -26,98 +24,26 @@ public class App extends Application
|
|||||||
{
|
{
|
||||||
super.onCreate();
|
super.onCreate();
|
||||||
mApp = this;
|
mApp = this;
|
||||||
pc = new PuzzleContainer();
|
|
||||||
|
PuzzleContainer pc = new PuzzleContainer();
|
||||||
|
gameState = new State(pc);
|
||||||
prefs = getSharedPreferences(PREFS, MODE_PRIVATE);
|
prefs = getSharedPreferences(PREFS, MODE_PRIVATE);
|
||||||
prefsEdit = prefs.edit();
|
|
||||||
max_level = pc.getCount();
|
gameState.loadState(prefs);
|
||||||
current_level = prefs.getInt("current_level", MIN_LEVEL);
|
|
||||||
achieved_level = prefs.getInt("achieved_level", MIN_LEVEL+10);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void storeGameState(){
|
||||||
|
gameState.storeState(prefs.edit());
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// This is a singleton object.
|
// This is a singleton object.
|
||||||
//
|
//
|
||||||
public static App theApp()
|
public static App theApp() {
|
||||||
{
|
|
||||||
return mApp;
|
return mApp;
|
||||||
}
|
}
|
||||||
//
|
|
||||||
// Puzzles.
|
public State state(){
|
||||||
//
|
return gameState;
|
||||||
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.");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,403 +0,0 @@
|
|||||||
package org.vostan.banvor;
|
|
||||||
|
|
||||||
//import java.lang.Exception;
|
|
||||||
import java.io.*;
|
|
||||||
import static java.lang.Math.*;
|
|
||||||
import android.util.Log;
|
|
||||||
|
|
||||||
import java.util.LinkedList;
|
|
||||||
|
|
||||||
import static org.vostan.banvor.App.TAG;
|
|
||||||
|
|
||||||
public class Puzzle
|
|
||||||
{
|
|
||||||
public final static int FLOOR = 0x0;
|
|
||||||
public final static int GOAL = 0x1;
|
|
||||||
public final static int FLOOR_MASK = ~(GOAL | FLOOR);
|
|
||||||
public final static int WALL = 0x2;
|
|
||||||
public final static int BOX = 0x4;
|
|
||||||
public final static int BINGO = BOX | GOAL;
|
|
||||||
public final static int WORKER = 0x8;
|
|
||||||
public final static int WORKER_NORTH = 0x00 | WORKER;
|
|
||||||
public final static int WORKER_SOUTH = 0x10 | WORKER;
|
|
||||||
public final static int WORKER_WEST = 0x20 | WORKER;
|
|
||||||
public final static int WORKER_EAST = 0x30 | WORKER;
|
|
||||||
public final static int WORKER_MASK = WORKER_EAST | WORKER_WEST | WORKER_SOUTH | WORKER_NORTH;
|
|
||||||
public final static int SELECTED = 0x40;
|
|
||||||
public final static int MAX_COUNT = 0x80-1;
|
|
||||||
|
|
||||||
protected int columns;
|
|
||||||
protected int rows;
|
|
||||||
protected int box_count;
|
|
||||||
|
|
||||||
protected int [] board;
|
|
||||||
protected int worker_x;
|
|
||||||
protected int worker_y;
|
|
||||||
protected int selected_x;
|
|
||||||
protected int selected_y;
|
|
||||||
protected int bingos;
|
|
||||||
|
|
||||||
public Puzzle( InputStream is )
|
|
||||||
{
|
|
||||||
load( is );
|
|
||||||
}
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// Low level helper functions.
|
|
||||||
//
|
|
||||||
|
|
||||||
public final int getColumnCount()
|
|
||||||
{
|
|
||||||
return columns;
|
|
||||||
}
|
|
||||||
public final int getRowCount()
|
|
||||||
{
|
|
||||||
return rows;
|
|
||||||
}
|
|
||||||
public static int getSymCount()
|
|
||||||
{
|
|
||||||
return MAX_COUNT;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final int getIndex( int x, int y )
|
|
||||||
{
|
|
||||||
return y*columns+x;
|
|
||||||
}
|
|
||||||
public final int getX( int idx )
|
|
||||||
{
|
|
||||||
return idx % columns;
|
|
||||||
}
|
|
||||||
public final int getY( int idx )
|
|
||||||
{
|
|
||||||
return idx / columns;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final int getSym( int x, int y )
|
|
||||||
{
|
|
||||||
return board[getIndex(x,y)];
|
|
||||||
}
|
|
||||||
public void setSym( int x, int y, int v )
|
|
||||||
{
|
|
||||||
board[getIndex(x,y)]=v;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean isEmpty( int v )
|
|
||||||
{
|
|
||||||
return (v & FLOOR_MASK) == 0;
|
|
||||||
}
|
|
||||||
public static boolean hasBox( int v )
|
|
||||||
{
|
|
||||||
return (v & BOX) != 0;
|
|
||||||
}
|
|
||||||
public static boolean hasWorker( int v )
|
|
||||||
{
|
|
||||||
return (v & WORKER) != 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final int getWorkerX()
|
|
||||||
{
|
|
||||||
return worker_x;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final int getWorkerY()
|
|
||||||
{
|
|
||||||
return worker_y;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final boolean isSelected()
|
|
||||||
{
|
|
||||||
return selected_x != -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final boolean isSelected( int x, int y )
|
|
||||||
{
|
|
||||||
return selected_x == x && selected_y == y;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final int getSelectedX()
|
|
||||||
{
|
|
||||||
return selected_x;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final int getSelectedY()
|
|
||||||
{
|
|
||||||
return selected_y;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final boolean isValid( int x, int y )
|
|
||||||
{
|
|
||||||
return ( 0 <= x && 0 <= y
|
|
||||||
&& x < getColumnCount()
|
|
||||||
&& y < getRowCount() );
|
|
||||||
}
|
|
||||||
|
|
||||||
public final boolean isOneStep( int x, int y )
|
|
||||||
{
|
|
||||||
return isValid(x,y)
|
|
||||||
&& (abs(worker_x-x )+abs(worker_y-y) == 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public final boolean isDone()
|
|
||||||
{
|
|
||||||
return bingos == box_count;
|
|
||||||
}
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// Loading.
|
|
||||||
//
|
|
||||||
private void load( InputStream is )
|
|
||||||
{try{
|
|
||||||
columns = is.read();
|
|
||||||
rows = is.read();
|
|
||||||
box_count = 0;
|
|
||||||
bingos = 0;
|
|
||||||
selected_x = -1;
|
|
||||||
selected_y = -1;
|
|
||||||
board = new int[columns*rows];
|
|
||||||
byte [] b = new byte [columns*rows];
|
|
||||||
is.read( b, 0, columns*rows);
|
|
||||||
for( int i = 0; i < b.length; ++i )
|
|
||||||
{
|
|
||||||
switch( b[i] )
|
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
board[i] = FLOOR;
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
board[i] = WALL;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
board[i] = BOX;
|
|
||||||
++box_count;
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
board[i] = GOAL;
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
board[i] = BINGO;
|
|
||||||
++box_count;
|
|
||||||
++bingos;
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
board[i] = WORKER;
|
|
||||||
worker_x = getX(i);
|
|
||||||
worker_y = getY(i);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch ( Exception e )
|
|
||||||
{
|
|
||||||
Log.d( TAG, "load()", e);
|
|
||||||
}}
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// Move worker.
|
|
||||||
//
|
|
||||||
|
|
||||||
public boolean walk( int x, int y)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// Check that this is one step away.
|
|
||||||
//
|
|
||||||
if ( !isOneStep(x,y) )
|
|
||||||
return false;
|
|
||||||
//
|
|
||||||
// Check that this is empty space.
|
|
||||||
//
|
|
||||||
int v = getSym(x,y);
|
|
||||||
if ( !isEmpty(v) )
|
|
||||||
return false;
|
|
||||||
//
|
|
||||||
// If something is selected then unselect first.
|
|
||||||
//
|
|
||||||
if ( isSelected() )
|
|
||||||
unselect();
|
|
||||||
//
|
|
||||||
// Find direction to move.
|
|
||||||
//
|
|
||||||
int worker;
|
|
||||||
if ( worker_x < x )
|
|
||||||
worker = WORKER_WEST;
|
|
||||||
else if ( worker_x > x )
|
|
||||||
worker = WORKER_EAST;
|
|
||||||
else if ( worker_y > y )
|
|
||||||
worker = WORKER_SOUTH;
|
|
||||||
else
|
|
||||||
worker = WORKER_NORTH;
|
|
||||||
//
|
|
||||||
// Move worker marker from current position to asked position.
|
|
||||||
//
|
|
||||||
setSym(worker_x,worker_y,getSym(worker_x,worker_y)&~WORKER_MASK);
|
|
||||||
worker_x =x;
|
|
||||||
worker_y =y;
|
|
||||||
setSym(worker_x,worker_y,getSym(worker_x,worker_y)|worker);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean select( int x, int y)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// Check that this is one step away.
|
|
||||||
//
|
|
||||||
if ( !isOneStep(x,y) )
|
|
||||||
return false;
|
|
||||||
//
|
|
||||||
// Check that this is empty space.
|
|
||||||
//
|
|
||||||
int v = getSym(x,y);
|
|
||||||
if ( !hasBox(v) )
|
|
||||||
return false;
|
|
||||||
//
|
|
||||||
// If something is selected then unselect first.
|
|
||||||
//
|
|
||||||
if ( isSelected() )
|
|
||||||
unselect();
|
|
||||||
//
|
|
||||||
// Find direction to move.
|
|
||||||
//
|
|
||||||
int worker;
|
|
||||||
if ( worker_x < x )
|
|
||||||
worker = WORKER_WEST;
|
|
||||||
else if ( worker_x > x )
|
|
||||||
worker = WORKER_EAST;
|
|
||||||
else if ( worker_y > y )
|
|
||||||
worker = WORKER_SOUTH;
|
|
||||||
else
|
|
||||||
worker = WORKER_NORTH;
|
|
||||||
//
|
|
||||||
// Move worker marker from current position to asked position.
|
|
||||||
//
|
|
||||||
selected_x =x;
|
|
||||||
selected_y =y;
|
|
||||||
setSym(worker_x,worker_y,getSym(worker_x,worker_y)&~WORKER_MASK|worker|SELECTED);
|
|
||||||
setSym(selected_x,selected_y,getSym(selected_x,selected_y)|SELECTED);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean unselect()
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// If not selected then do nothing.
|
|
||||||
//
|
|
||||||
if ( !isSelected() )
|
|
||||||
return false;
|
|
||||||
//
|
|
||||||
// Move worker marker from current position to asked position.
|
|
||||||
//
|
|
||||||
setSym(worker_x,worker_y,getSym(worker_x,worker_y)&~SELECTED);
|
|
||||||
setSym(selected_x,selected_y,getSym(selected_x,selected_y)&~SELECTED);
|
|
||||||
selected_x =-1;
|
|
||||||
selected_y =-1;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean push(int x, int y)
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// If not selected then do nothing.
|
|
||||||
//
|
|
||||||
if ( !isSelected() )
|
|
||||||
return false;
|
|
||||||
//
|
|
||||||
// Check that we go to the selected direction.
|
|
||||||
//
|
|
||||||
if ( selected_x != x && selected_y != y )
|
|
||||||
return false;
|
|
||||||
//
|
|
||||||
// Check that this is a box that we move.
|
|
||||||
//
|
|
||||||
int v = getSym(x,y);
|
|
||||||
if ( !hasBox(v) )
|
|
||||||
return false;
|
|
||||||
//
|
|
||||||
// Check that the next space to the box is empty.
|
|
||||||
//w - 2*(w-x) = 2x -w
|
|
||||||
int next_x = 2*x - worker_x;
|
|
||||||
int next_y = 2*y - worker_y;
|
|
||||||
int next_v = getSym(next_x,next_y);
|
|
||||||
if ( !isEmpty(next_v) )
|
|
||||||
return false;
|
|
||||||
//
|
|
||||||
// Ok, looks we can move the box. Do it actually.
|
|
||||||
//
|
|
||||||
unselect();
|
|
||||||
setSym(x,y,getSym(x,y)&~BOX);
|
|
||||||
setSym(next_x,next_y,getSym(next_x,next_y)|BOX);
|
|
||||||
walk(x,y);
|
|
||||||
select(next_x,next_y);
|
|
||||||
//
|
|
||||||
// Keep track of box count in place.
|
|
||||||
//
|
|
||||||
if ( (v & GOAL) != 0 )
|
|
||||||
--bingos;
|
|
||||||
if ( (next_v & GOAL) != 0 )
|
|
||||||
++bingos;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// Undo/Redo.
|
|
||||||
//
|
|
||||||
|
|
||||||
protected class State
|
|
||||||
{
|
|
||||||
public int [] board;
|
|
||||||
public int worker_x;
|
|
||||||
public int worker_y;
|
|
||||||
public int selected_x;
|
|
||||||
public int selected_y;
|
|
||||||
public int bingos;
|
|
||||||
|
|
||||||
public State(Puzzle puzzle)
|
|
||||||
{
|
|
||||||
board = puzzle.board.clone();
|
|
||||||
worker_x = puzzle.worker_x;
|
|
||||||
worker_y = puzzle.worker_y;
|
|
||||||
selected_x = puzzle.selected_x;
|
|
||||||
selected_y = puzzle.selected_y;
|
|
||||||
bingos = puzzle.bingos;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void restore(Puzzle puzzle)
|
|
||||||
{
|
|
||||||
puzzle.board = board;
|
|
||||||
puzzle.worker_x = worker_x;
|
|
||||||
puzzle.worker_y = worker_y;
|
|
||||||
puzzle.selected_x = selected_x;
|
|
||||||
puzzle.selected_y = selected_y;
|
|
||||||
puzzle.bingos = bingos;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
protected LinkedList<State> undoStack = new LinkedList<State>();
|
|
||||||
|
|
||||||
//
|
|
||||||
// Save this state to be able to restore later.
|
|
||||||
//
|
|
||||||
public void save()
|
|
||||||
{
|
|
||||||
State s = new State(this);
|
|
||||||
undoStack.addFirst(s);
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// Restore state.
|
|
||||||
//
|
|
||||||
public void restore()
|
|
||||||
{
|
|
||||||
State s = undoStack.removeFirst();
|
|
||||||
if ( s != null )
|
|
||||||
s.restore(this);
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// Check if there are items in the undo stack.
|
|
||||||
//
|
|
||||||
public final boolean isUndoable()
|
|
||||||
{
|
|
||||||
return undoStack.size() != 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
121
app/src/main/java/org/vostan/banvor/PuzzleBoardFragment.java
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
/*
|
||||||
|
* 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);
|
||||||
|
binding.btnTest.setVisibility(getResources().getBoolean(R.bool.debug_visible) ? View.VISIBLE : View.GONE);
|
||||||
|
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.btnTest.setOnClickListener((View.OnClickListener) v -> {
|
||||||
|
createNextLevelDialog((d, w) -> {
|
||||||
|
initAndShowCurrentPuzzle();
|
||||||
|
}).show();
|
||||||
|
});
|
||||||
|
binding.btnPrev.setOnClickListener((View.OnClickListener) v -> {
|
||||||
|
gameState.setCurrentLevel(gameState.getCurrentLevel()-1);
|
||||||
|
PuzzleBoardFragment.this.initAndShowCurrentPuzzle();
|
||||||
|
});
|
||||||
|
binding.btnNext.setOnClickListener((View.OnClickListener) v -> {
|
||||||
|
gameState.setCurrentLevel(gameState.getCurrentLevel()+1);
|
||||||
|
PuzzleBoardFragment.this.initAndShowCurrentPuzzle();
|
||||||
|
});
|
||||||
|
binding.btnReset.setOnClickListener((View.OnClickListener) v -> {
|
||||||
|
PuzzleBoardFragment.this.initAndShowCurrentPuzzle();
|
||||||
|
});
|
||||||
|
binding.btnUndo.setOnClickListener((View.OnClickListener) v -> {
|
||||||
|
binding.gameBoard.undoLastMove();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
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.
|
||||||
|
//
|
||||||
|
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(), R.style.BanvorDialog);
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,76 +0,0 @@
|
|||||||
package org.vostan.banvor;
|
|
||||||
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.io.IOException;
|
|
||||||
import static org.vostan.banvor.App.theApp;
|
|
||||||
|
|
||||||
import org.vostan.banvor.R;
|
|
||||||
|
|
||||||
public class PuzzleContainer
|
|
||||||
{
|
|
||||||
protected int count;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Load puzzle from the puzzle.bin.
|
|
||||||
*/
|
|
||||||
public Puzzle getPuzzle( int i )
|
|
||||||
{try{
|
|
||||||
InputStream is = theApp().getResources().openRawResource(R.raw.puzzles);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Read amount of puzzles.
|
|
||||||
//
|
|
||||||
count = read_i32(is);
|
|
||||||
if ( i >= count )
|
|
||||||
return null;
|
|
||||||
//
|
|
||||||
// Read the offset.
|
|
||||||
//
|
|
||||||
is.skip( i*4 );
|
|
||||||
int offset = read_i32(is);
|
|
||||||
//
|
|
||||||
// Jump to the offset and read the puzzle.
|
|
||||||
//
|
|
||||||
is.skip( offset - 4 - (i+1)*4);
|
|
||||||
Puzzle p = new Puzzle( is );
|
|
||||||
//
|
|
||||||
// Finally return the puzzle and we are done.
|
|
||||||
//
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
catch ( java.lang.Exception e )
|
|
||||||
{
|
|
||||||
//Log.d(TAG, "Exception: " + e.getMessage() );
|
|
||||||
e.printStackTrace();
|
|
||||||
return null;
|
|
||||||
}}
|
|
||||||
//
|
|
||||||
// Retrive amount of puzzles.
|
|
||||||
//
|
|
||||||
public int getCount()
|
|
||||||
{try{
|
|
||||||
if ( count == 0 )
|
|
||||||
{
|
|
||||||
InputStream is = theApp().getResources().openRawResource(R.raw.puzzles);
|
|
||||||
count = read_i32(is);
|
|
||||||
}
|
|
||||||
return count;
|
|
||||||
}
|
|
||||||
catch ( java.lang.Exception e )
|
|
||||||
{
|
|
||||||
//Log.d(TAG, "Exception: " + e.getMessage() );
|
|
||||||
e.printStackTrace();
|
|
||||||
return 0;
|
|
||||||
}}
|
|
||||||
//
|
|
||||||
// Helper function to read little endian 32bit integer.
|
|
||||||
//
|
|
||||||
protected int read_i32( InputStream is ) throws IOException
|
|
||||||
{
|
|
||||||
int i = is.read();
|
|
||||||
i |= is.read() << 8;
|
|
||||||
i |= is.read() << 16;
|
|
||||||
i |= is.read() << 24;
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
197
app/src/main/java/org/vostan/banvor/PuzzleListFragment.java
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
77
app/src/main/java/org/vostan/banvor/WelcomeActivity.java
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
68
app/src/main/java/org/vostan/banvor/WelcomeFragment.java
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,9 +2,12 @@
|
|||||||
* To change this template, choose Tools | Templates
|
* To change this template, choose Tools | Templates
|
||||||
* and open the template in the editor.
|
* and open the template in the editor.
|
||||||
*/
|
*/
|
||||||
package org.vostan.banvor.play;
|
package org.vostan.banvor.board;
|
||||||
|
|
||||||
import androidx.core.view.ViewCompat;
|
import androidx.core.view.ViewCompat;
|
||||||
|
|
||||||
|
import org.vostan.banvor.model.XYPair;
|
||||||
|
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -13,6 +16,106 @@ import java.util.LinkedList;
|
|||||||
*/
|
*/
|
||||||
public class Animator implements Runnable
|
public class Animator implements Runnable
|
||||||
{
|
{
|
||||||
|
public static abstract class Action
|
||||||
|
{
|
||||||
|
public int steps;
|
||||||
|
|
||||||
|
public Action()
|
||||||
|
{
|
||||||
|
steps = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract void intermediate( Animator ap, int step );
|
||||||
|
public abstract void last( Animator ap );
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static abstract class XYAction extends Action
|
||||||
|
{
|
||||||
|
protected XYPair _xy = new XYPair();
|
||||||
|
|
||||||
|
public XYAction( XYPair xy ){
|
||||||
|
_xy.set(xy);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Move extends XYAction
|
||||||
|
{
|
||||||
|
public Move( XYPair xy ){
|
||||||
|
super(xy);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void intermediate( Animator ap, int step )
|
||||||
|
{}
|
||||||
|
|
||||||
|
public void last( Animator ap )
|
||||||
|
{
|
||||||
|
ap.view.getPuzzle().walk(_xy);
|
||||||
|
ap.view.invalidate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Push extends XYAction
|
||||||
|
{
|
||||||
|
public Push( XYPair xy ){
|
||||||
|
super(xy);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void intermediate( Animator ap, int step )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public void last( Animator ap )
|
||||||
|
{
|
||||||
|
ap.view.getPuzzle().push(_xy);
|
||||||
|
ap.view.invalidate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Select extends XYAction
|
||||||
|
{
|
||||||
|
public Select( XYPair xy ){
|
||||||
|
super(xy);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void intermediate( Animator ap, int step )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public void last( Animator ap )
|
||||||
|
{
|
||||||
|
ap.view.getPuzzle().select(_xy);
|
||||||
|
ap.view.invalidate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class Unselect extends Action
|
||||||
|
{
|
||||||
|
public Unselect()
|
||||||
|
{}
|
||||||
|
|
||||||
|
public void intermediate( Animator ap, int step )
|
||||||
|
{}
|
||||||
|
|
||||||
|
public void last( Animator ap )
|
||||||
|
{
|
||||||
|
ap.view.getPuzzle().unselect();
|
||||||
|
ap.view.invalidate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class NoMove extends XYAction
|
||||||
|
{
|
||||||
|
public NoMove( XYPair xy ){
|
||||||
|
super(xy);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void intermediate( Animator ap, int step )
|
||||||
|
{}
|
||||||
|
|
||||||
|
public void last( Animator ap )
|
||||||
|
{}
|
||||||
|
}
|
||||||
|
|
||||||
protected PuzzleView view;
|
protected PuzzleView view;
|
||||||
protected LinkedList<Action> actions = new LinkedList<Action>();
|
protected LinkedList<Action> actions = new LinkedList<Action>();
|
||||||
protected boolean stop;
|
protected boolean stop;
|
||||||
@@ -98,111 +201,4 @@ public class Animator implements Runnable
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static abstract class Action
|
|
||||||
{
|
|
||||||
public int steps;
|
|
||||||
|
|
||||||
public Action()
|
|
||||||
{
|
|
||||||
steps = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public abstract void intermediate( Animator ap, int step );
|
|
||||||
public abstract void last( Animator ap );
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static abstract class XYAction extends Action
|
|
||||||
{
|
|
||||||
int x;
|
|
||||||
int y;
|
|
||||||
|
|
||||||
public XYAction( int _x, int _y )
|
|
||||||
{
|
|
||||||
x = _x;
|
|
||||||
y = _y;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class Move extends XYAction
|
|
||||||
{
|
|
||||||
public Move( int x, int y )
|
|
||||||
{
|
|
||||||
super(x,y);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void intermediate( Animator ap, int step )
|
|
||||||
{}
|
|
||||||
|
|
||||||
public void last( Animator ap )
|
|
||||||
{
|
|
||||||
ap.view.getPuzzle().walk(x,y);
|
|
||||||
ap.view.invalidate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class Push extends XYAction
|
|
||||||
{
|
|
||||||
public Push( int x, int y )
|
|
||||||
{
|
|
||||||
super(x,y);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void intermediate( Animator ap, int step )
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public void last( Animator ap )
|
|
||||||
{
|
|
||||||
ap.view.getPuzzle().push(x,y);
|
|
||||||
ap.view.invalidate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class Select extends XYAction
|
|
||||||
{
|
|
||||||
public Select(int x, int y )
|
|
||||||
{
|
|
||||||
super(x,y);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void intermediate( Animator ap, int step )
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public void last( Animator ap )
|
|
||||||
{
|
|
||||||
ap.view.getPuzzle().select(x,y);
|
|
||||||
ap.view.invalidate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class Unselect extends Action
|
|
||||||
{
|
|
||||||
public Unselect()
|
|
||||||
{}
|
|
||||||
|
|
||||||
public void intermediate( Animator ap, int step )
|
|
||||||
{}
|
|
||||||
|
|
||||||
public void last( Animator ap )
|
|
||||||
{
|
|
||||||
ap.view.getPuzzle().unselect();
|
|
||||||
ap.view.invalidate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class NoMove extends XYAction
|
|
||||||
{
|
|
||||||
public NoMove( int x, int y )
|
|
||||||
{
|
|
||||||
super(x,y);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void intermediate( Animator ap, int step )
|
|
||||||
{}
|
|
||||||
|
|
||||||
public void last( Animator ap )
|
|
||||||
{}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
package org.vostan.banvor.board;
|
||||||
|
|
||||||
|
import org.vostan.banvor.model.IPuzzleAnimator;
|
||||||
|
import org.vostan.banvor.model.XYPair;
|
||||||
|
|
||||||
|
public class PuzzleAnimator implements IPuzzleAnimator {
|
||||||
|
|
||||||
|
Animator animator = null;
|
||||||
|
|
||||||
|
public PuzzleAnimator(Animator a){
|
||||||
|
animator = a;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void move(XYPair xy )
|
||||||
|
{
|
||||||
|
animator.queue( new Animator.Move(xy) );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void push(XYPair xy )
|
||||||
|
{
|
||||||
|
animator.queue( new Animator.Push(xy) );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void select(XYPair xy )
|
||||||
|
{
|
||||||
|
animator.queue( new Animator.Select(xy) );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void unselect()
|
||||||
|
{
|
||||||
|
animator.queue( new Animator.Unselect() );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void buzz()
|
||||||
|
{
|
||||||
|
//animator.queue( new Animator.NoMove(x,y) );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void moveImpossible(XYPair xy )
|
||||||
|
{
|
||||||
|
animator.queue( new Animator.NoMove(xy) );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -2,14 +2,17 @@
|
|||||||
* To change this template, choose Tools | Templates
|
* To change this template, choose Tools | Templates
|
||||||
* and open the template in the editor.
|
* and open the template in the editor.
|
||||||
*/
|
*/
|
||||||
package org.vostan.banvor.play;
|
package org.vostan.banvor.board;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.graphics.Point;
|
import android.util.AttributeSet;
|
||||||
import android.view.GestureDetector;
|
import android.view.GestureDetector;
|
||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
import android.view.ScaleGestureDetector;
|
import android.view.ScaleGestureDetector;
|
||||||
import org.vostan.banvor.Puzzle;
|
|
||||||
|
import org.vostan.banvor.model.PuzzleChoreographer;
|
||||||
|
import org.vostan.banvor.model.Puzzle;
|
||||||
|
import org.vostan.banvor.model.XYPair;
|
||||||
|
|
||||||
//import android.support.v4.view.GestureDetectorCompat;
|
//import android.support.v4.view.GestureDetectorCompat;
|
||||||
|
|
||||||
@@ -25,12 +28,13 @@ public class PuzzleControl extends PuzzleView
|
|||||||
{
|
{
|
||||||
protected GestureDetector simpled;
|
protected GestureDetector simpled;
|
||||||
protected ScaleGestureDetector scaled;
|
protected ScaleGestureDetector scaled;
|
||||||
protected PuzzleLogic logic;
|
protected PuzzleChoreographer choregrapher;
|
||||||
protected Animator animator;
|
protected Animator animator;
|
||||||
|
protected PuzzleAnimator puzzleAnimator;
|
||||||
protected PuzzleControlLister lister;
|
protected PuzzleControlLister lister;
|
||||||
|
|
||||||
protected float lastSpan;
|
protected float lastSpan;
|
||||||
protected Point singleTapTile = new Point();
|
protected XYPair singleTapTile = new XYPair();
|
||||||
|
|
||||||
public interface PuzzleControlLister
|
public interface PuzzleControlLister
|
||||||
{
|
{
|
||||||
@@ -39,12 +43,13 @@ public class PuzzleControl extends PuzzleView
|
|||||||
public void onTouch();
|
public void onTouch();
|
||||||
}
|
}
|
||||||
|
|
||||||
public PuzzleControl(Context c)
|
public PuzzleControl(Context c, AttributeSet attributeSet)
|
||||||
{
|
{
|
||||||
super(c);
|
super(c,attributeSet);
|
||||||
logic = new PuzzleLogic();
|
choregrapher = new PuzzleChoreographer();
|
||||||
animator = new Animator( this );
|
animator = new Animator( this );
|
||||||
animator.setAnimationLister(this);
|
animator.setAnimationLister(this);
|
||||||
|
puzzleAnimator = new PuzzleAnimator(animator);
|
||||||
|
|
||||||
simpled = new GestureDetector( c, this );
|
simpled = new GestureDetector( c, this );
|
||||||
simpled.setOnDoubleTapListener(this);
|
simpled.setOnDoubleTapListener(this);
|
||||||
@@ -54,7 +59,7 @@ public class PuzzleControl extends PuzzleView
|
|||||||
public void setPuzzle( Puzzle p )
|
public void setPuzzle( Puzzle p )
|
||||||
{
|
{
|
||||||
super.setPuzzle(p);
|
super.setPuzzle(p);
|
||||||
logic.setPuzzle(p);
|
choregrapher.setPuzzle(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setPuzzleControlLister( PuzzleControlLister l )
|
public void setPuzzleControlLister( PuzzleControlLister l )
|
||||||
@@ -62,6 +67,13 @@ public class PuzzleControl extends PuzzleView
|
|||||||
lister = l;
|
lister = l;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void undoLastMove(){
|
||||||
|
if ( getPuzzle().isUndoable() ){
|
||||||
|
getPuzzle().restore();
|
||||||
|
invalidate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onTouchEvent(MotionEvent event)
|
public boolean onTouchEvent(MotionEvent event)
|
||||||
{
|
{
|
||||||
@@ -114,12 +126,12 @@ public class PuzzleControl extends PuzzleView
|
|||||||
// If the tap is not on a valid tile then there is not point to
|
// If the tap is not on a valid tile then there is not point to
|
||||||
// continue.
|
// continue.
|
||||||
//
|
//
|
||||||
if ( !puzzle.isValid(singleTapTile.x, singleTapTile.y) )
|
if ( !puzzle.isValid(singleTapTile) )
|
||||||
return true;
|
return true;
|
||||||
//
|
//
|
||||||
// Create sequence of steps and then animate it.
|
// Create sequence of steps and then animate it.
|
||||||
//
|
//
|
||||||
if ( logic.createSteps(animator, singleTapTile.x, singleTapTile.y) )
|
if ( choregrapher.createSteps(puzzleAnimator, singleTapTile))
|
||||||
{
|
{
|
||||||
puzzle.save();
|
puzzle.save();
|
||||||
animator.play();
|
animator.play();
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package org.vostan.banvor.play;
|
package org.vostan.banvor.board;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
@@ -10,12 +10,15 @@ import android.graphics.Point;
|
|||||||
import android.graphics.Rect;
|
import android.graphics.Rect;
|
||||||
import android.graphics.RectF;
|
import android.graphics.RectF;
|
||||||
import androidx.core.view.ViewCompat;
|
import androidx.core.view.ViewCompat;
|
||||||
|
|
||||||
|
import android.util.AttributeSet;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import static java.lang.Math.*;
|
import static java.lang.Math.*;
|
||||||
|
|
||||||
import org.vostan.banvor.Puzzle;
|
import org.vostan.banvor.model.Puzzle;
|
||||||
import static org.vostan.banvor.Puzzle.*;
|
import static org.vostan.banvor.model.Puzzle.*;
|
||||||
import org.vostan.banvor.R;
|
import org.vostan.banvor.R;
|
||||||
|
import org.vostan.banvor.model.XYPair;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*/
|
*/
|
||||||
@@ -38,9 +41,9 @@ public class PuzzleView extends View
|
|||||||
private Rect tile_src = new Rect();
|
private Rect tile_src = new Rect();
|
||||||
private RectF tile_dest = new RectF();
|
private RectF tile_dest = new RectF();
|
||||||
|
|
||||||
public PuzzleView(Context context)
|
public PuzzleView(Context context, AttributeSet attributeSet)
|
||||||
{
|
{
|
||||||
super(context);
|
super(context, attributeSet);
|
||||||
setFocusable(true);
|
setFocusable(true);
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -53,24 +56,22 @@ public class PuzzleView extends View
|
|||||||
// a.recycle();
|
// a.recycle();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setPuzzle( Puzzle p )
|
public void setPuzzle( Puzzle p ){
|
||||||
{
|
|
||||||
puzzle = p;
|
puzzle = p;
|
||||||
board.set(0,0,puzzle.getColumnCount(),puzzle.getRowCount());
|
board.set(0,0,puzzle.getColumnCount(),puzzle.getRowCount());
|
||||||
viewport.set(board);
|
viewport.set(board);
|
||||||
tile_size.set(0,0);
|
tile_size.set(0,0);
|
||||||
calcTransforms();
|
calcTransforms();
|
||||||
initTiles();
|
initTiles();
|
||||||
|
invalidate();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Puzzle getPuzzle()
|
public Puzzle getPuzzle(){
|
||||||
{
|
|
||||||
return puzzle;
|
return puzzle;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@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);
|
screen.set(0, 0, w, h);
|
||||||
tile_size.set(0,0);
|
tile_size.set(0,0);
|
||||||
calcTransforms();
|
calcTransforms();
|
||||||
@@ -78,8 +79,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 left = scale*(focusX - screen.left);
|
||||||
float right = scale*(screen.right - focusX);
|
float right = scale*(screen.right - focusX);
|
||||||
float top = scale*(focusY - screen.top);
|
float top = scale*(focusY - screen.top);
|
||||||
@@ -91,14 +91,12 @@ public class PuzzleView extends View
|
|||||||
ViewCompat.postInvalidateOnAnimation(this);
|
ViewCompat.postInvalidateOnAnimation(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void scaleViewportDone()
|
public void scaleViewportDone(){
|
||||||
{
|
|
||||||
//initTiles();
|
//initTiles();
|
||||||
ViewCompat.postInvalidateOnAnimation(this);
|
ViewCompat.postInvalidateOnAnimation(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void scrollViewport( float distanceX, float distanceY )
|
public void scrollViewport( float distanceX, float distanceY ){
|
||||||
{
|
|
||||||
viewport.set( screen.left+distanceX,
|
viewport.set( screen.left+distanceX,
|
||||||
screen.top+distanceY,
|
screen.top+distanceY,
|
||||||
screen.right+distanceX,
|
screen.right+distanceX,
|
||||||
@@ -244,7 +242,7 @@ public class PuzzleView extends View
|
|||||||
* Apply screen to board mapping and if the points are in the
|
* Apply screen to board mapping and if the points are in the
|
||||||
* column,row range then return it. Otherwise return null.
|
* column,row range then return it. Otherwise return null.
|
||||||
*/
|
*/
|
||||||
public void getTile( float scr_x, float scr_y, Point /*out*/ tile )
|
public void getTile(float scr_x, float scr_y, XYPair /*out*/ tile )
|
||||||
{
|
{
|
||||||
float [] scr_p = { scr_x, scr_y };
|
float [] scr_p = { scr_x, scr_y };
|
||||||
scr2col.mapPoints( scr_p );
|
scr2col.mapPoints( scr_p );
|
||||||
@@ -338,7 +336,7 @@ public class PuzzleView extends View
|
|||||||
}
|
}
|
||||||
private Bitmap createWorkerTile()
|
private Bitmap createWorkerTile()
|
||||||
{
|
{
|
||||||
Bitmap tmp = BitmapFactory.decodeResource( getResources(), R.drawable.worker );
|
Bitmap tmp = BitmapFactory.decodeResource( getResources(), R.drawable.worker);
|
||||||
Bitmap bitmap = Bitmap.createBitmap(tile_size.x, tile_size.y, Bitmap.Config.ARGB_8888);
|
Bitmap bitmap = Bitmap.createBitmap(tile_size.x, tile_size.y, Bitmap.Config.ARGB_8888);
|
||||||
Canvas canvas = new Canvas(bitmap);
|
Canvas canvas = new Canvas(bitmap);
|
||||||
canvas.drawBitmap(tmp,
|
canvas.drawBitmap(tmp,
|
||||||
@@ -384,7 +382,7 @@ public class PuzzleView extends View
|
|||||||
//tile_hlpr.roundOut(tile_hlpr);
|
//tile_hlpr.roundOut(tile_hlpr);
|
||||||
//tile_hlpr.right -=1;
|
//tile_hlpr.right -=1;
|
||||||
//tile_hlpr.bottom -=1;
|
//tile_hlpr.bottom -=1;
|
||||||
int sym = puzzle.getSym(x,y);
|
int sym = puzzle.getSym(new XYPair(x,y));
|
||||||
if ( !Puzzle.hasWorker(sym) )
|
if ( !Puzzle.hasWorker(sym) )
|
||||||
{
|
{
|
||||||
canvas.drawBitmap(tile[sym],
|
canvas.drawBitmap(tile[sym],
|
||||||
@@ -406,30 +404,30 @@ public class PuzzleView extends View
|
|||||||
Bitmap normal_worker = ((sym&SELECTED)!=0) ?
|
Bitmap normal_worker = ((sym&SELECTED)!=0) ?
|
||||||
tile[WORKER|SELECTED] : tile[WORKER];
|
tile[WORKER|SELECTED] : tile[WORKER];
|
||||||
int direction = sym & WORKER_MASK;
|
int direction = sym & WORKER_MASK;
|
||||||
if ( direction == WORKER_NORTH )
|
if ( direction == WORKER_FACE_DOWN)
|
||||||
{
|
|
||||||
canvas.translate(tile_dest.centerX(), tile_dest.centerY());
|
|
||||||
canvas.rotate(180+rotated);
|
|
||||||
canvas.translate(-tile_dest.centerX(), -tile_dest.centerY());
|
|
||||||
}
|
|
||||||
else if ( direction == WORKER_SOUTH )
|
|
||||||
{
|
{
|
||||||
canvas.translate(tile_dest.centerX(), tile_dest.centerY());
|
canvas.translate(tile_dest.centerX(), tile_dest.centerY());
|
||||||
canvas.rotate(0+rotated);
|
canvas.rotate(0+rotated);
|
||||||
canvas.translate(-tile_dest.centerX(), -tile_dest.centerY());
|
canvas.translate(-tile_dest.centerX(), -tile_dest.centerY());
|
||||||
}
|
}
|
||||||
else if ( direction == WORKER_WEST )
|
else if ( direction == WORKER_FACE_UP)
|
||||||
{
|
{
|
||||||
canvas.translate(tile_dest.centerX(), tile_dest.centerY());
|
canvas.translate(tile_dest.centerX(), tile_dest.centerY());
|
||||||
canvas.rotate(90+rotated);
|
canvas.rotate(180+rotated);
|
||||||
canvas.translate(-tile_dest.centerX(), -tile_dest.centerY());
|
canvas.translate(-tile_dest.centerX(), -tile_dest.centerY());
|
||||||
}
|
}
|
||||||
else if ( direction == WORKER_EAST )
|
else if ( direction == WORKER_FACE_LEFT)
|
||||||
{
|
{
|
||||||
canvas.translate(tile_dest.centerX(), tile_dest.centerY());
|
canvas.translate(tile_dest.centerX(), tile_dest.centerY());
|
||||||
canvas.rotate(-90+rotated);
|
canvas.rotate(-90+rotated);
|
||||||
canvas.translate(-tile_dest.centerX(), -tile_dest.centerY());
|
canvas.translate(-tile_dest.centerX(), -tile_dest.centerY());
|
||||||
}
|
}
|
||||||
|
else if ( direction == WORKER_FACE_RIGHT)
|
||||||
|
{
|
||||||
|
canvas.translate(tile_dest.centerX(), tile_dest.centerY());
|
||||||
|
canvas.rotate(90+rotated);
|
||||||
|
canvas.translate(-tile_dest.centerX(), -tile_dest.centerY());
|
||||||
|
}
|
||||||
canvas.drawBitmap(normal_worker,
|
canvas.drawBitmap(normal_worker,
|
||||||
tile_src,tile_dest,
|
tile_src,tile_dest,
|
||||||
mPaint);
|
mPaint);
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package org.vostan.banvor.game;
|
||||||
|
|
||||||
|
import org.vostan.banvor.model.Puzzle;
|
||||||
|
|
||||||
|
public interface IPuzzleSource {
|
||||||
|
public int getCount();
|
||||||
|
public Puzzle getPuzzle(int i );
|
||||||
|
}
|
||||||
113
app/src/main/java/org/vostan/banvor/game/PuzzleBinLoader.java
Normal file
@@ -0,0 +1,113 @@
|
|||||||
|
package org.vostan.banvor.game;
|
||||||
|
|
||||||
|
import static org.vostan.banvor.App.TAG;
|
||||||
|
|
||||||
|
import android.util.Log;
|
||||||
|
|
||||||
|
import org.vostan.banvor.model.Puzzle;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
|
||||||
|
public class PuzzleBinLoader {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Load puzzle from the puzzle.bin.
|
||||||
|
*/
|
||||||
|
public static Puzzle loadNthPuzzle(InputStream is, int i )
|
||||||
|
{try{
|
||||||
|
//
|
||||||
|
// Read amount of puzzles.
|
||||||
|
//
|
||||||
|
int count = read_i32(is);
|
||||||
|
if ( i >= count )
|
||||||
|
return null;
|
||||||
|
//
|
||||||
|
// Read the offset.
|
||||||
|
//
|
||||||
|
is.skip( i*4 );
|
||||||
|
int offset = read_i32(is);
|
||||||
|
//
|
||||||
|
// Jump to the offset and read the puzzle.
|
||||||
|
//
|
||||||
|
is.skip( offset - 4 - (i+1)*4);
|
||||||
|
Puzzle p = loadPuzzle(is);
|
||||||
|
//
|
||||||
|
// Finally return the puzzle and we are done.
|
||||||
|
//
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
catch ( java.lang.Exception e )
|
||||||
|
{
|
||||||
|
//Log.d(TAG, "Exception: " + e.getMessage() );
|
||||||
|
e.printStackTrace();
|
||||||
|
return null;
|
||||||
|
}}
|
||||||
|
//
|
||||||
|
// Retrive amount of puzzles.
|
||||||
|
//
|
||||||
|
public static int getCount(InputStream is)
|
||||||
|
{try{
|
||||||
|
int count = read_i32(is);
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
catch ( java.lang.Exception e )
|
||||||
|
{
|
||||||
|
//Log.d(TAG, "Exception: " + e.getMessage() );
|
||||||
|
e.printStackTrace();
|
||||||
|
return 0;
|
||||||
|
}}
|
||||||
|
|
||||||
|
private static Puzzle loadPuzzle( InputStream is )
|
||||||
|
{ try{
|
||||||
|
int cols = is.read();
|
||||||
|
int rows = is.read();
|
||||||
|
|
||||||
|
int [] board = new int[cols*rows];
|
||||||
|
byte [] b = new byte [cols*rows];
|
||||||
|
is.read( b, 0, cols*rows);
|
||||||
|
for( int i = 0; i < b.length; ++i )
|
||||||
|
{
|
||||||
|
switch( b[i] )
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
board[i] = Puzzle.FLOOR;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
board[i] = Puzzle.WALL;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
board[i] = Puzzle.BOX;
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
board[i] = Puzzle.GOAL;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
board[i] = Puzzle.BINGO;
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
board[i] = Puzzle.WORKER;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return new Puzzle(cols, rows, board);
|
||||||
|
}
|
||||||
|
catch ( Exception e )
|
||||||
|
{
|
||||||
|
Log.d( TAG, "load()", e);
|
||||||
|
return null;
|
||||||
|
}}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Helper function to read little endian 32bit integer.
|
||||||
|
//
|
||||||
|
private static int read_i32( InputStream is ) throws IOException
|
||||||
|
{
|
||||||
|
int i = is.read();
|
||||||
|
i |= is.read() << 8;
|
||||||
|
i |= is.read() << 16;
|
||||||
|
i |= is.read() << 24;
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
package org.vostan.banvor.game;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
|
|
||||||
|
import static org.vostan.banvor.App.theApp;
|
||||||
|
|
||||||
|
import org.vostan.banvor.R;
|
||||||
|
import org.vostan.banvor.model.Puzzle;
|
||||||
|
|
||||||
|
public class PuzzleContainer implements IPuzzleSource
|
||||||
|
{
|
||||||
|
protected int count;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Load puzzle from the puzzle.bin.
|
||||||
|
*/
|
||||||
|
public Puzzle getPuzzle(int i )
|
||||||
|
{
|
||||||
|
InputStream is = theApp().getResources().openRawResource(R.raw.puzzles);
|
||||||
|
return PuzzleBinLoader.loadNthPuzzle(is, i);
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// Retrieve amount of puzzles.
|
||||||
|
//
|
||||||
|
public int getCount()
|
||||||
|
{
|
||||||
|
if ( count == 0 )
|
||||||
|
{
|
||||||
|
InputStream is = theApp().getResources().openRawResource(R.raw.puzzles);
|
||||||
|
count = PuzzleBinLoader.getCount(is);
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
}
|
||||||
133
app/src/main/java/org/vostan/banvor/game/State.java
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
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.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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,122 +0,0 @@
|
|||||||
package org.vostan.banvor.menu;
|
|
||||||
|
|
||||||
import org.vostan.banvor.play.PlayActivity;
|
|
||||||
|
|
||||||
import android.content.Intent;
|
|
||||||
import android.view.View;
|
|
||||||
import android.os.Bundle;
|
|
||||||
//import androidx.fragment.app.Fragment;
|
|
||||||
//support.v4.app.FragmentActivity;
|
|
||||||
import androidx.fragment.app.FragmentManager;
|
|
||||||
import androidx.fragment.app.FragmentTransaction;
|
|
||||||
import android.view.Window;
|
|
||||||
|
|
||||||
import androidx.appcompat.app.AppCompatActivity;
|
|
||||||
|
|
||||||
import org.vostan.banvor.R;
|
|
||||||
import static org.vostan.banvor.App.theApp;
|
|
||||||
|
|
||||||
public class MainActivity extends AppCompatActivity
|
|
||||||
{
|
|
||||||
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 );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
/*
|
|
||||||
* To change this template, choose Tools | Templates
|
|
||||||
* and open the template in the editor.
|
|
||||||
*/
|
|
||||||
package org.vostan.banvor.menu;
|
|
||||||
|
|
||||||
import android.os.Bundle;
|
|
||||||
import androidx.fragment.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.banvor.App.theApp;
|
|
||||||
import org.vostan.banvor.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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,183 +0,0 @@
|
|||||||
/*
|
|
||||||
* To change this template, choose Tools | Templates
|
|
||||||
* and open the template in the editor.
|
|
||||||
*/
|
|
||||||
package org.vostan.banvor.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 androidx.fragment.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.banvor.R;
|
|
||||||
|
|
||||||
import static org.vostan.banvor.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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
package org.vostan.banvor.model;
|
||||||
|
|
||||||
|
public interface IPuzzleAnimator {
|
||||||
|
public void move(XYPair xy );
|
||||||
|
public void push( XYPair xy );
|
||||||
|
public void select( XYPair xy );
|
||||||
|
public void unselect();
|
||||||
|
public void buzz();
|
||||||
|
public void moveImpossible(XYPair xy );
|
||||||
|
}
|
||||||
323
app/src/main/java/org/vostan/banvor/model/Puzzle.java
Normal file
@@ -0,0 +1,323 @@
|
|||||||
|
package org.vostan.banvor.model;
|
||||||
|
|
||||||
|
//import java.lang.Exception;
|
||||||
|
|
||||||
|
import java.util.LinkedList;
|
||||||
|
|
||||||
|
public class Puzzle
|
||||||
|
{
|
||||||
|
public final static int FLOOR = 0x0;
|
||||||
|
public final static int GOAL = 0x1;
|
||||||
|
public final static int FLOOR_MASK = ~(GOAL | FLOOR);
|
||||||
|
public final static int WALL = 0x2;
|
||||||
|
public final static int BOX = 0x4;
|
||||||
|
public final static int BINGO = BOX | GOAL;
|
||||||
|
public final static int WORKER = 0x8;
|
||||||
|
public final static int WORKER_FACE_DOWN = 0x00 | WORKER;
|
||||||
|
public final static int WORKER_FACE_UP = 0x10 | WORKER;
|
||||||
|
public final static int WORKER_FACE_LEFT = 0x20 | WORKER;
|
||||||
|
public final static int WORKER_FACE_RIGHT = 0x30 | WORKER;
|
||||||
|
public final static int WORKER_MASK = WORKER_FACE_RIGHT | WORKER_FACE_LEFT | WORKER_FACE_UP | WORKER_FACE_DOWN;
|
||||||
|
public final static int SELECTED = 0x40;
|
||||||
|
public final static int MAX_COUNT = 0x80-1;
|
||||||
|
|
||||||
|
private final static XYPair UNSELECTED = new XYPair(-1,-1);
|
||||||
|
|
||||||
|
|
||||||
|
private int [] board;
|
||||||
|
private XYPair board_size = new XYPair(0,0);
|
||||||
|
private int bingos = 0;
|
||||||
|
private int box_count = 0;
|
||||||
|
private XYPair worker = new XYPair(0,0);
|
||||||
|
private XYPair selected = new XYPair(-1,-1);
|
||||||
|
|
||||||
|
public Puzzle(){
|
||||||
|
}
|
||||||
|
public Puzzle(int cols, int rows, int [] b)
|
||||||
|
{
|
||||||
|
board_size.set(cols, rows);
|
||||||
|
box_count = 0;
|
||||||
|
bingos = 0;
|
||||||
|
// board = new int[board_size.x()*board_size.y()];
|
||||||
|
board = b;
|
||||||
|
for( int i = 0; i < board.length; ++i ){
|
||||||
|
if ((board[i] & BOX) == BOX){
|
||||||
|
++box_count;
|
||||||
|
}
|
||||||
|
if ((board[i] & BINGO) == BINGO) {
|
||||||
|
++bingos;
|
||||||
|
}
|
||||||
|
if ((board[i] & WORKER) == WORKER){
|
||||||
|
worker = getXY(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Low level helper functions.
|
||||||
|
//
|
||||||
|
|
||||||
|
public final int getColumnCount()
|
||||||
|
{
|
||||||
|
return board_size.x();
|
||||||
|
}
|
||||||
|
public final int getRowCount()
|
||||||
|
{
|
||||||
|
return board_size.y();
|
||||||
|
}
|
||||||
|
public static int getSymCount()
|
||||||
|
{
|
||||||
|
return MAX_COUNT;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final int getIndex( final XYPair c ) {
|
||||||
|
return c.y()*board_size.x()+c.x();
|
||||||
|
}
|
||||||
|
public final XYPair getXY( int idx ) {
|
||||||
|
return new XYPair(idx % board_size.x(), idx / board_size.x());
|
||||||
|
}
|
||||||
|
|
||||||
|
public final int getSym( XYPair c ) {
|
||||||
|
return board[getIndex(c)];
|
||||||
|
}
|
||||||
|
public void setSym( final XYPair xy, int v )
|
||||||
|
{
|
||||||
|
board[getIndex(xy)]=v;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isEmpty( int v )
|
||||||
|
{
|
||||||
|
return (v & FLOOR_MASK) == 0;
|
||||||
|
}
|
||||||
|
public static boolean hasBox( int v )
|
||||||
|
{
|
||||||
|
return (v & BOX) != 0;
|
||||||
|
}
|
||||||
|
public static boolean hasWorker( int v )
|
||||||
|
{
|
||||||
|
return (v & WORKER) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final XYPair getWorker() {
|
||||||
|
return new XYPair(worker);
|
||||||
|
}
|
||||||
|
|
||||||
|
public final boolean isSelected()
|
||||||
|
{
|
||||||
|
return !selected.isEqual(UNSELECTED);
|
||||||
|
}
|
||||||
|
public final boolean isSelected( final XYPair s ) {
|
||||||
|
return selected.isEqual(s);
|
||||||
|
}
|
||||||
|
public final XYPair getSelected()
|
||||||
|
{
|
||||||
|
return new XYPair(selected);
|
||||||
|
}
|
||||||
|
|
||||||
|
public final boolean isValid( final XYPair xy ) {
|
||||||
|
return xy.isInside(XYPair.ZERO,board_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
public final boolean isOneStep( final XYPair xy ) {
|
||||||
|
return isValid(xy) && XYPair.sub(worker, xy).l1_norm() == 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final boolean isDone()
|
||||||
|
{
|
||||||
|
return bingos == box_count;
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Move worker.
|
||||||
|
//
|
||||||
|
|
||||||
|
private final int worker_direction(XYPair xy) {
|
||||||
|
//
|
||||||
|
// Find direction to move.
|
||||||
|
//
|
||||||
|
int w;
|
||||||
|
if (worker.left().isEqual(xy)) {
|
||||||
|
w = WORKER_FACE_LEFT;
|
||||||
|
}
|
||||||
|
else if (worker.right().isEqual(xy)) {
|
||||||
|
w = WORKER_FACE_RIGHT;
|
||||||
|
}
|
||||||
|
else if (worker.up().isEqual(xy)) {
|
||||||
|
w = WORKER_FACE_UP;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
w = WORKER_FACE_DOWN;
|
||||||
|
}
|
||||||
|
return w;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean walk(XYPair xy)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Check that this is one step away.
|
||||||
|
//
|
||||||
|
if ( !isOneStep(xy) )
|
||||||
|
return false;
|
||||||
|
//
|
||||||
|
// Check that this is empty space.
|
||||||
|
//
|
||||||
|
int v = getSym(xy);
|
||||||
|
if ( !isEmpty(v) )
|
||||||
|
return false;
|
||||||
|
//
|
||||||
|
// If something is selected then unselect first.
|
||||||
|
//
|
||||||
|
if ( isSelected() )
|
||||||
|
unselect();
|
||||||
|
//
|
||||||
|
// Move worker marker from current position to asked position.
|
||||||
|
//
|
||||||
|
setSym(worker,getSym(worker)&~WORKER_MASK);
|
||||||
|
worker.set(xy);
|
||||||
|
setSym(worker,getSym(worker)|worker_direction(xy));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean select(XYPair xy)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Check that this is one step away.
|
||||||
|
//
|
||||||
|
if ( !isOneStep(xy) )
|
||||||
|
return false;
|
||||||
|
//
|
||||||
|
// Check that this is empty space.
|
||||||
|
//
|
||||||
|
int v = getSym(xy);
|
||||||
|
if ( !hasBox(v) )
|
||||||
|
return false;
|
||||||
|
//
|
||||||
|
// If something is selected then unselect first.
|
||||||
|
//
|
||||||
|
if ( isSelected() )
|
||||||
|
unselect();
|
||||||
|
//
|
||||||
|
// Move worker marker from current position to asked position.
|
||||||
|
//
|
||||||
|
selected.set(xy);
|
||||||
|
setSym(worker,getSym(worker)&~WORKER_MASK|SELECTED|worker_direction(xy));
|
||||||
|
setSym(selected,getSym(selected)|SELECTED);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean unselect()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// If not selected then do nothing.
|
||||||
|
//
|
||||||
|
if ( !isSelected() )
|
||||||
|
return false;
|
||||||
|
//
|
||||||
|
// Move worker marker from current position to asked position.
|
||||||
|
//
|
||||||
|
setSym(worker,getSym(worker)&~SELECTED);
|
||||||
|
setSym(selected,getSym(selected)&~SELECTED);
|
||||||
|
selected.set(UNSELECTED);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean push(final XYPair xy)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// If not selected then do nothing.
|
||||||
|
//
|
||||||
|
if ( !isSelected() )
|
||||||
|
return false;
|
||||||
|
//
|
||||||
|
// Check that we go to the selected direction.
|
||||||
|
//
|
||||||
|
if ( !selected.isEqual(xy) )
|
||||||
|
return false;
|
||||||
|
//
|
||||||
|
// Check that this is a box that we move.
|
||||||
|
//
|
||||||
|
int v = getSym(xy);
|
||||||
|
if ( !hasBox(v) )
|
||||||
|
return false;
|
||||||
|
//
|
||||||
|
// Check that the next space to the box is empty.
|
||||||
|
//w - 2*(w-x) = 2x -w
|
||||||
|
XYPair next = xy.mul(2).sub(worker);
|
||||||
|
int next_v = getSym(next);
|
||||||
|
if ( !isEmpty(next_v) )
|
||||||
|
return false;
|
||||||
|
//
|
||||||
|
// Ok, looks we can move the box. Do it actually.
|
||||||
|
//
|
||||||
|
unselect();
|
||||||
|
setSym(xy,getSym(xy)&~BOX);
|
||||||
|
setSym(next,getSym(next)|BOX);
|
||||||
|
walk(xy);
|
||||||
|
select(next);
|
||||||
|
//
|
||||||
|
// Keep track of box count in place.
|
||||||
|
//
|
||||||
|
if ( (v & GOAL) != 0 )
|
||||||
|
--bingos;
|
||||||
|
if ( (next_v & GOAL) != 0 )
|
||||||
|
++bingos;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Undo/Redo.
|
||||||
|
//
|
||||||
|
|
||||||
|
protected class State
|
||||||
|
{
|
||||||
|
public int [] board;
|
||||||
|
public XYPair worker = new XYPair(0,0);
|
||||||
|
public XYPair selected = new XYPair(0, 0);
|
||||||
|
public int bingos = 0;
|
||||||
|
|
||||||
|
public State(Puzzle puzzle)
|
||||||
|
{
|
||||||
|
board = puzzle.board.clone();
|
||||||
|
worker.set(puzzle.worker);
|
||||||
|
selected.set(puzzle.selected);
|
||||||
|
bingos = puzzle.bingos;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void restore(Puzzle puzzle)
|
||||||
|
{
|
||||||
|
puzzle.board = board;
|
||||||
|
puzzle.worker.set(worker);
|
||||||
|
puzzle.selected.set(selected);
|
||||||
|
puzzle.bingos = bingos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
protected LinkedList<State> undoStack = new LinkedList<State>();
|
||||||
|
|
||||||
|
//
|
||||||
|
// Save this state to be able to restore later.
|
||||||
|
//
|
||||||
|
public void save()
|
||||||
|
{
|
||||||
|
State s = new State(this);
|
||||||
|
undoStack.addFirst(s);
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// Restore state.
|
||||||
|
//
|
||||||
|
public void restore()
|
||||||
|
{
|
||||||
|
State s = undoStack.removeFirst();
|
||||||
|
if ( s != null )
|
||||||
|
s.restore(this);
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// Check if there are items in the undo stack.
|
||||||
|
//
|
||||||
|
public final boolean isUndoable()
|
||||||
|
{
|
||||||
|
return undoStack.size() != 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,336 @@
|
|||||||
|
/*
|
||||||
|
* To change this template, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
package org.vostan.banvor.model;
|
||||||
|
|
||||||
|
import java.util.ListIterator;
|
||||||
|
import java.util.Vector;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class PuzzleChoreographer
|
||||||
|
{
|
||||||
|
private Puzzle puzzle = null;
|
||||||
|
private PuzzleRouteFinder routeFinder = null;
|
||||||
|
private IPuzzleAnimator animator;
|
||||||
|
|
||||||
|
public PuzzleChoreographer()
|
||||||
|
{}
|
||||||
|
|
||||||
|
public void setPuzzle( Puzzle p )
|
||||||
|
{
|
||||||
|
puzzle = p;
|
||||||
|
routeFinder = new PuzzleRouteFinder(p);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean createSteps(IPuzzleAnimator _animator, XYPair xy )
|
||||||
|
{
|
||||||
|
animator = _animator;
|
||||||
|
//
|
||||||
|
// Check that the x,y are valid.
|
||||||
|
//
|
||||||
|
if ( !puzzle.isValid(xy) )
|
||||||
|
return false;
|
||||||
|
//
|
||||||
|
// Now check what tile was tapped.
|
||||||
|
// If the tapped is a floor then ...
|
||||||
|
//
|
||||||
|
int tile = puzzle.getSym(xy);
|
||||||
|
if ( Puzzle.isEmpty(tile) )
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Calculate possible moves map.
|
||||||
|
//
|
||||||
|
routeFinder.calcMoves();
|
||||||
|
//
|
||||||
|
// Check if worker selected a box and can push it to the location?
|
||||||
|
// If yes then we are done.
|
||||||
|
//
|
||||||
|
if ( puzzle.isSelected() && tryMoveSelectedBox(xy) )
|
||||||
|
return true;
|
||||||
|
//
|
||||||
|
// Either nothing was selected or the box cannot be moved to
|
||||||
|
// tapped location. Try move worker alone.
|
||||||
|
//
|
||||||
|
if ( tryMoveWorker(xy) )
|
||||||
|
return true;
|
||||||
|
//
|
||||||
|
// Show that action is not allowed.
|
||||||
|
//
|
||||||
|
animator.moveImpossible(xy);
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// The tapped is the worker. Try move the box. If not possible
|
||||||
|
// then unselect if selected.
|
||||||
|
//
|
||||||
|
else if ( Puzzle.hasWorker(tile) )
|
||||||
|
{
|
||||||
|
if ( !puzzle.isSelected() )
|
||||||
|
{
|
||||||
|
animator.buzz();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// Calculate possible moves map.
|
||||||
|
//
|
||||||
|
routeFinder.calcMoves();
|
||||||
|
//
|
||||||
|
// Check if worker selected a box and can push it to the location?
|
||||||
|
// If yes then we are done.
|
||||||
|
//
|
||||||
|
if ( tryMoveSelectedBox(xy) ) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// If the box is not movable then unselect it.
|
||||||
|
//
|
||||||
|
animator.unselect();
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// The tapped is a box.
|
||||||
|
//
|
||||||
|
else if ( Puzzle.hasBox(tile) )
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Calculate possible moves map.
|
||||||
|
//
|
||||||
|
routeFinder.calcMoves();
|
||||||
|
//
|
||||||
|
// If the box is selected then unselect it.
|
||||||
|
//
|
||||||
|
if ( puzzle.isSelected(xy) )
|
||||||
|
{
|
||||||
|
animator.unselect();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// Try move the worker next to the box and select it if the
|
||||||
|
// box is not selected yet.
|
||||||
|
//
|
||||||
|
if ( trySelectBox(xy) ) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// Show that action is not allowed if reached till here.
|
||||||
|
//
|
||||||
|
animator.moveImpossible(xy);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Routes to accessible cells from where worker stands.
|
||||||
|
//
|
||||||
|
protected boolean tryMoveWorker(XYPair xy)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// If the filed is not accessable then move failed.
|
||||||
|
//
|
||||||
|
if ( !routeFinder.isAccessible(xy) ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// First unselect box.
|
||||||
|
//
|
||||||
|
if ( puzzle.isSelected() ) {
|
||||||
|
animator.unselect();
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// Get directions and queue moves accordingly.
|
||||||
|
//
|
||||||
|
Vector<XYPair> dirs = routeFinder.getDirections(xy);
|
||||||
|
ListIterator<XYPair> it = dirs.listIterator();
|
||||||
|
while ( it.hasNext() ) {
|
||||||
|
animator.move(it.next());
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// Done.
|
||||||
|
//
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected boolean tryMoveSelectedBox(XYPair xy)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// If no box is selected then we cannot move no box.
|
||||||
|
//
|
||||||
|
if ( !puzzle.isSelected() ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
final XYPair box_xy = puzzle.getSelected();
|
||||||
|
//
|
||||||
|
// There is no point to continue if we are asked to move the box to where is it.
|
||||||
|
//
|
||||||
|
if ( xy.isEqual(box_xy) ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// Check that asked move is orthogonal to the slected box.
|
||||||
|
//
|
||||||
|
// TODO: check that all cells are empty on the route.
|
||||||
|
//
|
||||||
|
if ( xy.x() == box_xy.x() || xy.y() == box_xy.y() ) {
|
||||||
|
return tryOrthogonalMoveSelectedBox(xy);
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// NOT IMPLEMENTED.
|
||||||
|
//
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected boolean tryOrthogonalMoveSelectedBox(XYPair xy)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// If no box is selected then we cannot move no box.
|
||||||
|
//
|
||||||
|
if ( !puzzle.isSelected() ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
final XYPair box_xy = puzzle.getSelected();
|
||||||
|
//
|
||||||
|
// There is no point to continue if we are asked to move the box to where is it.
|
||||||
|
//
|
||||||
|
if ( xy.isEqual(box_xy) ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// Check that asked move is orthogonal to the selected box.
|
||||||
|
//
|
||||||
|
if ( xy.x() != box_xy.x() && xy.y() != box_xy.y() ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// Now find the desired place for the worker to start push this
|
||||||
|
// box.
|
||||||
|
//
|
||||||
|
XYPair w = new XYPair(box_xy);
|
||||||
|
if ( xy.x() < box_xy.x() )
|
||||||
|
w = w.right();
|
||||||
|
else if ( xy.x() > box_xy.x() )
|
||||||
|
w = w.left();
|
||||||
|
else if ( xy.y() < box_xy.y() )
|
||||||
|
w = w.up();
|
||||||
|
else
|
||||||
|
w = w.down();
|
||||||
|
//
|
||||||
|
// Check if the desired place for the worker is accessable? If not
|
||||||
|
// then there is no point to continue.
|
||||||
|
//
|
||||||
|
if ( !routeFinder.isAccessible(w) ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// Now check that all cell till x,y are empty and that we can
|
||||||
|
// push box till there.
|
||||||
|
//
|
||||||
|
XYPair step_xy = box_xy.sub(w);
|
||||||
|
for ( XYPair i = box_xy; !xy.isEqual(i); )
|
||||||
|
{
|
||||||
|
i = i.add(step_xy);
|
||||||
|
int v = puzzle.getSym(i);
|
||||||
|
if ( !puzzle.isEmpty(v) && !puzzle.hasWorker(v) )
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// Ok, looks we can do the desired action. Now put instructions on
|
||||||
|
// what to do. First move worker to desired position if he is not
|
||||||
|
// there already.
|
||||||
|
//
|
||||||
|
if ( !w.isEqual(puzzle.getWorker()) )
|
||||||
|
{
|
||||||
|
if (!tryMoveWorker(w)){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
animator.select(box_xy);
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// Now create the steps to push the box.
|
||||||
|
//
|
||||||
|
for ( XYPair i = box_xy; !i.isEqual(xy); i = i.add(step_xy) ) {
|
||||||
|
animator.push(i);
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// Done
|
||||||
|
//
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected boolean trySelectBox(XYPair xy)
|
||||||
|
{
|
||||||
|
int north = puzzle.getSym(xy.up());
|
||||||
|
int south = puzzle.getSym(xy.down());
|
||||||
|
int west = puzzle.getSym(xy.left());
|
||||||
|
int east = puzzle.getSym(xy.right());
|
||||||
|
//
|
||||||
|
// First check if there is a worker in a neighboring cell. If
|
||||||
|
// yes then simply select the box. If the box is already selected
|
||||||
|
// then do nothing and if other box is selected then unselect it first
|
||||||
|
// and then select the box.
|
||||||
|
//
|
||||||
|
if ( Puzzle.hasWorker( west )
|
||||||
|
|| Puzzle.hasWorker( east )
|
||||||
|
|| Puzzle.hasWorker( north )
|
||||||
|
|| Puzzle.hasWorker( south ) )
|
||||||
|
{
|
||||||
|
if ( !puzzle.isSelected(xy) )
|
||||||
|
{
|
||||||
|
if ( puzzle.isSelected() )
|
||||||
|
animator.unselect();
|
||||||
|
animator.select(xy);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// Otherwise, check which of the cells is in closes walking
|
||||||
|
// distance and move worker to that cell, then select.
|
||||||
|
//
|
||||||
|
else
|
||||||
|
{
|
||||||
|
XYPair pref = new XYPair(-1, -1);
|
||||||
|
int shortest = Integer.MAX_VALUE;
|
||||||
|
if ( Puzzle.isEmpty( north )
|
||||||
|
&& shortest > routeFinder.stepsAway(xy.down()) )
|
||||||
|
{
|
||||||
|
shortest = routeFinder.stepsAway(xy.down());
|
||||||
|
pref.set(xy.down());
|
||||||
|
}
|
||||||
|
if ( Puzzle.isEmpty( south )
|
||||||
|
&& shortest > routeFinder.stepsAway(xy.up()) )
|
||||||
|
{
|
||||||
|
shortest = routeFinder.stepsAway(xy.up());
|
||||||
|
pref.set(xy.up());
|
||||||
|
}
|
||||||
|
if ( Puzzle.isEmpty( west )
|
||||||
|
&& shortest > routeFinder.stepsAway(xy.left()) )
|
||||||
|
{
|
||||||
|
shortest = routeFinder.stepsAway(xy.left());
|
||||||
|
pref.set(xy.left());
|
||||||
|
}
|
||||||
|
if ( Puzzle.isEmpty( east )
|
||||||
|
&& shortest > routeFinder.stepsAway( xy.right()) )
|
||||||
|
{
|
||||||
|
shortest = routeFinder.stepsAway( xy.right());
|
||||||
|
pref.set(xy.right());
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// Move the worker to the direction. If we cannot move worker
|
||||||
|
// next to the box then we cannot select it.
|
||||||
|
//
|
||||||
|
if ( !puzzle.isValid(pref) || !tryMoveWorker(pref) ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// Select the box.
|
||||||
|
//
|
||||||
|
animator.select(xy);
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// Done
|
||||||
|
//
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
180
app/src/main/java/org/vostan/banvor/model/PuzzleRouteFinder.java
Normal file
@@ -0,0 +1,180 @@
|
|||||||
|
package org.vostan.banvor.model;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Vector;
|
||||||
|
|
||||||
|
public class PuzzleRouteFinder {
|
||||||
|
protected Puzzle puzzle = null;
|
||||||
|
protected int [] moves;
|
||||||
|
|
||||||
|
//
|
||||||
|
// This is to avoid fragmentation of memory.
|
||||||
|
//
|
||||||
|
private Vector<XYPair> setOfCells = new Vector<XYPair>();
|
||||||
|
|
||||||
|
public PuzzleRouteFinder(Puzzle p) {
|
||||||
|
puzzle = p;
|
||||||
|
moves = new int[puzzle.getColumnCount() * puzzle.getRowCount()];
|
||||||
|
setOfCells.ensureCapacity(puzzle.getColumnCount() * puzzle.getRowCount());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected final int getMoves( XYPair xy ) {
|
||||||
|
return moves[puzzle.getIndex(xy)];
|
||||||
|
}
|
||||||
|
protected void setMoves( XYPair xy, int v )
|
||||||
|
{
|
||||||
|
moves[puzzle.getIndex(xy)]=v;
|
||||||
|
}
|
||||||
|
private boolean setMovesIfGreater( XYPair xy, int l )
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// If out of borders then nothing to do.
|
||||||
|
//
|
||||||
|
if ( !puzzle.isValid(xy) )
|
||||||
|
return false;
|
||||||
|
//
|
||||||
|
// Check if the cell is a floor or goal. If yes then set the l
|
||||||
|
// if current value is greater than l.
|
||||||
|
//
|
||||||
|
if ( getMoves(xy) > l && puzzle.isEmpty(puzzle.getSym(xy)))
|
||||||
|
{
|
||||||
|
setMoves(xy,l);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void calcMoves()
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Erase moves array.
|
||||||
|
//
|
||||||
|
Arrays.fill(moves,Integer.MAX_VALUE);
|
||||||
|
//
|
||||||
|
// For the beginning there is no cell in the list.
|
||||||
|
//
|
||||||
|
int front = 0;
|
||||||
|
setOfCells.removeAllElements();
|
||||||
|
//
|
||||||
|
// Set the seed.
|
||||||
|
//
|
||||||
|
setMoves(puzzle.getWorker(),0);
|
||||||
|
setOfCells.add(puzzle.getWorker());
|
||||||
|
//
|
||||||
|
// Now on each loop pop one cell from the list and calculate the
|
||||||
|
// distance of cell around that cell.
|
||||||
|
//
|
||||||
|
while ( front < setOfCells.size() )
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// Pop the cell.
|
||||||
|
//
|
||||||
|
XYPair xy = setOfCells.elementAt(front++);
|
||||||
|
//
|
||||||
|
// Increase the length of cells all around given cell and push
|
||||||
|
// them into the list.
|
||||||
|
//
|
||||||
|
int l = getMoves(xy)+1;
|
||||||
|
if ( setMovesIfGreater(xy.left(),l) ) {
|
||||||
|
setOfCells.add(xy.left());
|
||||||
|
}
|
||||||
|
if ( setMovesIfGreater(xy.right(),l) ) {
|
||||||
|
setOfCells.add(xy.right());
|
||||||
|
}
|
||||||
|
if ( setMovesIfGreater(xy.down(),l) ) {
|
||||||
|
setOfCells.add(xy.down());
|
||||||
|
}
|
||||||
|
if ( setMovesIfGreater(xy.up(),l) ) {
|
||||||
|
setOfCells.add(xy.up());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public final int stepsAway( XYPair xy )
|
||||||
|
{
|
||||||
|
return getMoves(xy);
|
||||||
|
}
|
||||||
|
|
||||||
|
public final boolean isAccessible( XYPair xy ) {
|
||||||
|
return puzzle.isValid(xy) && stepsAway(xy) != Integer.MAX_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Vector<XYPair> getDirections( XYPair xy )
|
||||||
|
{
|
||||||
|
int away = stepsAway(xy);
|
||||||
|
if (away == Integer.MAX_VALUE)
|
||||||
|
return null;
|
||||||
|
//
|
||||||
|
// Ok looks there is a routh to given cell. Now create an array
|
||||||
|
// and fill in the step to get to the cell.
|
||||||
|
//
|
||||||
|
Vector<XYPair> steps = new Vector<XYPair>(away);
|
||||||
|
steps.add(xy);
|
||||||
|
while ( steps.size() < away )
|
||||||
|
{
|
||||||
|
xy = steps.lastElement();
|
||||||
|
int j = stepsAway(xy);
|
||||||
|
if ( stepsAway(xy.left()) < j ) {
|
||||||
|
steps.add(xy.left());
|
||||||
|
}
|
||||||
|
else if ( stepsAway(xy.right()) < j ) {
|
||||||
|
steps.add(xy.right());
|
||||||
|
}
|
||||||
|
else if ( stepsAway(xy.down()) < j ) {
|
||||||
|
steps.add(xy.down());
|
||||||
|
}
|
||||||
|
else if ( stepsAway(xy.up()) < j ) {
|
||||||
|
steps.add(xy.up());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Collections.reverse(steps);
|
||||||
|
return steps;
|
||||||
|
}
|
||||||
|
|
||||||
|
public XYPair [] getPushDirections( XYPair xy )
|
||||||
|
{
|
||||||
|
//
|
||||||
|
// The selected box can be moved only orthogonally.
|
||||||
|
// Check that worker is on opposite side of the box.
|
||||||
|
// Statement:
|
||||||
|
// If scaliar product of selected->x,y and worker->selected is equal
|
||||||
|
// to manhatten distance of x,y from the selected box then the worker
|
||||||
|
// push direction is directed to x,y and is not opposit. In other words
|
||||||
|
// selected->x,y and worker->selected are codirectional.
|
||||||
|
//
|
||||||
|
XYPair sel = puzzle.getSelected();
|
||||||
|
XYPair dist = XYPair.sub(xy, puzzle.getSelected());
|
||||||
|
XYPair dir = XYPair.sub(puzzle.getSelected(), puzzle.getWorker());
|
||||||
|
double scaliar = (double)(dist.x())*(double)(dir.x())
|
||||||
|
+(double)(dist.y())*(double)(dir.y());
|
||||||
|
int len = dist.l1_norm();
|
||||||
|
if ( scaliar != (double)len )
|
||||||
|
return null;
|
||||||
|
//
|
||||||
|
// Now check that all cell till x,y are free.
|
||||||
|
//
|
||||||
|
XYPair ixy = new XYPair(puzzle.getSelected());
|
||||||
|
while ( !xy.isEqual(ixy) )
|
||||||
|
{
|
||||||
|
ixy = ixy.add(dir);
|
||||||
|
if ( !puzzle.isEmpty(puzzle.getSym(ixy)) )
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// Looks we could move the box till x,y. Create the steps array
|
||||||
|
// and fill it with push steps.
|
||||||
|
//
|
||||||
|
XYPair steps[] = new XYPair[len];
|
||||||
|
int i = 0;
|
||||||
|
ixy.set(puzzle.getSelected());
|
||||||
|
while ( !xy.isEqual(ixy) )
|
||||||
|
{
|
||||||
|
steps[i++] = ixy;
|
||||||
|
ixy = ixy.add(dir);
|
||||||
|
}
|
||||||
|
return steps;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
100
app/src/main/java/org/vostan/banvor/model/XYPair.java
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
package org.vostan.banvor.model;
|
||||||
|
|
||||||
|
import static java.lang.Math.abs;
|
||||||
|
|
||||||
|
public class XYPair
|
||||||
|
{
|
||||||
|
public static final XYPair UP = new XYPair(0, 1);
|
||||||
|
public static final XYPair DOWN = new XYPair(0, -1);
|
||||||
|
public static final XYPair LEFT = new XYPair(-1, 0);
|
||||||
|
public static final XYPair RIGHT = new XYPair(1, 0);
|
||||||
|
public static final XYPair ZERO = new XYPair(0, 0);
|
||||||
|
private int _x = 0;
|
||||||
|
private int _y = 0;
|
||||||
|
|
||||||
|
public XYPair(){
|
||||||
|
_x = 0;
|
||||||
|
_y = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public XYPair(int x, int y){
|
||||||
|
_x = x;
|
||||||
|
_y = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
public XYPair(XYPair op){
|
||||||
|
_x = op.x();
|
||||||
|
_y = op.y();
|
||||||
|
}
|
||||||
|
|
||||||
|
public final int x(){
|
||||||
|
return _x;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final int y(){
|
||||||
|
return _y;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void set(int x, int y){
|
||||||
|
_x = x;
|
||||||
|
_y = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void set(XYPair xy){
|
||||||
|
_x = xy.x();
|
||||||
|
_y = xy.y();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static XYPair add(XYPair op1, XYPair op2){
|
||||||
|
return new XYPair(op1._x+op2._x, op1._y+op2._y);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static XYPair sub(XYPair op1, XYPair op2){
|
||||||
|
return new XYPair(op1._x-op2._x, op1._y-op2._y);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static XYPair mul(XYPair op1, int scaliar){
|
||||||
|
return new XYPair(op1._x*scaliar, op1._y*scaliar);
|
||||||
|
}
|
||||||
|
|
||||||
|
public final XYPair mul(int scaliar){
|
||||||
|
return mul(this, scaliar);
|
||||||
|
}
|
||||||
|
|
||||||
|
public final XYPair sub(XYPair op){
|
||||||
|
return sub(this, op);
|
||||||
|
}
|
||||||
|
|
||||||
|
public final XYPair add(XYPair op){
|
||||||
|
return add(this, op);
|
||||||
|
}
|
||||||
|
|
||||||
|
public final int l1_norm(){
|
||||||
|
return abs(_x)+abs(_y);
|
||||||
|
}
|
||||||
|
|
||||||
|
public final boolean isEqual(XYPair op){
|
||||||
|
return _x == op._x && _y == op._y;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final boolean isInside(XYPair op1, XYPair op2){
|
||||||
|
return op1.x() <= this.x() && this.x() < op2.x()
|
||||||
|
&& op1.y() <= this.y() && this.y() < op2.y();
|
||||||
|
}
|
||||||
|
|
||||||
|
public final XYPair left(){
|
||||||
|
return this.add(LEFT);
|
||||||
|
}
|
||||||
|
|
||||||
|
public final XYPair right(){
|
||||||
|
return this.add(RIGHT);
|
||||||
|
}
|
||||||
|
|
||||||
|
public final XYPair up(){
|
||||||
|
return this.add(UP);
|
||||||
|
}
|
||||||
|
|
||||||
|
public final XYPair down(){
|
||||||
|
return this.add(DOWN);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,208 +0,0 @@
|
|||||||
package org.vostan.banvor.play;
|
|
||||||
|
|
||||||
import android.app.AlertDialog;
|
|
||||||
import android.app.Dialog;
|
|
||||||
import android.content.DialogInterface;
|
|
||||||
import android.os.Bundle;
|
|
||||||
import androidx.fragment.app.DialogFragment;
|
|
||||||
import androidx.fragment.app.FragmentActivity;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.Window;
|
|
||||||
import android.view.animation.Animation;
|
|
||||||
import android.view.animation.AnimationUtils;
|
|
||||||
import android.widget.FrameLayout;
|
|
||||||
import android.widget.TextView;
|
|
||||||
|
|
||||||
import org.vostan.banvor.App;
|
|
||||||
|
|
||||||
import static org.vostan.banvor.App.theApp;
|
|
||||||
import org.vostan.banvor.R;
|
|
||||||
import org.vostan.banvor.Puzzle;
|
|
||||||
|
|
||||||
public class PlayActivity extends FragmentActivity
|
|
||||||
implements PuzzleControl.PuzzleControlLister
|
|
||||||
{
|
|
||||||
protected final static int RESET_ITEM = 1;
|
|
||||||
protected final static int UNDO_ITEM = 2;
|
|
||||||
|
|
||||||
public Puzzle puzzle = null;
|
|
||||||
public PuzzleControl puzzle_view;
|
|
||||||
View title_view;
|
|
||||||
public TextView title_text;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onCreate(Bundle savedInstanceState)
|
|
||||||
{
|
|
||||||
super.onCreate(savedInstanceState);
|
|
||||||
//
|
|
||||||
// No title.
|
|
||||||
//
|
|
||||||
requestWindowFeature(Window.FEATURE_NO_TITLE);
|
|
||||||
//
|
|
||||||
// Create and set up the puzzle_view.
|
|
||||||
//
|
|
||||||
puzzle_view = new PuzzleControl( this );
|
|
||||||
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);
|
|
||||||
//
|
|
||||||
// Load the puzzle.
|
|
||||||
//
|
|
||||||
loadCurrentPuzzle();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onSolved()
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// Advance current level and achieved level.
|
|
||||||
//
|
|
||||||
final int nextl = theApp().getCurrentLevel()+1;
|
|
||||||
theApp().advanceAchivedLevel(nextl);
|
|
||||||
theApp().setCurrentLevel(nextl);
|
|
||||||
//
|
|
||||||
// Bring a dialog for user to choose to continue or stop.
|
|
||||||
//
|
|
||||||
DialogFragment df = new DialogFragment()
|
|
||||||
{
|
|
||||||
public Dialog onCreateDialog(Bundle savedInstanceState)
|
|
||||||
{
|
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
|
||||||
builder.setTitle("Congratulations! You Won!");
|
|
||||||
builder.setMessage( "Would you like to try the next puzzle?" );
|
|
||||||
builder.setNegativeButton("Enough",
|
|
||||||
new DialogInterface.OnClickListener()
|
|
||||||
{
|
|
||||||
public void onClick(DialogInterface d, int w)
|
|
||||||
{
|
|
||||||
finish();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
builder.setPositiveButton("Please",
|
|
||||||
new DialogInterface.OnClickListener()
|
|
||||||
{
|
|
||||||
public void onClick(DialogInterface d, int w)
|
|
||||||
{
|
|
||||||
loadCurrentPuzzle();
|
|
||||||
puzzle_view.invalidate();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
// Create the AlertDialog object and return it
|
|
||||||
Dialog dlg = builder.create();
|
|
||||||
dlg.setCancelable(false);
|
|
||||||
dlg.setCanceledOnTouchOutside(false);
|
|
||||||
return dlg;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
df.setCancelable(false);
|
|
||||||
df.show(getSupportFragmentManager(), null);
|
|
||||||
//dlg.show();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onLongPress()
|
|
||||||
{
|
|
||||||
if ( title_view.getVisibility() != View.VISIBLE )
|
|
||||||
showTitle();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onTouch()
|
|
||||||
{
|
|
||||||
if ( title_view.getVisibility() == View.VISIBLE )
|
|
||||||
hideTitle();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void showTitle()
|
|
||||||
{
|
|
||||||
Animation anim = AnimationUtils.loadAnimation(this, R.animator.puzzle_action_bar_enter);
|
|
||||||
title_view.startAnimation(anim);
|
|
||||||
title_view.setVisibility(View.VISIBLE);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void hideTitle()
|
|
||||||
{
|
|
||||||
Animation anim = AnimationUtils.loadAnimation(this, R.animator.puzzle_action_bar_exit);
|
|
||||||
title_view.startAnimation(anim);
|
|
||||||
title_view.setVisibility(View.INVISIBLE);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean onReset( View v )
|
|
||||||
{
|
|
||||||
while ( puzzle.isUndoable() )
|
|
||||||
puzzle.restore();
|
|
||||||
puzzle_view.invalidate();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// Go to previouse puzzle.
|
|
||||||
//
|
|
||||||
public boolean onPrev( View v )
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// If current level is less than achived level the move to next
|
|
||||||
// puzzle.
|
|
||||||
//
|
|
||||||
if ( theApp().getCurrentLevel() > App.MIN_LEVEL )
|
|
||||||
{
|
|
||||||
theApp().setCurrentLevel( theApp().getCurrentLevel()-1 );
|
|
||||||
loadCurrentPuzzle();
|
|
||||||
puzzle_view.invalidate();
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// Go to next puzzle.
|
|
||||||
//
|
|
||||||
public boolean onNext( View v )
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// If current level is less than achived level the move to next
|
|
||||||
// puzzle.
|
|
||||||
//
|
|
||||||
if ( theApp().getCurrentLevel() < theApp().getAchivedLevel() )
|
|
||||||
{
|
|
||||||
theApp().setCurrentLevel( theApp().getCurrentLevel()+1 );
|
|
||||||
loadCurrentPuzzle();
|
|
||||||
puzzle_view.invalidate();
|
|
||||||
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// Undo last action.
|
|
||||||
//
|
|
||||||
public boolean onUndo( View v )
|
|
||||||
{
|
|
||||||
if ( puzzle.isUndoable() )
|
|
||||||
{
|
|
||||||
puzzle.restore();
|
|
||||||
puzzle_view.invalidate();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void loadCurrentPuzzle()
|
|
||||||
{
|
|
||||||
puzzle = theApp().getCurrentPuzzle();
|
|
||||||
puzzle_view.setPuzzle(puzzle);
|
|
||||||
updateTitle();
|
|
||||||
}
|
|
||||||
public void updateTitle()
|
|
||||||
{
|
|
||||||
String title = "Level " + new Integer(theApp().getCurrentLevel()).toString();
|
|
||||||
setTitle(title);
|
|
||||||
}
|
|
||||||
public void setTitle(CharSequence title)
|
|
||||||
{
|
|
||||||
super.setTitle(title);
|
|
||||||
if (title_text != null) {
|
|
||||||
title_text.setText(title);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,540 +0,0 @@
|
|||||||
/*
|
|
||||||
* To change this template, choose Tools | Templates
|
|
||||||
* and open the template in the editor.
|
|
||||||
*/
|
|
||||||
package org.vostan.banvor.play;
|
|
||||||
|
|
||||||
import static java.lang.Math.*;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import org.vostan.banvor.Puzzle;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @author vahagnk
|
|
||||||
*/
|
|
||||||
public class PuzzleLogic
|
|
||||||
{
|
|
||||||
//protected PlayActivity activity;
|
|
||||||
protected Puzzle puzzle = null;
|
|
||||||
protected int [] moves;
|
|
||||||
protected int [] setOfCells;
|
|
||||||
|
|
||||||
public PuzzleLogic()
|
|
||||||
{}
|
|
||||||
|
|
||||||
public void setPuzzle( Puzzle p )
|
|
||||||
{
|
|
||||||
puzzle = p;
|
|
||||||
moves = new int[puzzle.getColumnCount()*puzzle.getRowCount()];
|
|
||||||
setOfCells = new int[2*puzzle.getColumnCount()*puzzle.getRowCount()];
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean createSteps(Animator animator, final int x, final int y )
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// Check that the x,y are valid.
|
|
||||||
//
|
|
||||||
if ( !puzzle.isValid(x, y) )
|
|
||||||
return false;
|
|
||||||
//
|
|
||||||
// Now check what tile was tapped.
|
|
||||||
// If the tapped is a floor then ...
|
|
||||||
//
|
|
||||||
int tile = puzzle.getSym( x, y);
|
|
||||||
if ( Puzzle.isEmpty(tile) )
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// Calculate possible moves map.
|
|
||||||
//
|
|
||||||
calcMoves();
|
|
||||||
//
|
|
||||||
// Check if worker selected a box and can push it to the location?
|
|
||||||
// If yes then we are done.
|
|
||||||
//
|
|
||||||
if ( puzzle.isSelected()
|
|
||||||
&& tryMoveBox(animator, x, y) )
|
|
||||||
return true;
|
|
||||||
//
|
|
||||||
// Either nothing was selected or the box cannot be moved to
|
|
||||||
// tapped location. Try move worker alone.
|
|
||||||
//
|
|
||||||
if ( tryMoveWorker( animator, x, y ) )
|
|
||||||
return true;
|
|
||||||
//
|
|
||||||
// Show that action is not allowed.
|
|
||||||
//
|
|
||||||
undoable( animator, x, y );
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// The tapped is the worker. Try move the box. If not possible
|
|
||||||
// then unselect if selected.
|
|
||||||
//
|
|
||||||
else if ( Puzzle.hasWorker(tile) )
|
|
||||||
{
|
|
||||||
if ( !puzzle.isSelected() )
|
|
||||||
{
|
|
||||||
buzz( animator );
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// Calculate possible moves map.
|
|
||||||
//
|
|
||||||
calcMoves();
|
|
||||||
//
|
|
||||||
// Check if worker selected a box and can push it to the location?
|
|
||||||
// If yes then we are done.
|
|
||||||
//
|
|
||||||
if ( tryMoveBox(animator, x, y) )
|
|
||||||
return true;
|
|
||||||
//
|
|
||||||
// If the box is not movable then unselect it.
|
|
||||||
//
|
|
||||||
unselect( animator );
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// The tapped is a box.
|
|
||||||
//
|
|
||||||
else if ( Puzzle.hasBox(tile) )
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// Calculate possible moves map.
|
|
||||||
//
|
|
||||||
calcMoves();
|
|
||||||
//
|
|
||||||
// If the box is selected then unselect it.
|
|
||||||
//
|
|
||||||
if ( puzzle.isSelected(x,y) )
|
|
||||||
{
|
|
||||||
unselect( animator );
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// Try move the worker next to the box and select it if the
|
|
||||||
// box is not selected yet.
|
|
||||||
//
|
|
||||||
if ( trySelectBox( animator, x, y ) )
|
|
||||||
return true;
|
|
||||||
//
|
|
||||||
// Show that action is not allowed if reached till here.
|
|
||||||
//
|
|
||||||
undoable( animator, x, y );
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// Routes to accessible cells from where worker stands.
|
|
||||||
//
|
|
||||||
protected boolean tryMoveWorker( Animator animator, int x, int y )
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// If the filed is not accessable then move failed.
|
|
||||||
//
|
|
||||||
if ( !isAccessible(x,y) )
|
|
||||||
return false;
|
|
||||||
//
|
|
||||||
// First unselect box.
|
|
||||||
//
|
|
||||||
if ( puzzle.isSelected() )
|
|
||||||
unselect( animator );
|
|
||||||
//
|
|
||||||
// Get directions and queue moves accordingly.
|
|
||||||
//
|
|
||||||
int dirs[] = getDirections(x, y);
|
|
||||||
for ( int i = 0; i < dirs.length; i+=2 )
|
|
||||||
move( animator, dirs[i],dirs[i+1] );
|
|
||||||
//
|
|
||||||
// Done.
|
|
||||||
//
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean tryMoveBox( Animator animator, int x, int y )
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// If no box is selected then we cannot move no box.
|
|
||||||
//
|
|
||||||
if ( !puzzle.isSelected() )
|
|
||||||
return false;
|
|
||||||
//
|
|
||||||
// Check that asked move is orthogonal to the slected box.
|
|
||||||
//
|
|
||||||
int bx = puzzle.getSelectedX();
|
|
||||||
int by = puzzle.getSelectedY();
|
|
||||||
int dx = x-bx;
|
|
||||||
int dy = y-by;
|
|
||||||
if ( dx != 0 && dy != 0 )
|
|
||||||
return false;
|
|
||||||
//
|
|
||||||
// There is no point to continue also in case if the asked cell
|
|
||||||
// is the box.
|
|
||||||
//
|
|
||||||
if ( dx == 0 && dy == 0 )
|
|
||||||
return false;
|
|
||||||
//
|
|
||||||
// Now find the desired place for the worker to start push this
|
|
||||||
// box.
|
|
||||||
//
|
|
||||||
int wx = bx;
|
|
||||||
int wy = by;
|
|
||||||
if ( x < bx )
|
|
||||||
++wx;
|
|
||||||
else if ( x > bx )
|
|
||||||
--wx;
|
|
||||||
else if ( y < by )
|
|
||||||
++wy;
|
|
||||||
else
|
|
||||||
--wy;
|
|
||||||
//
|
|
||||||
// Check if the desired place for the worker is accessable? If not
|
|
||||||
// then there is no point to continue.
|
|
||||||
//
|
|
||||||
if ( !isAccessible(wx, wy) )
|
|
||||||
return false;
|
|
||||||
//
|
|
||||||
// Now check that all cell till x,y are empty and that we can
|
|
||||||
// push box till there.
|
|
||||||
//
|
|
||||||
int sx = bx-wx;
|
|
||||||
int sy = by-wy;
|
|
||||||
int ix = bx;
|
|
||||||
int iy = by;
|
|
||||||
while ( x != ix || y != iy )
|
|
||||||
{
|
|
||||||
ix+=sx;
|
|
||||||
iy+=sy;
|
|
||||||
int v = puzzle.getSym(ix,iy);
|
|
||||||
if ( !puzzle.isEmpty(v) && !puzzle.hasWorker(v) )
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// Ok, looks we can do the desired action. Now put instructions on
|
|
||||||
// what to do. First move worker to desired position if he is not
|
|
||||||
// there already.
|
|
||||||
//
|
|
||||||
if ( wx != puzzle.getWorkerX() || wy != puzzle.getWorkerY() )
|
|
||||||
{
|
|
||||||
tryMoveWorker( animator, wx, wy );
|
|
||||||
select( animator, bx, by );
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// Now create the steps to push the box.
|
|
||||||
//
|
|
||||||
ix = bx;
|
|
||||||
iy = by;
|
|
||||||
while ( x != ix || y != iy )
|
|
||||||
{
|
|
||||||
push( animator, ix, iy );
|
|
||||||
ix+=sx;
|
|
||||||
iy+=sy;
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// Done
|
|
||||||
//
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean trySelectBox( Animator animator, int x, int y )
|
|
||||||
{
|
|
||||||
int north = puzzle.getSym(x,y-1);
|
|
||||||
int south = puzzle.getSym(x,y+1);
|
|
||||||
int west = puzzle.getSym(x-1,y);
|
|
||||||
int east = puzzle.getSym(x+1,y);
|
|
||||||
//
|
|
||||||
// First check if there is a worker in a nighbour cell. If
|
|
||||||
// yes then simplly select the box. If the box is already selected
|
|
||||||
// then do nothing and if othe box is selected then unselect it first
|
|
||||||
// and then select the box.
|
|
||||||
//
|
|
||||||
if ( Puzzle.hasWorker( west )
|
|
||||||
|| Puzzle.hasWorker( east )
|
|
||||||
|| Puzzle.hasWorker( north )
|
|
||||||
|| Puzzle.hasWorker( south ) )
|
|
||||||
{
|
|
||||||
if ( !puzzle.isSelected(x,y) )
|
|
||||||
{
|
|
||||||
if ( puzzle.isSelected() )
|
|
||||||
unselect( animator );
|
|
||||||
select( animator, x, y );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// Otherwise, check which is of the cells is in closes walking
|
|
||||||
// distance and move worker to that cell, then select.
|
|
||||||
//
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int pref_x = -1;
|
|
||||||
int pref_y = -1;
|
|
||||||
int shortest = Integer.MAX_VALUE;
|
|
||||||
if ( Puzzle.isEmpty( north )
|
|
||||||
&& shortest > stepsAway( x, y-1) )
|
|
||||||
{
|
|
||||||
shortest = stepsAway( x, y-1);
|
|
||||||
pref_x = x;
|
|
||||||
pref_y = y-1;
|
|
||||||
}
|
|
||||||
if ( Puzzle.isEmpty( south )
|
|
||||||
&& shortest > stepsAway( x, y+1) )
|
|
||||||
{
|
|
||||||
shortest = stepsAway( x, y+1);
|
|
||||||
pref_x = x;
|
|
||||||
pref_y = y+1;
|
|
||||||
}
|
|
||||||
if ( Puzzle.isEmpty( west )
|
|
||||||
&& shortest > stepsAway( x-1, y) )
|
|
||||||
{
|
|
||||||
shortest = stepsAway( x-1, y);
|
|
||||||
pref_x = x-1;
|
|
||||||
pref_y = y;
|
|
||||||
}
|
|
||||||
if ( Puzzle.isEmpty( east )
|
|
||||||
&& shortest > stepsAway( x+1, y) )
|
|
||||||
{
|
|
||||||
shortest = stepsAway( x+1, y);
|
|
||||||
pref_x = x+1;
|
|
||||||
pref_y = y;
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// Move the worker to the direction. If we cannot move worker
|
|
||||||
// next to the box then we cannot select it.
|
|
||||||
//
|
|
||||||
if ( !puzzle.isValid(pref_x, pref_y)
|
|
||||||
|| !tryMoveWorker(animator, pref_x, pref_y) )
|
|
||||||
return false;
|
|
||||||
//
|
|
||||||
// Select the box.
|
|
||||||
//
|
|
||||||
select(animator,x,y);
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// Done
|
|
||||||
//
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void move( Animator animator, int x, int y )
|
|
||||||
{
|
|
||||||
animator.queue( new Animator.Move(x,y) );
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void push( Animator animator, int x, int y )
|
|
||||||
{
|
|
||||||
animator.queue( new Animator.Push(x,y) );
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void select( Animator animator, int x, int y )
|
|
||||||
{
|
|
||||||
animator.queue( new Animator.Select(x,y) );
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void unselect( Animator animator )
|
|
||||||
{
|
|
||||||
animator.queue( new Animator.Unselect() );
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void buzz( Animator animator )
|
|
||||||
{
|
|
||||||
//animator.queue( new Animator.NoMove(x,y) );
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void undoable( Animator animator, int x, int y )
|
|
||||||
{
|
|
||||||
animator.queue( new Animator.NoMove(x,y) );
|
|
||||||
}
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// Routes to accessible cells from where worker stands.
|
|
||||||
//
|
|
||||||
|
|
||||||
protected final int getMoves( int x, int y )
|
|
||||||
{
|
|
||||||
return moves[puzzle.getIndex(x,y)];
|
|
||||||
}
|
|
||||||
protected void setMoves( int x, int y, int v )
|
|
||||||
{
|
|
||||||
moves[puzzle.getIndex(x,y)]=v;
|
|
||||||
}
|
|
||||||
private boolean setMovesIfGreater( int x, int y, int l )
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// If out of borders then nothing to do.
|
|
||||||
//
|
|
||||||
if ( y < 0 || y >= puzzle.getRowCount()
|
|
||||||
|| x < 0 || x >= puzzle.getColumnCount() )
|
|
||||||
return false;
|
|
||||||
//
|
|
||||||
// Check if the cell is a floor or goal. If yes then set the l
|
|
||||||
// if current value is greater than l.
|
|
||||||
//
|
|
||||||
if ( getMoves(x,y) > l && puzzle.isEmpty(puzzle.getSym(x,y)))
|
|
||||||
{
|
|
||||||
setMoves(x,y,l);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void calcMoves()
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// Erase moves array.
|
|
||||||
//
|
|
||||||
Arrays.fill(moves,Integer.MAX_VALUE);
|
|
||||||
//
|
|
||||||
// For the beginning there is no cell in the list.
|
|
||||||
//
|
|
||||||
int front = 0;
|
|
||||||
int last = 0;
|
|
||||||
//
|
|
||||||
// Set the seed.
|
|
||||||
//
|
|
||||||
setMoves(puzzle.getWorkerX(),puzzle.getWorkerY(),0);
|
|
||||||
setOfCells[last++] = puzzle.getWorkerX();
|
|
||||||
setOfCells[last++] = puzzle.getWorkerY();
|
|
||||||
//
|
|
||||||
// Now on each loop pop one cell from the list and calculate the
|
|
||||||
// distance of cell around that cell.
|
|
||||||
//
|
|
||||||
while ( front < last )
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// Pop the cell.
|
|
||||||
//
|
|
||||||
int x = setOfCells[front++];
|
|
||||||
int y = setOfCells[front++];
|
|
||||||
//
|
|
||||||
// Increase the length of cells all around given cell and push
|
|
||||||
// them into the list.
|
|
||||||
//
|
|
||||||
int l = getMoves(x,y)+1;
|
|
||||||
if ( setMovesIfGreater(x-1,y,l) )
|
|
||||||
{
|
|
||||||
setOfCells[last++] = x-1;
|
|
||||||
setOfCells[last++] = y;
|
|
||||||
}
|
|
||||||
if ( setMovesIfGreater(x+1,y,l) )
|
|
||||||
{
|
|
||||||
setOfCells[last++] = x+1;
|
|
||||||
setOfCells[last++] = y;
|
|
||||||
}
|
|
||||||
if ( setMovesIfGreater(x,y-1,l) )
|
|
||||||
{
|
|
||||||
setOfCells[last++] = x;
|
|
||||||
setOfCells[last++] = y-1;
|
|
||||||
}
|
|
||||||
if ( setMovesIfGreater(x,y+1,l) )
|
|
||||||
{
|
|
||||||
setOfCells[last++] = x;
|
|
||||||
setOfCells[last++] = y+1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public final int stepsAway( int x, int y )
|
|
||||||
{
|
|
||||||
return getMoves(x,y);
|
|
||||||
}
|
|
||||||
|
|
||||||
public final boolean isAccessible( int x, int y )
|
|
||||||
{
|
|
||||||
return puzzle.isValid(x, y) && stepsAway(x, y) != Integer.MAX_VALUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int [] getDirections( int x, int y )
|
|
||||||
{
|
|
||||||
int away = stepsAway(x,y);
|
|
||||||
if (away == Integer.MAX_VALUE)
|
|
||||||
return null;
|
|
||||||
//
|
|
||||||
// Ok looks there is a routh to given cell. Now create an array
|
|
||||||
// and fill in the step to get to the cell.
|
|
||||||
//
|
|
||||||
int [] steps = new int[2*away];
|
|
||||||
int i = steps.length;
|
|
||||||
steps[--i] = y;
|
|
||||||
steps[--i] = x;
|
|
||||||
while ( i > 0 )
|
|
||||||
{
|
|
||||||
x = steps[i];
|
|
||||||
y = steps[i+1];
|
|
||||||
int j = stepsAway(x,y);
|
|
||||||
if ( stepsAway(x-1,y) < j )
|
|
||||||
{
|
|
||||||
steps[--i] = y;
|
|
||||||
steps[--i] = x-1;
|
|
||||||
}
|
|
||||||
else if ( stepsAway(x+1,y) < j )
|
|
||||||
{
|
|
||||||
steps[--i] = y;
|
|
||||||
steps[--i] = x+1;
|
|
||||||
}
|
|
||||||
else if ( stepsAway(x,y-1) < j )
|
|
||||||
{
|
|
||||||
steps[--i] = y-1;
|
|
||||||
steps[--i] = x;
|
|
||||||
}
|
|
||||||
else if ( stepsAway(x,y+1) < j )
|
|
||||||
{
|
|
||||||
steps[--i] = y+1;
|
|
||||||
steps[--i] = x;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return steps;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int [] getPushDirections( int x, int y )
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// The selected box can be moved only orthogonally.
|
|
||||||
// Check that worker is on opposite side of the box.
|
|
||||||
// Statement:
|
|
||||||
// If scaliar product of selected->x,y and worker->selected is equal
|
|
||||||
// to manhatten distance of x,y from the selected box then the worker
|
|
||||||
// push direction is directed to x,y and is not opposit. In other words
|
|
||||||
// selected->x,y and worker->selected are codirectional.
|
|
||||||
//
|
|
||||||
int selx = puzzle.getSelectedX();
|
|
||||||
int sely = puzzle.getSelectedY();
|
|
||||||
int xx = x-selx;
|
|
||||||
int yy = y-sely;
|
|
||||||
int sx = selx-puzzle.getWorkerX();
|
|
||||||
int sy = sely-puzzle.getWorkerY();
|
|
||||||
double scaliar = (double)(xx)*(double)(sx)
|
|
||||||
+(double)(yy)*(double)(sy);
|
|
||||||
int len = abs(xx)+abs(yy);
|
|
||||||
if ( scaliar != (double)len )
|
|
||||||
return null;
|
|
||||||
//
|
|
||||||
// Now check that all cell till x,y are free.
|
|
||||||
//
|
|
||||||
int ix = selx;
|
|
||||||
int iy = sely;
|
|
||||||
while ( x != ix || y != iy )
|
|
||||||
{
|
|
||||||
ix+=sx;
|
|
||||||
iy+=sy;
|
|
||||||
if ( !puzzle.isEmpty(puzzle.getSym(ix,iy)) )
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// Looks we could move the box till x,y. Create the steps array
|
|
||||||
// and fill it with push steps.
|
|
||||||
//
|
|
||||||
int steps[] = new int [2*len];
|
|
||||||
int i = 0;
|
|
||||||
ix = selx;
|
|
||||||
iy = sely;
|
|
||||||
while ( x != ix || y != iy )
|
|
||||||
{
|
|
||||||
steps[i++] = ix;
|
|
||||||
steps[i++] = iy;
|
|
||||||
ix+=sx;
|
|
||||||
iy+=sy;
|
|
||||||
}
|
|
||||||
return steps;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 991 B |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 41 KiB |
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 47 KiB |
BIN
app/src/main/res/drawable/splash2.png
Normal file
|
After Width: | Height: | Size: 38 KiB |
BIN
app/src/main/res/drawable/splash3.png
Normal file
|
After Width: | Height: | Size: 6.9 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 15 KiB |
54
app/src/main/res/layout/activity_welcome.xml
Normal 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>
|
||||||
19
app/src/main/res/layout/content_welcome.xml
Normal 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>
|
||||||
135
app/src/main/res/layout/fragment_puzzle_board.xml
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
<?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="@color/primary_bg"
|
||||||
|
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" />
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:id="@+id/btn_test"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_gravity="center_vertical"
|
||||||
|
android:layout_weight="0"
|
||||||
|
android:background="@color/transparent"
|
||||||
|
android:scaleType="fitCenter"
|
||||||
|
android:text="test" />
|
||||||
|
|
||||||
|
|
||||||
|
<ImageButton
|
||||||
|
android:id="@+id/btn_prev"
|
||||||
|
android:contentDescription="Previous Puzzle"
|
||||||
|
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:contentDescription="Next Puzzle"
|
||||||
|
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:contentDescription="Reset Puzzle"
|
||||||
|
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:contentDescription="Undo the last move."
|
||||||
|
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"
|
||||||
|
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:contentDescription="The game board."
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1"
|
||||||
|
/>
|
||||||
|
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
|
|
||||||
51
app/src/main/res/layout/fragment_puzzle_list.xml
Normal 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/splash3"
|
||||||
|
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>
|
||||||
|
|
||||||
107
app/src/main/res/layout/fragment_welcome.xml
Normal 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/splash2"
|
||||||
|
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>
|
||||||
|
|
||||||
@@ -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>
|
|
||||||
|
|
||||||
@@ -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>
|
|
||||||
|
|
||||||
@@ -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>
|
|
||||||
|
|
||||||
@@ -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>
|
|
||||||
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
<?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>
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
<?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>
|
|
||||||
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 982 B |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 5.8 KiB |
|
Before Width: | Height: | Size: 3.8 KiB |
|
Before Width: | Height: | Size: 7.6 KiB |
45
app/src/main/res/navigation/nav_graph.xml
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
<?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="@animator/fragment_slide_right_enter"
|
||||||
|
app:exitAnim="@animator/fragment_slide_right_exit" />
|
||||||
|
<action
|
||||||
|
android:id="@+id/action_WelcomeFragment_to_PuzzleBoardFragment"
|
||||||
|
app:destination="@id/PuzzleBoardFragment"
|
||||||
|
app:enterAnim="@animator/fragment_slide_left_enter"
|
||||||
|
app:exitAnim="@animator/fragment_slide_left_exit" />
|
||||||
|
</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"
|
||||||
|
app:enterAnim="@animator/fragment_slide_right_enter"
|
||||||
|
app:exitAnim="@animator/fragment_slide_right_exit" />
|
||||||
|
</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>
|
||||||
3
app/src/main/res/values-land/dimens.xml
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<resources>
|
||||||
|
<dimen name="fab_margin">48dp</dimen>
|
||||||
|
</resources>
|
||||||
@@ -1,16 +1,17 @@
|
|||||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||||
<!-- Base application theme. -->
|
<!-- Base application theme. -->
|
||||||
<style name="Theme.Banvor" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
|
<style name="Theme.Banvor" parent="Theme.MaterialComponents.DayNight.NoActionBar">
|
||||||
<!-- Primary brand color. -->
|
<!-- Primary brand color. -->
|
||||||
<item name="colorPrimary">@color/purple_200</item>
|
<item name="colorPrimary">@color/secondary</item>
|
||||||
<item name="colorPrimaryVariant">@color/purple_700</item>
|
<item name="colorPrimaryVariant">@color/secondary_variant</item>
|
||||||
<item name="colorOnPrimary">@color/black</item>
|
<item name="colorOnPrimary">@color/on_secondary</item>
|
||||||
<!-- Secondary brand color. -->
|
<!-- Secondary brand color. -->
|
||||||
<item name="colorSecondary">@color/teal_200</item>
|
<item name="colorSecondary">@color/primary</item>
|
||||||
<item name="colorSecondaryVariant">@color/teal_200</item>
|
<item name="colorSecondaryVariant">@color/primary_variant</item>
|
||||||
<item name="colorOnSecondary">@color/black</item>
|
<item name="colorOnSecondary">@color/on_primary</item>
|
||||||
<!-- Status bar color. -->
|
<!-- Status bar color. -->
|
||||||
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
|
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
|
||||||
<!-- Customize your theme here. -->
|
<!-- Customize your theme here. -->
|
||||||
|
<item name="android:background">@color/secondary_bg</item>
|
||||||
</style>
|
</style>
|
||||||
</resources>
|
</resources>
|
||||||
3
app/src/main/res/values-w1240dp/dimens.xml
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<resources>
|
||||||
|
<dimen name="fab_margin">200dp</dimen>
|
||||||
|
</resources>
|
||||||
3
app/src/main/res/values-w600dp/dimens.xml
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
<resources>
|
||||||
|
<dimen name="fab_margin">48dp</dimen>
|
||||||
|
</resources>
|
||||||
@@ -18,13 +18,18 @@
|
|||||||
*/
|
*/
|
||||||
-->
|
-->
|
||||||
<resources>
|
<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="main_menu_btn_text">#C0C0C0C0</color>
|
||||||
<color name="purple_200">#FFBB86FC</color>
|
<color name="puzzle_title">#FFFFE680</color>
|
||||||
<color name="purple_500">#FF6200EE</color>
|
|
||||||
<color name="purple_700">#FF3700B3</color>
|
<color name="primary">#FFC107</color>
|
||||||
<color name="teal_200">#FF03DAC5</color>
|
<color name="primary_bg">#000000</color>
|
||||||
<color name="teal_700">#FF018786</color>
|
<color name="primary_variant">#FF5722</color>
|
||||||
<color name="black">#FF000000</color>
|
<color name="secondary">#913213</color>
|
||||||
<color name="white">#FFFFFFFF</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>
|
</resources>
|
||||||
|
|||||||
@@ -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
|
** Copyright 2008, The Android Open Source Project
|
||||||
@@ -23,4 +22,11 @@
|
|||||||
<dimen name="main_menu_btn_hmargin">10pt</dimen>
|
<dimen name="main_menu_btn_hmargin">10pt</dimen>
|
||||||
<dimen name="main_menu_btn_vmargin">2pt</dimen>
|
<dimen name="main_menu_btn_vmargin">2pt</dimen>
|
||||||
<dimen name="main_menu_btn_padding">10pt</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>
|
</resources>
|
||||||
@@ -9,4 +9,9 @@
|
|||||||
<string name="btn_puzzles">Puzzles</string>
|
<string name="btn_puzzles">Puzzles</string>
|
||||||
<string name="version_tag">Version:</string>
|
<string name="version_tag">Version:</string>
|
||||||
<string name="copyright">(c) 2013 Vahagn Khachatryan</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>
|
</resources>
|
||||||
|
|||||||
@@ -1,16 +1,30 @@
|
|||||||
<resources xmlns:tools="http://schemas.android.com/tools">
|
<resources xmlns:tools="http://schemas.android.com/tools">
|
||||||
<!-- Base application theme. -->
|
<!-- Base application theme. -->
|
||||||
<style name="Theme.Banvor" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
|
<style name="Theme.Banvor" parent="Theme.MaterialComponents.DayNight.NoActionBar">
|
||||||
<!-- Primary brand color. -->
|
<!-- Primary brand color. -->
|
||||||
<item name="colorPrimary">@color/purple_500</item>
|
<item name="colorPrimary">@color/primary</item>
|
||||||
<item name="colorPrimaryVariant">@color/purple_700</item>
|
<item name="colorPrimaryVariant">@color/primary_variant</item>
|
||||||
<item name="colorOnPrimary">@color/white</item>
|
<item name="colorOnPrimary">@color/on_primary</item>
|
||||||
<!-- Secondary brand color. -->
|
<!-- Secondary brand color. -->
|
||||||
<item name="colorSecondary">@color/teal_200</item>
|
<item name="colorSecondary">@color/secondary</item>
|
||||||
<item name="colorSecondaryVariant">@color/teal_700</item>
|
<item name="colorSecondaryVariant">@color/secondary_variant</item>
|
||||||
<item name="colorOnSecondary">@color/black</item>
|
<item name="colorOnSecondary">@color/on_secondary</item>
|
||||||
<!-- Status bar color. -->
|
<!-- Status bar color. -->
|
||||||
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
|
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
|
||||||
<!-- Customize your theme here. -->
|
<!-- Customize your theme here. -->
|
||||||
|
<item name="android:background">@color/primary_bg</item>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
|
<style name="NoActionBar">
|
||||||
|
<item name="windowActionBar">false</item>
|
||||||
|
<item name="windowNoTitle">true</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="BanvorDialog" parent="Theme.AppCompat.Light.Dialog.Alert">
|
||||||
|
<item name="android:background">@color/transparent</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<style name="AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />
|
||||||
|
|
||||||
|
<style name="PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />
|
||||||
</resources>
|
</resources>
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
114
app/src/test/java/org/vostan/banvor/UnitTestXYPair.java
Normal file
@@ -0,0 +1,114 @@
|
|||||||
|
package org.vostan.banvor;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.vostan.banvor.model.XYPair;
|
||||||
|
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
|
public class UnitTestXYPair {
|
||||||
|
public XYPair bottom_left = new XYPair(0, 0);
|
||||||
|
public XYPair upper_right = new XYPair(10, 10);
|
||||||
|
public XYPair middle = new XYPair(5, 5);
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void isInside_bottom_left_is_inside() {
|
||||||
|
assertTrue(bottom_left.isInside(bottom_left, upper_right));
|
||||||
|
assertTrue(new XYPair(bottom_left.x(), middle.y()).isInside(bottom_left, upper_right));
|
||||||
|
assertTrue(new XYPair(middle.x(), bottom_left.y()).isInside(bottom_left, upper_right));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void isInside_upper_right_is_not_inside() {
|
||||||
|
assertFalse(upper_right.isInside(bottom_left, upper_right));
|
||||||
|
assertFalse(new XYPair(upper_right.x(), middle.y()).isInside(bottom_left, upper_right));
|
||||||
|
assertFalse(new XYPair(middle.x(), upper_right.y()).isInside(bottom_left, upper_right));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void isInside_middle_is_inside() {
|
||||||
|
assertTrue(middle.isInside(bottom_left, upper_right));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void isInside_outside_is_not_inside() {
|
||||||
|
assertFalse(bottom_left.left().isInside(bottom_left, upper_right));
|
||||||
|
assertFalse(new XYPair(middle.x(), bottom_left.y()-1).isInside(bottom_left, upper_right));
|
||||||
|
assertFalse(new XYPair(upper_right.x()+1, middle.y()).isInside(bottom_left, upper_right));
|
||||||
|
assertFalse(new XYPair(middle.x(), upper_right.y()+1).isInside(bottom_left, upper_right));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void l1_norne_test() {
|
||||||
|
assertEquals(6, new XYPair(2,4).l1_norm());
|
||||||
|
assertEquals(6, new XYPair(-2,4).l1_norm());
|
||||||
|
assertEquals(6, new XYPair(2,-4).l1_norm());
|
||||||
|
assertEquals(6, new XYPair(-2,-4).l1_norm());
|
||||||
|
assertEquals(0, new XYPair(0,0).l1_norm());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void add_test() {
|
||||||
|
XYPair c = XYPair.add(new XYPair(2,4), new XYPair(3, 5));
|
||||||
|
assertEquals(5, c.x());
|
||||||
|
assertEquals(9, c.y());
|
||||||
|
|
||||||
|
c = XYPair.add(new XYPair(-2,4), new XYPair(3, -5));
|
||||||
|
assertEquals(1, c.x());
|
||||||
|
assertEquals(-1, c.y());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void sub_test() {
|
||||||
|
XYPair c = XYPair.sub(new XYPair(2,9), new XYPair(3, 5));
|
||||||
|
assertEquals(-1, c.x());
|
||||||
|
assertEquals(4, c.y());
|
||||||
|
|
||||||
|
c = XYPair.sub(new XYPair(-2,-4), new XYPair(3, -5));
|
||||||
|
assertEquals(-5, c.x());
|
||||||
|
assertEquals(1, c.y());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void mul_test() {
|
||||||
|
XYPair c = XYPair.mul(new XYPair(2,9), 0);
|
||||||
|
assertEquals(0, c.x());
|
||||||
|
assertEquals(0, c.y());
|
||||||
|
|
||||||
|
c = XYPair.mul(new XYPair(-2,-4), 3);
|
||||||
|
assertEquals(-6, c.x());
|
||||||
|
assertEquals(-12, c.y());
|
||||||
|
|
||||||
|
c = XYPair.mul(new XYPair(-2,-4), -2);
|
||||||
|
assertEquals(4, c.x());
|
||||||
|
assertEquals(8, c.y());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void left_test() {
|
||||||
|
XYPair c = new XYPair(5,5).left();
|
||||||
|
assertEquals(4, c.x());
|
||||||
|
assertEquals(5, c.y());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void right_test() {
|
||||||
|
XYPair c = new XYPair(5,5).right();
|
||||||
|
assertEquals(6, c.x());
|
||||||
|
assertEquals(5, c.y());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void up_test() {
|
||||||
|
XYPair c = new XYPair(5,5).up();
|
||||||
|
assertEquals(5, c.x());
|
||||||
|
assertEquals(6, c.y());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void down_test() {
|
||||||
|
XYPair c = new XYPair(5,5).down();
|
||||||
|
assertEquals(5, c.x());
|
||||||
|
assertEquals(4, c.y());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
10
build.gradle
@@ -3,10 +3,20 @@ buildscript {
|
|||||||
repositories {
|
repositories {
|
||||||
google()
|
google()
|
||||||
mavenCentral()
|
mavenCentral()
|
||||||
|
//This is needed for SVG->PNG
|
||||||
|
// maven {
|
||||||
|
// url "https://plugins.gradle.org/m2/"
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath "com.android.tools.build:gradle:7.0.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"
|
||||||
|
|
||||||
|
//This is needed for SVG->PNG
|
||||||
|
// classpath 'com.trello:victor:1.1.2'
|
||||||
|
|
||||||
// NOTE: Do not place your application dependencies here; they belong
|
// NOTE: Do not place your application dependencies here; they belong
|
||||||
// in the individual module build.gradle files
|
// in the individual module build.gradle files
|
||||||
}
|
}
|
||||||
|
|||||||