Compare commits
17 Commits
e694647f84
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 167b2e5b2c | |||
| c172905788 | |||
| 66d04087f8 | |||
| faa6ccc296 | |||
| 0a4f131e2b | |||
| 56679bd1be | |||
| 0c0938d651 | |||
| 0eee6f58e8 | |||
| f68a4ca706 | |||
| 0653507928 | |||
| e112d78439 | |||
| 8cbc732965 | |||
| b9cfbaf4df | |||
| a7fec27c0f | |||
| 4ae3528c29 | |||
| e0f000c7db | |||
| 880a85e2cc |
101
app/build.gradle
@@ -4,37 +4,8 @@ plugins {
|
||||
|
||||
apply plugin: "androidx.navigation.safeargs"
|
||||
|
||||
//
|
||||
// Creates version.xml
|
||||
//
|
||||
task createVersionXML {
|
||||
doLast {
|
||||
def versionP = 'git describe --tags --long --dirty=-x --always --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()
|
||||
githashP.waitFor()
|
||||
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
|
||||
//This is needed for SVG->PNG
|
||||
//apply plugin: 'com.trello.victor'
|
||||
|
||||
//
|
||||
// Convert SVG images from art directory into PNG files.
|
||||
@@ -51,23 +22,83 @@ preBuild.dependsOn createVersionXML
|
||||
//}
|
||||
//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 {
|
||||
signingConfigs {
|
||||
release {
|
||||
storeFile file('keys/signing_key')
|
||||
keyAlias 'key0'
|
||||
}
|
||||
}
|
||||
compileSdk 31
|
||||
|
||||
// sourceSets {
|
||||
// main {
|
||||
// svg.srcDir 'src/main/art'
|
||||
// }
|
||||
// }
|
||||
|
||||
defaultConfig {
|
||||
applicationId "org.vostan.banvor"
|
||||
minSdk 21
|
||||
targetSdk 31
|
||||
versionCode 1
|
||||
versionName "1.0"
|
||||
versionCode gitVersionCode()
|
||||
versionName gitVersion()
|
||||
|
||||
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 {
|
||||
release {
|
||||
minifyEnabled false
|
||||
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 {
|
||||
@@ -85,6 +116,8 @@ dependencies {
|
||||
implementation 'androidx.appcompat:appcompat:1.3.1'
|
||||
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.+'
|
||||
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
|
||||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
|
||||
|
||||
@@ -5,14 +5,16 @@
|
||||
|
||||
<application
|
||||
android:name=".App"
|
||||
android:icon="@drawable/icon"
|
||||
android:label="@string/app_name"
|
||||
android:roundIcon="@drawable/icon"
|
||||
android:theme="@style/Theme.Banvor">
|
||||
android:icon="${appIcon}"
|
||||
android:label="${appName}"
|
||||
android:roundIcon="${appIconRound}"
|
||||
android:theme="@style/Theme.Banvor"
|
||||
android:allowBackup="true"
|
||||
android:fullBackupOnly="true">
|
||||
<activity
|
||||
android:name=".WelcomeActivity"
|
||||
android:exported="true"
|
||||
android:label="@string/title_activity_welcome"
|
||||
android:label="${appName}"
|
||||
>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.MAIN" />
|
||||
|
||||
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 |
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/) -->
|
||||
|
||||
<svg
|
||||
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="500"
|
||||
height="500"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.48.5 r10040"
|
||||
inkscape:version="1.1.1 (c3084ef, 2021-09-22)"
|
||||
sodipodi:docname="icon.svg"
|
||||
enable-background="new"
|
||||
inkscape:export-filename="C:\Users\vahagnk\devel\_private\org.dyndns.vahagn.sokoban\res\drawable-xhdpi\icon_debug.png"
|
||||
inkscape:export-xdpi="17.280001"
|
||||
inkscape:export-ydpi="17.280001">
|
||||
inkscape:export-filename="/Users/vahagnk/devel/banvor/app/src/main/art/google_store_icon.png"
|
||||
inkscape:export-xdpi="98.304001"
|
||||
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
|
||||
id="defs4">
|
||||
<linearGradient
|
||||
@@ -73,7 +72,7 @@
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient5747"
|
||||
osb:paint="solid">
|
||||
inkscape:swatch="solid">
|
||||
<stop
|
||||
style="stop-color:#ffaf00;stop-opacity:1;"
|
||||
offset="0"
|
||||
@@ -203,9 +202,9 @@
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="1.19"
|
||||
inkscape:cx="27.238825"
|
||||
inkscape:cy="201.98681"
|
||||
inkscape:document-units="px"
|
||||
inkscape:cx="165.54622"
|
||||
inkscape:cy="202.10084"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer6"
|
||||
showgrid="true"
|
||||
inkscape:snap-smooth-nodes="false"
|
||||
@@ -213,14 +212,17 @@
|
||||
inkscape:snap-global="true"
|
||||
inkscape:object-nodes="false"
|
||||
inkscape:snap-intersection-paths="false"
|
||||
inkscape:window-width="1680"
|
||||
inkscape:window-height="988"
|
||||
inkscape:window-x="-8"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-width="1792"
|
||||
inkscape:window-height="1067"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="25"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:snap-nodes="true"
|
||||
showguides="true"
|
||||
inkscape:guide-bbox="true">
|
||||
inkscape:guide-bbox="true"
|
||||
inkscape:pagecheckerboard="true"
|
||||
inkscape:showpageshadow="false"
|
||||
showborder="true">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid5923"
|
||||
@@ -237,7 +239,6 @@
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
@@ -245,7 +246,7 @@
|
||||
inkscape:groupmode="layer"
|
||||
id="layer7"
|
||||
inkscape:label="BigBox"
|
||||
style="opacity:0.2964602;display:none"
|
||||
style="display:inline;opacity:0.29646"
|
||||
sodipodi:insensitive="true">
|
||||
<rect
|
||||
y="2.2209995"
|
||||
@@ -253,10 +254,10 @@
|
||||
height="499.0787"
|
||||
width="496.88708"
|
||||
id="rect4119-2"
|
||||
style="fill:#ffd42a;fill-opacity:1;stroke:none;display:inline" />
|
||||
style="display:inline;fill:#ffd42a;fill-opacity:1;stroke:none" />
|
||||
<path
|
||||
style="fill:#ffb82a;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642198px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
|
||||
d="m 2.5088277,2.2210102 83.5230193,0 -1.726158,497.1399998 -81.5044619,0 z"
|
||||
style="display:inline;fill:#ffb82a;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 2.5088277,2.2210102 H 86.031847 L 84.305689,499.36101 H 2.8012271 Z"
|
||||
id="path4184-5"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
@@ -264,11 +265,11 @@
|
||||
sodipodi:nodetypes="ccccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4186-8"
|
||||
d="m 417.63317,2.2210102 83.52302,0 -0.0777,497.1399998 -82.62207,0 z"
|
||||
style="fill:#ffb82a;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642198px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;display:inline" />
|
||||
d="m 417.63317,2.2210102 h 83.52302 l -0.0777,497.1399998 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="fill:#ffc52a;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642198;stroke-linejoin:round;stroke-opacity:1;display:inline"
|
||||
d="m 2.8012271,3.2936415 498.2771329,0 0,81.2589055 -498.2771329,0 z"
|
||||
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 H 501.07836 V 84.552547 H 2.8012271 Z"
|
||||
id="rect4190-8"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
@@ -276,44 +277,44 @@
|
||||
sodipodi:nodetypes="ccccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4193-1"
|
||||
d="m 2.8012271,418.10211 498.2771329,0 0,81.2589 -498.2771329,0 z"
|
||||
style="fill:#ffc52a;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642198;stroke-linejoin:round;stroke-opacity:1;display:inline" />
|
||||
d="M 2.8012271,418.10211 H 501.07836 v 81.2589 H 2.8012271 Z"
|
||||
style="display:inline;fill:#ffc52a;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642;stroke-linejoin:round;stroke-opacity:1" />
|
||||
<rect
|
||||
style="fill:#ffdd55;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642198;stroke-linejoin:round;stroke-opacity:1;display:inline"
|
||||
style="display:inline;fill:#ffdd55;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642;stroke-linejoin:round;stroke-opacity:1"
|
||||
id="rect4195-4-2"
|
||||
width="82.565849"
|
||||
height="333.54956"
|
||||
x="168.31187"
|
||||
y="84.552574" />
|
||||
<rect
|
||||
style="fill:#ffcc00;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642198;stroke-linejoin:round;stroke-opacity:1;display:inline"
|
||||
style="display:inline;fill:#ffcc00;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642;stroke-linejoin:round;stroke-opacity:1"
|
||||
id="rect4195-1"
|
||||
width="82.565849"
|
||||
height="333.54956"
|
||||
x="85.745911"
|
||||
y="84.552666" />
|
||||
<rect
|
||||
style="fill:#ffcc00;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642198;stroke-linejoin:round;stroke-opacity:1;display:inline"
|
||||
style="display:inline;fill:#ffcc00;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642;stroke-linejoin:round;stroke-opacity:1"
|
||||
id="rect4195-9-4"
|
||||
width="82.565849"
|
||||
height="333.54956"
|
||||
x="335.20364"
|
||||
y="84.552574" />
|
||||
<path
|
||||
style="fill:#ffba08;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642198;stroke-opacity:1;display:inline"
|
||||
d="m 21.923338,84.586749 352.411182,333.541901 114.19532,0 L 136.11865,84.586749 z"
|
||||
style="display:inline;fill:#ffba08;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642;stroke-opacity:1"
|
||||
d="M 21.923338,84.586749 374.33452,418.12865 H 488.52984 L 136.11865,84.586749 Z"
|
||||
id="rect4222-6-9"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
<path
|
||||
style="fill:#fab826;fill-opacity:1;stroke:#ffaf00;stroke-width:3.07642198;stroke-opacity:1;display:inline"
|
||||
d="M 368.49499,84.586749 21.737955,418.12865 l 113.175725,0 346.75703,-333.541901 z"
|
||||
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 H 134.91368 L 481.67071,84.586749 Z"
|
||||
id="rect4222-8"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
<path
|
||||
style="fill:none;stroke:none;display:inline"
|
||||
d="M 369.20984,2.296704 416.70485,89.400231 333.23091,88.837671 317.31962,2.3628486 z"
|
||||
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"
|
||||
id="path5801-2-9"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
@@ -322,21 +323,21 @@
|
||||
inkscape:groupmode="layer"
|
||||
id="layer6"
|
||||
inkscape:label="Debug"
|
||||
style="display:inline"
|
||||
style="display:none"
|
||||
sodipodi:insensitive="true">
|
||||
<g
|
||||
id="g3905"
|
||||
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
|
||||
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"
|
||||
style="fill:#ff0000;fill-opacity:0.36507939;stroke:none"
|
||||
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.365079;stroke:none"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
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"
|
||||
style="fill:#ff0000;fill-opacity:0.36507939;stroke:none"
|
||||
style="fill:#ff0000;fill-opacity:0.365079;stroke:none"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
|
||||
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
@@ -2,25 +2,24 @@
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="500"
|
||||
height="800"
|
||||
id="svg2"
|
||||
version="1.1"
|
||||
inkscape:version="0.48.5 r10040"
|
||||
inkscape:version="1.1.1 (c3084ef, 2021-09-22)"
|
||||
sodipodi:docname="splash.svg"
|
||||
inkscape:export-filename="C:\Users\vahagnk\devel\_private\org.dyndns.vahagn.sokoban\art\icon3_36.png"
|
||||
inkscape:export-xdpi="6.48"
|
||||
inkscape:export-ydpi="6.48"
|
||||
style="enable-background:new">
|
||||
inkscape:export-filename="/Users/vahagnk/devel/banvor/app/src/main/res/drawable/splash3.png"
|
||||
inkscape:export-xdpi="95.999992"
|
||||
inkscape:export-ydpi="95.999992"
|
||||
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
|
||||
id="defs4">
|
||||
<linearGradient
|
||||
@@ -73,7 +72,7 @@
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient5747"
|
||||
osb:paint="solid">
|
||||
inkscape:swatch="solid">
|
||||
<stop
|
||||
style="stop-color:#ffaf00;stop-opacity:1;"
|
||||
offset="0"
|
||||
@@ -153,7 +152,7 @@
|
||||
x2="356.59912"
|
||||
y2="109.88838"
|
||||
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
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3820"
|
||||
@@ -163,7 +162,7 @@
|
||||
x2="239.30128"
|
||||
y2="169.15221"
|
||||
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
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3873"
|
||||
@@ -173,7 +172,7 @@
|
||||
x2="159.09091"
|
||||
y2="979.63489"
|
||||
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
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3889"
|
||||
@@ -183,7 +182,7 @@
|
||||
x2="330.11365"
|
||||
y2="814.86218"
|
||||
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
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3907"
|
||||
@@ -193,7 +192,53 @@
|
||||
x2="206.80421"
|
||||
y2="230.84761"
|
||||
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>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
@@ -202,25 +247,28 @@
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="1.17"
|
||||
inkscape:cx="210.243"
|
||||
inkscape:cy="455.05609"
|
||||
inkscape:zoom="0.585"
|
||||
inkscape:cx="211.96581"
|
||||
inkscape:cy="409.40171"
|
||||
inkscape:document-units="px"
|
||||
inkscape:current-layer="layer6"
|
||||
inkscape:current-layer="layer4"
|
||||
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="1680"
|
||||
inkscape:window-height="1028"
|
||||
inkscape:window-x="1672"
|
||||
inkscape:window-y="-8"
|
||||
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:guide-bbox="true"
|
||||
inkscape:pagecheckerboard="true"
|
||||
inkscape:showpageshadow="false"
|
||||
borderlayer="true">
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid5923"
|
||||
@@ -237,7 +285,6 @@
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
@@ -245,18 +292,19 @@
|
||||
inkscape:groupmode="layer"
|
||||
id="layer7"
|
||||
inkscape:label="big_box"
|
||||
style="opacity:0.2964602;display:none"
|
||||
transform="translate(0,300)">
|
||||
style="display:none;opacity:0.29646"
|
||||
transform="translate(0,300)"
|
||||
sodipodi:insensitive="true">
|
||||
<rect
|
||||
y="-145.77899"
|
||||
x="4.2691622"
|
||||
height="499.0787"
|
||||
width="496.88708"
|
||||
y="-145.26665"
|
||||
x="-83.509636"
|
||||
height="664.37396"
|
||||
width="664.49176"
|
||||
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
|
||||
style="fill:#ffb82a;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642198px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
|
||||
d="m 2.5088277,-145.77899 83.5230193,0 -1.726158,497.14 -81.5044619,0 z"
|
||||
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 -85.863748,-145.26664 H 25.832371 L 23.523965,516.52653 H -85.472719 Z"
|
||||
id="path4184-5"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
@@ -264,11 +312,11 @@
|
||||
sodipodi:nodetypes="ccccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4186-8"
|
||||
d="m 417.63317,-145.77899 83.52302,0 -0.0777,497.14 -82.62207,0 z"
|
||||
style="fill:#ffb82a;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642198px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;display:inline" />
|
||||
d="M 469.28594,-145.26664 H 580.98206 L 580.8782,516.52653 H 470.38692 Z"
|
||||
style="display:inline;fill:#ffb82a;fill-opacity:1;stroke:#ffa600;stroke-width:4.10472px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
|
||||
<path
|
||||
style="fill:#ffc52a;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642198;stroke-linejoin:round;stroke-opacity:1;display:inline"
|
||||
d="m 2.8012271,-144.70636 498.2771329,0 0,81.258907 -498.2771329,0 z"
|
||||
style="display:inline;fill:#ffc52a;fill-opacity:1;stroke:#ffa600;stroke-width:4.10472;stroke-linejoin:round;stroke-opacity:1"
|
||||
d="M -85.472719,-143.83876 H 580.87798 V -35.666831 H -85.472719 Z"
|
||||
id="rect4190-8"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
@@ -276,44 +324,44 @@
|
||||
sodipodi:nodetypes="ccccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4193-1"
|
||||
d="m 2.8012271,270.10211 498.2771329,0 0,81.2589 -498.2771329,0 z"
|
||||
style="fill:#ffc52a;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642198;stroke-linejoin:round;stroke-opacity:1;display:inline" />
|
||||
d="M -85.472719,408.35462 H 580.87798 V 516.52653 H -85.472719 Z"
|
||||
style="display:inline;fill:#ffc52a;fill-opacity:1;stroke:#ffa600;stroke-width:4.10472;stroke-linejoin:round;stroke-opacity:1" />
|
||||
<rect
|
||||
style="fill:#ffdd55;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642198;stroke-linejoin:round;stroke-opacity:1;display:inline"
|
||||
style="display:inline;fill:#ffdd55;fill-opacity:1;stroke:#ffa600;stroke-width:4.10472;stroke-linejoin:round;stroke-opacity:1"
|
||||
id="rect4195-4-2"
|
||||
width="82.565849"
|
||||
height="333.54956"
|
||||
x="168.31187"
|
||||
y="-63.447426" />
|
||||
width="110.41608"
|
||||
height="444.02145"
|
||||
x="135.86623"
|
||||
y="-35.666794" />
|
||||
<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"
|
||||
width="82.565849"
|
||||
height="333.54956"
|
||||
x="85.745911"
|
||||
y="-63.447334" />
|
||||
width="110.41608"
|
||||
height="444.02145"
|
||||
x="25.449986"
|
||||
y="-35.666672" />
|
||||
<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"
|
||||
width="82.565849"
|
||||
height="333.54956"
|
||||
x="335.20364"
|
||||
y="-63.447426" />
|
||||
width="110.41608"
|
||||
height="444.02145"
|
||||
x="359.05215"
|
||||
y="-35.666794" />
|
||||
<path
|
||||
style="fill:#ffba08;fill-opacity:1;stroke:#ffa600;stroke-width:3.07642198;stroke-opacity:1;display:inline"
|
||||
d="m 21.923338,-63.413251 352.411182,333.541901 114.19532,0 -352.41119,-333.541901 z"
|
||||
style="display:inline;fill:#ffba08;fill-opacity:1;stroke:#ffa600;stroke-width:4.10472;stroke-opacity:1"
|
||||
d="M -59.900541,-35.621302 411.38225,408.38995 H 564.09673 L 92.813925,-35.621302 Z"
|
||||
id="rect4222-6-9"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
<path
|
||||
style="fill:#fab826;fill-opacity:1;stroke:#ffaf00;stroke-width:3.07642198;stroke-opacity:1;display:inline"
|
||||
d="M 368.49499,-63.413251 21.737955,270.12865 l 113.175725,0 346.75703,-333.541901 z"
|
||||
style="display:inline;fill:#fab826;fill-opacity:1;stroke:#ffaf00;stroke-width:4.10472;stroke-opacity:1"
|
||||
d="M 403.57299,-35.621302 -60.148455,408.38995 H 91.202503 L 554.92395,-35.621302 Z"
|
||||
id="rect4222-8"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
<path
|
||||
style="fill:none;stroke:none;display:inline"
|
||||
d="m 369.20984,-145.7033 47.49501,87.103531 -83.47394,-0.56256 -15.91129,-86.474821 z"
|
||||
style="display:inline;fill:none;stroke:none;stroke-width:1.33426"
|
||||
d="M 404.52897,-145.16588 468.04449,-29.213591 356.41401,-29.96247 335.13568,-145.07783 Z"
|
||||
id="path5801-2-9"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
@@ -321,20 +369,21 @@
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
id="layer6"
|
||||
inkscape:label="title">
|
||||
inkscape:label="title"
|
||||
style="display:inline"
|
||||
sodipodi:insensitive="true">
|
||||
<text
|
||||
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"
|
||||
x="0.66347247"
|
||||
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="7.0980215"
|
||||
y="120.67854"
|
||||
id="text3062"
|
||||
sodipodi:linespacing="125%"
|
||||
transform="scale(0.93246631,1.0724248)"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan3064"
|
||||
x="0.66347247"
|
||||
x="7.0980215"
|
||||
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
|
||||
inkscape:groupmode="layer"
|
||||
@@ -344,14 +393,14 @@
|
||||
transform="translate(0,-252.36218)"
|
||||
sodipodi:insensitive="true">
|
||||
<path
|
||||
style="fill:url(#linearGradient3879);fill-opacity:1;stroke:none"
|
||||
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"
|
||||
style="fill:url(#linearGradient3879);fill-opacity:1;stroke:none;stroke-width:1.34336"
|
||||
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"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="csccscc" />
|
||||
<path
|
||||
style="fill:url(#linearGradient3895);fill-opacity:1;stroke:none"
|
||||
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"
|
||||
style="fill:url(#linearGradient3895);fill-opacity:1;stroke:none;stroke-width:1.34336"
|
||||
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"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccscssc" />
|
||||
@@ -364,21 +413,21 @@
|
||||
transform="translate(0,300)"
|
||||
sodipodi:insensitive="true">
|
||||
<rect
|
||||
y="141.78345"
|
||||
x="303.048"
|
||||
height="189.63731"
|
||||
width="194.64587"
|
||||
y="227.44206"
|
||||
x="325.84378"
|
||||
height="269.79065"
|
||||
width="246.90125"
|
||||
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
|
||||
sodipodi:nodetypes="ccccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4121"
|
||||
d="m 342.65518,101.83473 -39.6072,39.94872 194.64588,-10e-6 -39.93747,-39.89529 z"
|
||||
style="fill:#ff9600;fill-opacity:1;stroke:none;display:inline" />
|
||||
d="m 376.08405,170.60839 -50.2403,56.8337 246.90126,-2e-5 -50.65924,-56.75768 z"
|
||||
style="display:inline;fill:#ff9600;fill-opacity:1;stroke:none;stroke-width:1.34336" />
|
||||
<path
|
||||
style="fill:#ffb82a;fill-opacity:1;stroke:#ffa600;stroke-width:1.18690801px;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"
|
||||
style="fill:#ffb82a;fill-opacity:1;stroke:#ffa600;stroke-width:1.59444px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 324.96905,227.44207 h 41.50228 l -0.85774,268.74268 h -40.49923 z"
|
||||
id="path4184"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
@@ -386,11 +435,11 @@
|
||||
sodipodi:nodetypes="ccccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4186"
|
||||
d="m 464.97533,141.78344 32.71853,0 -0.0305,188.90069 -32.36559,0 z"
|
||||
style="fill:#ffb82a;fill-opacity:1;stroke:#ffa600;stroke-width:1.18690801px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
|
||||
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.59444px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
|
||||
<path
|
||||
style="fill:#ffc52a;fill-opacity:1;stroke:#ffa600;stroke-width:1.18690801;stroke-linejoin:round;stroke-opacity:1"
|
||||
d="m 302.47296,142.191 195.19042,0 0,30.87636 -195.19042,0 z"
|
||||
style="fill:#ffc52a;fill-opacity:1;stroke:#ffa600;stroke-width:1.59444;stroke-linejoin:round;stroke-opacity:1"
|
||||
d="m 325.11436,228.0219 h 247.59199 v 43.92675 H 325.11436 Z"
|
||||
id="rect4190"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
@@ -398,98 +447,98 @@
|
||||
sodipodi:nodetypes="ccccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path4193"
|
||||
d="m 302.47296,299.80778 195.19042,0 0,30.87635 -195.19042,0 z"
|
||||
style="fill:#ffc52a;fill-opacity:1;stroke:#ffa600;stroke-width:1.18690801;stroke-linejoin:round;stroke-opacity:1" />
|
||||
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.59444;stroke-linejoin:round;stroke-opacity:1" />
|
||||
<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"
|
||||
width="32.343575"
|
||||
height="126.74043"
|
||||
x="367.3085"
|
||||
y="173.06735" />
|
||||
width="41.026657"
|
||||
height="180.30936"
|
||||
x="407.3559"
|
||||
y="271.94864" />
|
||||
<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"
|
||||
width="32.343575"
|
||||
height="126.74043"
|
||||
x="334.965"
|
||||
y="173.06738" />
|
||||
width="41.026657"
|
||||
height="180.30936"
|
||||
x="366.32935"
|
||||
y="271.9487" />
|
||||
<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"
|
||||
width="32.343575"
|
||||
height="126.74043"
|
||||
x="432.68518"
|
||||
y="173.06735" />
|
||||
width="41.026657"
|
||||
height="180.30936"
|
||||
x="490.28384"
|
||||
y="271.94864" />
|
||||
<path
|
||||
style="fill:#ffba08;fill-opacity:1;stroke:#ffa600;stroke-width:1.18690801;stroke-opacity:1;display:inline"
|
||||
d="m 309.96367,173.08035 138.05026,126.73752 44.73381,0 -138.05027,-126.73752 z"
|
||||
style="display:inline;fill:#ffba08;fill-opacity:1;stroke:#ffa600;stroke-width:1.59444;stroke-opacity:1"
|
||||
d="m 334.61606,271.96715 175.11175,180.3052 h 56.74322 L 391.35925,271.96715 Z"
|
||||
id="rect4222-6"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
<path
|
||||
style="fill:#fab826;fill-opacity:1;stroke:#ffaf00;stroke-width:1.18690801;stroke-opacity:1"
|
||||
d="m 445.72641,173.08035 -135.83535,126.73752 44.33437,0 135.83538,-126.73752 z"
|
||||
style="fill:#fab826;fill-opacity:1;stroke:#ffaf00;stroke-width:1.59444;stroke-opacity:1"
|
||||
d="M 506.82617,271.96715 334.52396,452.27235 H 390.7605 L 563.06275,271.96715 Z"
|
||||
id="rect4222"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
<path
|
||||
style="fill:#aa4400;stroke:none"
|
||||
d="m 364.06882,101.84466 -27.85671,40.34634 31.10207,0 17.00384,-40.33693 z"
|
||||
style="fill:#aa4400;stroke:none;stroke-width:1.34336"
|
||||
d="m 403.24648,170.62251 -35.33523,57.39939 h 39.45186 l 21.56875,-57.386 z"
|
||||
id="path5801"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
<path
|
||||
style="fill:#ff6600;stroke:none"
|
||||
d="m 367.84163,142.191 16.78684,-40.33679 21.10779,0.01 -5.90794,40.32709 z"
|
||||
style="fill:#ff6600;stroke:none;stroke-width:1.34336"
|
||||
d="m 408.03215,228.0219 21.2935,-57.3858 26.77447,0.0142 -7.49402,57.372 z"
|
||||
id="path5803"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
<path
|
||||
style="fill:#ff7f2a;stroke:none;display:inline"
|
||||
d="m 431.57529,142.191 -6.40565,-40.23712 -19.12278,-0.0898 -5.86864,40.33002 z"
|
||||
style="display:inline;fill:#ff7f2a;stroke:none;stroke-width:1.34336"
|
||||
d="m 488.87599,228.0219 -8.12534,-57.244 -24.25655,-0.12776 -7.44416,57.37617 z"
|
||||
id="path5803-6"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
<path
|
||||
style="fill:none;stroke:none;display:inline"
|
||||
d="m 445.9808,102.182 18.59488,40.02713 -32.68108,-0.25851 -6.22946,-39.73823 z"
|
||||
style="display:inline;fill:none;stroke:none;stroke-width:1.34336"
|
||||
d="m 507.14886,171.10243 23.58693,56.94526 -41.45476,-0.36778 -7.90185,-56.53424 z"
|
||||
id="path5801-2"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
<path
|
||||
style="fill:#d4aa00;stroke:none"
|
||||
d="m 464.4348,142.191 0.0873,-4.67444 32.70213,0.25851 0.24774,4.65329 z"
|
||||
style="fill:#d4aa00;stroke:none;stroke-width:1.34336"
|
||||
d="m 530.55709,228.0219 0.11073,-6.65016 41.48147,0.36777 0.31424,6.62007 z"
|
||||
id="path5855"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
<path
|
||||
style="fill:#ffcc00;stroke:none"
|
||||
d="m 464.52216,137.51656 -22.27583,-37.3704 0.0599,1.73482 22.25514,40.32804 z"
|
||||
style="fill:#ffcc00;stroke:none;stroke-width:1.34336"
|
||||
d="m 530.66791,221.37174 -28.25609,-53.16563 0.076,2.46808 28.22984,57.37335 z"
|
||||
id="path5857"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
<path
|
||||
style="fill:#ff9600;fill-opacity:1;stroke:none"
|
||||
d="m 464.52216,137.51656 32.70215,0.25851 -39.05814,-37.66825 -15.94328,0 z"
|
||||
style="fill:#ff9600;fill-opacity:1;stroke:none;stroke-width:1.34336"
|
||||
d="m 530.66791,221.37174 41.48149,0.36777 -49.54384,-53.58936 h -20.22347 z"
|
||||
id="path5859"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
<path
|
||||
style="fill:#d4aa00;fill-opacity:1;stroke:none"
|
||||
d="m 303.27493,141.82968 0,0 32.26901,0.40752 -0.20102,-3.20718 -32.03678,-0.46042 z"
|
||||
style="fill:#d4aa00;fill-opacity:1;stroke:none;stroke-width:1.34336"
|
||||
d="m 326.13163,227.50786 v 0 l 40.93207,0.57977 -0.25498,-4.56275 -40.6375,-0.65503 z"
|
||||
id="path5891"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccccc" />
|
||||
<path
|
||||
style="fill:#ff9600;fill-opacity:1;stroke:none"
|
||||
d="m 335.64188,139.03326 -32.226,-0.34915 40.16321,-38.57729 19.74096,0 z"
|
||||
style="fill:#ff9600;fill-opacity:1;stroke:none;stroke-width:1.34336"
|
||||
d="m 367.18793,223.52949 -40.8775,-0.49673 50.94557,-54.88261 h 25.04069 z"
|
||||
id="path5893"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
<path
|
||||
style="fill:#aa8800;fill-opacity:1;stroke:none"
|
||||
d="m 335.35265,139.18557 27.9674,-39.07875 0,1.95445 -27.77481,40.41628 z"
|
||||
style="fill:#aa8800;fill-opacity:1;stroke:none;stroke-width:1.34336"
|
||||
d="m 366.82107,223.74617 35.47562,-55.59602 v 2.78052 l -35.23134,57.49889 z"
|
||||
id="path5897"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccc" />
|
||||
@@ -502,18 +551,18 @@
|
||||
transform="translate(0,-252.36218)"
|
||||
sodipodi:insensitive="true">
|
||||
<path
|
||||
style="fill:#ffcc00;fill-opacity:1;stroke:none;display:inline"
|
||||
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"
|
||||
style="display:inline;fill:#ffcc00;fill-opacity:1;stroke:none;stroke-width:1.34336"
|
||||
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"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="csssssccssccccscsccc" />
|
||||
<rect
|
||||
style="fill:#d45500;fill-opacity:1;stroke:none"
|
||||
style="fill:#d45500;fill-opacity:1;stroke:none;stroke-width:1.34336"
|
||||
id="rect4182"
|
||||
width="25.747025"
|
||||
height="1.6119893e-006"
|
||||
x="362.77811"
|
||||
y="686.87097" />
|
||||
width="32.659168"
|
||||
height="2.2933232e-06"
|
||||
x="401.60925"
|
||||
y="769.45483" />
|
||||
</g>
|
||||
<g
|
||||
inkscape:groupmode="layer"
|
||||
@@ -523,14 +572,14 @@
|
||||
transform="translate(0,300)"
|
||||
sodipodi:insensitive="true">
|
||||
<path
|
||||
style="fill:url(#linearGradient3826);fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
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"
|
||||
style="fill:url(#linearGradient3826);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.34336"
|
||||
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"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="csssc" />
|
||||
<path
|
||||
style="fill:url(#linearGradient3913);fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
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"
|
||||
style="fill:url(#linearGradient3913);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.34336"
|
||||
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"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cscc" />
|
||||
@@ -543,20 +592,20 @@
|
||||
transform="translate(0,300)"
|
||||
sodipodi:insensitive="true">
|
||||
<path
|
||||
style="fill:#d45500;fill-opacity:1;stroke:none"
|
||||
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"
|
||||
style="fill:#d45500;fill-opacity:1;stroke:none;stroke-width:1.34336"
|
||||
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"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="sssss" />
|
||||
<path
|
||||
style="fill:url(#linearGradient4180);fill-opacity:1;stroke:none"
|
||||
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"
|
||||
style="fill:url(#linearGradient4180);fill-opacity:1;stroke:none;stroke-width:1.34336"
|
||||
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"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="sssss" />
|
||||
<path
|
||||
style="fill:#d45500;fill-opacity:1;stroke:none"
|
||||
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"
|
||||
style="fill:#d45500;fill-opacity:1;stroke:none;stroke-width:1.34336"
|
||||
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"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="scscs" />
|
||||
|
||||
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 24 KiB |
@@ -2,11 +2,9 @@ package org.vostan.banvor;
|
||||
|
||||
import android.app.Application;
|
||||
import android.content.SharedPreferences;
|
||||
import android.util.Log;
|
||||
|
||||
import org.vostan.banvor.game.State;
|
||||
import org.vostan.banvor.model.PuzzleContainer;
|
||||
import org.vostan.banvor.model.IPuzzleSource;
|
||||
import org.vostan.banvor.game.PuzzleContainer;
|
||||
|
||||
public class App extends Application
|
||||
{
|
||||
|
||||
@@ -35,6 +35,7 @@ public class PuzzleBoardFragment extends Fragment
|
||||
{
|
||||
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();
|
||||
}
|
||||
|
||||
@@ -60,22 +61,24 @@ public class PuzzleBoardFragment extends Fragment
|
||||
public void onTouch() {
|
||||
}
|
||||
});
|
||||
binding.btnPrev.setOnClickListener((View.OnClickListener) view1 -> {
|
||||
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) view2 -> {
|
||||
binding.btnNext.setOnClickListener((View.OnClickListener) v -> {
|
||||
gameState.setCurrentLevel(gameState.getCurrentLevel()+1);
|
||||
PuzzleBoardFragment.this.initAndShowCurrentPuzzle();
|
||||
});
|
||||
binding.btnReset.setOnClickListener((View.OnClickListener) view3 -> {
|
||||
binding.btnReset.setOnClickListener((View.OnClickListener) v -> {
|
||||
PuzzleBoardFragment.this.initAndShowCurrentPuzzle();
|
||||
});
|
||||
binding.btnUndo.setOnClickListener((View.OnClickListener) view4 -> {
|
||||
createNextLevelDialog((d, w) -> {
|
||||
gameState.advanceCurrentLevel();
|
||||
initAndShowCurrentPuzzle();
|
||||
}).show();
|
||||
binding.btnUndo.setOnClickListener((View.OnClickListener) v -> {
|
||||
binding.gameBoard.undoLastMove();
|
||||
});
|
||||
}
|
||||
|
||||
@@ -93,17 +96,6 @@ public class PuzzleBoardFragment extends Fragment
|
||||
//
|
||||
// Bring a dialog for user to choose to continue or stop.
|
||||
//
|
||||
// DialogFragment df = new DialogFragment() {
|
||||
// public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||
// return createNextLevelDialog(new DialogInterface.OnClickListener(){
|
||||
// public void onClick(DialogInterface d, int w){
|
||||
// gameState.advanceCurrentLevel();
|
||||
// initAndShowCurrentPuzzle();
|
||||
// }
|
||||
// });
|
||||
// }
|
||||
// };
|
||||
// df.show(getChildFragmentManager(), null);
|
||||
createNextLevelDialog((d, w) -> {
|
||||
gameState.advanceCurrentLevel();
|
||||
initAndShowCurrentPuzzle();
|
||||
@@ -117,7 +109,7 @@ public class PuzzleBoardFragment extends Fragment
|
||||
}
|
||||
|
||||
private Dialog createNextLevelDialog(DialogInterface.OnClickListener listener){
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
|
||||
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);
|
||||
|
||||
@@ -5,6 +5,9 @@
|
||||
package org.vostan.banvor.board;
|
||||
|
||||
import androidx.core.view.ViewCompat;
|
||||
|
||||
import org.vostan.banvor.model.XYPair;
|
||||
|
||||
import java.util.LinkedList;
|
||||
|
||||
/**
|
||||
@@ -28,21 +31,17 @@ public class Animator implements Runnable
|
||||
|
||||
protected static abstract class XYAction extends Action
|
||||
{
|
||||
int x;
|
||||
int y;
|
||||
protected XYPair _xy = new XYPair();
|
||||
|
||||
public XYAction( int _x, int _y )
|
||||
{
|
||||
x = _x;
|
||||
y = _y;
|
||||
public XYAction( XYPair xy ){
|
||||
_xy.set(xy);
|
||||
}
|
||||
}
|
||||
|
||||
public static class Move extends XYAction
|
||||
{
|
||||
public Move( int x, int y )
|
||||
{
|
||||
super(x,y);
|
||||
public Move( XYPair xy ){
|
||||
super(xy);
|
||||
}
|
||||
|
||||
public void intermediate( Animator ap, int step )
|
||||
@@ -50,16 +49,15 @@ public class Animator implements Runnable
|
||||
|
||||
public void last( Animator ap )
|
||||
{
|
||||
ap.view.getPuzzle().walk(x,y);
|
||||
ap.view.getPuzzle().walk(_xy);
|
||||
ap.view.invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
public static class Push extends XYAction
|
||||
{
|
||||
public Push( int x, int y )
|
||||
{
|
||||
super(x,y);
|
||||
public Push( XYPair xy ){
|
||||
super(xy);
|
||||
}
|
||||
|
||||
public void intermediate( Animator ap, int step )
|
||||
@@ -68,16 +66,15 @@ public class Animator implements Runnable
|
||||
|
||||
public void last( Animator ap )
|
||||
{
|
||||
ap.view.getPuzzle().push(x,y);
|
||||
ap.view.getPuzzle().push(_xy);
|
||||
ap.view.invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
public static class Select extends XYAction
|
||||
{
|
||||
public Select(int x, int y )
|
||||
{
|
||||
super(x,y);
|
||||
public Select( XYPair xy ){
|
||||
super(xy);
|
||||
}
|
||||
|
||||
public void intermediate( Animator ap, int step )
|
||||
@@ -86,7 +83,7 @@ public class Animator implements Runnable
|
||||
|
||||
public void last( Animator ap )
|
||||
{
|
||||
ap.view.getPuzzle().select(x,y);
|
||||
ap.view.getPuzzle().select(_xy);
|
||||
ap.view.invalidate();
|
||||
}
|
||||
}
|
||||
@@ -108,9 +105,8 @@ public class Animator implements Runnable
|
||||
|
||||
public static class NoMove extends XYAction
|
||||
{
|
||||
public NoMove( int x, int y )
|
||||
{
|
||||
super(x,y);
|
||||
public NoMove( XYPair xy ){
|
||||
super(xy);
|
||||
}
|
||||
|
||||
public void intermediate( Animator ap, int step )
|
||||
|
||||
@@ -1,211 +0,0 @@
|
||||
package org.vostan.banvor.board;
|
||||
|
||||
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.util.AttributeSet;
|
||||
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.model.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, new AttributeSet() {
|
||||
// });
|
||||
setContentView( puzzle_view );
|
||||
puzzle_view.setPuzzleControlLister( this );
|
||||
//
|
||||
// Create action bar.
|
||||
//
|
||||
FrameLayout rootLayout = (FrameLayout)findViewById(android.R.id.content);
|
||||
View.inflate(this, R.layout.fragment_puzzle_board, rootLayout);
|
||||
title_text = (TextView)findViewById(R.id.level_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().state().getCurrentLevel()+1;
|
||||
// theApp().state().(nextl);
|
||||
theApp().state().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().state().getCurrentLevel() > App.MIN_LEVEL )
|
||||
{
|
||||
theApp().state().setCurrentLevel( theApp().state().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().state().getCurrentLevel() < theApp().state().getHighestSolvedLevel() )
|
||||
{
|
||||
theApp().state().setCurrentLevel( theApp().state().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().state().getCurrentPuzzle();
|
||||
puzzle_view.setPuzzle(puzzle);
|
||||
updateTitle();
|
||||
}
|
||||
public void updateTitle()
|
||||
{
|
||||
String title = "Level " + new Integer(theApp().state().getCurrentLevel()).toString();
|
||||
setTitle(title);
|
||||
}
|
||||
public void setTitle(CharSequence title)
|
||||
{
|
||||
super.setTitle(title);
|
||||
if (title_text != null) {
|
||||
title_text.setText(title);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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) );
|
||||
}
|
||||
|
||||
}
|
||||
@@ -5,14 +5,14 @@
|
||||
package org.vostan.banvor.board;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Point;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.GestureDetector;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.ScaleGestureDetector;
|
||||
|
||||
import org.vostan.banvor.game.PuzzleLogic;
|
||||
import org.vostan.banvor.model.PuzzleChoreographer;
|
||||
import org.vostan.banvor.model.Puzzle;
|
||||
import org.vostan.banvor.model.XYPair;
|
||||
|
||||
//import android.support.v4.view.GestureDetectorCompat;
|
||||
|
||||
@@ -28,12 +28,13 @@ public class PuzzleControl extends PuzzleView
|
||||
{
|
||||
protected GestureDetector simpled;
|
||||
protected ScaleGestureDetector scaled;
|
||||
protected PuzzleLogic logic;
|
||||
protected PuzzleChoreographer choregrapher;
|
||||
protected Animator animator;
|
||||
protected PuzzleAnimator puzzleAnimator;
|
||||
protected PuzzleControlLister lister;
|
||||
|
||||
protected float lastSpan;
|
||||
protected Point singleTapTile = new Point();
|
||||
protected XYPair singleTapTile = new XYPair();
|
||||
|
||||
public interface PuzzleControlLister
|
||||
{
|
||||
@@ -45,10 +46,11 @@ public class PuzzleControl extends PuzzleView
|
||||
public PuzzleControl(Context c, AttributeSet attributeSet)
|
||||
{
|
||||
super(c,attributeSet);
|
||||
logic = new PuzzleLogic();
|
||||
choregrapher = new PuzzleChoreographer();
|
||||
animator = new Animator( this );
|
||||
animator.setAnimationLister(this);
|
||||
|
||||
puzzleAnimator = new PuzzleAnimator(animator);
|
||||
|
||||
simpled = new GestureDetector( c, this );
|
||||
simpled.setOnDoubleTapListener(this);
|
||||
scaled = new ScaleGestureDetector( c, this );
|
||||
@@ -57,14 +59,21 @@ public class PuzzleControl extends PuzzleView
|
||||
public void setPuzzle( Puzzle p )
|
||||
{
|
||||
super.setPuzzle(p);
|
||||
logic.setPuzzle(p);
|
||||
choregrapher.setPuzzle(p);
|
||||
}
|
||||
|
||||
public void setPuzzleControlLister( PuzzleControlLister l )
|
||||
{
|
||||
lister = l;
|
||||
}
|
||||
|
||||
|
||||
public void undoLastMove(){
|
||||
if ( getPuzzle().isUndoable() ){
|
||||
getPuzzle().restore();
|
||||
invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onTouchEvent(MotionEvent event)
|
||||
{
|
||||
@@ -117,12 +126,12 @@ public class PuzzleControl extends PuzzleView
|
||||
// If the tap is not on a valid tile then there is not point to
|
||||
// continue.
|
||||
//
|
||||
if ( !puzzle.isValid(singleTapTile.x, singleTapTile.y) )
|
||||
if ( !puzzle.isValid(singleTapTile) )
|
||||
return true;
|
||||
//
|
||||
// Create sequence of steps and then animate it.
|
||||
//
|
||||
if ( logic.createSteps(animator, singleTapTile.x, singleTapTile.y) )
|
||||
if ( choregrapher.createSteps(puzzleAnimator, singleTapTile))
|
||||
{
|
||||
puzzle.save();
|
||||
animator.play();
|
||||
|
||||
@@ -18,6 +18,7 @@ import static java.lang.Math.*;
|
||||
import org.vostan.banvor.model.Puzzle;
|
||||
import static org.vostan.banvor.model.Puzzle.*;
|
||||
import org.vostan.banvor.R;
|
||||
import org.vostan.banvor.model.XYPair;
|
||||
|
||||
/**
|
||||
*/
|
||||
@@ -241,7 +242,7 @@ public class PuzzleView extends View
|
||||
* Apply screen to board mapping and if the points are in the
|
||||
* 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 };
|
||||
scr2col.mapPoints( scr_p );
|
||||
@@ -381,7 +382,7 @@ public class PuzzleView extends View
|
||||
//tile_hlpr.roundOut(tile_hlpr);
|
||||
//tile_hlpr.right -=1;
|
||||
//tile_hlpr.bottom -=1;
|
||||
int sym = puzzle.getSym(x,y);
|
||||
int sym = puzzle.getSym(new XYPair(x,y));
|
||||
if ( !Puzzle.hasWorker(sym) )
|
||||
{
|
||||
canvas.drawBitmap(tile[sym],
|
||||
@@ -403,30 +404,30 @@ public class PuzzleView extends View
|
||||
Bitmap normal_worker = ((sym&SELECTED)!=0) ?
|
||||
tile[WORKER|SELECTED] : tile[WORKER];
|
||||
int direction = sym & WORKER_MASK;
|
||||
if ( direction == WORKER_NORTH )
|
||||
{
|
||||
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 )
|
||||
if ( direction == WORKER_FACE_DOWN)
|
||||
{
|
||||
canvas.translate(tile_dest.centerX(), tile_dest.centerY());
|
||||
canvas.rotate(0+rotated);
|
||||
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.rotate(90+rotated);
|
||||
canvas.rotate(180+rotated);
|
||||
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.rotate(-90+rotated);
|
||||
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,
|
||||
tile_src,tile_dest,
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -1,541 +0,0 @@
|
||||
/*
|
||||
* To change this template, choose Tools | Templates
|
||||
* and open the template in the editor.
|
||||
*/
|
||||
package org.vostan.banvor.game;
|
||||
|
||||
import static java.lang.Math.*;
|
||||
import java.util.Arrays;
|
||||
|
||||
import org.vostan.banvor.board.Animator;
|
||||
import org.vostan.banvor.model.Puzzle;
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -7,7 +7,6 @@ import android.util.Log;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
import org.vostan.banvor.model.IPuzzleSource;
|
||||
import org.vostan.banvor.model.Puzzle;
|
||||
|
||||
public class State {
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
package org.vostan.banvor.model;
|
||||
|
||||
public class Coord {
|
||||
public int x;
|
||||
public int y;
|
||||
}
|
||||
@@ -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 );
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
package org.vostan.banvor.model;
|
||||
|
||||
public interface IPuzzleSource {
|
||||
public int getCount();
|
||||
public Puzzle getPuzzle( int i );
|
||||
}
|
||||
@@ -1,14 +1,9 @@
|
||||
package org.vostan.banvor.model;
|
||||
|
||||
//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;
|
||||
@@ -18,28 +13,44 @@ public class Puzzle
|
||||
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 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;
|
||||
|
||||
protected int columns;
|
||||
protected int rows;
|
||||
protected int box_count;
|
||||
private final static XYPair UNSELECTED = new XYPair(-1,-1);
|
||||
|
||||
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 )
|
||||
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)
|
||||
{
|
||||
load( is );
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
@@ -49,39 +60,32 @@ public class Puzzle
|
||||
|
||||
public final int getColumnCount()
|
||||
{
|
||||
return columns;
|
||||
return board_size.x();
|
||||
}
|
||||
public final int getRowCount()
|
||||
{
|
||||
return rows;
|
||||
return board_size.y();
|
||||
}
|
||||
public static int getSymCount()
|
||||
{
|
||||
return MAX_COUNT;
|
||||
}
|
||||
|
||||
public final int getIndex( int x, int y )
|
||||
{
|
||||
return y*columns+x;
|
||||
|
||||
public final int getIndex( final XYPair c ) {
|
||||
return c.y()*board_size.x()+c.x();
|
||||
}
|
||||
public final int getX( int idx )
|
||||
{
|
||||
return idx % columns;
|
||||
}
|
||||
public final int getY( int idx )
|
||||
{
|
||||
return idx / columns;
|
||||
public final XYPair getXY( int idx ) {
|
||||
return new XYPair(idx % board_size.x(), idx / board_size.x());
|
||||
}
|
||||
|
||||
public final int getSym( int x, int y )
|
||||
{
|
||||
return board[getIndex(x,y)];
|
||||
public final int getSym( XYPair c ) {
|
||||
return board[getIndex(c)];
|
||||
}
|
||||
public void setSym( int x, int y, int v )
|
||||
public void setSym( final XYPair xy, int v )
|
||||
{
|
||||
board[getIndex(x,y)]=v;
|
||||
board[getIndex(xy)]=v;
|
||||
}
|
||||
|
||||
|
||||
public static boolean isEmpty( int v )
|
||||
{
|
||||
return (v & FLOOR_MASK) == 0;
|
||||
@@ -95,47 +99,28 @@ public class Puzzle
|
||||
return (v & WORKER) != 0;
|
||||
}
|
||||
|
||||
public final int getWorkerX()
|
||||
{
|
||||
return worker_x;
|
||||
}
|
||||
|
||||
public final int getWorkerY()
|
||||
{
|
||||
return worker_y;
|
||||
public final XYPair getWorker() {
|
||||
return new XYPair(worker);
|
||||
}
|
||||
|
||||
public final boolean isSelected()
|
||||
{
|
||||
return selected_x != -1;
|
||||
return !selected.isEqual(UNSELECTED);
|
||||
}
|
||||
|
||||
public final boolean isSelected( int x, int y )
|
||||
public final boolean isSelected( final XYPair s ) {
|
||||
return selected.isEqual(s);
|
||||
}
|
||||
public final XYPair getSelected()
|
||||
{
|
||||
return selected_x == x && selected_y == y;
|
||||
return new XYPair(selected);
|
||||
}
|
||||
|
||||
public final int getSelectedX()
|
||||
{
|
||||
return selected_x;
|
||||
public final boolean isValid( final XYPair xy ) {
|
||||
return xy.isInside(XYPair.ZERO,board_size);
|
||||
}
|
||||
|
||||
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 isOneStep( final XYPair xy ) {
|
||||
return isValid(xy) && XYPair.sub(worker, xy).l1_norm() == 1;
|
||||
}
|
||||
|
||||
public final boolean isDone()
|
||||
@@ -143,73 +128,42 @@ public class Puzzle
|
||||
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)
|
||||
|
||||
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(x,y) )
|
||||
if ( !isOneStep(xy) )
|
||||
return false;
|
||||
//
|
||||
// Check that this is empty space.
|
||||
//
|
||||
int v = getSym(x,y);
|
||||
int v = getSym(xy);
|
||||
if ( !isEmpty(v) )
|
||||
return false;
|
||||
//
|
||||
@@ -218,38 +172,25 @@ public class Puzzle
|
||||
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);
|
||||
setSym(worker,getSym(worker)&~WORKER_MASK);
|
||||
worker.set(xy);
|
||||
setSym(worker,getSym(worker)|worker_direction(xy));
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean select( int x, int y)
|
||||
public boolean select(XYPair xy)
|
||||
{
|
||||
//
|
||||
// Check that this is one step away.
|
||||
//
|
||||
if ( !isOneStep(x,y) )
|
||||
if ( !isOneStep(xy) )
|
||||
return false;
|
||||
//
|
||||
// Check that this is empty space.
|
||||
//
|
||||
int v = getSym(x,y);
|
||||
int v = getSym(xy);
|
||||
if ( !hasBox(v) )
|
||||
return false;
|
||||
//
|
||||
@@ -258,24 +199,11 @@ public class Puzzle
|
||||
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);
|
||||
selected.set(xy);
|
||||
setSym(worker,getSym(worker)&~WORKER_MASK|SELECTED|worker_direction(xy));
|
||||
setSym(selected,getSym(selected)|SELECTED);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -289,14 +217,13 @@ public class Puzzle
|
||||
//
|
||||
// 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;
|
||||
setSym(worker,getSym(worker)&~SELECTED);
|
||||
setSym(selected,getSym(selected)&~SELECTED);
|
||||
selected.set(UNSELECTED);
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean push(int x, int y)
|
||||
public boolean push(final XYPair xy)
|
||||
{
|
||||
//
|
||||
// If not selected then do nothing.
|
||||
@@ -306,30 +233,29 @@ public class Puzzle
|
||||
//
|
||||
// Check that we go to the selected direction.
|
||||
//
|
||||
if ( selected_x != x && selected_y != y )
|
||||
if ( !selected.isEqual(xy) )
|
||||
return false;
|
||||
//
|
||||
// Check that this is a box that we move.
|
||||
//
|
||||
int v = getSym(x,y);
|
||||
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
|
||||
int next_x = 2*x - worker_x;
|
||||
int next_y = 2*y - worker_y;
|
||||
int next_v = getSym(next_x,next_y);
|
||||
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(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);
|
||||
setSym(xy,getSym(xy)&~BOX);
|
||||
setSym(next,getSym(next)|BOX);
|
||||
walk(xy);
|
||||
select(next);
|
||||
//
|
||||
// Keep track of box count in place.
|
||||
//
|
||||
@@ -344,38 +270,32 @@ public class Puzzle
|
||||
//
|
||||
// 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 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_x = puzzle.worker_x;
|
||||
worker_y = puzzle.worker_y;
|
||||
selected_x = puzzle.selected_x;
|
||||
selected_y = puzzle.selected_y;
|
||||
worker.set(puzzle.worker);
|
||||
selected.set(puzzle.selected);
|
||||
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.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.
|
||||
//
|
||||
@@ -398,6 +318,6 @@ public class Puzzle
|
||||
//
|
||||
public final boolean isUndoable()
|
||||
{
|
||||
return undoStack.size() != 0;
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -1,77 +0,0 @@
|
||||
package org.vostan.banvor.model;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.io.IOException;
|
||||
import static org.vostan.banvor.App.theApp;
|
||||
import org.vostan.banvor.model.Puzzle;
|
||||
|
||||
import org.vostan.banvor.R;
|
||||
|
||||
public class PuzzleContainer implements IPuzzleSource
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
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 |
@@ -4,6 +4,7 @@
|
||||
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
|
||||
@@ -53,8 +54,20 @@
|
||||
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"
|
||||
@@ -67,6 +80,7 @@
|
||||
|
||||
<ImageButton
|
||||
android:src="@drawable/next"
|
||||
android:contentDescription="Next Puzzle"
|
||||
android:scaleType="fitCenter"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
@@ -78,6 +92,7 @@
|
||||
|
||||
<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"
|
||||
@@ -89,6 +104,7 @@
|
||||
|
||||
<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"
|
||||
@@ -97,7 +113,6 @@
|
||||
android:background="@color/transparent"
|
||||
android:scaleType="fitCenter"
|
||||
android:src="@drawable/undo"
|
||||
android:visibility="gone"
|
||||
tools:visibility="visible" />
|
||||
</LinearLayout>
|
||||
|
||||
@@ -108,6 +123,7 @@
|
||||
|
||||
<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"
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@drawable/splash"
|
||||
android:background="@drawable/splash3"
|
||||
tools:context=".PuzzleListFragment">
|
||||
|
||||
<LinearLayout
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@drawable/splash"
|
||||
android:background="@drawable/splash2"
|
||||
tools:context=".WelcomeFragment">
|
||||
|
||||
<!--View
|
||||
|
||||
@@ -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 |
@@ -13,11 +13,13 @@
|
||||
<action
|
||||
android:id="@+id/action_WelcomeFragment_to_PuzzleListFragment"
|
||||
app:destination="@id/PuzzleListFragment"
|
||||
app:enterAnim="@anim/nav_default_enter_anim"
|
||||
app:exitAnim="@anim/nav_default_exit_anim" />
|
||||
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:destination="@id/PuzzleBoardFragment"
|
||||
app:enterAnim="@animator/fragment_slide_left_enter"
|
||||
app:exitAnim="@animator/fragment_slide_left_exit" />
|
||||
</fragment>
|
||||
<fragment
|
||||
android:id="@+id/PuzzleListFragment"
|
||||
@@ -26,7 +28,9 @@
|
||||
tools:layout="@layout/fragment_puzzle_list">
|
||||
<action
|
||||
android:id="@+id/action_PuzzleListFragment_to_PuzzleBoardFragment"
|
||||
app:destination="@id/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"
|
||||
|
||||
@@ -20,6 +20,10 @@
|
||||
<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" />
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -3,13 +3,20 @@ buildscript {
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
//This is needed for SVG->PNG
|
||||
// maven {
|
||||
// url "https://plugins.gradle.org/m2/"
|
||||
// }
|
||||
}
|
||||
dependencies {
|
||||
classpath "com.android.tools.build:gradle:7.0.2"
|
||||
classpath 'com.android.tools.build:gradle:7.0.3'
|
||||
|
||||
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
|
||||
// in the individual module build.gradle files
|
||||
}
|
||||
|
||||