Compare commits

..

799 commits

Author SHA1 Message Date
Hendrik Brummermann
fcd8330db0
Merge pull request #769 from arianne/dependabot/npm_and_yarn/npm_and_yarn-53cbaf2a5b
Some checks failed
CodeQL / Analyze (push) Has been cancelled
Java CI / build (push) Has been cancelled
Bump esbuild from 0.27.2 to 0.28.1 in the npm_and_yarn group across 1 directory
2026-07-12 06:51:38 +02:00
dependabot[bot]
98864f3802
Bump esbuild in the npm_and_yarn group across 1 directory
Some checks failed
Java CI / build (push) Has been cancelled
Bumps the npm_and_yarn group with 1 update in the / directory: [esbuild](https://github.com/evanw/esbuild).


Updates `esbuild` from 0.27.2 to 0.28.1
- [Release notes](https://github.com/evanw/esbuild/releases)
- [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG-2025.md)
- [Commits](https://github.com/evanw/esbuild/compare/v0.27.2...v0.28.1)

---
updated-dependencies:
- dependency-name: esbuild
  dependency-version: 0.28.1
  dependency-type: direct:development
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-14 11:54:18 +00:00
dimitris
0dff60f98e Guard external link launch against ActivityNotFoundException 2026-06-04 15:04:24 -07:00
Hendrik Brummermann
246d9ce288 converted BarehandAttackSprite and RangedAttackSprite to ImageBitmap 2026-03-01 23:04:12 +01:00
Hendrik Brummermann
31d417e31f code cleanup 2026-03-01 23:04:12 +01:00
Hendrik Brummermann
60d20f593b use ImageBitmap for SkillEffect 2026-03-01 23:04:11 +01:00
Hendrik Brummermann
f44e519104
Merge pull request #762 from arianne/dependabot/npm_and_yarn/npm_and_yarn-fb4fae9948
Bump minimatch from 9.0.5 to 9.0.9 in the npm_and_yarn group across 1 directory
2026-03-01 12:54:22 +01:00
dependabot[bot]
70dc2ded31
Bump minimatch in the npm_and_yarn group across 1 directory
Some checks failed
Java CI / build (push) Has been cancelled
Bumps the npm_and_yarn group with 1 update in the / directory: [minimatch](https://github.com/isaacs/minimatch).


Updates `minimatch` from 9.0.5 to 9.0.9
- [Changelog](https://github.com/isaacs/minimatch/blob/main/changelog.md)
- [Commits](https://github.com/isaacs/minimatch/compare/v9.0.5...v9.0.9)

---
updated-dependencies:
- dependency-name: minimatch
  dependency-version: 9.0.9
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-01 10:34:11 +00:00
Hendrik Brummermann
542f4524db converted StatusIconDrawer to ImageBitmap 2026-02-28 18:55:14 +01:00
Hendrik Brummermann
0d25beefa8 refactored singleton class StatusIconDrawer out of RPEntity 2026-02-28 03:14:24 +01:00
Hendrik Brummermann
3a478f341d use HeldObjectManager.get() 2026-02-28 02:30:16 +01:00
Hendrik Brummermann
c9f865a894 slightly reduce size of drag icon to so players focus cursor position 2026-02-23 22:26:32 +01:00
Hendrik Brummermann
afd5329fcc Item uses ImageBitmap instead of HTMLImageElement 2026-02-23 22:08:35 +01:00
Hendrik Brummermann
b8edcfb252 code cleanup 2026-02-22 19:48:41 +01:00
Hendrik Brummermann
bebce66517 use ImageBitmap in DomesticAnimal 2026-02-22 19:32:51 +01:00
Hendrik Brummermann
6f58eef4f5 updated marauroa.jar to set _rpclass before init() 2026-02-22 19:29:26 +01:00
Hendrik Brummermann
4d2925aa4b cleaned up HTMLImageStorage usage 2026-02-22 10:53:57 +01:00
Hendrik Brummermann
fb2ae76fc5 renamed SpriteStore to HTMLImageStore and access it directly 2026-02-22 09:59:37 +01:00
Hendrik Brummermann
aadec09b5d clean up factory class 2026-02-22 09:16:33 +01:00
Hendrik Brummermann
9fd4316d0f removed stendhal.data.sprites variable 2026-02-22 09:09:49 +01:00
Hendrik Brummermann
e1d01dea79 replaced stendhal.ui.gamewindow and stendhal.ui.viewport 2026-02-12 23:52:30 +01:00
Hendrik Brummermann
dd500a36e5 replaced stendhal.zone with Zone.get() 2026-02-12 22:29:45 +01:00
Hendrik Brummermann
8b2727f392 converted stendhal.ui.html into static class HTMLUtil 2026-02-12 21:59:12 +01:00
Hendrik Brummermann
d350c2b494 invoke singleton get-methods instead of SingletonRepo 2026-02-12 21:27:15 +01:00
Hendrik Brummermann
2022b28b76 access OutfitStore singleton directly 2026-02-12 01:42:32 +01:00
Hendrik Brummermann
1f9242ae6f converted to image bitmap 2026-02-10 23:24:15 +01:00
Hendrik Brummermann
03654e4459 prevent path traversal 2026-02-09 22:32:04 +01:00
Hendrik Brummermann
fcadfcdbd3 use ImageBitmap 2026-02-09 22:28:39 +01:00
Hendrik Brummermann
581ffc886a use ImageBitmap and ImageManager 2026-02-09 00:32:54 +01:00
Hendrik Brummermann
e2146721d1 use ImageBitmap in ActivityIndicatorSprite 2026-02-08 22:02:29 +01:00
Hendrik Brummermann
c6a51ffcf3 converted Blood from SpriteStore to ImageManager 2026-02-08 18:45:22 +01:00
Hendrik Brummermann
d846fa5818 created an ImageSprite class for ImageManager ImageRefs and use it 2026-02-08 18:45:05 +01:00
Hendrik Brummermann
13fc7f6b1a deleted unused classes EmptySprite, ImageSprite, Sprite, Tileset 2026-02-08 16:45:36 +01:00
Hendrik Brummermann
86cf9c0959 deleted class ImageSprite 2026-02-08 15:19:16 +01:00
Hendrik Brummermann
7c5cef1181 fixed ctrl direction change 2026-02-08 00:27:36 +01:00
Hendrik Brummermann
72f23a7bc1 call super.destroy() 2026-02-07 22:24:24 +01:00
Hendrik Brummermann
404263a1ef code cleanup 2026-02-07 22:23:33 +01:00
Hendrik Brummermann
b479ec3d52 use ImageManager instead of SpriteStore for weather images 2026-02-07 02:04:40 +01:00
Hendrik Brummermann
b796ba36b0 use ImageManager instead of SpriteStore 2026-02-07 02:01:55 +01:00
Hendrik Brummermann
07a41fddfe cache tileset-images to speed up zone changes 2026-02-07 02:01:21 +01:00
Hendrik Brummermann
97ea5ab442 use ImageManager 2026-02-05 22:09:59 +01:00
Hendrik Brummermann
659c155a36 apply preferences to own outfit 2026-02-05 22:09:39 +01:00
Hendrik Brummermann
0f3ecbd3dd code cleanup 2026-02-05 22:08:12 +01:00
Hendrik Brummermann
535e7f5727 use ImageManager images for preview of outfit parts into Outfit Dialog 2026-02-04 22:57:48 +01:00
Hendrik Brummermann
1bf34316fb support ImageRef.free() without going through the ImageManager 2026-02-04 22:57:01 +01:00
Hendrik Brummermann
c7befd2fe1 support cleanup of ImageManager 2026-02-04 22:15:01 +01:00
Hendrik Brummermann
230b25e5fa added support for filtered images 2026-02-02 22:10:18 +01:00
Hendrik Brummermann
3b6d652aa8 dont return the image in waitFor because it might have expired 2026-02-02 22:04:07 +01:00
Hendrik Brummermann
41604ca00e code cleanup 2026-02-02 21:59:34 +01:00
Hendrik Brummermann
7e0fbe0f16 split ImageRef and ImageRefImpl to hide management methods 2026-02-02 20:54:03 +01:00
Hendrik Brummermann
2bd16f0307 implemented ImageRef.waitFor() 2026-02-01 22:43:01 +01:00
Hendrik Brummermann
afb06b8f97 started to work on ImageManager and ImageRef 2026-02-01 22:25:24 +01:00
Hendrik Brummermann
95f373bd1c removed reference to global stendhal object 2026-02-01 22:25:06 +01:00
Hendrik Brummermann
e58e6a54cb do not use failsave sprite for drag image 2026-01-31 23:11:37 +01:00
Hendrik Brummermann
f109b551f5 optimized image creation 2026-01-31 23:10:42 +01:00
Hendrik Brummermann
5f4d9d9460 moved SpriteStore.getAreaOf() to HTMLImageElementUtil 2026-01-31 21:28:43 +01:00
Hendrik Brummermann
61f047a955 prevent negative positions of dialogs 2026-01-31 17:18:58 +01:00
Hendrik Brummermann
3534bf384f close outfit dialog preview ImageBitmap 2026-01-31 17:06:49 +01:00
Hendrik Brummermann
6b1296e059 renamed MultilayerImage to MultilayerImageLoader 2026-01-31 15:50:39 +01:00
Hendrik Brummermann
c19e4b0627 added filter support to MultilayerImage 2026-01-31 15:50:19 +01:00
Hendrik Brummermann
72d569343a implemented MultilayerImage loader 2026-01-31 14:55:56 +01:00
Hendrik Brummermann
a6708ee0c2 removed references to stendhal.data.map and SingletonRepo.getMap() 2026-01-25 23:43:17 +01:00
Hendrik Brummermann
e0dce1a242 access TileMap directly without referencing stendhal.data.map 2026-01-25 23:33:25 +01:00
Hendrik Brummermann
55e802b988 changed module and moduleResolution for better compatibility 2026-01-25 23:09:08 +01:00
Hendrik Brummermann
d24e452f59 inlined LandscapeRender.ts into CombinedTilesetRenderingStrategy.ts 2026-01-25 23:08:26 +01:00
Hendrik Brummermann
8fc173d923 replaced tileset loader "ImagePreloader" as ImageCache using ImageBitmap 2026-01-25 20:01:31 +01:00
Hendrik Brummermann
1484f872da code cleanup 2026-01-25 19:59:25 +01:00
Hendrik Brummermann
93a99c9c10 moved CombinedTilesetRenderingStrategy out of LandscapeRenderingStrategy 2026-01-25 01:53:13 +01:00
Hendrik Brummermann
79ba39a030 fixed moduleResolution setting 2026-01-25 01:41:35 +01:00
Hendrik Brummermann
1c50a2a454 moved sprite/image/ImageFilter out of data/SpriteStore 2026-01-25 01:40:28 +01:00
Hendrik Brummermann
4feb1e628a use OffscreenCanvas to create outfit sprite 2026-01-24 23:13:03 +01:00
Hendrik Brummermann
662aab6ded use ImageBitmap for minimap static collisions 2026-01-24 18:39:35 +01:00
Hendrik Brummermann
f9fc0230f5 use OffscreenCanvas 2026-01-24 15:13:40 +01:00
Hendrik Brummermann
ba6d507924 inlined DrawingStage into Outfit 2026-01-23 23:00:04 +01:00
Hendrik Brummermann
e121d44356 added TODOs and fixed compiler warnings 2026-01-23 22:47:34 +01:00
Hendrik Brummermann
8b61de02e6 converted Singleton DrawingStage to instance and use Offscreen 2026-01-23 22:47:17 +01:00
Hendrik Brummermann
1ca1f0e47e fixed undefined _hsMap() error 2026-01-23 21:31:57 +01:00
Jordan Irwin
3026afe931
Manually build code in CodeQL workflow as default target has changed 2026-01-20 21:52:22 -08:00
Jordan Irwin
f9a37f122e
Update instances of CodeQL Action to v3 as v2 is now deprecated 2026-01-20 21:39:33 -08:00
Jordan Irwin
fd2cff8618
Clean up README 2026-01-20 20:27:21 -08:00
Jordan Irwin
30494af57c
Fix running server with 'ant server_run' 2026-01-20 19:41:59 -08:00
Jordan Irwin
2ed431fd6a
Add Spanish translations for lemon, banana, & corn 2026-01-20 01:27:31 -08:00
Jordan Irwin
cc4918a5ed
Add Spanish translation for map description 2026-01-20 01:26:38 -08:00
Jordan Irwin
6608eb2b02
Add Spanish translations for some newer items 2026-01-20 01:26:09 -08:00
Jordan Irwin
79622ee9cf
Update Spanish translations for some renamed items 2026-01-20 01:12:57 -08:00
Jordan Irwin
c6f2718aec
Remove trailing periods from translated names 2026-01-20 01:12:06 -08:00
Jordan Irwin
1fd97009eb
Update Spanish translations of item & entity descriptions 2026-01-20 00:19:55 -08:00
Jordan Irwin
517b62c5b1
Update Spanash locale file header 2026-01-20 00:19:29 -08:00
Jordan Irwin
de36580350
Run 'ant locale_update' 2026-01-20 00:14:16 -08:00
Jordan Irwin
3d971f37b5
Update locale template 2026-01-20 00:13:41 -08:00
Jordan Irwin
4666911be6
Don't need English language file 2026-01-20 00:13:30 -08:00
AntumDeluge
c4723aba93 Merge pull request 'Clean Up Ant Build' (#32) from AntumDeluge/stendhal:build_cleanup into master
Reviewed-on: https://codeberg.org/arianne/stendhal/pulls/32
2026-01-20 03:47:18 +01:00
Jordan Irwin
8c93122d1e
Rename target locale_build_template to locale_template 2026-01-19 18:07:18 -08:00
Jordan Irwin
2bec3a151b
Remove unneeded aliases 2026-01-19 18:03:56 -08:00
Jordan Irwin
38f5c0124d
Remove build target descriptions
Descriptions now available in `ant help` target.
2026-01-19 18:03:56 -08:00
Jordan Irwin
2df3243f2d
Make 'help' default target 2026-01-19 18:03:55 -08:00
Jordan Irwin
08873546ba
Add help info to ant build 2026-01-19 18:03:47 -08:00
Jordan Irwin
26c4723749
Move build properties to sub-module 2026-01-19 17:38:39 -08:00
Jordan Irwin
6eeff4766d
Make compile_stendhaltools target alias of compile_tools 2026-01-19 17:38:39 -08:00
Jordan Irwin
737cac9495
Make compile_stendhaltextclient build target alias of compile_textclient 2026-01-19 17:38:33 -08:00
Hendrik Brummermann
5ae5d33438 updated marauroa.jar
Some checks failed
Java CI / build (push) Has been cancelled
2026-01-18 21:41:30 +01:00
Hendrik Brummermann
621a43579a fixed import 2026-01-18 21:05:29 +01:00
Hendrik Brummermann
45cd2ac30e moved onPerceptionEnd method from Client to StendhalPerceptionListener 2026-01-18 14:13:13 +01:00
Hendrik Brummermann
b328b1aedf moved RPObject, RPEvent and RPSlot from Stendhal to Marauroa 2026-01-17 23:50:58 +01:00
Hendrik Brummermann
d633ebf947 use instance of Marauroa class instead of global marauroa object 2026-01-17 15:15:33 +01:00
Hendrik Brummermann
f4935f4928 updated marauroa.jar 2026-01-16 22:07:55 +01:00
Hendrik Brummermann
b71a29f883 user register for RPObjects 2026-01-16 22:04:56 +01:00
Hendrik Brummermann
3424b898b8 created dedicated CorpseSlot class 2026-01-16 22:04:20 +01:00
Hendrik Brummermann
1f3abca39c use register for events 2026-01-16 22:03:57 +01:00
Hendrik Brummermann
d6ca574a20 fixed references to wrong "ui" variable 2026-01-15 21:42:09 +01:00
Hendrik Brummermann
612b4a6b88 code cleanup 2026-01-14 23:09:37 +01:00
Hendrik Brummermann
a13ee36fe8 converted all events to TypeScript 2026-01-14 22:56:50 +01:00
Jordan Irwin
2abc8df666
Run 'ant cleanwhitespace' 2026-01-13 19:12:13 -08:00
Jordan Irwin
14d7e046be
Process ant build files in 'cleanwhitespace' target 2026-01-13 19:09:24 -08:00
Jordan Irwin
6c64621496
Don't try to clean removed 'tiled' directory 2026-01-13 19:09:23 -08:00
Hendrik Brummermann
6a4009c790 fixed build 2026-01-13 23:07:55 +01:00
Hendrik Brummermann
38934a8c09 fixed local builds after esbuild migration 2026-01-13 09:13:54 +01:00
Hendrik Brummermann
738d3cd830 explicitly define marauroa global variable 2026-01-10 00:24:12 +01:00
Hendrik Brummermann
8cb1a7b050 converted stendhal object into a static class 2026-01-09 00:06:37 +01:00
Hendrik Brummermann
d1fc6947b7 use esbuild 2026-01-06 21:45:58 +01:00
Hendrik Brummermann
402bb84c43 fixed this-reference and redirect to character selection on disconnect 2026-01-06 21:44:41 +01:00
Hendrik Brummermann
819b80913f added esbuild as devDependencies 2026-01-06 21:43:57 +01:00
Hendrik Brummermann
da4378d30c updated marauroa 2026-01-06 21:43:35 +01:00
Hendrik Brummermann
37d3e1c84d fixed init order and wrong "this". 2026-01-02 04:11:34 +01:00
Hendrik Brummermann
f1d98fff56 access SpriteStore via singletons instead of stendhal-variable 2026-01-02 04:11:33 +01:00
Jordan Irwin
8f642ac446
Increment version to 1.49.5 2026-01-01 18:33:01 -08:00
Jordan Irwin
6224a0638a
Run 'ant init' to update copyright year 2026-01-01 18:31:27 -08:00
Jordan Irwin
c38740eaab
Use 'versionName' instead of 'versionCode' in Android output filename 2026-01-01 18:24:56 -08:00
Hendrik Brummermann
cbf971e632 replace stendhal.paths with Paths to ensure correct init order 2026-01-02 01:37:39 +01:00
Hendrik Brummermann
7546fbba80 removed unused library 2025-12-30 00:24:38 +01:00
Hendrik Brummermann
face9f3a67 use OffscreenCanvas and ImageBitmap instead of img- and canvas-elements 2025-12-28 18:59:53 +01:00
Hendrik Brummermann
703fa61329 cleaned up references to animations 2025-12-28 18:13:15 +01:00
Hendrik Brummermann
4dbe1f73fe implemented light rendering (to test "/debug light" and change zone) 2025-12-28 17:51:51 +01:00
Hendrik Brummermann
09371bff47 restore transparency after blending 2025-12-28 14:41:39 +01:00
Hendrik Brummermann
6ff59a0040 refactored drawCombinedTileAtIndex and drawTile in preparation for blend 2025-12-28 12:40:28 +01:00
Hendrik Brummermann
063d03c45f used Canvas and RenderingContext2D to allow OffscreenCanvas 2025-12-28 12:32:20 +01:00
Hendrik Brummermann
d191c14232 updated typescript and typedoc 2025-12-28 12:31:20 +01:00
Hendrik Brummermann
d9b51f0d15 disabled code to draw lights (alpha is broken) 2025-12-28 10:04:14 +01:00
Hendrik Brummermann
44f6a4a9fe marked event listener as passive to prevent scroll delay 2025-12-27 13:10:16 +01:00
Hendrik Brummermann
d1d4eb5c49 removed setting alpha in applyHSLFilter method 2025-12-27 13:00:05 +01:00
Hendrik Brummermann
0d56d2b63b renamed Map to TileMap and use type definition 2025-12-26 14:57:00 +01:00
Hendrik Brummermann
a000e5f788 made blend layer available 2025-12-26 14:41:21 +01:00
Jordan Irwin
cc5414894f
Use JDK version 17 in Android Build Test workflow
Current bundled Gradle Wrapper version is 7.5.1, which isn't
compatible with more recent Java releases.
2025-12-24 22:10:38 -08:00
Jordan Irwin
2e5dbc12c6
Validate Gradle Wrapper .jar in Android Build Test workflow 2025-12-24 22:01:09 -08:00
Jordan Irwin
f756534846
Validate Gradle Wrapper distribution checksum not .jar checksum 2025-12-24 21:59:21 -08:00
Jordan Irwin
7174c32521
Send Android Build error report to Discord dev channel 2025-12-24 18:21:32 -08:00
Jordan Irwin
049b91e98b
Don't send details to Discord 2025-12-24 18:21:01 -08:00
Jordan Irwin
a5db37305e
Fix 'run' line 2025-12-24 18:13:57 -08:00
Jordan Irwin
179bc4d5e7
Fix code alignment in Android Build Test GitHub workflow 2025-12-24 18:10:25 -08:00
Jordan Irwin
31c4f9cfb4
Discord webhook for Android Build Test failure 2025-12-24 18:07:00 -08:00
Jordan Irwin
c4491004d2
Parse job ID in Android Build Test GitHub workflow 2025-12-24 18:05:36 -08:00
Jordan Irwin
e910892a16
Build .apk packages using Ant in Android Build Test GitHub workflow 2025-12-24 17:31:39 -08:00
Jordan Irwin
7beb123117
Allow dispatching Android build workflow manually 2025-12-24 17:11:58 -08:00
Hendrik Brummermann
a141cc187d properly format item names in description text of shop windows 2025-12-22 19:21:51 +01:00
Hendrik Brummermann
c68f0a59d5 show outfits in shop sign dialog 2025-12-22 18:06:00 +01:00
Hendrik Brummermann
a3bd4b328a code cleanup 2025-12-22 18:05:49 +01:00
Hendrik Brummermann
9e56945faf use proper table for item shop signs 2025-12-22 17:31:24 +01:00
Hendrik Brummermann
6f783d3ef6 moved ShowItemListEvent and ShowOutfitListEvent out of EventRegistry 2025-12-22 17:02:31 +01:00
Hendrik Brummermann
ccee5a42b3 added experiment to .gitignore 2025-12-21 22:11:50 +01:00
Jordan Irwin
f2d519a29f
Revert "Ensure cargo-license installed for nativehelper build"
This reverts commit d516c738bf.
2025-11-03 03:43:05 -08:00
Jordan Irwin
d516c738bf
Ensure cargo-license installed for nativehelper build 2025-11-03 03:29:09 -08:00
Jordan Irwin
ad92b7f2a9
make sure extensions/binary directory exists when building Neutralinojos app 2025-11-03 00:14:27 -08:00
Hendrik Brummermann
2ee0aaa5e7 created stendhal-client.zip file and renamed executables 2025-11-02 12:12:50 +01:00
Jordan Irwin
6592f5c245
Fix Gourmet achievement
Coal for Haunchy quest slot state was changed to use "done" instead of "waiting".

Closes: https://codeberg.org/arianne/stendhal/issues/28
2025-11-01 00:18:03 -07:00
Jordan Irwin
8206631665
Fix Unit test for Gwen's updated shop prices 2025-10-31 18:21:40 -07:00
Jordan Irwin
bdb34e8628
Reduce outfit prices in Gwen's shop by 50% 2025-10-31 18:07:20 -07:00
Jordan Irwin
0fba46d89b
Minor change to script text output 2025-10-31 17:56:18 -07:00
Jordan Irwin
4a55c4a706
Trim large music files to decrease size to 2MB or less
Should help to mitigate issue with Java client failing to load large music data on systems with low resources.

https://github.com/arianne/stendhal/issues/750
2025-10-31 17:43:09 -07:00
Jordan Irwin
4253e1e73b
Python script to check audio files sizes
Prints warning if file size exceeds 2MB.

https://github.com/arianne/stendhal/issues/750
2025-10-31 17:42:55 -07:00
Jordan Irwin
4e8fe0592e
Add license boilerplates 2025-10-15 20:15:19 -07:00
Jordan Irwin
5709a85824
Set Java client compilation to 8
Support for 7 removed in newer Java versions.
2025-09-25 22:03:44 -07:00
Jordan Irwin
700e3ee730
Replace calls to deprecated URL constructors 2025-09-25 21:58:36 -07:00
Jordan Irwin
0b2cb9df08
Set User-Agent string for Wikipedia API requests
Closes: https://codeberg.org/arianne/stendhal/issues/27
2025-09-25 21:58:27 -07:00
Jordan Irwin
63d9667264
Fix typo in quest dialogue 2025-09-25 19:48:53 -07:00
Jordan Irwin
920ed5a3a2
Add start screen screenshot for F-Droid 2025-09-24 13:15:29 -07:00
Jordan Irwin
f02fc6b04f
Add phone screenshots for F-Droid
Closes https://github.com/arianne/stendhal/issues/754
2025-09-24 13:02:57 -07:00
Jordan Irwin
807a8bb40a
Print authentication status when nativehelper connection closes 2025-09-12 10:40:28 -07:00
Jordan Irwin
e6180e9ff5
Update changes 2025-09-08 23:05:15 -07:00
Jordan Irwin
3de1141898
Close nativehelper extension when clientDisconnect event triggered
Closes https://github.com/neutralinojs/neutralinojs/issues/1458
Closes https://github.com/arianne/stendhal/issues/736
2025-09-08 22:46:57 -07:00
Jordan Irwin
3e31e6b788
Update changes 2025-09-07 13:08:15 -07:00
Jordan Irwin
ff9fb76ab3
Update Neutralino.js to 6.2.0
Closes: https://github.com/arianne/stendhal/issues/696

Commit reference: f46403677c
2025-08-26 13:49:09 -07:00
Jordan Irwin
ccb229efe9
Clean up indentation in Neutralino.js config 2025-08-26 13:48:21 -07:00
Jordan Irwin
5f3f86c6e7
Normalize line endings in Tiled maps 2025-07-26 18:44:53 -07:00
Jordan Irwin
42c30cdbda
Run 'ant clean_whitespace' 2025-07-26 16:08:05 -07:00
Jordan Irwin
01dddc103f
Update Android source location in clean_whitespace target 2025-07-26 16:07:12 -07:00
Hendrik Brummermann
70bcbc3066 perfer Codeberg over Github 2025-01-22 22:18:29 +01:00
Hendrik Brummermann
3c7b1a30ae use Mastodon instead of Twitter 2025-01-22 22:13:20 +01:00
Jordan Irwin
e82524ec2f
Adjust coloring alpha setting to better match Java client 2025-01-09 02:54:59 -08:00
Jordan Irwin
f224b79094
Don't check movement radius if NPC has path 2025-01-02 23:56:42 -08:00
Jordan Irwin
a7e66a4288
Ignore movement limit when radius set to 0
Fixes SilentNPC paths
Closes https://codeberg.org/arianne/stendhal/issues/7
2025-01-02 23:55:56 -08:00
Jordan Irwin
79e882fe5f
Code optimization 2025-01-02 21:50:19 -08:00
Jordan Irwin
8b63897d37
Update copyright year 2025-01-02 14:38:31 -08:00
Jordan Irwin
a24774cda9
Template F-Droid release announcment file for master branch 2024-12-21 15:14:49 -08:00
Jordan Irwin
2746ee1411
Increment version 2024-12-21 15:11:30 -08:00
Jordan Irwin
962bd11aec
Fix Mr Ross's head 2024-12-21 14:57:16 -08:00
Jordan Irwin
a9ae0db9a9
Disable encrypted DependencyInfoBlock in APK build
https://gitlab.com/fdroid/fdroiddata/-/issues/3330
2024-12-20 19:58:47 -08:00
Jordan Irwin
06f4e5eb78
Remove unreachable code block 2024-12-17 19:26:16 -08:00
Jordan Irwin
ade5f226a9
Fix random selecting between patrolling & wander idle behavior 2024-12-17 18:44:43 -08:00
Jordan Irwin
d2f549394d
Touch up scaling artifacts in necrosophia overlay 2024-12-15 22:27:45 -08:00
Hendrik Brummermann
4f9ffc1a48 treat undefined strings as empty 2024-12-11 21:18:38 +01:00
Jordan Irwin
178cd60429
Remove music with questionable licensing from Athor map &...
...restore bongos.
2024-12-03 11:43:16 -08:00
tigertoes
f4f6fd6a2c added second level checking set of portals for entwives 2024-08-08 00:24:19 -04:00
tigertoes
23412db466 modified map to house mithril dragons - access to come 2024-08-07 23:01:42 -04:00
Jordan Irwin
65d0e04af3
Add FIXME note 2024-07-31 04:00:30 -07:00
Jordan Irwin
2cee409a77
Add TODO note 2024-07-31 01:51:35 -07:00
Jordan Irwin
aba72381ea
Override keypress events in login dialog...
Allows using tab key to select fields.
2024-07-31 00:14:02 -07:00
Jordan Irwin
14586c634c
Add logout button to choose character dialog 2024-07-30 23:46:27 -07:00
Jordan Irwin
796a1e09cb
Hide close button of login & character select dialogs 2024-07-30 22:47:00 -07:00
Jordan Irwin
706d485113
Method to hide close button of floating window 2024-07-30 22:37:55 -07:00
Jordan Irwin
a10ec0272d
Add support for rotating outfit preview 2024-07-30 22:15:04 -07:00
Jordan Irwin
d53d3f690e
Use OutfitPreviewComponent for composite preview in outfit dialog 2024-07-30 22:13:11 -07:00
Jordan Irwin
52b1df5f96
Component for creating an outfit preview 2024-07-30 22:11:06 -07:00
Jordan Irwin
76feee77fd
Class to represent an entity's outfit 2024-07-30 22:11:06 -07:00
Jordan Irwin
bf60fed1b8
Method to add image directly to SpriteStore cache 2024-07-30 22:10:43 -07:00
Jordan Irwin
c4aa1a9786
Add method to OutfitStore to check if layer uses "skin" coloring 2024-07-30 21:34:06 -07:00
Jordan Irwin
21d00772ad
Move layer names to OutfitStore 2024-07-30 21:23:52 -07:00
Jordan Irwin
2d232b1646
Drawing stage class for manipulating images before they are...
...displayed
2024-07-30 21:13:15 -07:00
Jordan Irwin
0f2a5117f5
Function to check if string is empty or contains whitespace only 2024-07-30 21:04:40 -07:00
Jordan Irwin
cb6db786f2
Function for padding string on left side 2024-07-30 21:03:54 -07:00
Jordan Irwin
212eba66d5
Convert StringUtil class to namespace 2024-07-30 20:58:19 -07:00
Jordan Irwin
cdadb33ca0
Add license boilerplate 2024-07-25 18:54:41 -07:00
Jordan Irwin
5e4d873a38
Flip pathfinding button icon & fill with white 2024-07-25 15:27:03 -07:00
Jordan Irwin
cb4d5b609f
Update changes 2024-07-25 02:32:39 -07:00
Jordan Irwin
a6f3e22538
Create test for dojo seller/repairer NPC (Akutagawa) 2024-07-25 02:32:39 -07:00
Jordan Irwin
7c1b52bff6
Fix Akutagawa's repair prices 2024-07-25 02:32:38 -07:00
Jordan Irwin
8930612a49
Fix repairer checks & conditions 2024-07-25 02:32:38 -07:00
Jordan Irwin
b7c552cdf4
Fix supported item check in repair request 2024-07-25 02:32:38 -07:00
Jordan Irwin
236bb8bd72
Fix repairer dynamic responses 2024-07-25 02:32:37 -07:00
Jordan Irwin
89ee706681
Set conversation state in ChatAction 2024-07-25 02:32:37 -07:00
Jordan Irwin
ef768a1ba6
Don't pass item name to canRepair method 2024-07-25 02:32:36 -07:00
Jordan Irwin
c8f5d45eef
Support plural & case-insensitive repair requests 2024-07-25 02:32:36 -07:00
Jordan Irwin
98e0cf4222
Reset assassin repairer when conversation ends or repair is executed 2024-07-25 02:32:36 -07:00
Jordan Irwin
b6f066508f
Remove fixme note & unneeded warning suppression 2024-07-25 02:32:35 -07:00
Jordan Irwin
2dc2318a3b
Move methods from AssassinRepairerAdder to AssassinRepairer 2024-07-25 02:32:35 -07:00
Jordan Irwin
bbe8c03b97
Fixed condition to check if player dropped items before confirming...
...repair
2024-07-25 02:32:34 -07:00
Jordan Irwin
e06b6737c4
Convert response IDs to enum 2024-07-25 02:32:17 -07:00
Jordan Irwin
d6428edaf3
Set locale when converting to lower case 2024-07-25 02:31:42 -07:00
Jordan Irwin
b71d3a7ccc
Add doc string 2024-07-25 02:31:15 -07:00
Jordan Irwin
42f98da03f
Add "repair" to chat options merchant activities list 2024-07-25 01:56:01 -07:00
Jordan Irwin
418d9cde03
Add repair phrases to ConversationPhrases 2024-07-25 01:56:01 -07:00
Jordan Irwin
9e387d13ec
Methods to get entities by class type 2024-07-25 01:23:01 -07:00
Jordan Irwin
cbf59d11b8
Don't try to autobind if player is null 2024-07-25 01:22:56 -07:00
Jordan Irwin
0de7b82913
Add todo notes 2024-07-24 19:01:03 -07:00
Jordan Irwin
228898fa15
Add/Clean up doc strings 2024-07-24 19:00:32 -07:00
Jordan Irwin
21b6930a11
Reword changes section 2024-07-23 22:08:03 -07:00
Jordan Irwin
38c71e284e
Update changes 2024-07-23 17:28:48 -07:00
Jordan Irwin
593d27f2c4
Hide screen capture behing debugging property 2024-07-23 17:24:32 -07:00
Jordan Irwin
26b56245b9
Add support for viewport video capture using application menu 2024-07-23 17:24:31 -07:00
Jordan Irwin
e867756659
Add support for viewport video capture using slash action 2024-07-23 17:24:31 -07:00
Jordan Irwin
f33639737c
Class for capturing video of viewport 2024-07-23 17:24:30 -07:00
Jordan Irwin
a70721a98f
Make DownloadUtil.timestamp public 2024-07-23 17:24:28 -07:00
Jordan Irwin
96e8aa1a1f
Add ring of clarity drop to golden orc 2024-07-23 16:57:09 -07:00
Jordan Irwin
743eaf8384
Add ring of clarity drop to unicorn 2024-07-23 16:57:04 -07:00
Jordan Irwin
e81ee6a33c
Ring of clarity (increases atk accuracy by 25%) 2024-07-23 16:44:49 -07:00
Jordan Irwin
585981f8c4
Add item attribute to affect hit chance 2024-07-23 16:38:57 -07:00
Jordan Irwin
d5f3712ee7
Add method to get all items from equipment slots 2024-07-23 16:38:52 -07:00
Jordan Irwin
68b99deaec
Fix typo 2024-07-23 15:30:19 -07:00
Jordan Irwin
1bc83e61c0
Use variable instance instead of raw value 2024-07-23 15:30:00 -07:00
Jordan Irwin
c76392f854
Add fixme/todo notes 2024-07-23 15:29:35 -07:00
Jordan Irwin
c2a79db036
Use xml config to set up dojo seller/repairer NPC 2024-07-23 02:09:54 -07:00
Jordan Irwin
4794564af9
Remove ShopsList.addBuyer method 2024-07-23 02:09:07 -07:00
Jordan Irwin
254ebf2ee1
Un-deprecated overload of ShopsList.add 2024-07-23 02:06:14 -07:00
Jordan Irwin
d5a889c58e
Replace calls to deprecated ShopsList.get 2024-07-23 00:56:32 -07:00
Jordan Irwin
5e7b1f9c73
Remove calls to deprecated get & init methods in ShopsXMLLoader 2024-07-23 00:33:23 -07:00
Jordan Irwin
ce872ef5d2
Suppress unused method warning 2024-07-23 00:33:19 -07:00
Jordan Irwin
ed42b5a074
Parameterize references to generic type Class<T> 2024-07-23 00:28:55 -07:00
Jordan Irwin
26883d7afa
Add license boilerplate 2024-07-22 23:50:34 -07:00
Jordan Irwin
e166b717b3
Un-deprecate NPC.moveRandomly 2024-07-22 23:39:11 -07:00
Jordan Irwin
24fbeee56b
Return Point instead of Pair from getRandomSpawnPosition 2024-07-22 23:28:07 -07:00
Jordan Irwin
f520851d46
Add TODO note 2024-07-22 15:56:15 -07:00
Jordan Irwin
e76888cc51
Support setting wander radius limit in IdleBehaviourFactory 2024-07-22 15:49:47 -07:00
Jordan Irwin
5cf76c7f03
Apply wander behavior to dog NPCs 2024-07-22 15:41:23 -07:00
Jordan Irwin
9bd676a3c3
Support returning to origin in wander behavior 2024-07-22 15:25:23 -07:00
Jordan Irwin
81b46c3fa0
Return squared distance when calculating distance to entity origin...
...and make method public
2024-07-22 15:08:36 -07:00
Jordan Irwin
2edcfb1cf7
Return squared distance when calculating distance to entity origin 2024-07-22 15:07:25 -07:00
Jordan Irwin
bf5a4e73bd
Overload Rand.flipCoin for result with even probability 2024-07-22 14:11:20 -07:00
Jordan Irwin
485e626083
Add doc strings & code cleanup 2024-07-22 09:55:33 -07:00
Jordan Irwin
1f5d4be5ed
Update TODO note 2024-07-22 05:17:46 -07:00
Jordan Irwin
423bd033e0
Add TODO note 2024-07-22 03:52:16 -07:00
Jordan Irwin
96acebae7d
Admin script to manage clover 2024-07-21 21:38:48 -07:00
Jordan Irwin
40db53c75d
Add method to check for spawned clover 2024-07-21 21:38:18 -07:00
Jordan Irwin
01a3d15134
Don't try to remove clover from zone if it has already been...
...picked up by player
2024-07-21 21:36:32 -07:00
Jordan Irwin
345926808a
Add TODO note 2024-07-20 15:45:51 -07:00
Jordan Irwin
637effbf69
New quest: Lucky Four-Leaf Clover 2024-07-20 15:00:13 -07:00
Jordan Irwin
e2cf347731
New NPC: Maple, a clover hunter 2024-07-20 15:00:13 -07:00
Jordan Irwin
e681dc2fcc
Sprite image for clover hunter NPC (OGA BY)
Using dress 55 & hair 46.
2024-07-20 15:00:12 -07:00
Jordan Irwin
02ef1ed34f
New achievement: Luck O' the Irish
Find the four-leaf clover
2024-07-20 15:00:12 -07:00
Jordan Irwin
05ff7ffd66
Mark Sikhw maps as innaccessible 2024-07-20 15:00:11 -07:00
Jordan Irwin
336d83854f
Configure four-leaf clover spawner with 0_semos_plains_n map 2024-07-20 15:00:11 -07:00
Jordan Irwin
ac34c133ee
Four-leaf clover configurator 2024-07-20 15:00:04 -07:00
Jordan Irwin
e6b34706ac
Four-leaf clover spawner
https://stendhalgame.org/wiki/Stendhal_Quest_Ideas/Lucky_Four_Leaf_Clover
2024-07-20 14:59:06 -07:00
Jordan Irwin
aad2005dc0
Return item in growNewFruit 2024-07-20 14:57:16 -07:00
Jordan Irwin
e6e0d60bf5
Four-leaf clover item 2024-07-20 14:57:16 -07:00
Jordan Irwin
845df00bdd
Image for clover item (OGA BY)
Copied from lucky charm
2024-07-20 14:57:15 -07:00
Jordan Irwin
1af92af6af
Methods to get a random spawn position in a zone 2024-07-20 14:57:15 -07:00
Jordan Irwin
dcc390c30a
Method to get seconds to midnight from current time 2024-07-20 14:57:14 -07:00
Jordan Irwin
d5adb7c5ae
Add touched up base to kid1npc sprite 2024-07-18 10:43:57 -07:00
Jordan Irwin
92752ac7fe
Add touched up template for laying human adult 2024-07-18 10:43:18 -07:00
Jordan Irwin
e1f897fa30
Update changes 2024-07-15 11:01:35 -07:00
Jordan Irwin
3ba6448011
Make Amber wander 2024-07-15 10:39:22 -07:00
Jordan Irwin
0d334d4a22
Use wander idle behavior with rabbits in Fado 2024-07-15 10:39:21 -07:00
Jordan Irwin
2848042ea7
Don't stop or change direction until after position change to prevent...
...sprite jumping
2024-07-15 10:39:21 -07:00
Jordan Irwin
fccda47c93
Add support for using idle behavior with other NPC types 2024-07-15 10:39:20 -07:00
Jordan Irwin
a4fc86c04a
Add pre-logic to NPC types 2024-07-15 10:39:19 -07:00
Jordan Irwin
4dd4e8840c
Move wander idle behavior class to NPC package 2024-07-15 10:39:18 -07:00
Jordan Irwin
52a3809c35
Move idle behavior classes to NPC package 2024-07-15 10:39:17 -07:00
Jordan Irwin
757eb04038
Make idle behaviour work with NPC class 2024-07-15 10:39:16 -07:00
Jordan Irwin
6653634128
Add wander behavior to crabs in addition to patrolling 2024-07-15 10:38:47 -07:00
Jordan Irwin
8d42afbf0d
Change turtle behavior to wander 2024-07-15 10:38:46 -07:00
Jordan Irwin
2d43a41541
Allow randomly selecting between "patrolling" & "wander" behavior...
...when both are included in AI profiles
2024-07-15 10:38:46 -07:00
Jordan Irwin
858320c8e2
Reset idler to prevent stopping creature during chase 2024-07-15 10:38:45 -07:00
Jordan Irwin
95bf1616ba
Handle creature collision in idler if available 2024-07-15 10:38:44 -07:00
Jordan Irwin
0616ea3a8b
AI profile for "wandering" entities 2024-07-15 10:38:43 -07:00
Jordan Irwin
246a5b47dc
Add reset method to idle behavior classes 2024-07-15 10:38:42 -07:00
Jordan Irwin
0f118cbe46
Add onMoved method to idle behavior classes 2024-07-15 10:38:42 -07:00
Jordan Irwin
2f78691d05
Add methods to handle collision in idle behavior classes 2024-07-15 10:38:41 -07:00
Jordan Irwin
28b7ae2a23
Abstract idle behavior class 2024-07-15 10:38:40 -07:00
Jordan Irwin
f8a09deb53
Add method to randomly change NPC direction 2024-07-15 10:38:39 -07:00
Jordan Irwin
87c1111b63
Don't load sounds for events that are too far to be heard
https://github.com/arianne/stendhal/issues/742
2024-07-15 09:40:35 -07:00
Jordan Irwin
d0d0330ea2
Fall back to default sound radius 2024-07-15 09:36:33 -07:00
Jordan Irwin
7412928f51
Move sound event to its own class file 2024-07-15 09:36:32 -07:00
Jordan Irwin
a2bcd77959
Move default sound radius to common class 2024-07-15 09:36:32 -07:00
Jordan Irwin
ee715a5fe5
Announce new offers with Harold in chat/IRC 2024-07-14 19:50:10 -07:00
Jordan Irwin
b614dad186
Fix licensing of lucky charm 2024-07-11 00:29:43 -07:00
Jordan Irwin
179520b9df
Clean up item graphics sources 2024-07-11 00:26:59 -07:00
Jordan Irwin
ba56253b84
Clean up comment 2024-07-09 20:26:34 -07:00
Jordan Irwin
e906f1f3df
Add Region.DENIRAN_CITY & change appropriate quests 2024-07-09 20:26:33 -07:00
Jordan Irwin
4d2d68907a
Specify how many unicorn horns Zelan needs
Closes https://github.com/arianne/stendhal/issues/421
2024-07-09 16:20:35 -07:00
Jordan Irwin
8a75706607
Clean up grammar in Zelan's dialogue 2024-07-09 16:14:13 -07:00
Jordan Irwin
d6f528f81a
Treat "chaos" as both singular & plural
Closes https://github.com/arianne/stendhal/issues/586
2024-07-09 15:56:47 -07:00
Jordan Irwin
4db3ad4d67
Change Elodrin's skin color to match elves
Closes https://github.com/arianne/stendhal/issues/616
2024-07-09 15:04:19 -07:00
Jordan Irwin
fc644a9755
Update changes 2024-07-09 14:57:15 -07:00
Jordan Irwin
0c32227a7b
Clean up bestiary window layout
Closes https://github.com/arianne/stendhal/issues/675
2024-07-09 14:56:23 -07:00
Jordan Irwin
a39f2e65db
Move bestiary event to its own class 2024-07-09 14:25:46 -07:00
Jordan Irwin
65fb1748a7
Add transformation effect to vampires 2024-07-09 00:10:58 -07:00
Jordan Irwin
df48d0daac
Update changes 2024-07-08 23:16:17 -07:00
Jordan Irwin
a26777d722
Redraw electricity overlays 2024-07-08 23:10:52 -07:00
Jordan Irwin
9f532e2bc3
Extract flames from necrosophia sprite & use as overlay...
...animation (WIP)
2024-07-08 23:10:51 -07:00
Jordan Irwin
1827a40eac
Fix attack sprite animation 2024-07-08 23:10:51 -07:00
Jordan Irwin
091c6deb79
Use OverlaySpriteImpl as base for AttackSprite 2024-07-08 23:10:50 -07:00
Jordan Irwin
abcbc1dbae
Rename ActionSprite to AttackSprite 2024-07-08 23:10:49 -07:00
Jordan Irwin
1d3a249d76
Replace Aenihata's static overlay with animated one 2024-07-08 23:10:49 -07:00
Jordan Irwin
7929acb4d2
Add ice sparkles overlay to ice giant 2024-07-08 23:10:48 -07:00
Jordan Irwin
54d149a7bd
Add ice sparkles overlay to ice golem 2024-07-08 23:10:47 -07:00
Jordan Irwin
c0f3e237c1
Create ice sparkles overlay animation 2024-07-08 23:10:47 -07:00
Jordan Irwin
4c05093b01
Extract electricity from dark elf master sprite & use as...
...overlay animation
2024-07-08 23:10:46 -07:00
Jordan Irwin
c22e919f9c
Extract electricity from dark elf viceroy sprite & use as...
...overlay animation
2024-07-08 23:10:45 -07:00
Jordan Irwin
4d1251c906
Extract electricity from imperial demon lord sprite & use as...
...overlay animation
2024-07-08 23:10:45 -07:00
Jordan Irwin
f662040941
Extract beams from albino elf magician sprite & use as overlay...
...animation
2024-07-08 23:10:44 -07:00
Jordan Irwin
77972930a5
Extract blue flame from emperor dalmung sprite & use as overlay...
...animation
2024-07-08 23:10:44 -07:00
Jordan Irwin
19346b3143
Extract flame from archrat sprite & use as overlay animation 2024-07-08 23:10:43 -07:00
Jordan Irwin
20b9335645
Extract magic sparkles from Tywysoga sprite & use as overlay...
...animation
2024-07-08 23:10:42 -07:00
Jordan Irwin
5a4904c96f
Add support for direction dependent overlay animations 2024-07-08 23:10:41 -07:00
Jordan Irwin
d028bc624e
Move overlay effect creation to EntityOverlayRegistry 2024-07-08 23:10:41 -07:00
Jordan Irwin
ace5065bd3
Add setting to disable entity overlay effects 2024-07-08 23:10:32 -07:00
Jordan Irwin
f2055ab79e
Sprite class to represent an entity skill animation 2024-07-08 21:58:07 -07:00
Jordan Irwin
2e6bcc67ba
Sprite class to represent an entity overlay animation 2024-07-08 21:58:05 -07:00
Jordan Irwin
fe5cde1145
Add support for animated overlay for NPC & creature entities 2024-07-08 21:58:03 -07:00
Jordan Irwin
5c883098c2
Touch up Barbarus's sprite 2024-07-08 21:49:15 -07:00
Jordan Irwin
8f9aa9825b
Adjust glow monster's eyes 2024-07-08 20:06:18 -07:00
Jordan Irwin
78a60745a5
Draw mohawk on glow monster & remove fins
https://github.com/arianne/stendhal/issues/624
2024-07-08 19:57:58 -07:00
Jordan Irwin
d7703f3721
Draw daggers for blordrough storm trooper
https://github.com/arianne/stendhal/issues/624
2024-07-08 19:28:05 -07:00
Jordan Irwin
ba6e2848f0
Add staff from dark elf wizard to emperor dalmung
https://github.com/arianne/stendhal/issues/624
2024-07-08 19:04:13 -07:00
Jordan Irwin
6771560c91
Draw sword for barbarian elite
https://github.com/arianne/stendhal/issues/624
2024-07-08 18:26:50 -07:00
Jordan Irwin
a510097efb
Add cape from chaos soldier to minotaur king
https://github.com/arianne/stendhal/issues/624
2024-07-06 02:54:40 -07:00
Jordan Irwin
fbdc8e33cf
Draw bracers & nose ring for minotaurs
https://github.com/arianne/stendhal/issues/624
2024-07-06 02:38:55 -07:00
Jordan Irwin
4d5fc5cee2
Draw sword for armed naga
https://github.com/arianne/stendhal/issues/624
2024-07-06 01:51:57 -07:00
Jordan Irwin
d5153a72af
Draw staff for oni priest
https://github.com/arianne/stendhal/issues/624
2024-07-06 01:16:45 -07:00
Jordan Irwin
fc81162673
Touch-ups to dark elf matronmother to make sword more noticable
https://github.com/arianne/stendhal/issues/624
2024-07-06 00:24:54 -07:00
Jordan Irwin
c1078e197c
Touch-ups to dark elf ranger cape 2024-07-06 00:13:35 -07:00
Jordan Irwin
c653a2b35c
Remove hat, add hairband & cape to resemble old dark elf ranger...
...sprite better

https://github.com/arianne/stendhal/issues/624
2024-07-05 23:52:13 -07:00
Jordan Irwin
792ca5e414
Add kerchief from risicia thug to dark elf ranger
https://github.com/arianne/stendhal/issues/624
2024-07-05 23:16:08 -07:00
Jordan Irwin
b09aa4e2c2
Revert catching error when opening audio resource 2024-07-05 23:16:08 -07:00
Jordan Irwin
45b271bd72
Update changes 2024-07-05 22:29:04 -07:00
Jordan Irwin
32a2ac6957
Rename parameter 2024-07-05 22:16:59 -07:00
Jordan Irwin
96df82c461
Catch general error/exception when loading audio resource 2024-07-05 22:15:57 -07:00
Jordan Irwin
b936af9375
Add pitchfork from chaos dragonrider to dark mutant
https://github.com/arianne/stendhal/issues/624
2024-07-04 04:36:49 -07:00
Jordan Irwin
675913dcfa
Add sword from chaos warrior to soldier elf
https://github.com/arianne/stendhal/issues/624
2024-07-04 04:04:46 -07:00
Jordan Irwin
84d1b7aab4
Draw new shield for veteran goblin
https://github.com/arianne/stendhal/issues/624
2024-07-03 22:06:34 -07:00
Jordan Irwin
062b4d1667
Draw new helmet for soldier goblin
https://github.com/arianne/stendhal/issues/624
2024-07-03 20:58:55 -07:00
Jordan Irwin
8a46d1e8ce
Touch ups to chaos lord's swords 2024-07-03 20:18:52 -07:00
Jordan Irwin
958a36d2de
Add swords from imperial general to chaos lord
https://github.com/arianne/stendhal/issues/624
2024-07-03 20:03:40 -07:00
Jordan Irwin
873048f98b
Draw new claw for chaos commander
https://github.com/arianne/stendhal/issues/624
2024-07-03 19:53:19 -07:00
Jordan Irwin
66d280f10c
Add knife from risecia thug to fallen angel
https://github.com/arianne/stendhal/issues/624
2024-07-02 17:48:23 -07:00
Jordan Irwin
92089cbcaa
Make Waerryna look like a dark elf
Closes https://github.com/arianne/stendhal/issues/615
2024-07-02 03:15:29 -07:00
Jordan Irwin
0ce79fdad8
Add special case to prevent Mayor Chalmers from taking...
...experimental sandwiches rewarded from Meal for Groongo quest

Closes https://github.com/arianne/stendhal/issues/729
2024-07-02 02:27:28 -07:00
Jordan Irwin
d60d216466
Add methods to exclude quest non-submittable items 2024-07-02 02:18:59 -07:00
Jordan Irwin
4746f125ed
Add methods to check if an item should be submittable in quests 2024-07-02 02:15:51 -07:00
Jordan Irwin
3e5d472bc3
Move RPEntity.nameMatches to static Item.nameMatches 2024-07-02 01:24:05 -07:00
Jordan Irwin
3845fc69da
Add hint about apothecary breadcrumbs in Traps for Klaas travel log
Closes https://github.com/arianne/stendhal/issues/617
2024-07-01 19:38:09 -07:00
Jordan Irwin
97ff41869f
Fix typo in Klaas's dialogue 2024-07-01 19:36:10 -07:00
Jordan Irwin
a5251127dc
Add attribution to rg1024 for bag cursors 2024-06-23 22:13:44 -07:00
Jordan Irwin
46f63776cb
Fix license & attribution of attack & harvest cursors 2024-06-23 21:52:30 -07:00
Jordan Irwin
d6aed77641
Quick menu button to toggle pathfinding via ground 2024-06-23 21:51:30 -07:00
Jordan Irwin
a6ddc99d8d
Use arrow function notation when registering click listener for...
...quick menu buttons
2024-06-23 21:41:17 -07:00
Jordan Irwin
46e399b30f
Add release notes text 2024-06-23 19:40:22 -07:00
Jordan Irwin
22b57a3e5e
Delete old Lua documentation 2024-06-23 19:39:21 -07:00
Jordan Irwin
8ce87348e1
Clean up ant build properties 2024-06-23 19:11:58 -07:00
Jordan Irwin
a2747d3f80
Delete unused ant build properties 2024-06-23 19:09:56 -07:00
Jordan Irwin
b01060f667
Remove unnecessary override 2024-06-22 02:02:48 -07:00
Jordan Irwin
8ede1b841a
Use ActiveEntity.getFaceDirection to determine sprite drawing...
...index. Defaults to "down" when facing direction cannot be determined.

Closes: https://github.com/arianne/stendhal/issues/721
2024-06-21 22:27:52 -07:00
Jordan Irwin
542fe5be1b
Add method ActiveEntity.getFaceDirection 2024-06-21 22:27:30 -07:00
Jordan Irwin
e80ce98382
Add failsafe to ActiveEntity.getWalkDirection 2024-06-21 22:27:15 -07:00
Jordan Irwin
c3f81e5d31
Add failsafe to SoundManager.normVolume
Underlying issue may still need fixed.

https://github.com/arianne/stendhal/issues/714
2024-06-21 22:26:55 -07:00
Jordan Irwin
2df0596cfc
Fix conversion between int/float volume ranges 2024-06-21 00:55:37 -07:00
Jordan Irwin
947fc79489
New music for Athor Island
- Island Mountain by David Kvistorf (CC0): https://opengameart.org/node/78672
- Jump and Run Tropics by Bart Kelsey (CC BY-SA 3.0): https://opengameart.org/node/3801
2024-06-20 22:09:03 -07:00
Jordan Irwin
43353e1ef8
Change default master volume to 50 2024-06-15 23:48:44 -07:00
Jordan Irwin
98e2f70218
Description for pelt
https://sourceforge.net/p/arianne/patches/762/
2024-06-15 18:34:00 -07:00
Jordan Irwin
30399d830d
Description for polar bear
https://sourceforge.net/p/arianne/patches/761/
2024-06-15 18:31:24 -07:00
Jordan Irwin
60026dde03
Description for elder cannibal
https://sourceforge.net/p/arianne/patches/760/
2024-06-15 18:29:46 -07:00
Jordan Irwin
9a5e5b0223
Description for giant killer bat
https://sourceforge.net/p/arianne/patches/759/
2024-06-15 18:27:00 -07:00
Jordan Irwin
356f36ad07
Method to add listener to update config on change event 2024-06-15 17:04:43 -07:00
Jordan Irwin
60cb09077f
Support multiple change event listeners 2024-06-15 17:04:43 -07:00
Jordan Irwin
4d50010790
Code cleanup 2024-06-15 17:04:40 -07:00
tigertoes
2b10df791f fix grammar for hole in the ground 2024-06-15 19:53:04 -04:00
Jordan Irwin
752626b3aa
Use Tooltip class in SettingsComponent 2024-06-13 22:15:02 -07:00
Jordan Irwin
4b6319d910
Move Component.refresh to super class 2024-06-13 22:10:15 -07:00
Jordan Irwin
29d53375c0
Rework tooltip class 2024-06-13 22:05:02 -07:00
Jordan Irwin
582748b551
Clean up docstrings 2024-06-13 20:35:25 -07:00
Jordan Irwin
6f5a275694
Display quickmenu by default for touch devices 2024-06-13 20:34:51 -07:00
Jordan Irwin
98d5349bb4
Add "cloaks" to Josephine's known chat options
https://github.com/arianne/stendhal/issues/640
Closes https://github.com/arianne/stendhal/issues/612
2024-06-13 15:53:37 -07:00
Jordan Irwin
c1241a3e08
Add workaround to display "loan" & "nothing" triggers in Lost...
...Wedding Ring quest

https://github.com/arianne/stendhal/issues/640
2024-06-13 15:16:07 -07:00
Jordan Irwin
16a6731d24
Methods to delete transition matching state, trigger, & condition 2024-06-13 15:14:00 -07:00
Jordan Irwin
d1c96181a5
Add workaround to display "clothes" trigger in Supplies for Phalk quest
https://github.com/arianne/stendhal/issues/640
2024-06-13 13:42:17 -07:00
Jordan Irwin
7f06ef1346
Add methods to force triggers to display as chat options even if not...
...registered in transition
2024-06-13 13:42:03 -07:00
Jordan Irwin
4e4fa1aeca
Call learnWordsInCurrentConversation in overloaded SpeakerNPC.say...
...method
2024-06-13 13:27:53 -07:00
Jordan Irwin
0c2ff23ed1
Add "rent" to Gordon's known chat options
https://github.com/arianne/stendhal/issues/640
2024-06-13 11:40:46 -07:00
Jordan Irwin
d1174e5fd6
Add FIXME note 2024-06-13 11:40:45 -07:00
Jordan Irwin
7fa046294b
Don't process learned words from conversation when not attending to a...
...player
2024-06-13 11:40:45 -07:00
Jordan Irwin
01b6cf9dc7
Show chat options marked as "known" even when not included in...
...transition triggers
2024-06-13 11:40:44 -07:00
Jordan Irwin
fa0a522070
Normalize known chat options to lower case 2024-06-13 11:40:33 -07:00
Jordan Irwin
5a8add7e5d
Use Debug class for marking settings & touch for debugging 2024-06-12 16:30:36 -07:00
Jordan Irwin
e3188b3986
Class for marking properties for debugging 2024-06-12 16:26:55 -07:00
Jordan Irwin
5072211638
Setting to disable parallax backgrounds 2024-06-10 10:42:22 -07:00
Jordan Irwin
0bc610eb6c
Add stars parallax background to lower levels of wizards tower 2024-06-09 19:40:17 -07:00
Jordan Irwin
ee7faac1da
Add parallax backgrounds to Semos Tower levels 8 & 9 2024-06-08 02:07:49 -07:00
Jordan Irwin
9c0315793a
Change attribute name to "parallax_ignore_tiles" 2024-06-08 01:24:48 -07:00
Jordan Irwin
a39087c1ab
Update changes 2024-06-08 00:44:42 -07:00
Jordan Irwin
f9af9aa9df
Add parallax background to Kika Clouds 2024-06-08 00:32:44 -07:00
Jordan Irwin
f7baa36ede
Add parallax background to Kika Islands 2024-06-08 00:32:43 -07:00
Jordan Irwin
1cef2c4f6a
Add to clouds tileset for use with edges 2024-06-08 00:32:43 -07:00
Jordan Irwin
086cfbe00b
Create parallax background for area surrounding Semos 2024-06-08 00:32:42 -07:00
Jordan Irwin
59a0727dd1
Add support for alternate floor layer for client's that support...
...parallax backgrounds
2024-06-08 00:32:42 -07:00
Jordan Irwin
7e1f493839
Add support for specifying tiles not to draw in web client 2024-06-07 23:35:25 -07:00
Jordan Irwin
d9a045f2d5
Update changes 2024-06-07 20:24:51 -07:00
Jordan Irwin
3675593ae4
Disable "roof" & "roof_add" layers in Kika Clouds 2024-06-07 20:23:49 -07:00
Jordan Irwin
631fd7d932
Don't load map layer marked as "locked" and not "visible" 2024-06-07 20:23:09 -07:00
Jordan Irwin
b2447e8c7d
Add animated clouds to Kika Clouds 2024-06-07 01:03:30 -07:00
Jordan Irwin
07f367b9bc
Animated clouds 2024-06-07 01:02:30 -07:00
Jordan Irwin
eca1a46448
Make transitions code more readable 2024-06-06 14:38:30 -07:00
Jordan Irwin
9257fe4ee5
Add support for parallax scrolling backgrounds in web client 2024-06-06 08:10:54 -07:00
Jordan Irwin
13f136adc8
Cache failsafe image at startup 2024-06-06 08:09:06 -07:00
Jordan Irwin
9fb6a0d96e
Fix layers opacity 2024-06-06 08:07:55 -07:00
Jordan Irwin
6356e1f23c
Don't assume on-time delivery when timestamp isn't available 2024-06-05 22:44:44 -07:00
Jordan Irwin
8f6c3cacdf
Fix paths in map rendering build targets 2024-06-05 02:13:18 -07:00
Jordan Irwin
a08d9ae3e2
Move vampire_maplabel script to bin directory 2024-06-05 01:57:06 -07:00
Jordan Irwin
9f854e7ab7
Make vampire_maplabel position independent 2024-06-05 01:53:54 -07:00
Jordan Irwin
6cb9be3b49
Clean up vampire_maplabel script 2024-06-04 23:03:22 -07:00
Jordan Irwin
1e4bbaa84a
Move system dependent properties to Ant submodule 2024-06-04 22:50:05 -07:00
Jordan Irwin
033b302d9f
Clean up system executables properties 2024-06-04 22:38:44 -07:00
Jordan Irwin
0c722d8a12
Fix location of locale-template script 2024-06-04 22:32:51 -07:00
Jordan Irwin
2ae840aaf1
Fix location of vampire_maplabel script 2024-06-04 22:25:36 -07:00
Jordan Irwin
0f1e8927ea
Use global neu executable 2024-06-04 21:25:47 -07:00
Jordan Irwin
5f8d34f249
Fix calling neu executable on Windows 2024-06-04 21:07:27 -07:00
Jordan Irwin
07346dd0eb
Clean up indentation 2024-06-04 20:19:44 -07:00
Jordan Irwin
7336fc1821
Allow aborting/restarting deliver item quest in case player lost item...
...or quest is stuck in state where player cannot finish
2024-06-03 18:47:38 -07:00
Jordan Irwin
953b7b5b20
Add failsafe to DeliverItemTask.isDeliveryTooLate 2024-06-03 14:31:06 -07:00
Jordan Irwin
3927596105
Fix parsing completions count of Kill Enemy Army quest 2024-06-03 14:11:43 -07:00
Jordan Irwin
fd39cda6e3
Animated fog for web client 2024-06-01 15:08:44 -07:00
Jordan Irwin
3ab51b17ea
Tileable fog for animation generated with G'MIC: https://gmic.eu/ 2024-06-01 15:08:31 -07:00
Jordan Irwin
85d6cff21a
Convert client entry point to TypeScript 2024-05-31 23:02:05 -07:00
Jordan Irwin
c53a1ebef7
Fix event parameter type 2024-05-31 22:39:28 -07:00
Jordan Irwin
8873a242b2
Add TODO note 2024-05-31 20:55:58 -07:00
Jordan Irwin
38d0e8d715
Replace refrences to getSoundManager with stendhal.sound where appropriate 2024-05-31 20:51:27 -07:00
Jordan Irwin
347008b896
Replace references to stendhal.ui.soundMan with stendhal.sound 2024-05-31 20:39:30 -07:00
Jordan Irwin
77f6e44abb
Minor optimization 2024-05-31 20:31:35 -07:00
Jordan Irwin
8128bed44e
Don't store sound manager instances in class properties 2024-05-31 20:29:00 -07:00
Jordan Irwin
3496eb9af4
Store sound manager instance in stendhal.sound 2024-05-31 20:14:20 -07:00
Jordan Irwin
c1b967d1b5
Move SoundManager & LoopedSoundSourceManger classes to data/sound 2024-05-31 20:04:29 -07:00
Jordan Irwin
60173d582d
Move SoundLayer enum to data/sound 2024-05-31 19:43:53 -07:00
Jordan Irwin
7d2c2e128f
Move SoundFactory class to data/sound 2024-05-31 19:40:30 -07:00
Jordan Irwin
68cf101189
Increment version 2024-05-31 17:49:51 -07:00
Hendrik Brummermann
a9baa4af19 updated Android release notes 2024-05-30 23:25:04 +02:00
Jordan Irwin
7113c11d53
Fix parsing error 2024-05-29 02:24:29 -07:00
Jordan Irwin
6723d7f5bf
Replace program logic in quest manuscript classes 2024-05-28 21:28:14 -07:00
Jordan Irwin
fb158dbc11
Quest manuscript completions count always in index 2 2024-05-28 21:02:42 -07:00
Jordan Irwin
bcedecad50
Correct grammar in House Buying history 2024-05-28 20:15:07 -07:00
Jordan Irwin
057afa534a
Support possessive form in Grammar 2024-05-28 20:14:32 -07:00
Jordan Irwin
e61506126c
Update changes 2024-05-28 18:58:27 -07:00
Jordan Irwin
212dc7623e
Show House Buying in open quests during owed taxes period
https://github.com/arianne/stendhal/issues/716
2024-05-28 18:54:35 -07:00
Jordan Irwin
dbc3de7055
Admin script to manage House Buying 2024-05-28 18:54:20 -07:00
Jordan Irwin
a7bdde5331
Don't play weather sound if weather is disabled 2024-05-28 04:59:54 -07:00
Jordan Irwin
9e4ef5146b
Performance optimization: Require refresh/map change to update...
...lighting effects setting
2024-05-28 04:45:56 -07:00
Jordan Irwin
bf275d84bf
Use standard message when changing weather setting 2024-05-28 04:30:23 -07:00
Jordan Irwin
02cdffe0af
Add setting to enable/disable activity indicator animation 2024-05-28 04:21:28 -07:00
Jordan Irwin
45b94965e9
Convert activity indicator setting to component 2024-05-28 04:00:38 -07:00
Jordan Irwin
c9c06ad5a7
Require refresh/map change to update activity indicator setting 2024-05-28 03:57:15 -07:00
Jordan Irwin
c302d2dcd6
Class for displaying some commonly used messages in chat log 2024-05-28 03:20:11 -07:00
Jordan Irwin
c0288c5360
Add visuals tab to settings dialog 2024-05-28 02:59:57 -07:00
Jordan Irwin
2277a276fb
Add TODO note 2024-05-28 02:58:10 -07:00
Hendrik Brummermann
f376b0cb87 added TODO about removing program logic from quest manuscripts 2024-05-26 23:07:52 +02:00
Jordan Irwin
05eb315e41
Reword changes 2024-05-26 12:51:42 -07:00
Jordan Irwin
6385ed51cb
Disable sliders when sound not enabled 2024-05-26 12:45:46 -07:00
Jordan Irwin
05d61c6bcb
Add ComponentBase.setEnabled method 2024-05-26 12:45:05 -07:00
Jordan Irwin
71ad4108fd
Add SettingsComponent.getValue method 2024-05-26 12:44:31 -07:00
Jordan Irwin
4379d81a25
Add sliders for remaining sound layers in settings dialog 2024-05-26 11:59:55 -07:00
Jordan Irwin
b9de8c3117
Fix button spacing of chat log context menu 2024-05-26 05:03:23 -07:00
Jordan Irwin
23332a7c8c
Add FIXME note 2024-05-26 04:45:12 -07:00
Jordan Irwin
477a0ed37d
Add support for passing filename parameter to DownloadHandler.download 2024-05-26 04:26:27 -07:00
Jordan Irwin
4276878a60
Support plain text download in Android client
Closes: https://github.com/arianne/stendhal/issues/727
2024-05-26 04:20:11 -07:00
Jordan Irwin
75895904e6
Clean up extra trailing semicolon 2024-05-26 03:13:04 -07:00
Jordan Irwin
356937fe33
Remove unused property TimeUtil.TURNS_IN_MINUTE 2024-05-26 01:13:21 -07:00
Jordan Irwin
59abb15ba5
Use seconds instead of turns for entity path suspensions 2024-05-26 01:11:10 -07:00
Jordan Irwin
f7f01ecaa0
Update changes pertaining to Android release 2024-05-25 20:08:15 -07:00
Jordan Irwin
2049f2b4b7
Add TODO note 2024-05-25 01:21:23 -07:00
Jordan Irwin
02602f0bc5
Reword changes 2024-05-25 01:12:36 -07:00
Jordan Irwin
07d34cf25b
Disable Portuguese translation pending review 2024-05-25 01:05:31 -07:00
Jordan Irwin
0bc6f28204
In case of logout in arena, update deathmatch slot after teleport to...
...allow player to start again

Closes: https://github.com/arianne/stendhal/issues/724
2024-05-25 01:00:27 -07:00
Jordan Irwin
e02d87b8e6
Add FIXME note 2024-05-25 00:54:18 -07:00
Jordan Irwin
0b056f3b81
Show number of hot deliveries in Pizza Delivery quest history 2024-05-24 20:58:12 -07:00
Jordan Irwin
31911288d7
Class for adding a customized result to BuiltQuest history 2024-05-24 20:55:52 -07:00
Jordan Irwin
0e4bca7399
Delete Enum class 2024-05-21 19:23:12 -07:00
Jordan Irwin
0ccc0ecf71
Delete unused NumericEnum class 2024-05-21 18:47:23 -07:00
Jordan Irwin
e8ca6e4c6d
Convert Layout to standard enum 2024-05-21 18:46:08 -07:00
Jordan Irwin
3224e60189
Move Layout enum to data/enum 2024-05-21 18:37:42 -07:00
Jordan Irwin
43e45c29ff
Convert WidgetType to standard enum 2024-05-21 18:37:35 -07:00
Jordan Irwin
ad6d75617f
Rename SettingsType enum to WidgetType 2024-05-21 18:09:19 -07:00
Jordan Irwin
511828cff1
Move re-tell action to its own class 2024-05-21 13:51:28 -07:00
Jordan Irwin
f4202cb65d
Move tell action to its own class 2024-05-21 13:51:20 -07:00
Jordan Irwin
8fd4876f4f
Add TODO note 2024-05-21 13:04:21 -07:00
Jordan Irwin
ff3debc55c
Make characer name chat tab completions case insensitive 2024-05-21 11:32:27 -07:00
Jordan Irwin
a8bfff60a8
Remove content limit in Pair 2024-05-21 09:19:59 -07:00
Jordan Irwin
9575e933c0
Use 'stendhal' object instead of setting class file variables 2024-05-20 06:12:27 -07:00
Jordan Irwin
d3b6ad1509
Limit pair data types values 2024-05-20 06:06:48 -07:00
Jordan Irwin
497c14aaac
Clean up indentation 2024-05-20 06:06:29 -07:00
Jordan Irwin
85d9a37189
Schedule freezing hell at server startup
Can be disabled with -Dstendhal.nohellfreezer
2024-05-19 21:29:16 -07:00
Jordan Irwin
92a215ea3b
Convert freeze hell script to AbstractAdminScript 2024-05-19 21:29:12 -07:00
Hendrik Brummermann
be6e05ac4c
Merge pull request #720 from KarajuSs/pl-fdroid
Polish description translations for F-Droid
2024-05-19 23:54:40 +02:00
Jordan Irwin
a1889565a5
Add TODO notes 2024-05-18 08:05:51 -07:00
Jordan Irwin
16cbe8ee7b
Move util/Color to data/color/Color 2024-05-17 01:32:10 -07:00
Jordan Irwin
b04807320f
Move locale template script to bin directory 2024-05-17 00:53:17 -07:00
Jordan Irwin
ae99d29757
Remove duplicate license boilerplate 2024-05-17 00:41:06 -07:00
Jordan Irwin
8af14b678f
Script for checking & optionally updating copyright...
...boilerplate year(s) in source files
2024-05-17 00:40:57 -07:00
Jordan Irwin
c7a4b5b915
Fix content policy error regarding inline style in LICENSE.html 2024-05-16 13:43:27 -07:00
Jordan Irwin
582b0fdc33
Allow browser's context menu in about dialog 2024-05-16 12:15:40 -07:00
Jordan Irwin
1da8d96d76
Update changes 2024-05-16 08:00:03 -07:00
Jordan Irwin
93e7d4e6cc
Remove experimental flag from light effects & enable by default 2024-05-16 07:57:09 -07:00
Jordan Irwin
4a04d40354
Draw coloring directly onto canvas instead of using slow filter 2024-05-16 07:48:31 -07:00
Jordan Irwin
a1fd258665
Fix color classes & helper methods 2024-05-16 07:45:16 -07:00
Jordan Irwin
c607055942
Better number to hex string method 2024-05-16 07:42:48 -07:00
Jordan Irwin
28347f0089
Add static path to maps root directory 2024-05-16 00:24:24 -07:00
Jordan Irwin
28eb3e111a
Add FIXME note 2024-05-14 22:16:04 -07:00
Jordan Irwin
3c30c36642
Allow requesting different item for Ultimate Collector quest...
...after 6 months

Closes: https://github.com/arianne/stendhal/issues/719
2024-05-14 12:06:15 -07:00
Jordan Irwin
04e0516af5
Add constants for minutes in a year & half year 2024-05-14 11:58:01 -07:00
Jordan Irwin
3cf04e90a4
Check for empty string for clarity 2024-05-14 01:21:08 -07:00
Jordan Irwin
c226c7529a
Add master volume slider to settings dialog 2024-05-13 21:53:36 -07:00
Jordan Irwin
fa071e486c
Component to represet slider widget & label 2024-05-13 21:52:37 -07:00
Jordan Irwin
c63d39c80d
Widget component abstract class 2024-05-13 21:50:04 -07:00
Jordan Irwin
a899c8d0d4
Update volume levels at client startup
Closes: https://github.com/arianne/stendhal/issues/722
2024-05-13 21:28:04 -07:00
Jordan Irwin
52d1569418
Move French & Italian description translations to temporary...
...files until certified by a fluent speaker.
2024-05-13 16:52:03 -07:00
Kamil Lewicki
2fa88a3fa2
Corrected polish full description 2024-05-12 23:44:42 +02:00
Kamil Lewicki
cb2b22e062
Add Polish full description translation for F-Droid 2024-05-12 23:35:03 +02:00
Kamil Lewicki
4c25015baf
Add shorten polish description translation for F-Droid 2024-05-12 23:34:45 +02:00
Hendrik Brummermann
7ff2b3213e replaced machine translated text with English version 2024-05-12 21:47:31 +02:00
Jordan Irwin
5e92cca27b
Move SoundID to data/sound 2024-05-10 19:43:52 -07:00
Jordan Irwin
9695c3b169
Add TODO note 2024-05-10 19:37:19 -07:00
Jordan Irwin
f980165564
Add optional parameter to specify private message sender name 2024-05-10 19:36:36 -07:00
Jordan Irwin
61bf897294
Wrapper for RPClass to avoid using attribute names set in constructor 2024-05-10 19:36:14 -07:00
Jordan Irwin
dd759e2d1d
Add sounds tab to settings dialog 2024-05-10 05:47:46 -07:00
Jordan Irwin
a47ccb6e2f
Component class to represent configuration setting element 2024-05-10 05:47:45 -07:00
Jordan Irwin
af9f6c1335
Enumeration class for sound layers 2024-05-10 05:47:36 -07:00
Jordan Irwin
32eba455c2
String type enumeration class 2024-05-10 05:37:36 -07:00
Jordan Irwin
78df10f5e4
Component base class that doesn't require DOM element to exist at construction 2024-05-10 05:37:19 -07:00
Jordan Irwin
7e4be06914
Move & rename enumeration classes 2024-05-10 05:37:05 -07:00
Jordan Irwin
1fef7ea24e
Make Enumeration class abstract 2024-05-10 05:36:53 -07:00
Jordan Irwin
5c3d00d1d7
Fix RingsmithNPC Lua script 2024-05-09 02:16:06 -07:00
Jordan Irwin
6a79c25963
Expose TimeUtil class to Lua 2024-05-09 02:15:48 -07:00
Jordan Irwin
287bdc71be
Code & whitespace cleanup 2024-05-09 01:15:07 -07:00
Jordan Irwin
2f5480a1cf
Add default case 2024-05-09 01:13:32 -07:00
Jordan Irwin
5b167c69fd
Add boilerplates 2024-05-09 01:10:31 -07:00
Jordan Irwin
3375a4b1da
Add annotations to suppress unused parameter warning of some...
...protected methods
2024-05-09 01:05:02 -07:00
Jordan Irwin
17ca660a86
Add annotations to suppress unused parameter warning of some public...
...constructors & methods
2024-05-09 00:42:08 -07:00
Jordan Irwin
58c07e1879
Add method to check tile animation JSON data 2024-05-08 23:39:46 -07:00
Jordan Irwin
fea1e459e0
Move MathHelper members to TimeUtil since only used by server 2024-05-08 22:01:50 -07:00
Jordan Irwin
ef2725881b
Prevent "menu" attribute from being removed from persistent items
https://github.com/arianne/stendhal/issues/699
2024-05-07 06:42:43 -07:00
Jordan Irwin
106ee5bac4
Don't require admin member to be set in abstract admin script 2024-05-07 06:05:10 -07:00
Jordan Irwin
abce198c17
Throw error when param count max is less than min 2024-05-07 06:02:06 -07:00
Jordan Irwin
2c9bb43815
Make standard messages more robust 2024-05-07 06:01:22 -07:00
Jordan Irwin
185f4d1317
Admin script for debugging weather server side 2024-05-07 00:46:13 -07:00
Jordan Irwin
677dbf791d
Add wrapper methods for sending admin script messages 2024-05-07 00:46:13 -07:00
Jordan Irwin
657acc2a9c
Add standard message 2024-05-07 00:45:54 -07:00
Jordan Irwin
c0054efbf7
Set continuous movement attribute by default for house portals
Can be disabled with "disable_movecont" attribute
2024-05-06 07:07:48 -07:00
Jordan Irwin
8bf15d9226
Add resistance to portal in Ados house 70 2024-05-06 05:49:15 -07:00
Jordan Irwin
073c720bea
Set admin script member instead of passing instance to methods 2024-05-06 05:49:15 -07:00
Jordan Irwin
6e05acb3a9
Include admin script help info by default 2024-05-06 05:49:15 -07:00
Jordan Irwin
9046201324
Return empty list by default instead of null 2024-05-06 05:49:14 -07:00
Jordan Irwin
11f53c059b
Fix indenting admin script output 2024-05-06 05:49:13 -07:00
Jordan Irwin
c986b39065
Add more standard messages 2024-05-06 05:44:32 -07:00
Hendrik Brummermann
5c57b1e2bf added triggers and quote 2024-05-05 23:50:38 +02:00
Hendrik Brummermann
c31baea485 reorganized legal section to emphazize that everything is free software 2024-05-05 23:49:40 +02:00
Hendrik Brummermann
495ac0c564 replaced subclass of ArrayList with standard HashSet 2024-05-05 00:02:49 +02:00
Jordan Irwin
92a29f8e83
Factory for creating sound objects 2024-05-04 02:25:34 -07:00
Jordan Irwin
ecd9ee8995
Move Sound inteface to data.SoundFactory.SoundObject 2024-05-04 02:25:09 -07:00
Jordan Irwin
3101478f26
Clean up imports 2024-05-04 02:24:44 -07:00
Jordan Irwin
165243496b
Show a "none" option on touch enabled devices when travel log...
...items list is empty
2024-05-03 19:01:38 -07:00
Jordan Irwin
84331c9c28
Add method to detect touch enabled devices 2024-05-03 19:01:09 -07:00
Jordan Irwin
ba18071fe0
Set first item as selected & trigger "change" event when travel...
...log type changes
2024-05-03 18:59:58 -07:00
Jordan Irwin
693886254b
Don't send event for travel log options without value 2024-05-03 18:32:13 -07:00
Jordan Irwin
315329d601
Display larger buttons on any system using coarse pointer (touch) 2024-05-03 17:26:36 -07:00
Jordan Irwin
7f39b6498a
Update localate template 2024-05-02 03:08:22 -07:00
Jordan Irwin
ec0a24d710
Add theming to context menus 2024-05-01 01:48:37 -07:00
Jordan Irwin
4d3b231164
Add support for left/right aligned tabs 2024-05-01 01:43:33 -07:00
Jordan Irwin
090bf94b45
Make layout parameter require & change tab elements initial ordering 2024-05-01 01:38:08 -07:00
Jordan Irwin
a008d8737a
Add padding to settings dialog tabs contents 2024-05-01 00:51:59 -07:00
Jordan Irwin
dd340e8079
Convert settings dialog to tabbed interface 2024-05-01 00:46:19 -07:00
Jordan Irwin
3d50f62a9a
Make AboutDialog inherit TabDialogContentComponent 2024-05-01 00:40:18 -07:00
Jordan Irwin
db59996152
Component for creating dialog contents with tabbed interface 2024-05-01 00:38:32 -07:00
Jordan Irwin
d10b81197b
Add methods to get theme & font maps from config manager 2024-05-01 00:37:01 -07:00
Jordan Irwin
5d01675294
Restore initial display style instead of setting to block 2024-05-01 00:36:30 -07:00
Jordan Irwin
b1508b1391
Remove unneeded extra outer container in settings dialog 2024-04-30 22:29:22 -07:00
Jordan Irwin
ca9af8f66f
Add methods to create dialog buttons 2024-04-30 22:26:16 -07:00
Jordan Irwin
ea40a18c18
Add optional contents parameter to TabPanelComponent.addTab 2024-04-30 20:01:49 -07:00
Jordan Irwin
7355a3d934
Change travel log tabs to match other tabbed components 2024-04-30 19:27:16 -07:00
Jordan Irwin
f9de2abe7d
Add some padding above dialog buttons 2024-04-30 19:10:27 -07:00
Jordan Irwin
7ebc0839ee
Place about dialog tabs above contents 2024-04-30 19:03:46 -07:00
Jordan Irwin
d667689a04
Add support for placing component tabs above contents 2024-04-30 19:03:37 -07:00
Jordan Irwin
77bb08ca0a
Enumeration type representing layout of elements 2024-04-30 18:26:25 -07:00
Jordan Irwin
076559bfe7
Classes to represent enumeration types 2024-04-30 18:25:20 -07:00
Jordan Irwin
f6b55032e3
Clean up line breaks (limit to 100 characters) 2024-04-29 22:12:29 -07:00
Jordan Irwin
7139a82d52
Add German full description translation for F-Droid 2024-04-29 22:09:52 -07:00
Jordan Irwin
c0553eba5e
Clean up line breaks (limit to 100 characters) 2024-04-29 20:52:42 -07:00
Jordan Irwin
970296890d
Add Italian full description translation for F-Droid 2024-04-29 20:44:16 -07:00
Jordan Irwin
6828b22dfe
Add French full description translation for F-Droid 2024-04-29 19:31:49 -07:00
Jordan Irwin
6512a2bc0c
Add Portuguese full description translation for F-Droid 2024-04-28 01:29:36 -07:00
Jordan Irwin
51a0bf94f4
Add Spanish full description translation for F-Droid 2024-04-28 01:29:35 -07:00
Jordan Irwin
3e5871007a
Update changes 2024-04-27 22:01:09 -07:00
Jordan Irwin
0280e8083a
Display travel log dialog while waiting for server response 2024-04-27 22:00:43 -07:00
Jordan Irwin
946ba0ab30
Move progressstatus action into separate class file 2024-04-27 21:41:29 -07:00
Jordan Irwin
91fb13c933
Add wrapper method SlashAction.send 2024-04-27 21:34:01 -07:00
Jordan Irwin
fc67f54be6
Fix infinite request loop when travel log dialog items list is...
...technically empty
2024-04-27 21:05:49 -07:00
Jordan Irwin
54eb03c5e9
Change 30 Minutes or Less achievement to 25 quest completions 2024-04-27 18:23:15 -07:00
Jordan Irwin
f71d98c8aa
New achievement: 30 Minutes or Less
Deliver 5 hot pizzas
2024-04-26 00:15:11 -07:00
Jordan Irwin
be279d48cc
Track on time deliveries 2024-04-25 23:28:39 -07:00
Jordan Irwin
4b31550218
Fix note 2024-04-25 22:54:07 -07:00
Jordan Irwin
4bc4732d9a
Add "menubutton" class to character select buttons
https://github.com/arianne/stendhal/issues/417
2024-04-25 21:08:25 -07:00
Jordan Irwin
3d4a30c06e
Make buttons, inputs, & selects larger on small screens where...
...fine pointing device isn't detected (touch screens)

https://github.com/arianne/stendhal/issues/417
2024-04-25 21:06:15 -07:00
Jordan Irwin
7a00021188
Move font face declarations into separate stylesheet 2024-04-25 18:35:41 -07:00
Jordan Irwin
e8d9413d40
Move stylesheets into css directory 2024-04-25 18:34:02 -07:00
Jordan Irwin
256d80226b Don't throw error if build directory doesn't exist 2024-04-24 00:27:26 -07:00
Jordan Irwin
c6bbd109e7 Disable default excludes 2024-04-24 00:27:26 -07:00
Jordan Irwin
70456c41ad
Exclude build/eclipse from ant clean target 2024-04-23 19:23:10 -07:00
Jordan Irwin
11edc7ed84
Use relative link to contributors page 2024-04-22 17:59:51 -07:00
Jordan Irwin
530d29fde3
Update legal section of README 2024-04-22 17:56:52 -07:00
Jordan Irwin
490767249f
Update how to play section of README 2024-04-22 17:56:28 -07:00
Jordan Irwin
860b9cbbfc
Add some details & shading to age achievement icon 2024-04-22 16:42:35 -07:00
Jordan Irwin
5923af3576
Move on-screen joystick management into its own class 2024-04-21 23:01:43 -07:00
Jordan Irwin
8beac8192c
Add support for saving chat log to plain text file 2024-04-21 23:01:37 -07:00
Jordan Irwin
3c2e41d05e
Move screenshot creation to DownloadUtil 2024-04-21 22:38:45 -07:00
Jordan Irwin
7d92d1e28e
Classes for creating downloadable files 2024-04-21 22:38:32 -07:00
Jordan Irwin
0811ef4077
Create constructor for MenuItem class 2024-04-21 22:38:31 -07:00
Jordan Irwin
d2bc58dccd Fix potential null pointer access 2024-04-21 14:23:19 -07:00
Jordan Irwin
d06b044367 Replace deprecated call to ShopsList.configureNPC 2024-04-21 14:23:19 -07:00
Jordan Irwin
b75e11e846 Parameterize ShopInventory instances as suggested by Eclipse 2024-04-21 14:23:19 -07:00
Jordan Irwin
3fe87fdee8 Clean up unused values in ShopsXMLLoader 2024-04-21 14:23:19 -07:00
Jordan Irwin
52b5cd4a61 Add unused notations suggested by Eclipse 2024-04-21 14:23:19 -07:00
Jordan Irwin
dab41ffa97 Use ShopGroupXMLLoader to configure merchant NPC tests 2024-04-21 14:23:19 -07:00
Hendrik Brummermann
7a328e22cc
Merge pull request #694 from AntumDeluge/dev_depends
Save typedoc & showdown Node modules as dev depends to prevent re-downloading
2024-04-21 20:34:41 +02:00
nhnb
623c6ae35f Merge pull request 'Add Romanian description for F-Droid' (#1) from cosmin/stendhal:translate-fdroid-ro into master
Reviewed-on: https://codeberg.org/arianne/stendhal/pulls/1
2024-04-21 08:28:21 +00:00
Cosmin Humeniuc
96c3b54ee0
Add Romanian description for F-Droid 2024-04-21 10:15:01 +03:00
Jordan Irwin
85dbe3330a
Show joystick/d-pad by default if pointer device is not detected 2024-04-20 14:48:10 -07:00
Jordan Irwin
5ab1003a8d
Add option to config manager to check if a key value is set 2024-04-20 14:45:35 -07:00
Jordan Irwin
000bbc05eb
Save typedoc & showdown modules as dev depends to prevent re-downloading 2024-04-19 17:30:07 -07:00
Jordan Irwin
a28525fe23
Shorten description translations for F-Droid character limit 2024-04-19 16:43:47 -07:00
Jordan Irwin
e9b07fa02c
Merge pull request #706 from licaon-kter/patch-1
Shorten short-description
2024-04-19 16:34:46 -07:00
Licaon_Kter
c30ef6e91f
Shorten short-description 2024-04-18 12:06:02 +00:00
Jordan Irwin
417d0a41ef
Remove note about achievement idea added to wiki 2024-04-17 00:06:16 -07:00
Jordan Irwin
6195a0687f
Update Unicorn Horns for Zelan quest for checking completions
https://github.com/arianne/stendhal/issues/230
2024-04-15 19:04:02 -07:00
Jordan Irwin
a45fc7b47d
Update Traps for Klaas quest for checking completions
https://github.com/arianne/stendhal/issues/230
2024-04-15 19:01:07 -07:00
Jordan Irwin
2cccd40b66
Update Pizza Delivery quest for checking completions
https://github.com/arianne/stendhal/issues/230
2024-04-15 18:57:44 -07:00
Jordan Irwin
7d62bbb723
Update Eggs for Marianne quest for checking completions
https://github.com/arianne/stendhal/issues/230
2024-04-15 18:54:50 -07:00
Jordan Irwin
66bac0618f
Update Clean Athor's Underground quest for checking completions
https://github.com/arianne/stendhal/issues/230
2024-04-15 18:51:47 -07:00
Jordan Irwin
7289b9f9de
Update Kill Gnomes quest for checking completions
https://github.com/arianne/stendhal/issues/230
2024-04-15 18:42:53 -07:00
Jordan Irwin
087b5b4733
Update Rhosyd for Elf Princess quest for checking completions
https://github.com/arianne/stendhal/issues/230
2024-04-15 18:30:46 -07:00
Jordan Irwin
904f0a3c8d
Update Campfire quest for checking completions
https://github.com/arianne/stendhal/issues/230
2024-04-15 18:30:12 -07:00
Jordan Irwin
412bcb28bc
Update Amazon Princess quest for checking completions
https://github.com/arianne/stendhal/issues/230
2024-04-15 18:29:33 -07:00
Jordan Irwin
86910286fa
Update Find Jef's Mother quest for checking completions
https://github.com/arianne/stendhal/issues/230
2024-04-15 18:28:40 -07:00
Jordan Irwin
f41e13d519
Update Kill Enemy Army quest for checking completions
https://github.com/arianne/stendhal/issues/230
2024-04-15 18:28:09 -07:00
Jordan Irwin
725378d44a
Update Kill Monks quest for checking completions
https://github.com/arianne/stendhal/issues/230
2024-04-15 18:27:24 -07:00
Jordan Irwin
1f2642c29e
Update Maze quest for checking completions
https://github.com/arianne/stendhal/issues/230
2024-04-15 18:26:44 -07:00
Jordan Irwin
ab93c838f2
Update Meal for Groongo Rahnnt quest for checking completions
https://github.com/arianne/stendhal/issues/230
2024-04-15 18:26:13 -07:00
Jordan Irwin
4a24e4dde9
Update Water for Xiphin Zohos quest for checking completions
https://github.com/arianne/stendhal/issues/230
2024-04-15 18:25:08 -07:00
Jordan Irwin
3230330097
Update Restock the Flower Shop quest for checking completions
https://github.com/arianne/stendhal/issues/230
2024-04-15 18:24:33 -07:00
Jordan Irwin
db13a55826
Update Kirdneh Museum Needs Help quest for checking completions
https://github.com/arianne/stendhal/issues/230
2024-04-15 18:23:45 -07:00
Jordan Irwin
1452578b46
Update Help Tomi quest for checking completions
https://github.com/arianne/stendhal/issues/230
2024-04-15 18:22:58 -07:00
Jordan Irwin
691432302a
Update Coded Message from Finn Farmer quest for checking completions
https://github.com/arianne/stendhal/issues/230
2024-04-15 18:22:21 -07:00
Jordan Irwin
1d57393ad5
Update Balloon for Bobby quest for checking completions
https://github.com/arianne/stendhal/issues/230
2024-04-15 18:20:57 -07:00
Jordan Irwin
5e99f8ab20
Check that slot index is not empty string 2024-04-15 18:19:00 -07:00
Jordan Irwin
9409a68f7b
Add FIXME note 2024-04-15 15:55:09 -07:00
Jordan Irwin
d4597e578f
Update Coal for Haunchy quest for checking completions
https://github.com/arianne/stendhal/issues/230
2024-04-15 15:42:08 -07:00
Jordan Irwin
6f2239da6f
Update daily monster & item quests for checking completions
https://github.com/arianne/stendhal/issues/230
2024-04-15 15:41:27 -07:00
Jordan Irwin
437c3ed967
Add support for retrieving completions count to quest manuscript
https://github.com/arianne/stendhal/issues/230
2024-04-15 15:39:18 -07:00
Jordan Irwin
814be97fe6
Track which slot indexes are used to store quest completions count in...
...QuestInfo

https://github.com/arianne/stendhal/issues/230
2024-04-15 15:36:57 -07:00
Jordan Irwin
4c16c2549f
Count open quests being repeated toward QuestCountCompletedCondition
https://github.com/arianne/stendhal/issues/230
2024-04-15 12:32:14 -07:00
Jordan Irwin
29616e2133
Add support for retrieving number of times player has completed a quest
https://github.com/arianne/stendhal/issues/230
2024-04-15 12:27:51 -07:00
Jordan Irwin
eb155be8ea
Leave "quantity" attribute undefined by default in summon action
Closes: https://github.com/arianne/stendhal/issues/702
2024-04-12 11:49:37 -07:00
Jordan Irwin
cc048d5c79
Add unicorn to grammar test 2024-04-12 10:56:14 -07:00
Jordan Irwin
d2af9d48a9
Change registered prefix of leather thread item to "strand(s) of"
Closes: https://github.com/arianne/stendhal/issues/701
2024-04-12 10:55:03 -07:00
Jordan Irwin
4643200553
Clean up indentation 2024-04-12 09:54:09 -07:00
Jordan Irwin
42a28c8956
Add knife to soldier goblin (from risecia thug)
https://github.com/arianne/stendhal/issues/624
2024-04-11 15:21:55 -07:00
Jordan Irwin
e24382e9ff
Update blordrough sprites attributions 2024-04-11 14:55:21 -07:00
Jordan Irwin
cb08241687
Add sword to blordrough corporal
Based on Vollrat's sword (CC0): https://opengameart.org/node/72575

https://github.com/arianne/stendhal/issues/624
2024-04-11 14:48:18 -07:00
Jordan Irwin
c97f7f84df
Add sword to dark elf knight
Based on Vollrat's sword (CC0): https://opengameart.org/node/72575

https://github.com/arianne/stendhal/issues/624
2024-04-11 14:27:24 -07:00
Jordan Irwin
ea210a0e23
Adjust imperial commander's sword 2024-04-11 14:09:44 -07:00
Jordan Irwin
662c6bd923
Add balloon to babybear
https://github.com/arianne/stendhal/issues/624
2024-04-11 13:54:15 -07:00
Jordan Irwin
f5c22b9005
Add sword to dark angel
Sword by Cethiel (CC0): https://opengameart.org/node/95842

https://github.com/arianne/stendhal/issues/624
2024-04-11 13:34:37 -07:00
Jordan Irwin
ce22d05396
Add sword to angel
Sword by Cethiel (CC0): https://opengameart.org/node/95575

https://github.com/arianne/stendhal/issues/624
2024-04-11 12:48:58 -07:00
Jordan Irwin
36b73047a8
Clean up angels' halo 2024-04-11 10:45:06 -07:00
Jordan Irwin
8a3c1738d6
Update fixme note 2024-04-08 08:53:15 -07:00
Jordan Irwin
31a900ecde
Minor optimization 2024-04-05 15:14:16 -07:00
Jordan Irwin
0119e4b3a9
Update description for F-Droid 2024-04-04 01:49:56 -07:00
Jordan Irwin
cda456080e
Fix ClientView layout 2024-04-04 00:32:13 -07:00
Jordan Irwin
4b415d238d
Create class to handle splash image 2024-04-04 00:09:24 -07:00
Jordan Irwin
d88ee79505
Fix NPE 2024-04-04 00:08:02 -07:00
Jordan Irwin
1c53e95726
Change some ClientView static methods to instance methods 2024-04-03 22:45:15 -07:00
Jordan Irwin
2dd548262c
Preliminary support for multiple ClientView instances 2024-04-03 21:28:22 -07:00
Jordan Irwin
d628936d89
Programmatically create ClientView instance 2024-04-03 21:20:13 -07:00
Jordan Irwin
e062d5407a
Don't store ClientView static instance 2024-04-03 17:21:01 -07:00
Jordan Irwin
fb85ccf246
Make release logger functional to show message dialogs 2024-04-03 17:18:23 -07:00
Jordan Irwin
1f74b65ba7
Don't need to pass MainActivity instance to Logger initializer 2024-04-03 17:06:43 -07:00
Jordan Irwin
b0f94e366d
Change default level for Logger.notify to info 2024-04-03 16:42:29 -07:00
Jordan Irwin
b792bd871b
Reference static MainActivity instance with full name 2024-04-03 16:39:13 -07:00
Jordan Irwin
c5a6942081
Fix dialog contexts 2024-04-03 16:32:32 -07:00
Jordan Irwin
79f72864ef
Make Menu class true singleton 2024-04-03 16:12:58 -07:00
Jordan Irwin
ed0bef6caf
Move ClientView.playTitleMusic to MusicPlayer.playTitleMusic 2024-04-03 15:55:36 -07:00
Jordan Irwin
d1141799ec
Move MusicPlayer class to main package 2024-04-03 15:54:33 -07:00
Jordan Irwin
b47f6440a4
Don't need to make static reference to MainActivity.this 2024-04-01 19:42:43 -07:00
Jordan Irwin
cbb6a019fb
Remove unused value 2024-04-01 19:17:52 -07:00
Jordan Irwin
bb317ad4cc
Fix unnecessary casts from Context to MainActivity 2024-04-01 19:15:26 -07:00
Jordan Irwin
2bb9c12814
Fix call to static method 2024-04-01 19:06:32 -07:00
Jordan Irwin
50a5a35d00
Clean up imports 2024-04-01 18:54:20 -07:00
Jordan Irwin
bd15e460c6
Android: Add portrait splash & background color 2024-03-31 20:38:34 -07:00
Hendrik Brummermann
5945b940d3 exit Neutralino process on window close 2024-03-31 22:07:00 +02:00
Hendrik Brummermann
21304c2c09 fixed ant compilejs to work with Eclipse 2024-03-31 21:58:33 +02:00
Hendrik Brummermann
dfd81f03a7 added logout button 2024-03-31 12:42:05 +02:00
Jordan Irwin
454e100aea
Fix Seven Cherubs quest slot affected by Update Converter bug
Closes: https://github.com/arianne/stendhal/issues/695
2024-03-30 17:55:55 -07:00
Jordan Irwin
37448f470c
Don't trim empty slot states when updating quests
https://github.com/arianne/stendhal/issues/695
2024-03-30 17:47:31 -07:00
Jordan Irwin
e29228c2c4
Add Android meta data for F-Droid 2024-03-30 16:33:20 -07:00
Jordan Irwin
7fdbe9111d
Remove old unused sprites 2024-03-30 13:48:58 -07:00
Jordan Irwin
797372adbb
Exclude converted contributors.html from source distribution 2024-03-30 13:44:54 -07:00
Hendrik Brummermann
cd53f56e7a don't include result of compilejs in source distribution 2024-03-29 23:21:07 +01:00
Jordan Irwin
e9d88dcc90 Use same tileset directory for both development & distribution...
...package for simplicity
2024-03-28 17:50:18 -07:00
Jordan Irwin
66f5f93c9a Move web client source to src/js directory
https://github.com/arianne/stendhal/issues/628
2024-03-28 17:50:18 -07:00
Jordan Irwin
977f5e6f35
Update changes 2024-03-28 16:17:20 -07:00
Jordan Irwin
d520815d89 Rename chef Patrick to Preston
https://github.com/arianne/stendhal/issues/551
2024-03-28 12:18:49 -07:00
Jordan Irwin
837fb5646d Reserve name Patrick for Herald
https://github.com/arianne/stendhal/issues/551
2024-03-28 12:18:49 -07:00
Jordan Irwin
24a1679c55 Add method to reserve names for dynamically created NPCs 2024-03-28 12:18:49 -07:00
Jordan Irwin
65fa0d8db6
Add Gradle wrapper SHA-256 checksum info recommend by F-Droid
https://gitlab.com/fdroid/fdroiddata/-/merge_requests/14774#note_1837005543
2024-03-28 11:17:09 -07:00
Jordan Irwin
010c8689ac
Increment version to 1.46.5 2024-03-28 09:16:51 -07:00
Hendrik Brummermann
ac72f383a5 fixed size of notification bubble 2024-03-28 00:53:17 +01:00
Hendrik Brummermann
f790e89bf7 implemented updater 2024-03-28 00:19:12 +01:00
Jordan Irwin
647ca5d566
Use Locale.ENGLISH when calling String.toLowerCase 2024-03-26 23:41:28 -07:00
Jordan Irwin
053b6331e0
Fix changes 2024-03-26 19:14:31 -07:00
Jordan Irwin
589a8bba14
Add support for single globalized zone music to Java client
Doesn't restart if changed zone uses same music.
2024-03-26 19:06:19 -07:00
Jordan Irwin
6a758f3ed0
Fix changes 2024-03-26 18:57:22 -07:00
Jordan Irwin
bcd146b70b
Fix developing mode tileset path 2024-03-24 16:27:54 -07:00
Hendrik Brummermann
9a8d0e32b7 fixed compiler error 2024-03-25 00:09:08 +01:00
Jordan Irwin
506122aea0
Update changes 2024-03-21 15:03:56 -07:00
Jordan Irwin
221e059542
Fix update converter to handle quest slot sections containing...
...multiple object names delimited by commas

https://github.com/arianne/stendhal/issues/691
2024-03-21 14:59:52 -07:00
Jordan Irwin
19f419d064
Fix whitespace in Ritati Dragontracker's dialogue 2024-03-20 03:24:44 -07:00
Hendrik Brummermann
593387a7a0 run webclient build on dist 2024-03-19 23:15:11 +01:00
Hendrik Brummermann
0db115207a added missing dependencies to documentation 2024-03-19 22:38:00 +01:00
Jordan Irwin
764c63e093
Add tab to about dialog to display contributor information
https://github.com/arianne/stendhal/issues/651
2024-03-18 22:01:39 -07:00
Jordan Irwin
2109090efe
Allow passing element to Component & Panel constructors 2024-03-18 22:01:39 -07:00
Jordan Irwin
f69fec71d9
Convert contributors.md to HTML for use in web client 2024-03-18 22:01:38 -07:00
Jordan Irwin
e5799a01ec
Ensure using correct implementation of setTimeout & clearTimeout global functions 2024-03-18 21:49:34 -07:00
Jordan Irwin
0a072dd907
Fix path to font in vampire script 2024-03-18 15:55:05 -07:00
Jordan Irwin
6ab2bd3a80
Disable Android built-in about dialog
Web client now has about dialog.
2024-03-18 12:52:04 -07:00
Jordan Irwin
384c24de64
Docstring edit 2024-03-18 04:42:45 -07:00
Jordan Irwin
aaa08b702d
Support opening chat log context menu with touch
Closes: https://github.com/arianne/stendhal/issues/603
2024-03-18 03:35:26 -07:00
Jordan Irwin
c8f3838b42
Add option to enable/disable pinch & double-tap zoom
Closes: https://github.com/arianne/stendhal/issues/687
2024-03-18 03:05:57 -07:00
Jordan Irwin
904de865af
Fix controlling mute & volume level of single global music instance
Closes: https://github.com/arianne/stendhal/issues/688
2024-03-18 01:31:19 -07:00
Jordan Irwin
4ca4709789
Fix web client tileset path
https://github.com/arianne/stendhal/pull/669 places tiled maps & tilesets
in data directory so `data-tileset-path` attribute is no longer needed for
test server
2024-03-18 00:14:26 -07:00
Jordan Irwin
194713f7bb
Move stairs portals indexes into separate static class & make immutable 2024-03-18 00:02:49 -07:00
Jordan Irwin
517f4924f1
Add continuous movement attribute to Amazon portals 2024-03-17 22:44:36 -07:00
Jordan Irwin
ec3dafd39b
Add continuous movement attribute to Orril Mountain entrance 2024-03-17 22:22:30 -07:00
Jordan Irwin
e46bda70ac
Add continuous movement attribute to Ados townhall portal 2024-03-17 22:19:15 -07:00
Jordan Irwin
f00011f98e
Convert Tiled maps with CRLF line endings to LF 2024-03-17 19:32:49 -07:00
Jordan Irwin
8d38a6e694
Clean up mixed line endings in Tiled maps 2024-03-17 19:28:00 -07:00
Jordan Irwin
8964104538
Don't need to build separate webclient package with ant dist
Included in server package.
2024-03-17 18:23:17 -07:00
Jordan Irwin
7432652e66
Move sbin scripts to bin
https://github.com/arianne/stendhal/issues/628
2024-03-17 18:16:54 -07:00
Jordan Irwin
144a0e8d1a
Change Eclipse's build output directory to build/eclipse
https://github.com/arianne/stendhal/issues/628
2024-03-17 18:12:49 -07:00
Jordan Irwin
5778cb85e9 Change web client default tileset search path to data/maps/tileset 2024-03-17 17:53:52 -07:00
Jordan Irwin
bb79b9f419 Migrate tiled directory to data/maps
https://github.com/arianne/stendhal/issues/628
2024-03-17 17:53:52 -07:00
Jordan Irwin
5257669348 Dynamically create slash action help info 2024-03-17 17:53:22 -07:00
Jordan Irwin
77ad5a24a0 Class to represent action/command parameter info 2024-03-17 17:53:22 -07:00
Jordan Irwin
79dd5ab89b
Update changes 2024-03-17 00:51:40 -07:00
Jordan Irwin
7b2670bba8
Fix redundant check 2024-03-17 00:25:27 -07:00
Jordan Irwin
5f566f8988
Revert "Fix multi-touch support in item inventories"
This reverts commit 1551389c75.
2024-03-17 00:21:00 -07:00
Jordan Irwin
ee7233d0eb
Fix corpse & chest cursor when quick pickup enabled
Closes: https://github.com/arianne/stendhal/issues/601
2024-03-16 18:35:53 -07:00
3938 changed files with 61059 additions and 51379 deletions

View file

@ -7,16 +7,56 @@ on:
pull_request:
paths:
- 'app/android/**'
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- id: job_info
uses: daleyjem/gh-job-id@v1
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
job_name: 'build'
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v3
- name: Checkout Repository
uses: actions/checkout@v3
- name: Build Android Packages
run: cd app/android/client && gradle assemble
- name: Set Up JDK
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'adopt'
- name: Validate Gradle Wrapper .jar
run: |
cd app/android/gradle/wrapper
curl --location --output gradle-wrapper.jar.sha256 \
https://services.gradle.org/distributions/gradle-7.5.1-wrapper.jar.sha256
echo " gradle-wrapper.jar" >> gradle-wrapper.jar.sha256
sha256sum --check gradle-wrapper.jar.sha256
- name: Build APKs with Ant
uses: cedx/setup-ant@v6
with:
version: '1.10'
- run: ant -noinput -buildfile build.xml android -Dgradle.params="assembleDebug assembleRelease"
- name: Failure Report
uses: sarisia/actions-status-discord@v1
if: failure()
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK_DEVELOPMENT }}
with:
title: 'Android Build Failed'
description: '${{ steps.job_info.outputs.html_url }}'
nodetail: true
- uses: sarisia/actions-status-discord@v1
if: failure()
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK_DEVLOG }}
with:
title: 'Android Build Failed'
description: '${{ steps.job_info.outputs.html_url }}'
nodetail: true

View file

@ -29,15 +29,15 @@ jobs:
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v2
uses: github/codeql-action/init@v3
# Override language selection by uncommenting this and choosing your languages
# with:
# languages: go, javascript, csharp, python, cpp, java
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
uses: github/codeql-action/autobuild@v2
#- name: Autobuild
# uses: github/codeql-action/autobuild@v3
# Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
@ -46,9 +46,7 @@ jobs:
# and modify them (or add more) to build your code if your project
# uses a compiled language
#- run: |
# make bootstrap
# make release
- run: ant -noinput -f build.xml clean compile
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2
uses: github/codeql-action/analyze@v3

1
.gitignore vendored
View file

@ -50,4 +50,3 @@ build_server_xmlconf
/node_modules/
/log/
/build-archive/
/srcjs/contributors.html

View file

@ -20,4 +20,15 @@
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.wst.common.project.facet.core.nature</nature>
</natures>
<filteredResources>
<filter>
<id>1771748271774</id>
<name></name>
<type>30</type>
<matcher>
<id>org.eclipse.core.resources.regexFilterMatcher</id>
<arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
</matcher>
</filter>
</filteredResources>
</projectDescription>

View file

@ -20,19 +20,38 @@ So what are you waiting for?! A whole new world awaits...
## How to play
[![Play now](https://arianne-project.org/images/playbutton.png)](https://stendhalgame.org/account/mycharacters.html) &nbsp; &nbsp; &nbsp; &nbsp;
### Web Browser
[![Play now](https://arianne-project.org/images/playbutton.png)](https://stendhalgame.org/account/mycharacters.html)
Play in any web browser for desktop or mobile with JavaScript support. Click on the "play now"
button to create or log in to your account.
### Mobile
Play using the [progressive web app](https://en.wikipedia.org/wiki/Progressive_web_app). Just visit
[stendhalgame.org](https://stendhalgame.org/) in your mobile browser and click "install" when prompted.
[<img src="https://fdroid.gitlab.io/artwork/badge/get-it-on.png" height="75">](https://f-droid.org/packages/org.stendhalgame.client/)
Play on your Android device using the dedicated app. You can get it from the
[F-Droid App Store](https://f-droid.org/) or download it from [stendhalgame.org](https://stendhalgame.org/download.html).
### Classic Desktop
[![Download](https://stendhalgame.org/images/downloadbutton.png)](https://arianne-project.org/download/stendhal.zip)
You need Java which you can download from [https://www.java.com](https://www.java.com/en/download) on Microsoft Windows. Java is included in most Linux distributions. Both Oracle Java and OpenJDK are supported.
Play using the classic desktop client. You will need Java which you can download from
[java.com](https://www.java.com/en/download) on Microsoft Windows. Java is included in
most Linux distributions. Both Oracle Java and OpenJDK are supported.
Please download Stendhal from [https://stendhalgame.org](https://stendhalgame.org)<br>
You can double click on stendhal-starter.jar and the client will run.<br>
If you prefer to run from command line, then just execute this command
in the stendhal folder:
Please download Stendhal from [stendhalgame.org](https://stendhalgame.org/download.html).<br>
You can double click on `stendhal-starter.jar` and the client will run.<br>
If you prefer to run from command line, then just execute this command in the stendhal folder:
`java -jar stendhal-starter.jar`
There is a [manual](https://stendhalgame.org/wiki/Stendhal_Manual), and there is Help from the client menu icons in the upper right hand side of the game screen.
There is a [manual](https://stendhalgame.org/wiki/Stendhal_Manual), and there is Help from the client menu icons in the upper right hand side of the game screen.
## Development environment
@ -44,13 +63,18 @@ There is a [manual](https://stendhalgame.org/wiki/Stendhal_Manual), and there i
## Legal
The server and java client are free software; you can redistribute it and/or modify it under the terms of the **GNU General Public License** 2 or later as published by the Free Software Foundation.
The web client is free software; you can redistribute it and/or modify it under the terms of the **GNU Affero General Public License** 3 or later as published by the Free Software Foundation.
Stendhal is free software. You can redistribute it and/or modify under the following terms:
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the [LICENSE.txt](LICENSE.txt) file for more details.
- The **server**, **java client**, and **Android client**: *GNU General Public License* 2 or later as published by the Free Software Foundation
- The **web client** and **native client**: *GNU Affero General Public License* 3 or later as published by the Free Software Foundation with the definition of "System libraries" being extended to include authentication providers and software distribution platforms.
- The **nativehelper** extensions: *GNU Lesser General Public License* 3 or later as published by the Free Software Foundation
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
[LICENSE.txt](LICENSE.txt) and [src/js/LICENSE.html](src/js/LICENSE.html) file for more details.
Stendhal(c) is copyright of Miguel Angel Blanch Lardin, 2005-2008, arianne_rpg at users dot sourceforge dot net and others<br>
Stendhal(c) is copyright of the Arianne Project, 2006-2024, arianne-general at lists dot sourceforge dot net
Stendhal(c) is copyright of the Arianne Project, 2006-2026, arianne-general at lists dot sourceforge dot net
Please have a look at the list of [contributors](https://github.com/arianne/stendhal/blob/master/doc/contributors.md#contributors).
Please have a look at the list of [contributors](doc/contributors.md#contributors).

1
app/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
/godot/

View file

@ -10,15 +10,23 @@ android {
applicationId namespace
minSdk 21
targetSdk 32
versionCode 1046000
versionName "1.46"
versionCode 1049005
versionName "1.49.5"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
targetSdkVersion 32
minSdkVersion 21
}
// F-Droid doesn't allow encrypted DependencyInfoBlock in APK
dependenciesInfo {
// disables dependency metadata when building APKs
includeInApk = false
// disables dependency metadata when building Android App Bundles
includeInBundle = false
}
// build output
project.setProperty("archivesBaseName", "${namespace}-${defaultConfig.versionCode}")
project.setProperty("archivesBaseName", "${namespace}-${defaultConfig.versionName}")
project.setProperty("buildDir", "${projectDir}/../../../build/build_android_client")
/* A keystore.properties file can be placed in the root Android project directory and must

View file

@ -28,12 +28,11 @@ import android.util.Log;
*/
public class Logger {
/** Attribute denoting state of initialization. */
private static boolean initialized = false;
/** Logs directory. */
private static File logsDir;
/** Main activity instance. */
private static MainActivity mainActivity;
/** Singleton instance. */
private static Logger instance;
@ -58,10 +57,13 @@ public class Logger {
/**
* Initializes logs directory.
*/
public static void init(final File dir, final MainActivity activity) {
public static void init(final File dir) {
if (Logger.initialized) {
Logger.warn(true, "tried to re-initialize logger");
return;
}
Logger.initialized = true;
logsDir = new File(dir.getPath() + "/logs");
mainActivity = activity;
writeLine("\n // -- debugging initialized -- //", null);
writeLine("logs directory: " + logsDir.getPath());
}
@ -240,16 +242,16 @@ public class Logger {
* Logging verbosity level.
*/
public static void notify(final String text, LogLevel level) {
if (mainActivity == null) {
if (!Logger.initialized) {
System.err.println("ERROR: Logger not initialized. Call Logger.init.");
return;
}
if (level == null) {
level = LogLevel.DEBUG;
level = LogLevel.INFO;
}
final AlertDialog.Builder builder = new AlertDialog.Builder(ClientView.get().getContext());
final AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.get());
builder.setTitle(level.label);
builder.setMessage(text);

View file

@ -13,21 +13,19 @@ package org.stendhalgame.client;
import java.util.Random;
import org.stendhalgame.client.sound.MusicPlayer;
import android.app.AlertDialog;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.net.Uri;
import android.os.Build;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.inputmethod.BaseInputConnection;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.webkit.DownloadListener;
import android.webkit.WebChromeClient;
@ -35,7 +33,6 @@ import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ImageView;
/**
@ -43,9 +40,6 @@ import android.widget.ImageView;
*/
public class ClientView extends WebView {
/** Image used as title page background. */
private ImageView splash;
/** Client URL path. */
private String clientUrlSuffix = "client";
@ -55,23 +49,13 @@ public class ClientView extends WebView {
private boolean testServer = false;
private Boolean debugging;
/** ID of page currently loaded. */
private static PageId currentPage;
private PageId currentPage;
/** ID of page previously loaded. */
private PageId previousPage;
private String stateId = "";
private String seed = "";
/** Singleton instance. */
private static ClientView instance;
/**
* Retrieves the static instance.
*/
public static ClientView get() {
return instance;
}
/**
* Creates a new view.
@ -117,10 +101,12 @@ public class ClientView extends WebView {
* Initializes client WebView interface.
*/
private void onInit() {
// FIXME: may be considered unsafe as this is not technically a singleton
instance = this;
setActive(false); // main activity manages initial visibility
setBackgroundColor(Color.TRANSPARENT);
setBackgroundColor(android.graphics.Color.TRANSPARENT);
// expand to size of parent constraints
setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
final WebSettings viewSettings = getSettings();
viewSettings.setJavaScriptEnabled(true);
@ -147,6 +133,30 @@ public class ClientView extends WebView {
initDownloadHandler();
}
/**
* Sets active state of this client view.
*
* @param active
* If `true` shows this client view, otherwise hides it.
*/
public void setActive(final boolean active) {
if (active) {
setVisibility(ClientView.VISIBLE);
return;
}
setVisibility(ClientView.GONE);
}
/**
* Checks active state of client view.
*
* @return
* `true` is this view is visible.
*/
public boolean isActive() {
return getVisibility() == ClientView.VISIBLE;
}
/**
* Initializes method overrides to handle page loading.
*/
@ -180,7 +190,11 @@ public class ClientView extends WebView {
if (!UrlHelper.isInternalUri(uri)) {
// open external links in default browser/app
// FIXME: should we ask for confirmation?
MainActivity.get().startActivity(new Intent(Intent.ACTION_VIEW, uri));
try {
MainActivity.get().startActivity(new Intent(Intent.ACTION_VIEW, uri));
} catch (final ActivityNotFoundException e) {
Notifier.toast("No app found to open this link");
}
return true;
}
view.loadUrl(UrlHelper.checkClientUrl(uri.toString()));
@ -219,7 +233,7 @@ public class ClientView extends WebView {
} else if (url.equals("") || url.equals("about:blank")) {
setPage(PageId.TITLE);
if (PreferencesActivity.getBoolean("title_music", true)) {
playTitleMusic();
MusicPlayer.playTitleMusic();
}
} else {
setPage(PageId.OTHER);
@ -237,7 +251,7 @@ public class ClientView extends WebView {
public boolean dispatchKeyEvent(final KeyEvent event) {
final boolean ret = super.dispatchKeyEvent(event);
// hide keyboard when "enter" pressed
if (ClientView.isGameActive() && event.getAction() == KeyEvent.ACTION_UP
if (isGameActive() && event.getAction() == KeyEvent.ACTION_UP
&& event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
((InputMethodManager) MainActivity.get()
.getSystemService(Context.INPUT_METHOD_SERVICE))
@ -254,6 +268,9 @@ public class ClientView extends WebView {
/**
* Handles downloading screenshot created by web client.
*
* TODO: get filename to pass to `DownloadHandler.download` from "download" property of
* anchor
*
* @param url
* Content URL to the screenshot image.
* @param userAgent
@ -329,7 +346,7 @@ public class ClientView extends WebView {
* One of "main", "test", or "none".
*/
public String getSelectedClient() {
if (ClientView.onTitleScreen()) {
if (onTitleScreen()) {
return "none";
}
return testClient ? "test" : "main";
@ -342,7 +359,7 @@ public class ClientView extends WebView {
* One of "main", "test", or "none".
*/
public String getSelectedServer() {
if (ClientView.onTitleScreen()) {
if (onTitleScreen()) {
return "none";
}
return testServer ? "test" : "main";
@ -412,7 +429,7 @@ public class ClientView extends WebView {
public void loadTitleScreen() {
reset();
setPage(PageId.TITLE);
setSplashResource(R.drawable.splash);
SplashUtil.get().setVisible(true);
loadUrl("about:blank");
Menu.get().show();
}
@ -431,25 +448,11 @@ public class ClientView extends WebView {
}
}
/**
* Sets the background image.
*
* @param resId
* Resource ID.
*/
private void setSplashResource(final int resId) {
if (splash == null) {
splash = (ImageView) MainActivity.get().findViewById(R.id.splash);
splash.setBackgroundColor(android.graphics.Color.TRANSPARENT);
}
splash.setImageResource(resId);
}
/**
* Opens a message dialog for user to choose between main & test clients.
*/
private void selectClient() {
final AlertDialog.Builder builder = new AlertDialog.Builder(ClientView.get().getContext());
final AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
builder.setMessage("Select client");
builder.setPositiveButton("Main", new DialogInterface.OnClickListener() {
@ -480,7 +483,7 @@ public class ClientView extends WebView {
* Opens a message dialog for user to choose between main & test servers.
*/
private void selectServer() {
final AlertDialog.Builder builder = new AlertDialog.Builder(ClientView.get().getContext());
final AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
builder.setMessage("Select server");
builder.setPositiveButton("Main", new DialogInterface.OnClickListener() {
@ -511,8 +514,8 @@ public class ClientView extends WebView {
// create a unique state
stateId = generateRandomString();
seed = generateRandomString();
// remove splash image
setSplashResource(android.R.color.transparent);
// hide splash image
SplashUtil.get().setVisible(false);
final String initialPage = UrlHelper.getInitialPageUrl();
Logger.debug("Loading initial page: " + initialPage);
@ -542,7 +545,7 @@ public class ClientView extends WebView {
* @return
* `true` if current page matches `PageId.TITLE`.
*/
public static boolean onTitleScreen() {
public boolean onTitleScreen() {
return currentPage == PageId.TITLE;
}
@ -552,7 +555,7 @@ public class ClientView extends WebView {
* @return
* `true` if current page matches `PageId.WEBCLIENT`.
*/
public static boolean isGameActive() {
public boolean isGameActive() {
return currentPage == PageId.WEBCLIENT;
}
@ -562,46 +565,10 @@ public class ClientView extends WebView {
* @return
* Current `PageId`.
*/
public static PageId getCurrentPageId() {
public PageId getCurrentPageId() {
return currentPage;
}
/**
* Plays selected music.
*
* @param musicId
* String identifier of music to play or `null` to play music configured in preferences.
*/
public static void playTitleMusic(String musicId) {
if (musicId == null) {
musicId = PreferencesActivity.getString("song_list");
}
int id = R.raw.title_01;
switch (musicId) {
case "title_02":
id = R.raw.title_02;
break;
case "title_03":
id = R.raw.title_03;
break;
case "title_04":
id = R.raw.title_04;
break;
case "title_05":
id = R.raw.title_05;
break;
}
Logger.debug("playing music: " + musicId);
MusicPlayer.playMusic(id, true);
}
/**
* Plays music configured in preferences.
*/
public static void playTitleMusic() {
playTitleMusic(null);
}
/**
* Sets current page ID.
*
@ -609,10 +576,10 @@ public class ClientView extends WebView {
* Page ID to be used.
*/
private void setPage(final PageId newPage) {
previousPage = ClientView.currentPage;
ClientView.currentPage = newPage;
previousPage = currentPage;
currentPage = newPage;
if (previousPage == null) {
previousPage = ClientView.currentPage;
previousPage = currentPage;
}
}

View file

@ -13,6 +13,8 @@ package org.stendhalgame.client;
import java.io.File;
import java.io.FileOutputStream;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.Date;
@ -26,61 +28,175 @@ import android.util.Base64;
* created by the web client page.
*/
public class DownloadHandler {
private boolean result = false;
private String message = null;;
public void download(final String url, final String mimetype) {
private static enum DownloadType {
IMAGE_PNG("image/png"),
TEXT_PLAIN("text/plain"),
UNSUPPORTED(null);
private String value;
private DownloadType(final String value) {
this.value = value;
}
public static DownloadType fromString(final String value) {
for (final DownloadType v: DownloadType.values()) {
if (v.value != null && v.value.equals(value)) {
return v;
}
}
return DownloadType.UNSUPPORTED;
}
}
private boolean result = false;
private String message = null;
/**
* Checks for a supported MIME type.
*
* @param url
* File or data URL.
* @param mimetype
* Detected MIME type.
* @return
* Download type or unsupported.
*/
private DownloadType checkMimeType(final String url, final String mimetype) {
final DownloadType dtype = DownloadType.fromString(mimetype);
if (DownloadType.UNSUPPORTED.equals(dtype) && url.startsWith("data:image/png;base64,")) {
return DownloadType.IMAGE_PNG;
}
return dtype;
}
/**
* Writes file data to device storage.
*
* @param dir
* Directory where new file is to be created.
* @param basename
* Filename of new file.
* @param data
* File contents to be written to storage.
*/
private void downloadInternal(final File dir, final String basename, final byte[] data) {
String stacktrace = null;
try {
if (!dir.exists()) {
dir.mkdirs();
}
final FileOutputStream fos = new FileOutputStream(new File(dir, basename));
fos.write(data);
fos.close();
this.result = true;
} catch (final java.lang.NoClassDefFoundError e) {
this.message = "an error occurred while decoding data (see debug log for more info)";
stacktrace = stackTraceToString(e);
} catch (java.io.IOException e) {
this.message = "an error occurred while attempting to write file (see debug log for more info)";
stacktrace = stackTraceToString(e);
}
if (stacktrace != null) {
Logger.error(stacktrace.toString());
}
}
/**
* Writes file data to device storage.
*
* @param url
* A data URL.
* @param mimetype
* Detected MIME type.
* @param targetName
* Filename for new file.
*/
public void download(final String url, final String mimetype, String targetName) {
final Uri uri = Uri.parse(url);
final String scheme = uri.getScheme();
final String storageState = Environment.getExternalStorageState();
final DownloadType dtype = checkMimeType(url, mimetype);
if (!ClientView.isGameActive()) {
if (!MainActivity.get().getActiveClientView().isGameActive()) {
this.message = "downloading from this page not supported";
} else if (!"data".equals(scheme)) {
// only data URL supported
this.message = "download type \"" + scheme + "\" not supported";
} else if (!"image/png".equals(mimetype) || !url.startsWith("data:image/png;base64,")) {
} else if (DownloadType.UNSUPPORTED.equals(dtype)) {
this.message = "mimetype not supported: " + mimetype;
} else if (!Environment.MEDIA_MOUNTED.equals(storageState)) {
this.message = "storage not available for writing (state: " + storageState + ")";
} else {
} else if (DownloadType.IMAGE_PNG.equals(dtype)) {
final File targetDir = new File(Environment.getExternalStorageDirectory()
+ "/Pictures/Screenshots");
final String targetName = "stendhal_"
+ new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss").format(new Date()) + ".png";
if (targetName == null) {
// default filename
targetName = "stendhal_" + new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss").format(new Date())
+ ".png";
}
Logger.debug("Saving screenshot: " + targetDir.getPath()
+ "/" + targetName + " (" + mimetype + ")");
String msg;
String stacktrace = null;
try {
if (!targetDir.exists()) {
targetDir.mkdirs();
final byte[] data = Base64.decode(url.split("base64,")[1], Base64.DEFAULT);
downloadInternal(targetDir, targetName, data);
if (this.result) {
this.message = "saved screenshot to " + targetDir.getPath() + "/" + targetName;
}
} else if (DownloadType.TEXT_PLAIN.equals(dtype)) {
// `Environment.DIRECTORY_DOWNLOADS` fails on newer Android versions
//final File targetDir = new File(Environment.DIRECTORY_DOWNLOADS);
final File targetDir = new File(Environment.getExternalStorageDirectory() + "/Download");
if (targetName == null) {
// default filename
targetName = "stendhal_" + new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss").format(new Date())
+ ".txt";
}
Logger.debug("Saving file: " + targetDir.getPath()
+ "/" + targetName + " (" + mimetype + ")");
final String[] parts = url.split(",");
byte[] data;
if (parts[0].endsWith(";base64")) {
data = Base64.decode(parts[1], Base64.DEFAULT);
} else {
try {
data = URLDecoder.decode(parts[1], StandardCharsets.UTF_8.name())
.getBytes(StandardCharsets.UTF_8);
} catch (final java.io.UnsupportedEncodingException e) {
this.message = "an error occurred while attempting to decode data URL (see debug log for more info)";
Logger.error(stackTraceToString(e));
return;
}
final byte[] data = Base64.decode(url.split("base64,")[1], Base64.DEFAULT);
final FileOutputStream fos = new FileOutputStream(new File(targetDir, targetName));
fos.write(data);
fos.close();
this.result = true;
msg = "saved screenshot to " + targetDir.getPath() + "/" + targetName;
} catch (final java.lang.NoClassDefFoundError e) {
msg = "an error occurred while decoding data (see debug log for more info)";
stacktrace = stackTraceToString(e);
} catch (java.io.IOException e) {
msg = "an error occurred while attempting to write file (see debug log for more info)";
stacktrace = stackTraceToString(e);
}
this.message = msg;
if (stacktrace != null) {
Logger.error(stacktrace.toString());
downloadInternal(targetDir, targetName, data);
if (this.result) {
this.message = "file saved to " + targetDir.getPath() + "/" + targetName;
}
} else {
this.message = "an unknown error occurred";
}
}
/**
* Writes file data to device storage.
*
* @param url
* A data URL.
* @param mimetype
* Detected MIME type.
*/
public void download(final String url, final String mimetype) {
download(url, mimetype, null);
}
public boolean getResult() {
return result;
}

View file

@ -11,13 +11,17 @@
***************************************************************************/
package org.stendhalgame.client;
import java.util.LinkedList;
import java.util.List;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.os.Bundle;
import android.view.ViewGroup;
import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;
/**
@ -25,12 +29,10 @@ import androidx.constraintlayout.widget.ConstraintLayout;
*/
public class MainActivity extends AppCompatActivity {
/** WebView layout. */
private ConstraintLayout layout;
/** WebView instance. */
private ClientView client;
/** Menu instance. */
private Menu menu;
/** Active clients. **/
private ViewGroup clientList;
/** Static activity instance. */
private static MainActivity instance;
@ -42,7 +44,7 @@ public class MainActivity extends AppCompatActivity {
* NOTE: This may not be necessary if Android has built-in methods to retrieve current activity.
*/
public static MainActivity get() {
return instance;
return MainActivity.instance;
}
/**
@ -53,20 +55,17 @@ public class MainActivity extends AppCompatActivity {
try {
super.onCreate(savedInstanceState);
// FIXME: may be considered unsafe as this is not technically a singleton
instance = this;
MainActivity.instance = this;
// initialize debug logging mechanism
Logger.init(getExternalFilesDir(null), this);
updateOrientation();
Logger.init(getExternalFilesDir(null));
setContentView(R.layout.activity_main);
// FIXME: is this used?
layout = (ConstraintLayout) findViewById(R.id.content);
client = (ClientView) findViewById(R.id.clientWebView);
menu = new Menu(client.getContext());
client.loadTitleScreen();
clientList = findViewById(R.id.clientList);
createClientView();
// NOTE: client view instance must be created before initializing menu
menu = Menu.get();
updateOrientation();
} catch (final Exception e) {
// TODO: add option to save to file or copy to clipboard the error
e.printStackTrace();
@ -103,11 +102,92 @@ public class MainActivity extends AppCompatActivity {
menu.toggleVisibility();
}
/**
* Creates view to host a client instance.
*/
private void createClientView() {
final ClientView clientView = new ClientView(this);
setActiveClientView(clientView);
clientList.addView(clientView);
clientView.loadTitleScreen();
// show splash when a new view is created
SplashUtil.get().setVisible(true);
}
/**
* Sets client view to be shown and hides all others.
*
* @param clientView
* The `ClientView` instance to be visible.
*/
private void setActiveClientView(final ClientView clientView) {
for (int idx = 0; idx < clientList.getChildCount(); idx++) {
((ClientView) clientList.getChildAt(idx)).setActive(false);
}
clientView.setActive(true);
}
/**
* Sets client view to be shown and hides all others.
*
* @param clientIndex
* The index of `ClientView` instance to be visible.
*/
private void setActiveClientView(final int clientIndex) {
if (clientIndex < 0 || clientIndex >= clientList.getChildCount()) {
Logger.error(true, "Tried to access invalid client index: " + clientIndex);
return;
}
setActiveClientView((ClientView) clientList.getChildAt(clientIndex));
}
/**
* Retrieves active client view.
*
* @return
* `ClientView` instance that is visible.
*/
public ClientView getActiveClientView() {
for (int idx = 0; idx < clientList.getChildCount(); idx++) {
final ClientView clientView = (ClientView) clientList.getChildAt(idx);
if (clientView.isActive()) {
return clientView;
}
}
// default to first client view
return (ClientView) clientList.getChildAt(0);
}
/**
* Retrieves list of available client views.
*
* @return
* List containing all created `ClientView` instances.
*/
public List<ClientView> getClientViewList() {
final List<ClientView> available = new LinkedList<>();
for (int idx = 0; idx < clientList.getChildCount(); idx++) {
available.add((ClientView) clientList.getChildAt(idx));
}
return available;
}
/**
* Attempts to connect to client host.
*/
public void loadLogin() {
client.loadLogin();
getActiveClientView().loadLogin();
}
/**
* Retrieves app orientation.
*
* @return
* One of `Configuration.ORIENTATION_PORTRAIT` (1), `Configuration.ORIENTATION_LANDSCAPE` (2),
* or `Configuration.ORIENTATION_UNDEFINED` (0).
*/
public int getOrientation() {
return getResources().getConfiguration().orientation;
}
/**
@ -136,7 +216,7 @@ public class MainActivity extends AppCompatActivity {
* Opens a dialog to confirm exiting activity.
*/
public void onRequestQuit() {
final AlertDialog.Builder builder = new AlertDialog.Builder(client.getContext());
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Quit Stendhal?");
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@ -164,12 +244,16 @@ public class MainActivity extends AppCompatActivity {
//~ }
/**
* Updates direction pad position when screen orientation changes.
* Listens for changes to orientation.
*/
//~ @Override
//~ public void onConfigurationChanged(final Configuration config) {
//~ super.onConfigurationChanged(config);
//~ }
@Override
public void onConfigurationChanged(final Configuration config) {
super.onConfigurationChanged(config);
final ClientView clientView = getActiveClientView();
if (clientView != null && PageId.TITLE.equals(clientView.getCurrentPageId())) {
SplashUtil.get().update();
}
}
/**
* Called when main activity ends.
@ -193,6 +277,6 @@ public class MainActivity extends AppCompatActivity {
* Creates preferences activity.
*/
public void showSettings() {
startActivity(new Intent(MainActivity.this, PreferencesActivity.class));
startActivity(new Intent(this, PreferencesActivity.class));
}
}

View file

@ -11,10 +11,6 @@
***************************************************************************/
package org.stendhalgame.client;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.Button;
@ -26,8 +22,6 @@ import android.widget.Toolbar;
*/
public class Menu {
/** Main activity context. */
private final Context ctx;
/** Toolbar representing menu. */
private final Toolbar nav;
@ -35,23 +29,25 @@ public class Menu {
private Button btn_title;
private Button btn_reload;
/** Static menu instance. */
/** Singleton instance. */
private static Menu instance;
/**
* Retrieves menu instance.
* Retrieves menu singleton instance.
*/
public static Menu get() {
if (Menu.instance == null) {
Menu.instance = new Menu();
}
return instance;
}
public Menu(final Context ctx) {
// FIXME: may be considered unsafe as this is not technically a singleton
instance = this;
this.ctx = ctx;
nav = (Toolbar) ((Activity) ctx).findViewById(R.id.menu_main);
/**
* Hidden singleton constructor.
*/
private Menu() {
nav = (Toolbar) MainActivity.get().findViewById(R.id.menu_main);
nav.setTag(nav.getVisibility());
nav.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
@ -112,7 +108,7 @@ public class Menu {
* Refreshes displayed menu buttons.
*/
public void updateButtons() {
final PageId page = ClientView.getCurrentPageId();
final PageId page = MainActivity.get().getActiveClientView().getCurrentPageId();
btn_connect.setVisibility(View.GONE);
btn_title.setVisibility(View.GONE);
@ -130,7 +126,7 @@ public class Menu {
* Sets actions when buttons are pressed.
*/
private void initButtonHandlers() {
final MainActivity activity = (MainActivity) ctx;
final MainActivity activity = MainActivity.get();
btn_connect = (Button) activity.findViewById(R.id.btn_connect);
btn_connect.setOnClickListener(new View.OnClickListener() {
@ -150,7 +146,7 @@ public class Menu {
new Notifier.Action() {
@Override
protected void onCall() {
ClientView.get().loadTitleScreen();
MainActivity.get().getActiveClientView().loadTitleScreen();
updateButtons();
}
},
@ -172,7 +168,7 @@ public class Menu {
new Notifier.Action() {
@Override
protected void onCall() {
ClientView.get().reload();
MainActivity.get().getActiveClientView().reload();
}
},
new Notifier.Action() {
@ -190,7 +186,7 @@ public class Menu {
public void onClick(final View v) {
super.onClick(v);
((MainActivity) ctx).showSettings();
activity.showSettings();
}
});
@ -203,7 +199,7 @@ public class Menu {
// TODO: create proper about activity
final ClientView client = ClientView.get();
final ClientView client = MainActivity.get().getCurrentView();
final AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.get());
final String buildType = AppInfo.getBuildType();
String msg = "Android client version: " + AppInfo.getBuildVersion();
@ -265,7 +261,7 @@ public class Menu {
private class ClickListener implements View.OnClickListener {
@Override
public void onClick(final View v) {
if (!ClientView.onTitleScreen()) {
if (!MainActivity.get().getActiveClientView().onTitleScreen()) {
nav.setVisibility(View.GONE);
}
}

View file

@ -9,13 +9,10 @@
* (at your option) any later version. *
* *
***************************************************************************/
package org.stendhalgame.client.sound;
package org.stendhalgame.client;
import java.io.IOException;
import org.stendhalgame.client.Logger;
import org.stendhalgame.client.MainActivity;
import android.content.Context;
import android.media.MediaPlayer;
import android.net.Uri;
@ -69,6 +66,42 @@ public class MusicPlayer {
playMusic(MainActivity.get(), id, loop);
}
/**
* Plays selected music.
*
* @param musicId
* String identifier of music to play or `null` to play music configured in preferences.
*/
public static void playTitleMusic(String musicId) {
if (musicId == null) {
musicId = PreferencesActivity.getString("song_list");
}
int id = R.raw.title_01;
switch (musicId) {
case "title_02":
id = R.raw.title_02;
break;
case "title_03":
id = R.raw.title_03;
break;
case "title_04":
id = R.raw.title_04;
break;
case "title_05":
id = R.raw.title_05;
break;
}
Logger.debug("playing music: " + musicId);
MusicPlayer.playMusic(id, true);
}
/**
* Plays music configured in preferences.
*/
public static void playTitleMusic() {
playTitleMusic(null);
}
public static void stopMusic() {
if (mplayer != null) {
if (mplayer.isPlaying()) {

View file

@ -25,7 +25,7 @@ public class OpenAppByUrl extends Activity {
// String action = intent.getAction();
Uri data = intent.getData();
Logger.debug("URL: " + data);
ClientView.get().checkLoginIntent(intent);
MainActivity.get().getActiveClientView().checkLoginIntent(intent);
finish();
}

View file

@ -11,8 +11,6 @@
***************************************************************************/
package org.stendhalgame.client;
import org.stendhalgame.client.sound.MusicPlayer;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.os.Bundle;
@ -204,11 +202,11 @@ public class PreferencesActivity extends AppCompatActivity {
@Override
public boolean onPreferenceChange(final Preference pref, final Object obj) {
// set music state as soon as preference is changed
if (ClientView.onTitleScreen()) {
if (MainActivity.get().getActiveClientView().onTitleScreen()) {
if (!((Boolean) obj)) {
MusicPlayer.stopMusic();
} else if (!MusicPlayer.isPlaying()) {
ClientView.playTitleMusic();
MusicPlayer.playTitleMusic();
}
}
@ -231,11 +229,11 @@ public class PreferencesActivity extends AppCompatActivity {
@Override
public boolean onPreferenceChange(final Preference pref, final Object obj) {
// set music state as soon as preference is changed
if (ClientView.onTitleScreen()) {
if (MainActivity.get().getActiveClientView().onTitleScreen()) {
Logger.debug("changing title music preference: " + (String) obj);
if (title_music.isChecked()) {
ClientView.playTitleMusic((String) obj);
MusicPlayer.playTitleMusic((String) obj);
}
}
@ -254,8 +252,7 @@ public class PreferencesActivity extends AppCompatActivity {
@Override
protected void onCall() {
Logger.debug("clearing cache");
final ClientView clientView = ClientView.get();
if (clientView != null) {
for (final ClientView clientView: MainActivity.get().getClientViewList()) {
clientView.clearCache(true);
}
}

View file

@ -0,0 +1,90 @@
/***************************************************************************
* Copyright © 2024 - Faiumoni e. V. *
***************************************************************************
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
package org.stendhalgame.client;
import android.content.res.Configuration;
import android.widget.ImageView;
public class SplashUtil {
/** Image used as title page background. */
private final ImageView splash;
/** Singleton instance. */
private static SplashUtil instance;
/**
* Retrieves singleton instance.
*/
public static SplashUtil get() {
if (SplashUtil.instance == null) {
SplashUtil.instance = new SplashUtil();
}
return SplashUtil.instance;
}
/**
* Hidden singleton constructor.
*/
private SplashUtil() {
splash = (ImageView) MainActivity.get().findViewById(R.id.splash);
setVisible(false);
}
/**
* Sets the background splash image.
*
* @param resId
* Resource ID.
* @param bgColor
* Coloring to fill behind splash image.
*/
private void setImage(final int resId, final int bgColor) {
splash.setBackgroundColor(bgColor);
splash.setImageResource(resId);
}
/**
* Sets splash image dependent on device orientation.
*/
public void update() {
if (!isVisible()) {
return;
}
int resId = R.drawable.splash;
if (MainActivity.get().getOrientation() == Configuration.ORIENTATION_PORTRAIT) {
resId = R.drawable.splash_portrait;
}
// light blue background color
setImage(resId, 0xff6c9ed1);
}
/**
* Shows or hides background splash image.
*
* @param visible
* `true` if image should visible, `false` if not.
*/
public void setVisible(final boolean visible) {
splash.setVisibility(visible ? ImageView.VISIBLE : ImageView.GONE);
update();
}
/**
* Checks if splash is visible.
*/
public boolean isVisible() {
return ImageView.VISIBLE == splash.getVisibility();
}
}

View file

@ -129,7 +129,7 @@ class UrlHelper {
final Uri uri = UrlHelper.toUri(url);
final Uri.Builder builder = uri.buildUpon();
if (UrlHelper.isClientUrl(url)) {
final ClientView client = ClientView.get();
final ClientView client = MainActivity.get().getActiveClientView();
final boolean testClient = client.isTestClient();
String replaceSuffix = "/testclient/";
if (testClient) {
@ -212,7 +212,7 @@ class UrlHelper {
// allow pages from stendhalgame.org
return true;
}
final String cs = ClientView.get().checkCustomServer();
final String cs = MainActivity.get().getActiveClientView().checkCustomServer();
if (cs != null) {
return UrlHelper.stripHost(cs).equals(host);
}

View file

@ -0,0 +1,9 @@
Stendhal has a huge and rich world. You can explore cities, forest, mountains, plains and dungeons.
You can fight monsters and become a hero.
You will meet a wide variety of characters. Many will give you tasks and quests for valuable
experience. You may be asked to help protect land, feed the hungry, heal the sick, make someone
happy, solve a puzzle or simply lend a hand.
So what are you waiting for? A whole new world awaits... And if you like, get the source code, and
add your own ideas!

View file

@ -1 +1 @@
Stendhal ist ein Multiplayer-Adventure mit klassischer 2D-Grafik. Es ist vollständig Open Source.
Ein Multiplayer-Adventure mit klassischer 2D-Grafik

Binary file not shown.

After

Width:  |  Height:  |  Size: 335 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 647 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 597 KiB

View file

@ -1 +1 @@
Stendhal is a multiplayer adventure with classic 2D graphics. It is completely open source.
A multiplayer adventure with classic 2D graphics

View file

@ -0,0 +1,9 @@
Stendhal tiene un mundo enorme y rico. Puedes explorar ciudades, bosques, montañas, llanos y
mazmorras. Puedes combatir monstruos y llegar a ser un héroe.
Te encontrarás con una amplia variedad de personajes. Muchos te darán tareas y misiones para obtener
experiencia valiosa. Es posible que se te pida proteger terrenos, alimentar a los hambrientos, curar
a los enfermos, hacer feliz a alguien, resolver un rompecabezas, o simplemente echar una mano.
Entonces, ¿a qué estás esperando? Un mundo completamente nuevo te espera... ¡Y si deseas, consigue
el código fuente y añade tus propias ideas!

View file

@ -1 +1 @@
Stendhal es una aventura multijugador con gráficos 2D clásicos. Es completamente de código abierto.
Una aventura multijugador con gráficos 2D clásicos

View file

@ -0,0 +1,10 @@
Stendhal a un monde immense et riche. Vous pouvez explorer des villes, des forêts, des montagnes,
des plaines et des donjons. Vous pouvez combattre des monstres et devenir un héros.
Vous rencontrerez une grande variété de personnages. Beaucoup vous donneront des tâches et des
quêtes pour l'expérience précieuse. On vous demandera peut-être d'aider à protéger des terres,
nourrir les affamés, soigner les malades, rendre quelqu'un heureux, résoudre une énigme ou
simplement donner un coup de main.
Alors, qu'attendez-tu? Un tout nouveau monde vous attend... Et si vous le souhaitez, récupérez le
code source et ajoutez vos propres idées!

View file

@ -1 +1 @@
Stendhal est une aventure multijoueur avec des graphismes 2D classiques. C'est complètement open source.
Une aventure multijoueur avec des graphismes 2D classiques

View file

@ -0,0 +1,9 @@
Stendhal ha un mondo enorme e ricco. Puoi esplorare città, foreste, montagne, pianure e dungeon.
Puoi combattere mostri e diventare un eroe.
Incontrerai una vasta varietà di personaggi. Molti ti daranno compiti e missioni per preziosa
esperienza. Potresti essere chiesto di aiutare a proteggere terra, nutrire gli affamati, curare i
malati, rendere felice qualcuno, risolvere un puzzle o semplicemente dare una mano.
Allora, cosa stai aspettando? Un mondo completamente nuovo aspetta... E se vuoi, ottieni il codice
sorgente e aggiungi le tue idee!

View file

@ -1 +1 @@
Stendhal è un'avventura multiplayer con la classica grafica 2D. È completamente open source.
Un'avventura multiplayer con la classica grafica 2D

View file

@ -0,0 +1,9 @@
Stendhal to niezwykły, pełen możliwości świat. Odkryjesz w nim miasta, lasy, góry, równiny i lochy.
Stawić możesz czoło potworom oraz stać się bohaterem.
W drodze napotkasz rozmaite postacie. Wielu z nich zleci ci misje, które zapewnią cenne
doświadczenie. Zdarzy się, że będziesz musiał ochraniać ziemie, nakarmić głodnych, pomóc wyleczyć chorych,
uprzyjemnić czyjeś życie, rozwiązać zagadki lub po prostu wesprzeć pomocną dłonią.
A więc na co jeszcze czekasz? Cały nowy świat wyczekuje ciebie... Jeśli chcesz, pobierz kod
źródłowy oraz dodaj własne pomysły!

View file

@ -0,0 +1 @@
Wieloosobowa gra przygodowa z klasyczną grafiką 2D

View file

@ -0,0 +1,9 @@
Stendhal tem um mundo enorme e rico. Podes explorar cidades, florestas, montanhas, planícies e
masmorras. Podes lutar contra monstros e tornar-te um herói.
Vais encontrar uma grande variedade de personagens. Muitos vão dar-te tarefas e missões para
experiência valiosa. Podes ser solicitado(a) a proteger a terra, alimentar os famintos, curar os
doentes, fazer alguém feliz, resolver um quebra-cabeça, ou simplesmente dar uma mão.
Então, do que estás à espera? Um mundo completamente novo aguarda... E se quiseres, obtém o
código-fonte e adiciona as tuas próprias ideias!

View file

@ -1 +1 @@
Stendhal é uma aventura multijogador com gráficos 2D clássicos. É totalmente de código aberto.
Uma aventura multijogador com gráficos 2D clássicos

View file

@ -0,0 +1,9 @@
Stendhal are o lume imensă și bogată. Poți explora orașe, păduri, munți, câmpii și temnițe. Poți să
lupți cu monștri și să devii erou.
Vei întâlni o gamă largă de personaje. Multe îți vor da sarcini și misiuni în schimbul valoroasei
experiențe. Ți s-ar putea cere să protejezi pământuri, să-i hrănești pe cei flămânzi, să-i vindeci
pe cei bolnavi, să faci pe cineva fericit, să dezlegi un puzzle sau doar să dai o mână de ajutor.
Ce mai aștepți? O întreagă nouă lume te așteaptă... Și dacă vrei, ia codul sursă și adaugă-ți
propriile idei!

View file

@ -0,0 +1 @@
O aventură multijucător cu grafică 2D clasică

View file

@ -1,65 +1,3 @@
PUT RELEASE ANNOUNCEMENT LINES HERE
1.46
*world*
- renamed items:
- "courgette" to "zucchini"
- "iron" to "iron bar"
- "salad" to "lettuce"
- fixed many NPCs not responding to certain chat options
- normalized spelling of some words to American English in most NPC dialogues
- "colour" -> "color"
- "defence" -> "defense"
- "favour" -> "favor"
- "favourite" -> "favorite"
- "fulfil" -> "fulfill"
- "organise" -> "organize"
- "recognise" -> "rocognize"
- Orchiwald will stop after entity collision instead of reversing path
- foghorn sounds plays when ferry arrives at mainland & island
- added commerce sound to more NPCs when exchanging money for items/services
- seeds can be used from inventory
*graphics*
- redrawn placeholder tiles in Oni Palace
- fixed some outfit errors
- disabled unfinished weapon-style attack sprites
*web client*
- improved movement handling with on-screen joystick & direction pad
- alternate "floating" menu style
- alternate "floating" chat panel style
- software keyboard is automatically hidden after sending chat message
- optional activity indicator for corpses & some signs
- immediate configuration changes affect only the active client/browser tab
- application menu dialog doesn't close when clicking on background
- correct NPC title is displayed in chat options dialog
- disabled highlighting joystick/d-pad button on mouse double-click & drag
- joystick/d-pad isn't shown until user interface is ready
- character name in stats panel uses default font size
- fixed chest default open/close behavior (clicking on open chest opens inventory window instead of closing)
- doesn't attempt to open corpse/chest inventory windows when character not in range
- fixed chat history duplicates
- chat options dialog remains open until NPC is no longer attending or player closes
- fixed continuous movement state not always updated at startup
- supports displaying members' HP status in group panel
- fixed group panel not always showing membership after login
- added support for touch drag-and-drop
- fixed weather drawing to not appear to move with player
- fixed subsequent single clicks on items to not count as double after double click
- fixed deathmatch scrying orbs
- fixed portal default action when on a collision tile
- added autocomplete support
- fixed positioning of door sprites (-2_orril_lich_palace 84 108)
- optional click/touch indicator
- fixed difficult to move small floating windows
- supports chat commands tab completion
- supports text highlighting in speech bubbles
- fixed opening chat log context menu with touch
- supports continued zone music when changed zone matches
*Android*
- added option to clear WebView cache
- added option to lock orientation
- fixes for using the correct software keyboard
- app ID changed to conform with F-Droid standards
Please see the complete change log for further details: https://arianne-project.org/game/stendhal.html#changes

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

View file

@ -13,20 +13,20 @@
android:id="@+id/splash"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:scaleType="fitCenter"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
/>
<org.stendhalgame.client.ClientView
android:id="@+id/clientWebView"
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/clientList"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
/>
app:layout_constraintTop_toTopOf="parent">
</androidx.constraintlayout.widget.ConstraintLayout>
<Toolbar
android:id="@+id/menu_main"

View file

@ -5,6 +5,6 @@
<string name="app_name">Stendhal</string>
<string name="intent_url_scheme">stendhalprod8gps5y99pu</string>
<string name="build_type">prod</string>
<string name="build_version">1.46</string>
<string name="build_version">1.49.5</string>
</resources>

View file

@ -13,12 +13,19 @@ package org.stendhalgame.client;
import java.io.File;
import android.app.AlertDialog;
import android.content.DialogInterface;
/**
* Dummy class for release builds.
* Semi-functional logger for release builds.
*
* Displays notification dialogs but does not write to logs directory.
*/
public class Logger {
/** Attribute denoting state of initialization. */
private static boolean initialized = false;
/** Logs directory. */
private static File logsDir;
@ -33,7 +40,6 @@ public class Logger {
if (Logger.instance == null) {
Logger.instance = new Logger();
}
return Logger.instance;
}
@ -47,7 +53,12 @@ public class Logger {
/**
* Initializes logs directory.
*/
public static void init(final File dir, @SuppressWarnings("unused") final MainActivity activity) {
public static void init(final File dir) {
if (Logger.initialized) {
Logger.warn("tried to re-initialize logger");
return;
}
Logger.initialized = true;
logsDir = new File(dir.getPath() + "/logs");
}
@ -73,10 +84,17 @@ public class Logger {
}
/**
* Dummy method for release builds.
* Shows an information dialog.
*
* @param notify
* If `true` a toast notification is displayed to user.
* @param text
* Text to be displayed.
*/
public static void info(final boolean notify, final String text) {
// do nothing
if (notify) {
Logger.notify(text, LogLevel.INFO);
}
}
/**
@ -87,10 +105,17 @@ public class Logger {
}
/**
* Dummy method for release builds.
* Shows a warning dialog.
*
* @param notify
* If `true` a toast notification is displayed to user.
* @param text
* Text to be displayed.
*/
public static void warn(final boolean notify, final String text) {
// do nothing
if (notify) {
Logger.notify(text, LogLevel.WARN);
}
}
/**
@ -101,10 +126,17 @@ public class Logger {
}
/**
* Dummy method for release builds.
* Shows an error message dialog.
*
* @param notify
* If `true` a toast notification is displayed to user.
* @param text
* Text to be displayed.
*/
public static void error(final boolean notify, final String text) {
// do nothing
if (notify) {
Logger.notify(text, LogLevel.ERROR);
}
}
/**
@ -115,24 +147,59 @@ public class Logger {
}
/**
* Dummy method for release builds.
* Shows a debug message dialog.
*
* @param notify
* If `true` a toast notification is displayed to user.
* @param text
* Text to be displayed.
*/
public static void debug(final boolean notify, final String text) {
// do nothing
if (notify) {
Logger.notify(text, LogLevel.DEBUG);
}
}
/**
* Dummy method for release builds.
* Displays a toast notification to user.
*
* @param text
* Text to display in notification.
*/
public static void notify(final String text) {
// do nothing
notify(text, LogLevel.INFO);
}
/**
* Dummy method for release builds.
* Displays a toast notification to user.
*
* @param text
* Text to display in notification.
* @param level
* Logging verbosity level.
*/
public static void notify(final String text, final LogLevel level) {
// do nothing
public static void notify(final String text, LogLevel level) {
if (!Logger.initialized) {
System.err.println("ERROR: Logger not initialized. Call Logger.init.");
return;
}
if (level == null) {
level = LogLevel.INFO;
}
final AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.get());
builder.setTitle(level.label);
builder.setMessage(text);
builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(final DialogInterface dialog, final int id) {
dialog.cancel();
}
});
builder.create().show();
}
/**

View file

@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionSha256Sum=91a239400bb638f36a1795d8fdf7939d532cdc7d794d1119b7261aac158b1e60
distributionSha256Sum=f6b8596b10cce501591e92f229816aa4046424f3b24d771751b06779d58c8ec4
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

View file

@ -18,6 +18,7 @@ panic = 'abort'
strip = true
[dependencies]
lazy_static = "1.5.0"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
steamworks = "0.10.0"

View file

@ -1,9 +1,12 @@
use lazy_static::lazy_static;
use serde_json::Value;
use std::io;
use std::io::Read;
use std::process;
use std::sync::Arc;
use std::sync::atomic::AtomicBool;
use std::sync::atomic::Ordering;
use std::sync::Mutex;
use std::sync::mpsc::Sender;
use std::sync::mpsc::channel;
use std::thread;
@ -16,6 +19,10 @@ use websocket::client::ClientBuilder;
use websocket::{Message, OwnedMessage};
lazy_static! {
static ref AUTHENTICATED: Mutex<bool> = Mutex::new(false);
}
fn connect() -> (Sender<OwnedMessage>, JoinHandle<()>) {
println!("Read connection parameters");
let mut json = String::new();
@ -112,58 +119,70 @@ fn connect() -> (Sender<OwnedMessage>, JoinHandle<()>) {
}
}
});
return (tx, receive_loop);
return (tx, receive_loop);
}
fn handle_message(nl_token: &String, tx: Sender<OwnedMessage>, message: String) {
if message.contains("event\":\"request_authentication\"") {
authenticate(tx, nl_token.clone());
} else if message.contains("event\":\"clientDisconnect\"") {
let authenticated = AUTHENTICATED.lock().unwrap();
if *authenticated {
println!("Authenticated, exiting extension ...");
} else {
println!("Unauthenticated, exiting extension ...");
}
process::exit(0);
}
}
fn authenticate(tx: Sender<OwnedMessage>, nl_token: String) {
match Client::init() {
Ok((client, single)) => {
match Client::init() {
Ok((client, single)) => {
let called = Arc::new(AtomicBool::new(false));
let callback_called = called.clone();
let (_ticket_handle, session_ticket): (steamworks::AuthTicket, Vec<u8>) = client.user().authentication_session_ticket();
let _callback =
client.register_callback(move |session_ticket_response: AuthSessionTicketResponse| {
//if session_ticket_response.ticket == ticket_handle {
println!("Ticket Response Result: {:?}", session_ticket_response.result);
callback_called.store(true, Ordering::Relaxed);
// println!("Ticket : {:?}", session_ticket_response.ticket);
// println!("Ticket Response: {:?}", session_ticket);
let (_ticket_handle, session_ticket): (steamworks::AuthTicket, Vec<u8>) = client.user().authentication_session_ticket();
let _callback =
client.register_callback(move |session_ticket_response: AuthSessionTicketResponse| {
//if session_ticket_response.ticket == ticket_handle {
if session_ticket_response.result.is_ok() {
let mut authenticated = AUTHENTICATED.lock().unwrap();
*authenticated = true;
}
println!("Ticket Response Result: {:?}", session_ticket_response.result);
callback_called.store(true, Ordering::Relaxed);
// println!("Ticket : {:?}", session_ticket_response.ticket);
// println!("Ticket Response: {:?}", session_ticket);
let message = OwnedMessage::Text(format!("\
{{\
\"id\": \"15fb0ffb-7b18-48d2-89a3-39b1ce4b2645\",\
\"method\": \"app.broadcast\",\
\"accessToken\": {:?},\
\"data\": {{\
\"event\": \"steamAuthToken\",\
\"data\": {:?}\
}}\
}}", nl_token, &session_ticket));
match tx.send(message) {
Ok(()) => (),
Err(e) => {
println!("Websocket send error: {:?}", e);
}
}
let message = OwnedMessage::Text(format!("\
{{\
\"id\": \"15fb0ffb-7b18-48d2-89a3-39b1ce4b2645\",\
\"method\": \"app.broadcast\",\
\"accessToken\": {:?},\
\"data\": {{\
\"event\": \"steamAuthToken\",\
\"data\": {:?}\
}}\
}}", nl_token, &session_ticket));
match tx.send(message) {
Ok(()) => (),
Err(e) => {
println!("Websocket send error: {:?}", e);
}
}
});
for _ in 0..100 {
single.run_callbacks();
if called.load(Ordering::Relaxed) {
return;
}
::std::thread::sleep(::std::time::Duration::from_millis(50));
}
},
Err(_) => {
});
for _ in 0..100 {
single.run_callbacks();
if called.load(Ordering::Relaxed) {
return;
}
::std::thread::sleep(::std::time::Duration::from_millis(50));
}
},
Err(_) => {
println!("Steam not available");
let message = OwnedMessage::Text(format!("\
{{\
@ -181,10 +200,10 @@ fn authenticate(tx: Sender<OwnedMessage>, nl_token: String) {
}
}
}
}
}
}
fn main() {
let (_tx, receive_loop) = connect();
let (_tx, receive_loop) = connect();
let _ = receive_loop.join();
}

View file

@ -11,6 +11,7 @@ neutralino.js
# Neutralinojs related files
.storage
*.log
extensions/binary/steam_appid.txt
extensions/binary/*.so
extensions/binary/*.dll
extensions/binary/nativehelper*

View file

@ -1 +0,0 @@
2267890

View file

@ -1,7 +1,7 @@
{
"$schema": "https://raw.githubusercontent.com/neutralinojs/neutralinojs/main/schemas/neutralino.config.schema.json",
"applicationId": "stendhal_client",
"version": "0.4.0",
"applicationId": "org.stendhalgame.client",
"version": "1.49.5",
"defaultMode": "window",
"port": 0,
"documentRoot": "/resources/",
@ -11,9 +11,9 @@
"enableExtensions": true,
"extensions": [
{
"id": "nativehelper",
"commandLinux": "${NL_PATH}/extensions/binary/nativehelper",
"commandWindows": "${NL_PATH}/extensions/binary/nativehelper.exe"
"id": "nativehelper",
"commandLinux": "${NL_PATH}/extensions/binary/nativehelper",
"commandWindows": "${NL_PATH}/extensions/binary/nativehelper.exe"
}
],
"tokenSecurity": "one-time",
@ -55,7 +55,7 @@
"resourcesPath": "/resources/",
"extensionsPath": "/extensions/",
"clientLibrary": "/resources/js/neutralino.js",
"binaryVersion": "5.0.0",
"clientVersion": "5.0.1"
"binaryVersion": "6.2.0",
"clientVersion": "6.2.0"
}
}

View file

@ -2,6 +2,9 @@ const SERVER_ORIGIN = "https://stendhalgame.org";
// const SERVER_ORIGIN = "http://localhost";
const SERVER_PATH = "/account/login.html";
const UPDATE_URL = "https://arianne-project.org/stendhal/updates/manifest.json";
let authenticated = false;
const byteToHex = [];
@ -28,8 +31,24 @@ function onSteamAuthToken(event) {
document.querySelector("form").submit();
}
async function update() {
try {
let manifest = await Neutralino.updater.checkForUpdates(UPDATE_URL);
if(manifest.version > NL_APPVERSION) {
console.log("Updating...");
await Neutralino.updater.install();
} else {
console.log('Stendhal is up to date.');
}
} catch (e) {
console.log("Update check failed", e);
}
}
function onNoAuthToken(_event) {
console.log("onNoAuthToken");
update();
window.location = SERVER_ORIGIN + SERVER_PATH + "?" + Date.now();
}
@ -56,8 +75,14 @@ async function timeoutExtensionAuthentication() {
}
Neutralino.init();
// https://github.com/neutralinojs/neutralinojs/issues/678
Neutralino.events.on("windowClose", () => {
Neutralino.app.exit();
});
setTimeout(() => timeoutExtensionConnection(), 2000);
Neutralino.events.on("steamAuthToken", onSteamAuthToken);
Neutralino.events.on("noAuthToken", onNoAuthToken);
Neutralino.extensions.dispatch('nativehelper', 'request_authentication');
Neutralino.extensions.dispatch("nativehelper", "request_authentication");

146
bin/check-boilerplates.sh Executable file
View file

@ -0,0 +1,146 @@
#!/usr/bin/env bash
# This script is licensed under Creative Commons Zero (CC0 / Public Domain).
# source root should be directory above script location
cd "$(dirname $0)/../"
root=$(pwd)
script="$(basename $0)";
cur_year=$(date +"%Y")
args=("$@")
write=0
if [ "${args[0]}" == "-w" ] || [ "${args[0]}" == "--write" ]; then
write=1
unset args[0]
# shift so args[0] isn't undefined
args=("${args[@]}")
fi
if [ ! -z ${args[0]} ]; then
src_dirs=("${args[@]}")
else
src_dirs=(
"src/games/stendhal/client"
"src/games/stendhal/common"
"src/games/stendhal/server"
"src/games/stendhal/tools"
"src/js/stendhal"
"data/script"
)
fi
if [ ${write} -eq 0 ]; then
echo -e "\nScan only mode, to update files use '${script} --write'"
fi
warnings=0
# logs a warning message
warn() {
w="WARNING: ${1}"
if [[ ${warnings} -eq 0 ]]; then
# no previous output from this so erase contents
echo -e "Issues reported by ${script}:\n${w}" > "issues.txt"
else
# append
echo -e "${w}" >> "issues.txt"
fi
echo "${w}"
warnings=$(expr ${warnings} + 1)
}
# logs an error message & exits
err() {
c=${1}
e="ERROR: ${2} (error code: ${c}), exiting ..."
if [[ ${warnings} -eq 0 ]]; then
# no previous output from this run so erase contents
echo -e "Issues reported by ${script}:\n${e}" > "issues.txt"
else
# append
echo -e "${e}" >> "issues.txt"
fi
echo -e "${e}\nDetails saved to issues.txt"
exit ${c}
}
start_time=$(date +"%s")
file_types=(-name "*.java" -o -name "*.js" -o -name "*.ts" -o -name "*.lua")
checked=0
updated=0
for rel_path in "${src_dirs[@]}"; do
if [[ "${rel_path}" == /* ]]; then
abs_path="${rel_path}"
else
abs_path="${root}/${rel_path}"
fi
if [ ! -d "${abs_path}" ]; then
warn "Skipped missing directory: ${rel_path}"
continue
fi
if [ ${write} -eq 0 ]; then
echo -e "\nChecking copyrights in ${rel_path} ..."
else
echo -e "\nChecking and updating copyright year (${cur_year}) in ${rel_path} ..."
fi
sources=$(find "${rel_path}" -type f \( "${file_types[@]}" \))
for src in ${sources}; do
pattern="Copyright\( ©\)\? "
instances=$(grep "^ \*.*${pattern}" "${src}")
icount=$(echo "${instances}" | wc -l)
if [ ${icount} -gt 1 ]; then
warn "Multiple copyrights: ${src}"
# use first instance
instances=$(echo "${instances}" | head -n1)
fi
year=$(echo "${instances}" | sed -e "s/^ \*.*${pattern}//" | cut -b1-4)
if [ "${year}" == "" ]; then
warn "Copyright not detected: ${src}"
continue
elif [ "${year}" == "${cur_year}" ]; then
years="${cur_year}"
else
years="${year}-${cur_year}"
fi
if [ ${#year} -lt 4 ]; then
warn "Invalid year ${year}: ${src}"
fi
if [ ${write} -gt 0 ]; then
# add updated year(s) to file (replace only first instance)
sed -i -e "0,/${pattern}${year}[^ ]* \([^*]*\)\*/s//Copyright\1 ${years} \2\*/" "${src}"
# update pattern for perl regex
#pattern=$(echo ${pattern} | perl -pe 's/\\//g')
#perl -i -pe "!\${i} && s/${pattern} ${year}.*? (.*)\*/Copyright\$1 ${years} \$2\*/ && (\${i}=1)" "${src}"
ret=$?
if [ ${ret} -ne 0 ]; then
err ${ret} "An unhandled exception occurred"
fi
updated=$(expr ${updated} + 1)
fi
checked=$(expr ${checked} + 1)
done
done
s=$(expr $(date +"%s") - ${start_time})
m=$(expr ${s} / 60)
s=$(expr ${s} - ${m} \* 60)
h=$(expr ${m} / 60)
m=$(expr ${m} - ${h} \* 60)
echo -e "\nDone (elapsed time: ${h}h ${m}m ${s}s)"
echo "Files checked: ${checked}"
echo "Files updated: ${updated}"
echo "Warnings: ${warnings}"
if [ ${warnings} -gt 0 ]; then
echo "Details saved to issues.txt"
fi

90
bin/check-file-size.py Executable file
View file

@ -0,0 +1,90 @@
#!/usr/bin/env python3
'''
***************************************************************************
* Copyright © 2025 - Faiumoni e. V. *
***************************************************************************
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************
'''
import errno
import os
import sys
from pathlib import Path
dir_root = Path(__file__).parent
if "bin" == dir_root.name:
dir_root = Path(dir_root.parent)
dir_music = Path(dir_root, "data/music")
dir_sounds = Path(dir_root, "data/sounds")
## Checks if a file is larger than 2MB.
#
# On systems with low resources, the Java client struggles to load large audio files.
#
# @param path
# File path.
# @return
# `EFBIG` if file is larger than 2MB, 0 otherwise.
def checkAudioFileSize(path):
if not path.is_file():
# ignore if audio file doesn't exist
print("WARNING: Ignoring file not found: {}".format(path))
return 0
if path.stat().st_size > 1048576 * 2:
# warn if file size > 2MB
return errno.EFBIG
return 0
## Checks directory for large audio files.
#
# @param path
# Directory path to be walked.
# @return
# `EFBIG` if any file larger than 2MB found, 0 otherwise.
def checkAudioDir(path):
if not path.is_dir():
# ignore if audio directory doesn't exist
print("WARNING: Ignoring directory not found: {}".format(path))
return 0
res = 0
for ROOT, DIRS, FILES in path.walk():
for filename in FILES:
filepath = Path(ROOT, filename)
if filepath.suffix.lower().lstrip(".") not in ("ogg", "oga", "mid", "midi"):
# only check supported file types
continue
code = checkAudioFileSize(filepath)
if code == errno.EFBIG:
res = code
sys.stderr.write("WARNING: Audio file size larger than 2MB: {}\n".format(str(filepath)[len(str(dir_root)):].lstrip("/\\")))
return res
def main():
res = 0
for audio_dir in dir_music, dir_sounds:
code = checkAudioDir(audio_dir)
if code != 0:
res = code
if res == 0:
print("No large audio data files detected")
return res
if __name__ == "__main__":
# work from source tree root
os.chdir(dir_root)
sys.exit(main())

View file

@ -1,7 +1,7 @@
#!/usr/bin/env python
# ***************************************************************************
# * Copyright © 2023 - Stendhal *
# * Copyright © 2023-2024 - Stendhal *
# ***************************************************************************
# * *
# * This program is free software; you can redistribute it and/or modify *

View file

@ -1,6 +1,6 @@
@echo off
set STENDHAL_VERSION=1.46
set STENDHAL_VERSION=1.49.5
set SERVER_JAR=stendhal-server-%STENDHAL_VERSION%.jar
:: change to server directory

2
bin/runserver.sh Normal file → Executable file
View file

@ -1,6 +1,6 @@
#!/usr/bin/env bash
STENDHAL_VERSION="1.46"
STENDHAL_VERSION="1.49.5"
SERVER_JAR="stendhal-server-${STENDHAL_VERSION}.jar"
# change to server directory

View file

@ -1,5 +1,4 @@
#!/usr/bin/env python3
#Tue Sep 10 23:32:58 CEST 2019, slightly tweaked -- omero
"""
This script is used to create the world map with labeled zone names.
@ -10,20 +9,19 @@ To create the labeled world map:
* Open a command line
* Change to your stendhal directory
* Run
ant rendermaps
ant rendermaps
* Change to the tiled directory
* Run
python vampire_maplabel.py -world
python vampire_maplabel.py -world
* Open tiled/world/world.tmx in tiled
* Set the floor layer to opaque (no transparency)
* Set the zoom to 1:1 (CTRL-0)
* From the file menu, select "Save as Image"
* Crop the black border (e.g. use "Crop Automatically" in The GIMP)
* Upload the image, e.g. at http://imageshack.us
* Replace your labeled image files from the tiled/world directory with
the clean (unlabeled) ones from CVS.
* Edit http://stendhalgame.org/wiki/Template:SmallWorldMap
and add a link to your uploaded image.
* Replace your labeled image files from the tiled/world directory with the clean (unlabeled) ones
from CVS.
* Edit http://stendhalgame.org/wiki/Template:SmallWorldMap and add a link to your uploaded image.
"""
import sys
@ -33,29 +31,38 @@ import os
from PIL import Image, ImageFont, ImageDraw
# get absolute path where script is located
dir_root = os.path.dirname(__file__)
if dir_root:
os.chdir(dir_root)
dir_root = os.getcwd()
dir_world = os.path.join(dir_root, 'world')
script_name = os.path.basename(__file__)
# directory from where script was executed
dir_start = os.getcwd()
# path to root directory
os.chdir(os.path.join(os.path.dirname(__file__), '../'))
dir_root = os.getcwd()
# directory relative to root where images are located
subdir_world = os.path.normpath('data/maps/world')
# absolute path to directory where images are located
dir_world = os.path.join(dir_root, subdir_world)
protected = ('world', 'logo', 'reserved', 'empty', 'empty-white')
def showUsage():
print ('Usage: {} [image-filenames...]'.format(script_name))
print (' This will label each PNG file passed as argument.')
print (' E.g: ./world/int_*.png will label all interiors, etc. etc.')
print
print ('Alternatively, you can run: {} -world'.format(script_name))
print (' This will label each PNG file in the world subdirectory.')
print('Usage: {} [image-filenames...]'.format(script_name))
print(' This will label each PNG file passed as argument.')
print(' E.g: data/maps/world/int_*.png will label all\n interiors, etc.')
print(' Note: If filename parameters aren\'t found they\n are assumed to be nested within the\n {} directory.'.format(subdir_world))
print()
print('Alternatively, you can run: {} -world'.format(script_name))
print(' This will label each PNG file in the world subdirectory.')
processed = 0
def do_label(fname):
print ('Processing {}'.format(fname))
global processed
print('Processing {}'.format(fname))
# remove directory and file extension
label = os.path.basename(fname).split('/')[-1].replace('.png', '')
print ('Processing LABEL: {}'.format(label))
print('Processing LABEL: {}'.format(label))
img = Image.open(fname)
img = img.convert('RGBA')
@ -64,7 +71,7 @@ def do_label(fname):
# label
draw = ImageDraw.Draw(img, 'RGBA')
draw.fontmode = "0" # set to "1" to disable anti-aliasing (not documented in PIL module)
font = ImageFont.truetype('../data/font/Carlito-Bold.ttf', 12)
font = ImageFont.truetype('../font/Carlito-Bold.ttf', 12)
draw.text((6, 6), label, ( 0, 0, 0, 255),font=font)
draw.text((5, 5), label, (255, 255, 255, 255),font=font)
@ -75,12 +82,43 @@ def do_label(fname):
img.paste(img2, img2)
img.save(fname)
processed += 1
## Checks file path & converts to absolute.
#
# @param imagepath
# Path to image file.
def checkAbsPath(imagepath):
if not imagepath.lower().endswith('.png'):
# only PNG images supported
imagepath += '.png'
imagepath = os.path.normpath(imagepath)
# check from root directory
if os.path.isfile(imagepath):
return os.path.abspath(imagepath)
# check from directory where script was executed
os.chdir(dir_start)
if os.path.isfile(imagepath):
imagepath = os.path.abspath(imagepath)
else:
# assume file is nested in `subdir_world`
imagepath = os.path.join(dir_world, imagepath)
# change back to root dir remaining execution
os.chdir(dir_root)
return imagepath
if len(sys.argv) < 2:
print('\nERROR: Not enough arguments\n')
showUsage()
sys.exit(1)
elif len(sys.argv) == 2 and sys.argv[1] == '-world':
if len(sys.argv) == 2 and sys.argv[1] == '-world':
for fname in os.listdir(dir_world):
if fname.endswith('.png'):
absolute_fname = os.path.join(dir_world, fname)
@ -89,14 +127,8 @@ elif len(sys.argv) == 2 and sys.argv[1] == '-world':
continue
do_label(absolute_fname)
else:
# This doesn't work for me. --mort
#for fname in reduce(operator.add, map(glob.glob, sys.argv[1:])):
# This works for me. --omero
for fname in list(sys.argv[1:]):
if not fname.endswith('.png'):
fname = '{}.png'.format(fname)
absolute_fname = os.path.join(dir_world, fname)
absolute_fname = checkAbsPath(fname)
if fname.rstrip('.png') in protected:
print('NOTE: skipping protected file: {}'.format(absolute_fname))
continue
@ -104,7 +136,10 @@ else:
if not os.path.isfile(absolute_fname):
print('\nERROR: Cannot process {}\n File does not exist.'.format(absolute_fname))
sys.exit(1)
print ( 'Labeling {}...'.format(fname ))
print('Labeling {}...'.format(fname ))
do_label(absolute_fname)
print ('All Done.')
if processed == 0:
print('\nWARNING: no images were processed')
else:
print('\nprocessed {} {}'.format(processed, 'image' if processed == 1 else 'images'))

View file

@ -91,10 +91,10 @@ updates_server_fallback = http://arianne.sourceforge.net/stendhal/updates
version_server = http://arianne.sourceforge.net/stendhal.version
# current version of stendhal
version.old = 1.45
version = 1.46
version.old = 1.49
version = 1.49.5
# FIXME: dynamic method to set this property?
version.android = 1046000
version.android = 1049005
# javac options
javac.deprecation = true
@ -102,18 +102,17 @@ javac.debug = true
javac.debuglevel = source,lines
# change these only if you know what you are doing
buildroot = build
build = build
buildroot = ${build}
build-archive = build-archive
src = src
testsrc = tests
srcjs = srcjs
docu = data/docu
maps = data/maps
data = data/gui
sprites = data/sprites
layers = data/layers
tiled = tiled
build = build
srcjs = ${src}/js
docs = doc
data = data
gui = ${data}/gui
maps = ${data}/maps
sprites = ${data}/sprites
lib = ${buildroot}/lib
marauroa_root = ../marauroa
marauroa_src = ${marauroa_root}/src

102
build.xml
View file

@ -1,103 +1,33 @@
<?xml version='1.0'?>
<project name="stendhal" default="compile" basedir=".">
<!--
Sets a property (by name and value), or set of properties (from file or resource) in the project. Properties are case sensitive.
Properties are immutable: whoever sets a property first freezes it for the rest of the build; they are most definitely not variables.
-->
<property environment="env"/>
<project name="stendhal" default="help" basedir=".">
<description>
Project:
Name: .......... ${game_name}
Version: ....... ${version}
Root: .......... ${basedir}
<condition property="os.win">
<os family="windows"/>
</condition>
Build system:
Ant version: ... ${ant.version.number}
Ant home: ...... ${ant.location}
Java version: .. ${java.version}
Java home: ..... ${java.home}
<condition property="exe.ext" value=".exe" else="">
<equals arg1="${os.win}" arg2="true"/>
</condition>
<condition property="executable.npm" value="npm.cmd" else="npm">
<equals arg1="${os.win}" arg2="true"/>
</condition>
Execute `ant help` for more information.
</description>
<!-- Windows fails to execute "ng" unless it is invoked as "ng.cmd" -->
<condition property="executable.suffix" value=".cmd">
<os family="windows"/>
</condition>
<property name="executable.suffix" value=""/>
<property file="build.ant-private.properties"/>
<property file="build.ant.properties"/>
<property name="build_tests" value="${buildroot}/build_tests"/>
<property name="build_tests_report" value="${buildroot}/build_test_report"/>
<property name="build_client" value="${buildroot}/build_client"/>
<property name="build_client_data" value="${buildroot}/build_client_data"/>
<property name="build_client_sound_data" value="${buildroot}/build_client_sound_data"/>
<property name="build_client_music_data" value="${buildroot}/build_client_music_data"/>
<property name="build_webclient" value="${buildroot}/build_webclient"/>
<property name="build_docker" value="${buildroot}/build_docker"/>
<property name="buildtools_docker" value="buildtools/docker"/>
<property name="build_postman" value="${buildroot}/buildbot/"/>
<property name="build_server" value="${buildroot}/build_server"/>
<property name="build_server_maps" value="${buildroot}/build_server_maps"/>
<property name="build_server_script" value="${buildroot}/build_server_script"/>
<property name="build_server_mods" value="${buildroot}/build_server_mods"/>
<property name="build_server_xmlconf" value="${buildroot}/build_server_xmlconf"/>
<property name="build_stendhaltools" value="${buildroot}/build_stendhaltools"/>
<property name="build_stendhaltextclient" value="${buildroot}/build_stendhaltextclient"/>
<property name="client_data" value="stendhal-data-${version}.jar"/>
<property name="client_jarname" value="stendhal-${version}.jar"/>
<property name="client_sound_data" value="stendhal-sound-data-${version}.jar"/>
<property name="client_music_data" value="stendhal-music-data-${version}.jar"/>
<property name="client_starter_jarname" value="stendhal-starter-${version}.jar"/>
<property name="dist_server_binary" value="${buildroot}/stendhal-server-${version}.zip" />
<property name="maps_jarname" value="stendhal-maps-${version}.jar"/>
<property name="server_jarname" value="stendhal-server-${version}.jar"/>
<property name="xmlconf_jarname" value="stendhal-xmlconf-${version}.jar"/>
<property name="config_dir" value="data/conf"/>
<property name="schema_location" value="${config_dir}"/>
<property name="cobertura.dir" value="${libdir}/cobertura"/>
<condition property="exclude.signing" value="true">
<not>
<available file="keystore.ks"/>
</not>
</condition>
<condition property="exclude.jardiff" value="true">
<not>
<available file="${build-archive}/stendhal-${version.old}.zip"/>
</not>
</condition>
<!-- time & date -->
<tstamp>
<format property="year" pattern="yyyy"/>
<format property="date" pattern="yyyy-MM-dd"/>
<format property="time" pattern="HH:mm:ss"/>
</tstamp>
<property name="datetime" value="${date} ${time}"/>
<!-- check for some executables -->
<available property="python.present" file="python${exe.ext}" filepath="${env.PATH}"/>
<available property="python3.present" file="python3${exe.ext}" filepath="${env.PATH}"/>
<!-- Ant sub-modules -->
<import file="build-private.xml" optional="true"/>
<import file="${ant_modules}/properties.xml"/>
<import file="${ant_modules}/info.xml"/>
<import file="${ant_modules}/system.xml"/>
<import file="${ant_modules}/apps.xml"/>
<import file="${ant_modules}/main.xml"/>
<import file="${ant_modules}/clean.xml"/>

View file

@ -19,7 +19,7 @@
<!--
To setup up the development environment on Linux:
curl https://sh.rustup.rs -sSf | sh
apt-get install mingw-w64
apt-get install build-essential libssl-dev pkg-config mingw-w64
cargo install cargo-license
rustup target add x86_64-pc-windows-gnu
-->
@ -37,6 +37,7 @@
<arg value="--target" />
<arg value="x86_64-pc-windows-gnu" />
</exec>
<mkdir dir="app/neutralinojs/extensions/binary" />
<exec executable="cargo" dir="app/nativehelper" failonerror="true" output="app/neutralinojs/extensions/binary/LICENSE.txt">
<arg value="license" />
<arg value="-ad" />
@ -57,15 +58,17 @@
</chmod>
</target>
<!--
npm install -g @neutralinojs/neu
-->
<available file="app/neutralinojs/bin/neutralino-linux_x64" property="neutralinojs.present" />
<target name="prepare-neutralinojs" unless="neutralinojs.present">
<exec executable="neu" dir="app/neutralinojs" failonerror="true">
<exec executable="${executable.neu}" dir="app/neutralinojs" failonerror="true">
<arg value="update" />
</exec>
</target>
<target name="neutralinojs" depends="prepare-neutralinojs">
<exec executable="neu" dir="app/neutralinojs" failonerror="true">
<exec executable="${executable.neu}" dir="app/neutralinojs" failonerror="true">
<arg value="build" />
</exec>
<delete failonerror="false">
@ -75,23 +78,33 @@
<include name="*.log" />
</fileset>
</delete>
<move
file="app/neutralinojs/dist/stendhal-client/stendhal-client-linux_x64"
tofile="app/neutralinojs/dist/stendhal-client/stendhal-client-linux" />
<move
file="app/neutralinojs/dist/stendhal-client/stendhal-client-win_x64.exe"
tofile="app/neutralinojs/dist/stendhal-client/stendhal-client-windows.exe" />
<chmod dir="app/neutralinojs/dist/stendhal-client/" type="file" perm="ugo+rx">
<include name="stendhal*" />
<include name="stendhal-client-linux" />
<include name="**/nativehelper*" />
</chmod>
<!--
<copy todir="dist/stendhal-client" flatten="true">
<fileset dir="app/neutralinoks">
<include name="LICENSE.txt" />
</fileset>
</copy>
-->
<copy file="app/neutralinojs/LICENSE.txt" tofile="app/neutralinojs/dist/stendhal-client/LICENSE.txt">
<filterchain>
<concatfilter append="app/neutralinojs/extensions/binary/LICENSE.txt" />
</filterchain>
</copy>
<echo file="app/neutralinojs/dist/stendhal-client/extensions/binary/steam_appid.txt">${steam-appid}</echo>
<delete file="${buildroot}/stendhal-client-${version}.zip"/>
<zip destfile="${buildroot}/stendhal-client-${version}.zip">
<zipfileset dir="app/neutralinojs/dist/stendhal-client" prefix="stendhal-client" filemode="755">
<include name="stendhal-client-linux" />
<include name="**/nativehelper*" />
</zipfileset>
<zipfileset dir="app/neutralinojs/dist/stendhal-client" prefix="stendhal-client">
<exclude name="stendhal-client-linux" />
<exclude name="**/nativehelper*" />
</zipfileset>
</zip>
</target>
@ -148,7 +161,8 @@
</target> <!-- client_android_build -->
<target name="android" description="Create Android client package for release and distribution.">
<!-- Create Android client package for release and distribution. -->
<target name="android">
<echo
if:set="exclude.webview"
message="ANDROID_SDK_ROOT environment variable not set. Skipping Android WebView client build."/>

View file

@ -2,8 +2,11 @@
<project xmlns:if="ant:if" xmlns:unless="ant:unless">
<target name="clean" description="Delete all build files and directories.">
<delete dir="${buildroot}"/>
<!-- Delete all build files and directories. -->
<target name="clean">
<delete includeEmptyDirs="true" quiet="true">
<fileset dir="${buildroot}" excludes="eclipse/" defaultExcludes="false"/>
</delete>
<delete dir="${build_cobertura}"/>
<delete dir="${build_cobertura_report}"/>
<delete file="cobertura.ser"/>
@ -16,14 +19,16 @@
</target>
<target name="clean_client_data" description="Delete client data build files and directories.">
<!-- Delete client data build files and directories. -->
<target name="clean_client_data">
<delete dir="${build_client_data}"/>
<delete dir="${build_client_music_data}"/>
<delete dir="${build_client_sound_data}"/>
</target>
<target name="cleanjs" description="Delete web client build files and directories.">
<!-- Delete web client build files and directories. -->
<target name="cleanjs">
<delete dir="${buildroot}/js"/>
<delete dir="${buildroot}/ts"/>
</target>

View file

@ -19,13 +19,15 @@
</condition>
<target name="jar" depends="client_build,server_build" description="Build server and clients.">
<!-- Build server and clients. -->
<target name="jar" depends="client_build,server_build">
<!-- XXX: client & server builds are not exclusive to NetBeans, remove this output? -->
<echo>Built client and server for NetBeans.</echo>
</target>
<target name="signjar" unless="exclude.signing" description="Sign client distribution.">
<!-- Sign client distribution. -->
<target name="signjar" unless="exclude.signing">
<signjar
alias="${keystore.alias}"
keystore="keystore.ks"
@ -34,24 +36,30 @@
</target>
<!-- Generate JAR files for both client and server. -->
<!-- XXX: why does this depend on "server_build" twice? -->
<target name="compile" depends="server_build,client_build,server_build" description="Generate JAR files for both client and server."/>
<target name="compile" depends="server_build,client_build,server_build" />
<target name="dist" depends="clean,dist_binary,dist_source,signupdates" description="Create all packages for Stendhal release."/>
<!-- Create all packages for Stendhal release. -->
<target name="dist" depends="clean,dist_binary,dist_source,signupdates" />
<target name="dist_binary" depends="clean,dist_server_binary,dist_client_binary,dist_client_starter,dist_webclient_binary"
description="Create all binary packages for Stendhal release."/>
<!-- Create all binary packages for Stendhal release. -->
<target name="dist_binary" depends="clean,dist_server_binary,dist_client_binary,dist_client_starter,dist_webclient_binary" />
<!-- START: source -->
<target name="dist_source" description="Create all source packages for Stendhal release.">
<!-- Create all source packages for Stendhal release. -->
<target name="dist_source">
<mkdir dir="${buildroot}/stendhal-${version}-src"/>
<copy todir="${buildroot}/stendhal-${version}-src/src">
<fileset dir="src"/>
<fileset dir="src">
<exclude name="js/*compiled*"/>
<exclude name="js/contributors.html"/>
</fileset>
</copy>
<mkdir dir="${buildroot}/stendhal-${version}-src/libs"/>
@ -65,12 +73,7 @@
<copy todir="${buildroot}/stendhal-${version}-src/data">
<fileset dir="data">
</fileset>
</copy>
<copy todir="${buildroot}/stendhal-${version}-src/tiled">
<fileset dir="${tiled}">
<exclude name="world/**"/>
<exclude name="maps/world/**"/>
</fileset>
</copy>
@ -87,8 +90,8 @@
<include name="*.html"/>
</fileset>
</copy>
<copy todir="${buildroot}/stendhal-${version}-src/doc">
<fileset dir="doc"/>
<copy todir="${buildroot}/stendhal-${version}-src/${docs}">
<fileset dir="${docs}"/>
<fileset dir="." includes="LICENSE.txt"/>
</copy>
@ -106,7 +109,8 @@
<!-- START: client data -->
<target name="build_client_data" description="Build client data files.">
<!-- Build client data files. -->
<target name="build_client_data">
<!-- base data -->
<mkdir dir="${build_client_data}"/>
<copy todir="${build_client_data}/data/sprites">
@ -122,8 +126,8 @@
<exclude name="items/meta/"/>
</fileset>
</copy>
<copy todir="${build_client_data}/data/tileset">
<fileset dir="${tiled}/tileset">
<copy todir="${build_client_data}/data/maps/tileset">
<fileset dir="${maps}/tileset">
<exclude name="**/*.bz2"/>
<exclude name="**/*.gz"/>
<exclude name="**/*.psd"/>
@ -134,11 +138,15 @@
<exclude name="logic/layer/"/>
</fileset>
</copy>
<mkdir dir="${maps}/parallax"/> <!-- in case no parallax images available -->
<copy todir="${build_client_data}/data/maps/parallax">
<fileset dir="${maps}/parallax" includes="**/*.png"/>
</copy>
<copy todir="${build_client_data}/data/font">
<fileset dir="data/font"/>
</copy>
<copy todir="${build_client_data}/data/gui">
<fileset dir="${data}">
<fileset dir="${gui}">
<exclude name="paneldrock009.jpg"/>
<exclude name="panelmetal003.gif"/>
<exclude name="panelrock016.jpg"/>
@ -177,7 +185,8 @@
<!-- START: server -->
<target name="server_build" depends="init,checkxml" description="Compile JAR file for Stendhal server.">
<!-- Compile JAR file for Stendhal server. -->
<target name="server_build" depends="init,checkxml">
<mkdir dir="${build_server}"/>
<copy todir="${build_server}/data/conf" file="data/conf/stendhalcreateaccount.properties"/>
@ -264,7 +273,7 @@
</javac>
<copy todir="${build_server_maps}/data/maps">
<fileset dir="${tiled}">
<fileset dir="${maps}">
<include name="**/*.tmx"/>
</fileset>
</copy>
@ -338,7 +347,8 @@
</target> <!-- server_build -->
<target name="dist_server_binary" depends="server_build" description="Create server package for release and distribution.">
<!-- Create server package for release and distribution. -->
<target name="dist_server_binary" depends="server_build">
<mkdir dir="${buildroot}/stendhal-server-${version}"/>
<copy todir="${buildroot}/stendhal-server-${version}/data/script">
@ -364,8 +374,8 @@
<copy todir="${buildroot}/stendhal-server-${version}/libs">
<fileset dir="libs"/>
</copy>
<copy todir="${buildroot}/stendhal-server-${version}/doc">
<fileset dir="doc"/>
<copy todir="${buildroot}/stendhal-server-${version}/${docs}">
<fileset dir="${docs}"/>
<fileset dir="." includes="LICENSE.txt"/>
</copy>
@ -390,10 +400,12 @@
</target> <!-- dist_server_binary -->
<target name="dist_docker" depends="docker_build,docker_push" description="Build and push container image."/>
<!-- Build and push container image. -->
<target name="dist_docker" depends="docker_build,docker_push" />
<target name="docker_build_prepare" depends="dist_server_binary" description="Prepare container image build.">
<!-- Prepare container image build. -->
<target name="docker_build_prepare" depends="dist_server_binary">
<mkdir dir="${build_docker}" />
<copy file="${buildtools_docker}/Dockerfile" todir="${build_docker}" />
<copy file="${buildtools_docker}/.dockerignore" todir="${build_docker}" />
@ -402,7 +414,8 @@
</target> <!-- docker_build_prepare -->
<target name="docker_build" depends="docker_build_prepare" description="Build container image.">
<!-- Build container image. -->
<target name="docker_build" depends="docker_build_prepare">
<exec dir="${build_docker}" executable="docker">
<arg value="build" />
<arg value="-t" />
@ -412,28 +425,57 @@
</target> <!-- docker_build -->
<target name="docker_push" description="Push container image."/>
<!-- Push container image. -->
<target name="docker_push" />
<target name="server_run" depends="server_build,compilejs" description="Run server.">
<mkdir dir="run_srvr"/>
<!-- Run server. -->
<target name="server_run" depends="server_build,compilejs">
<mkdir dir="run_srvr/libs"/>
<mkdir dir="run_srvr/js"/>
<copy todir="run_srvr">
<fileset file="build/lib/${server_jarname}"/>
<fileset file="build/lib/${xmlconf_jarname}"/>
<fileset file="build/lib/${maps_jarname}"/>
<fileset file="libs/marauroa.jar"/>
<fileset file="libs/groovy.jar"/>
<fileset file="libs/guava.jar"/>
<fileset file="libs/log4j.jar"/>
<fileset file="libs/${mysqldriver_jarname}"/>
</copy>
<copy todir="run_srvr/libs">
<fileset file="${marauroa_jar}" />
<fileset file="${groovy_jar}" />
<fileset file="${guava_jar}" />
<fileset file="${log4j_jar}" />
<fileset file="${mysqldriver_jar}" />
<fileset file="${h2_jar}" />
<fileset file="${hamcrest_jar}" />
<fileset file="${tomcatcore_jar}" />
<fileset file="${tomcatwebsocket_jar}" />
<fileset file="${jakartaannotation_jar}" />
<fileset file="${luaj_jar}" />
<fileset file="${jsonsimple_jar}" />
</copy>
<copy todir="run_srvr/js">
<fileset dir="${srcjs}">
<exclude name="stendhal/" />
<exclude name="stendhal-compiled.js.map" />
<exclude name=".gitignore" />
</fileset>
</copy>
<chmod file="run_srvr/${server_jarname}" perm="+x"/>
<exec dir="." executable="java">
<arg line="-Xmx256m -cp run_srvr -jar run_srvr/${server_jarname} -c server.ini -l"/>
</exec>
<java jar="run_srvr/${server_jarname}"
fork="true"
failonerror="true"
maxmemory="256m">
<arg value="-c" />
<arg value="server.ini" />
<arg value="-l" />
<classpath>
<pathelement location="${basedir}" />
</classpath>
</java>
<!-- we've run the program, so delete the jars -->
<delete dir="run_srvr"/>
@ -444,7 +486,8 @@
<!-- START: java client -->
<target name="client_build" depends="init,build_client_data" description="Compile client JAR file.">
<!-- Compile client JAR file. -->
<target name="client_build" depends="init,build_client_data">
<mkdir dir="${build_client}"/>
<copy todir="${build_client}/games/stendhal/client">
@ -492,7 +535,7 @@
<!-- compile Starter.java for Java 1.7. So we will be able to
display a dialogbox if running on an old Java Version -->
<javac srcdir="${src}" destdir="${build_client}" debug="${javac.debug}" debuglevel="${javac.debuglevel}" source="1.7" target="1.7" deprecation="${javac.deprecation}" includeantruntime="false">
<javac srcdir="${src}" destdir="${build_client}" debug="${javac.debug}" debuglevel="${javac.debuglevel}" source="1.8" target="1.8" deprecation="${javac.deprecation}" includeantruntime="false">
<include name="games/stendhal/client/update/Starter.java"/>
<compilerarg value="-encoding"/>
@ -537,7 +580,8 @@
</target> <!-- client_build -->
<target name="compile_stendhaltextclient" description="Compile text client.">
<!-- Compile text client. -->
<target name="compile_textclient">
<mkdir dir="${build_stendhaltextclient}"/>
<javac srcdir="${src}" destdir="${build_stendhaltextclient}" source="1.8" target="1.8" debug="${javac.debug}" debuglevel="${javac.debuglevel}" deprecation="${javac.deprecation}" includeantruntime="false">
@ -558,8 +602,12 @@
</javac>
</target> <!-- compile_stendhaltextclient -->
<!-- Alias of `compile_textclient`. -->
<target name="compile_stendhaltextclient" depends="compile_textclient" />
<target name="dist_client_binary" depends="clean_client_data,client_build" description="Create Java client package for release and distribution.">
<!-- Create Java client package for release and distribution. -->
<target name="dist_client_binary" depends="clean_client_data,client_build">
<mkdir dir="${buildroot}/stendhal-${version}"/>
<mkdir dir="${buildroot}/stendhal-${version}/lib"/>
<mkdir dir="${buildroot}/stendhal-${version}/log"/>
@ -579,8 +627,8 @@
<include name="*.html"/>
</fileset>
</copy>
<copy todir="${buildroot}/stendhal-${version}/doc">
<fileset dir="doc"/>
<copy todir="${buildroot}/stendhal-${version}/${docs}">
<fileset dir="${docs}"/>
<fileset file="LICENSE.txt"/>
</copy>
<touch file="${buildroot}/stendhal-${version}/log/stendhal.txt"/>
@ -595,8 +643,8 @@
</target> <!-- dist_client_binary -->
<!-- XXX: is this still used? -->
<target name="dist_client_starter" depends="client_build" description="Create Java client starter package.">
<!-- Create Java client starter package (obsolete). -->
<target name="dist_client_starter" depends="client_build">
<mkdir dir="${buildroot}/stendhal-${version}"/>
<copy todir="${buildroot}/stendhal-${version}" file="${lib}/${client_starter_jarname}"/>
<copy todir="${buildroot}/stendhal-${version}/lib">
@ -605,10 +653,8 @@
<include name="*.html"/>
</fileset>
</copy>
<copy todir="${buildroot}/stendhal-${version}/doc">
<fileset dir="doc">
<exclude name="mkdocs/"/>
</fileset>
<copy todir="${buildroot}/stendhal-${version}/${docs}">
<fileset dir="${docs}"/>
<fileset file="LICENSE.txt"/>
</copy>
<copy todir="${buildroot}/stendhal-${version}" file="README.md"/>
@ -620,7 +666,8 @@
</target> <!-- dist_client_starter -->
<target name="client_run" depends="client_build" description="Run Java client.">
<!-- Run Java client. -->
<target name="client_run" depends="client_build">
<mkdir dir="run_clnt"/>
<mkdir dir="run_clnt/lib"/>
@ -656,135 +703,97 @@
</target> <!-- client_run -->
<!-- Run client for NetBeans trick. -->
<!-- Netbeans won't let you choose ant options, so this does it for us-->
<target name="run" depends="client_run" description="Run client for NetBeans trick."/>
<target name="run" depends="client_run" />
<!-- END: java client -->
<!-- START: web client -->
<target name="js-prepare-contribs">
<!-- convert contributors markdown to HTML -->
<exec executable="npm${executable.suffix}" failonerror="true">
<target name="js-prepare-marauroa">
<mkdir dir="node_modules/marauroa"/>
<unzip dest="node_modules/marauroa" src="libs/marauroa.jar">
<mapper type="flatten"/>
<patternset>
<include name="js/**"/>
</patternset>
</unzip>
</target>
<target name="js-prepare-build">
<mkdir dir="node_modules/marauroa"/>
<echo file="node_modules/marauroa/build.js">
export function version(marauroa, stendhal) {
stendhal.data = stendhal.data || {};
stendhal.data.build = {
version: "${version}",
build: "${datetime}",
dist: "webclient"
}
//CI
}
</echo>
<antcall target="js-prepare-build-ci" />
</target>
<target name="js-prepare-build-ci" if="ci.build.info">
<loadfile property="cibuildinfo" srcFile="${ci.build.info}" failonerror="false" quiet="true"/>
<replace file="node_modules/marauroa/build.js" token="//CI" value="${cibuildinfo}" />
</target>
<extension-point name="js-prepare" depends="js-prepare-node,js-prepare-contribs,js-prepare-marauroa,js-prepare-build"/>
<target name="js-prepare-node">
<exec executable="${executable.npm}" failonerror="true">
<arg value="install"/>
<arg value="showdown"/>
<arg value="--no-save"/>
</exec>
<exec executable="npx${executable.suffix}" failonerror="true">
</target>
<target name="js-prepare-contribs" depends="js-prepare-node">
<exec executable="${executable.npx}" failonerror="true">
<arg value="showdown"/>
<arg value="makehtml"/>
<arg value="--input"/>
<arg value="doc/contributors.md"/>
<arg value="${docs}/contributors.md"/>
<arg value="--output"/>
<arg value="${srcjs}/contributors.html"/>
</exec>
</target>
<target name="js-prepare-marauroa">
<mkdir dir="build/js"/>
<unzip dest="build" src="libs/marauroa.jar">
<patternset>
<include name="js/**"/>
</patternset>
</unzip>
</target>
<target name="js-prepare-build">
<echo file="build/js/build.js">
var stendhal = window.stendhal = window.stendhal || {};
stendhal.data = stendhal.data || {};
stendhal.data.build = {
version: "${version}",
build: "${datetime}",
dist: "webclient"
}
</echo>
</target>
<extension-point name="js-prepare" depends="js-prepare-contribs,js-prepare-marauroa,js-prepare-build,js-prepare-node"/>
<target name="js-prepare-node">
<exec executable="npm${executable.suffix}" failonerror="true">
<arg value="install"/>
<arg value="--no-save"/>
</exec>
</target>
<!-- TODO: Do not write stendhal-compiled.js to the source directory tree but directly to the compiled directory tree -->
<target name="js-invoke-compiler">
<exec executable="npx${executable.suffix}" dir="srcjs/stendhal" failonerror="true">
<exec executable="${executable.npx}" dir="${srcjs}/stendhal" failonerror="true">
<arg value="tsc"/>
</exec>
<property name="js-debug" value="--debug --formatting=PRETTY_PRINT --create_source_map srcjs/stendhal-compiled.js.map --source_map_include_content"/>
<property name="js-files-license" value="srcjs/stendhal/license.js"/>
<property name="js-files-marauroa" value="build/js/marauroa.js build/js/client-framework.js build/js/message-factory.js build/js/perception.js build/js/rpfactory.js build/js/inflate.js build/js/deserializer.js"/>
<property name="js-files-config" value="build/js/build.js"/>
<property name="js-files-lib1" value="srcjs/jsxgraph-util.js"/>
<property name="js-files-lib2" value=""/>
<property name="js-files-data1" value="srcjs/stendhal/data/sha3.js"/>
<property name="js-files-data2" value=""/>
<property name="js-files-entity5" value=""/>
<property name="js-files-entity6" value=""/>
<property name="js-files-ui1" value=""/>
<property name="js-files-ui2" value=""/>
<property name="js-files-ui3" value=""/>
<property name="js-files-main1" value=""/>
<property name="js-files-ui4" value=""/>
<property name="js-files-main2" value="srcjs/stendhal/main.js"/>
<property name="js-files-main3" value=""/>
<property name="js-files-ts" value="build/ts/*.js build/ts/**/*.js"/>
<property name="js-files-ts2" value=""/>
<java jar="buildtools/closure-compiler/compiler.jar"
fork="true"
failonerror="true"
maxmemory="128m">
<arg value="--language_in=ECMASCRIPT_2020"/>
<arg value="--language_out=STABLE"/>
<arg value="--compilation_level"/>
<arg value="ADVANCED"/>
<arg line="${js-debug}"/>
<arg value="--process_common_js_modules"/>
<arg value="--module_resolution=node"/>
<arg value="--jscomp_off=checkVars"/>
<!-- DEBUG: -->
<!--<arg value="-\-jscomp_off=globalThis"/>-->
<arg value="--js_output_file=srcjs/stendhal-compiled.js"/>
<arg line="${js-files-license}"/>
<arg line="${js-files-marauroa}"/>
<arg line="${js-files-config}"/>
<arg line="${js-files-lib1}"/>
<arg line="${js-files-lib2}"/>
<arg line="${js-files-data1}"/>
<arg line="${js-files-data2}"/>
<arg line="${js-files-entity5}"/>
<arg line="${js-files-entity6}"/>
<arg line="${js-files-ui1}"/>
<arg line="${js-files-ui2}"/>
<arg line="${js-files-ui3}"/>
<arg line="${js-files-main1}"/>
<arg line="${js-files-ui4}"/>
<arg line="${js-files-main2}"/>
<arg line="${js-files-main3}"/>
<arg line="${js-files-ts}"/>
<arg line="${js-files-ts2}"/>
</java>
<echo file="srcjs/stendhal-compiled.js" append="true">
//# sourceMappingURL=stendhal-compiled.js.map
</echo>
<exec executable="${executable.npx}" dir="${srcjs}/stendhal" failonerror="true">
<arg value="esbuild"/>
<arg value="--bundle"/>
<arg value="--outfile=../stendhal-compiled.js"/>
<arg value="--platform=browser"/>
<!-- <arg value="- -minify"/> -->
<arg value="main.ts"/>
</exec>
<antcall target="compilejs-hook" />
<copy todir="build/eclipse/js" preservelastmodified="true" failonerror="false" quiet="true">
<fileset dir="${srcjs}">
<include name="stendhal-compiled.js*" />
</fileset>
</copy>
</target> <!-- js-invoke-compiler -->
@ -793,7 +802,8 @@
</target>
<target name="compilejs" depends="cleanjs" description="Compile web client.">
<!-- Compile web client. -->
<target name="compilejs" depends="cleanjs">
<antcall target="js-prepare" unless:set="exclude.webclient"/>
<antcall target="js-invoke-compiler" unless:set="exclude.webclient"/>
@ -802,13 +812,14 @@
</target> <!-- compilejs -->
<target name="webclient_build" depends="compilejs,clean_client_data,build_client_data" description="Compile and stage web client files.">
<!-- Compile and stage web client files. -->
<target name="webclient_build" depends="compilejs,clean_client_data,build_client_data">
<mkdir dir="${build_webclient}"/>
<copy todir="${build_webclient}">
<fileset dir="${srcjs}">
<include name="stendhal.html"/>
<include name="stendhal.css"/>
<include name="css/**/*.css"/>
<include name="stendhal-compiled.js"/>
<include name="LICENSE.html"/>
<include name="favicon.ico"/>
@ -817,24 +828,23 @@
</copy>
<replaceregexp file="${build_webclient}/stendhal.html"
match="data-tileset-path=&quot;/tileset&quot;"
match="data-tileset-path=&quot;/data/maps/tileset&quot;"
replace="data-tileset-path=&quot;/data/tileset&quot;"
byline="false"/>
</target> <!-- webclient_build -->
<target name="build_webclient" depends="webclient_build" description="Alias of webclient_build."/>
<target name="dist_webclient_binary" depends="webclient_build" description="Create web client package for release and distribution.">
<!-- Create web client package for release and distribution. -->
<target name="dist_webclient_binary" depends="webclient_build">
<zip destfile="${buildroot}/stendhal-webclient-${version}.zip">
<zipfileset dir="${build_client_data}"/>
<zipfileset dir="${build_client_music_data}"/>
<zipfileset dir="${build_client_sound_data}"/>
<zipfileset dir="${build_webclient}" prefix="js"/>
<zipfileset dir="doc" prefix="doc">
<zipfileset dir="${docs}" prefix="doc">
<include name="contributors.md"/>
<include name="ReleaseNotes.txt"/>
<include name="Licenses/**"/>
<include name="sources/**"/>
</zipfileset>

View file

@ -12,7 +12,8 @@
<delete dir="${buildroot}/build_docs"/>
</target>
<target name="docs" description="Generate HTML documentation for Java, TypeScript, and Lua APIs." depends="luadocs,javadocs,tsdocs"/>
<!-- Generate HTML documentation for Java, TypeScript, and Lua APIs. -->
<target name="docs" depends="luadocs,javadocs,tsdocs"/>
<!-- Java documentation -->
@ -87,13 +88,8 @@
</target>
<target name="tsdocs" depends="clean_tsdocs">
<exec executable="npm${executable.suffix}" failonerror="true">
<arg value="install"/>
<arg value="typedoc"/>
<arg value="--no-save"/>
</exec>
<exec executable="npx${executable.suffix}" dir="srcjs/stendhal" failonerror="true">
<target name="tsdocs" depends="clean_tsdocs,js-prepare-node">
<exec executable="${executable.npx}" dir="${srcjs}/stendhal" failonerror="true">
<arg value="typedoc"/>
<arg value="--entryPointStrategy"/>
<arg value="expand"/>
@ -113,7 +109,7 @@
message="Python unavailable, cannot run mkdocs"/>
<!-- NOTE: MkDocs create the top-level index.html -->
<exec if:true="${python.present}" executable="python" failonerror="true"
<exec executable="${executable.python}" if:true="${python.present}" failonerror="true"
dir="./buildtools/mkdocs/">
<arg value="-u"/>
<arg value="build.py"/>

View file

@ -0,0 +1,86 @@
<?xml version='1.0'?>
<project>
<target name="info" description="Print project build information.">
<echo level="info" message="Project:" />
<echo level="info" message=" Name: .......... ${game_name}" />
<echo level="info" message=" Version: ....... ${version}" />
<echo level="info" message=" Root: .......... ${basedir}" />
<echo level="info" />
<echo level="info" message="Build system:" />
<echo level="info" message=" Ant version: ... ${ant.version.number}" />
<echo level="info" message=" Ant home: ...... ${ant.location}" />
<echo level="info" message=" Java version: .. ${java.version}" />
<echo level="info" message=" Java home: ..... ${java.home}" />
</target>
<target name="help" description="Print project build and help information." depends="info">
<echo level="info" message="Usage:" />
<echo level="info" message=" ant &lt;target&gt; [&lt;target&gt;...]" />
<echo level="info" />
<echo level="info" />
<echo level="info" message="=== TARGETS ===" />
<echo level="info" />
<echo level="info" message="General:" />
<echo level="info" message=" info: ........................ Print project build information." />
<echo level="info" message=" help: ........................ Print project build and help information." />
<echo level="info" message=" init: ........................ Update version and resource info." />
<echo level="info" message=" checkxml: .................... Verify XML files are well-formed." />
<echo level="info" />
<echo level="info" message="Build:" />
<echo level="info" message=" server_build: ................ Compile JAR file for Stendhal server." />
<echo level="info" message=" client_build: ................ Compile client JAR file." />
<echo level="info" message=" webclient_build: ............. Compile and stage web client files." />
<echo level="info" message=" compile_textclient: .......... Compile text client." />
<echo level="info" message=" compile: ..................... Generate JAR files for both client and server." />
<echo level="info" message=" compilejs: ................... Compile web client." />
<echo level="info" message=" compile_tools: ............... Compile Stendhal build tools." />
<echo level="info" message=" server_run: .................. Run server." />
<echo level="info" message=" client_run: .................. Run Java client." />
<echo level="info" message=" postman: ..................... Build postman bot." />
<echo level="info" />
<echo level="info" message="Testing:" />
<echo level="info" message=" compile_tests: ............... Compile all tests." />
<echo level="info" message=" run_tests: ................... Run all tests." />
<echo level="info" message=" test: ........................ Compile and run all tests." />
<echo level="info" />
<echo level="info" message="Build cleaning:" />
<echo level="info" message=" clean: ....................... Delete all build files and directories." />
<echo level="info" message=" clean_client_data: ........... Delete client data build files and directories." />
<echo level="info" message=" cleanjs: ..................... Delete web client build files and directories." />
<echo level="info" />
<echo level="info" message="Source maintanence:" />
<echo level="info" message=" clean_whitespace: ............ Clean whitespace in source and other specified file types." />
<echo level="info" />
<echo level="info" message="Distribution:" />
<echo level="info" message=" dist_source: ................. Create all source packages for Stendhal release." />
<echo level="info" message=" dist_binary: ................. Create all binary packages for Stendhal release." />
<echo level="info" message=" dist_server_binary: .......... Create server package for release and distribution." />
<echo level="info" message=" dist_client_binary: .......... Create Java client package for release and distribution." />
<echo level="info" message=" dist_webclient_binary: ....... Create web client package for release and distribution." />
<echo level="info" message=" dist_client_starter: ......... Create Java client starter package (obsolete)." />
<echo level="info" message=" dist: ........................ Create all packages for Stendhal release." />
<echo level="info" message=" android: ..................... Create Android client package for release and distribution." />
<echo level="info" />
<echo level="info" message="Resources:" />
<echo level="info" message=" rendermaps: .................. Convert TMX maps to PNG images scaled 1:16." />
<echo level="info" message=" renderatlas: ................. Generate files for the Stendhal Atlas." />
<echo level="info" message=" renderworldmap: .............. Export world.tmx map to PNG image." />
<echo level="info" message=" updatemaps: .................. Load and save TMX maps to fix tilesets changes." />
<echo level="info" />
<echo level="info" message="Documentation:" />
<echo level="info" message=" docs: ........................ Generate HTML documentation for Java, TypeScript, and Lua APIs." />
<echo level="info" />
<echo level="info" message="Localization:" />
<echo level="info" message=" locale_template: ............. Creates a template for translating." />
<echo level="info" message=" locale_update: ............... Update translation files from template." />
<echo level="info" />
<echo level="info" message="Aliases:" />
<echo level="info" message=" compile_stendhaltextclient: .. Alias of `compile_textclient`." />
<echo level="info" message=" compile_stendhaltools: ....... Alias of `compile_tools`." />
<echo level="info" />
<echo level="info" message="Execute `ant -p -v` for a full list of build targets." />
</target>
</project>

View file

@ -2,21 +2,23 @@
<project xmlns:if="ant:if" xmlns:unless="ant:unless">
<target name="locale_build_template" description="Creates a template for translating.">
<!-- Creates a template for translating. -->
<target name="locale_template">
<echo unless:true="${python.present}" message="Python unavailable, cannot build locale template"/>
<exec if:true="${python.present}" executable="python" failonerror="true" dir="${buildtools}">
<exec executable="${executable.python}" if:true="${python.present}" failonerror="true">
<arg value="-u"/>
<arg value="locale_template.py"/>
<arg value="./bin/locale-template.py"/>
</exec>
</target>
<target name="locale_update" description="Update translation files from template.">
<!-- Update translation files from template. -->
<target name="locale_update">
<echo unless:true="${python.present}" message="Python unavailable, cannot update translations"/>
<exec if:true="${python.present}" executable="python" failonerror="true" dir="${buildtools}">
<exec executable="${executable.python}" if:true="${python.present}" failonerror="true">
<arg value="-u"/>
<arg value="locale_template.py"/>
<arg value="./bin/locale-template.py"/>
<arg value="--update"/>
</exec>
</target>

View file

@ -2,7 +2,8 @@
<project xmlns:if="ant:if" xmlns:unless="ant:unless">
<target name="init" description="Update version and resource info.">
<!-- Update version and resource info. -->
<target name="init">
<mkdir dir="${lib}"/>
<!-- update version -->
@ -38,6 +39,14 @@
match="&lt;string name=&quot;build_version&quot;&gt;.*?&lt;/string&gt;"
replace="&lt;string name=&quot;build_version&quot;&gt;${version}&lt;/string&gt;"
byline="true"/>
<replaceregexp file="app/neutralinojs/neutralino.config.json"
match="&quot;version&quot;: &quot;.*&quot;"
replace="&quot;version&quot;: &quot;${version}&quot;"
byline="true"/>
<replaceregexp file="${src}/games/stendhal/client/update/HttpClient.java"
match="StendhalClient/.* \("
replace="StendhalClient/${version} \("
byline="true"/>
<!-- update location of resources -->
<replaceregexp file="${src}/games/stendhal/client/update/game-default.properties"
@ -81,7 +90,8 @@
</target> <!-- init -->
<target name="checkxml" description="Verify XML files are well-formed.">
<!-- Verify XML files are well-formed. -->
<target name="checkxml">
<schemavalidate failonerror="yes" lenient="yes" warn="yes">
<schema namespace="stendhal" file="${config_dir}/zones.xsd"/>
<fileset dir="${config_dir}/zones">
@ -159,7 +169,8 @@
</target> <!-- checkxml -->
<target name="internalUpdatePrereleaseVersion" if="PRE_RELEASE" description="Add date to pre-release test client.">
<!-- Add date to pre-release test client. -->
<target name="internalUpdatePrereleaseVersion" if="PRE_RELEASE">
<tstamp prefix="date">
<format property="iso" pattern="yyyy-MM-dd"/>
</tstamp>

View file

@ -4,7 +4,8 @@
<import file="tools.xml" />
<target name="rendermaps" description="Convert TMX maps to PNG images scaled 1:16." depends="compile_stendhaltools">
<!-- Convert TMX maps to PNG images scaled 1:16. -->
<target name="rendermaps" depends="compile_stendhaltools">
<taskdef name="maprenderer" classname="games.stendhal.tools.MapRenderer">
<classpath>
<pathelement path="${build_stendhaltools}"/>
@ -12,9 +13,9 @@
</classpath>
</taskdef>
<mkdir dir="tiled/world"/>
<maprenderer imagePath="${tiled}/world/">
<fileset dir="tiled">
<mkdir dir="${maps}/world"/>
<maprenderer imagePath="${maps}/world/">
<fileset dir="${maps}">
<include name="Level */**/*.tmx"/>
<include name="interiors/**/*.tmx"/>
<exclude name="**/memory/**"/>
@ -23,7 +24,8 @@
</target> <!-- rendermaps -->
<target name="renderatlas" description="Generate files for the Stendhal Atlas." depends="compile_stendhaltools">
<!-- Generate files for the Stendhal Atlas. -->
<target name="renderatlas" depends="compile_stendhaltools">
<taskdef name="maprenderer" classname="games.stendhal.tools.MapRenderer">
<classpath>
<pathelement path="${build_stendhaltools}"/>
@ -41,16 +43,16 @@
0 128 0.0078125
-->
<mkdir dir="tiled/world"/>
<maprenderer imagePath="${tiled}/world/" zoom="0.0625">
<fileset dir="tiled">
<mkdir dir="${maps}/world"/>
<maprenderer imagePath="${maps}/world/" zoom="0.0625">
<fileset dir="${maps}">
<include name="Level 0/**/*.tmx"/>
<exclude name="**/memory/**"/>
</fileset>
</maprenderer>
<mkdir dir="tiled/world/large"/>
<maprenderer imagePath="${tiled}/world/large" zoom="0.25">
<fileset dir="tiled">
<mkdir dir="${maps}/world/large"/>
<maprenderer imagePath="${maps}/world/large" zoom="0.25">
<fileset dir="${maps}">
<include name="Level 0/**/*.tmx"/>
<exclude name="**/memory/**"/>
</fileset>
@ -58,15 +60,13 @@
</target> <!-- renderatlas -->
<target name="renderworldmap" description="Export world.tmx map to PNG image." depends="rendermaps">
<property name="pycmd" value="python3" if:true="${python3.present}"/>
<property name="pycmd" value="python" unless:true="${python3.present}" if:true="${python.present}"/>
<!-- Export world.tmx map to PNG image. -->
<target name="renderworldmap" depends="rendermaps">
<!-- embed area images with area name -->
<!-- FIXME: need to detect the Python "PIL" module to ensure script can run or
write Java class that can do this -->
<exec executable="${pycmd}" if:set="pycmd">
<arg value="./tiled/vampire_maplabel.py"/>
<exec executable="${executable.python}" if:true="${python.present}">
<arg value="./bin/vampire_maplabel.py"/>
<arg value="-world"/>
</exec>
@ -78,8 +78,8 @@
<pathelement path="${tiled_jar}"/>
</classpath>
</taskdef>
<maprenderer imagePath="${tiled}/world/" zoom="1.0">
<fileset dir="tiled/world">
<maprenderer imagePath="${maps}/world/" zoom="1.0">
<fileset dir="${maps}/world">
<include name="world.tmx"/>
</fileset>
</maprenderer>
@ -88,7 +88,8 @@
</target> <!-- renderworldmap -->
<target name="updatemaps" description="Load and save TMX maps to fix tilesets changes." depends="compile_stendhaltools">
<!-- Load and save TMX maps to fix tilesets changes. -->
<target name="updatemaps" depends="compile_stendhaltools">
<taskdef name="mapupdater" classname="games.stendhal.tools.MapUpdater">
<classpath>
<pathelement path="${build_stendhaltools}"/>
@ -97,7 +98,7 @@
</taskdef>
<mapupdater>
<fileset dir="tiled">
<fileset dir="${maps}">
<include name="Level */**/*.tmx"/>
<include name="interiors/**/*.tmx"/>
</fileset>

View file

@ -16,7 +16,8 @@
<delete file="${build}/package/client/stendhal-starter.exe"/>
</target>
<target name="msiPackage" description="Creates MSI installer package from current build" depends="stagePackage">
<!-- Creates MSI installer package from current build. -->
<target name="msiPackage" depends="stagePackage">
<delete dir="${build}/package/msi-app-image"/>
<exec executable="jpackage" dir="." failonerror="true">
<arg line="--type app-image"/>
@ -46,7 +47,8 @@
</exec>
</target> <!-- msiPackage -->
<target name="dmgPackage" description="Creates DMG package from current build" depends="stagePackage">
<!-- Creates DMG package from current build. -->
<target name="dmgPackage" depends="stagePackage">
<delete dir="${build}/package/dmg-app-image"/>
<exec executable="jpackage" dir="." failonerror="true">
<arg line="--type app-image"/>
@ -74,7 +76,8 @@
</exec>
</target> <!-- dmgPackage -->
<target name="rpmPackage" description="Creates RPM package from current build" depends="stagePackage">
<!-- Creates RPM package from current build. -->
<target name="rpmPackage" depends="stagePackage">
<delete dir="${build}/package/rpm-app-image"/>
<exec executable="jpackage" dir="." failonerror="true">
<arg line="--type app-image"/>
@ -107,7 +110,8 @@
</exec>
</target> <!-- rpmPackage -->
<target name="debPackage" description="Creates DEB package from current build" depends="stagePackage">
<!-- Creates DEB package from current build. -->
<target name="debPackage" depends="stagePackage">
<delete dir="${build}/package/deb-app-image"/>
<exec executable="jpackage" dir="." failonerror="true">
<arg line="--type app-image"/>

View file

@ -0,0 +1,77 @@
<?xml version='1.0'?>
<project>
<!--
Sets a property (by name and value), or set of properties (from file or resource) in the project. Properties are case sensitive.
Properties are immutable: whoever sets a property first freezes it for the rest of the build; they are most definitely not variables.
-->
<!-- store ant version number without extra details -->
<antversion property="ant.version.number" />
<!-- store ant home directory with system delimiter -->
<property name="ant.location" location="${ant.home}" />
<property name="build_tests" value="${buildroot}/build_tests"/>
<property name="build_tests_report" value="${buildroot}/build_test_report"/>
<property name="build_client" value="${buildroot}/build_client"/>
<property name="build_client_data" value="${buildroot}/build_client_data"/>
<property name="build_client_sound_data" value="${buildroot}/build_client_sound_data"/>
<property name="build_client_music_data" value="${buildroot}/build_client_music_data"/>
<property name="build_webclient" value="${buildroot}/build_webclient"/>
<property name="build_docker" value="${buildroot}/build_docker"/>
<property name="buildtools_docker" value="buildtools/docker"/>
<property name="build_postman" value="${buildroot}/buildbot/"/>
<property name="build_server" value="${buildroot}/build_server"/>
<property name="build_server_maps" value="${buildroot}/build_server_maps"/>
<property name="build_server_script" value="${buildroot}/build_server_script"/>
<property name="build_server_mods" value="${buildroot}/build_server_mods"/>
<property name="build_server_xmlconf" value="${buildroot}/build_server_xmlconf"/>
<property name="build_stendhaltools" value="${buildroot}/build_stendhaltools"/>
<property name="build_stendhaltextclient" value="${buildroot}/build_stendhaltextclient"/>
<property name="client_data" value="stendhal-data-${version}.jar"/>
<property name="client_jarname" value="stendhal-${version}.jar"/>
<property name="client_sound_data" value="stendhal-sound-data-${version}.jar"/>
<property name="client_music_data" value="stendhal-music-data-${version}.jar"/>
<property name="client_starter_jarname" value="stendhal-starter-${version}.jar"/>
<property name="dist_server_binary" value="${buildroot}/stendhal-server-${version}.zip" />
<property name="maps_jarname" value="stendhal-maps-${version}.jar"/>
<property name="server_jarname" value="stendhal-server-${version}.jar"/>
<property name="xmlconf_jarname" value="stendhal-xmlconf-${version}.jar"/>
<property name="config_dir" value="data/conf"/>
<property name="schema_location" value="${config_dir}"/>
<property name="cobertura.dir" value="${libdir}/cobertura"/>
<condition property="exclude.signing" value="true">
<not>
<available file="keystore.ks"/>
</not>
</condition>
<condition property="exclude.jardiff" value="true">
<not>
<available file="${build-archive}/stendhal-${version.old}.zip"/>
</not>
</condition>
<!-- time & date -->
<tstamp>
<format property="year" pattern="yyyy"/>
<format property="date" pattern="yyyy-MM-dd"/>
<format property="time" pattern="HH:mm:ss"/>
</tstamp>
<property name="datetime" value="${date} ${time}"/>
</project>

View file

@ -0,0 +1,29 @@
<?xml version='1.0'?>
<project>
<!-- system dependent properties -->
<property environment="env"/>
<condition property="exe.ext" value=".exe" else="">
<os family="windows"/>
</condition>
<!-- Node modules -->
<condition property="executable.npm" value="npm.cmd" else="npm">
<os family="windows"/>
</condition>
<condition property="executable.npx" value="npx.cmd" else="npx">
<os family="windows"/>
</condition>
<condition property="executable.neu" value="neu.cmd" else="neu">
<os family="windows"/>
</condition>
<!-- Python executables -->
<condition property="executable.python" value="python3${exe.ext}" else="python${exe.ext}">
<available file="python3${exe.ext}" filepath="${env.PATH}"/>
</condition>
<available property="python.present" file="${executable.python}" filepath="${env.PATH}"/>
</project>

View file

@ -7,7 +7,8 @@
<import file="dist.xml" />
<import file="tools.xml" />
<target name="test" description="Compile and run all tests." depends="compile_tests,prepare_serverini_for_tests,run_tests,report_test">
<!-- Compile and run all tests. -->
<target name="test" depends="compile_tests,prepare_serverini_for_tests,run_tests,report_test">
<exec executable="curl">
<arg value="-q"/>
<arg value="-F"/>
@ -21,7 +22,8 @@
</target> <!-- test -->
<target name="compile_tests" description="Compile all tests." depends="server_build,client_build,compile_stendhaltools,compile_stendhaltextclient,postman">
<!-- Compile all tests. -->
<target name="compile_tests" depends="server_build,client_build,compile_stendhaltools,compile_stendhaltextclient,postman">
<mkdir dir="${build_tests}"/>
<copy todir="${build_tests}">
@ -63,7 +65,8 @@
</target> <!-- compile_tests -->
<target name="prepare_serverini_for_tests" unless="server.ini" description="Generate server.ini for testing.">
<!-- Generate server.ini for testing. -->
<target name="prepare_serverini_for_tests" unless="server.ini">
<echo file="server.ini">
database_implementation=games.stendhal.server.core.engine.StendhalPlayerDatabase
factory_implementation=games.stendhal.server.core.engine.StendhalRPObjectFactory
@ -85,7 +88,8 @@ d = 9017093486007323270605414717455737376618092805104733236083857811315606869372
</target> <!-- prepare_serverini_for_tests -->
<target name="run_tests" description="Run all tests.">
<!-- Run all tests. -->
<target name="run_tests">
<mkdir dir="${build_tests_report}"/>
<taskdef uri="antlib:org.jacoco.ant" resource="org/jacoco/ant/antlib.xml">
<classpath path="buildtools/jacoco/jacocoant.jar"/>
@ -147,7 +151,8 @@ d = 9017093486007323270605414717455737376618092805104733236083857811315606869372
</target> <!-- run_tests -->
<target name="report_test" description="Aggregate test results.">
<!-- Aggregate test results. -->
<target name="report_test">
<mkdir dir="${build_tests_report}"/>
<junitreport todir="${build_tests_report}" tofile="testresults.xml">
<fileset dir="${build_tests_report}">

View file

@ -4,7 +4,8 @@
<import file="dist.xml" />
<target name="compile_stendhaltools" description="Compile Stendhal build tools.">
<!-- Compile Stendhal build tools. -->
<target name="compile_tools">
<mkdir dir="${build_stendhaltools}"/>
<javac srcdir="${src}" destdir="${build_stendhaltools}" source="1.8" target="1.8" debug="${javac.debug}" debuglevel="${javac.debuglevel}" deprecation="${javac.deprecation}" includeantruntime="true">
@ -28,7 +29,11 @@
</javac>
</target> <!-- compile_stendhaltools -->
<target name="clean_whitespace" description="Clean whitespace in source and other specified file types." depends="compile_stendhaltools">
<!-- Alias of `compile_tools`. -->
<target name="compile_stendhaltools" depends="compile_tools" />
<!-- Clean whitespace in source and other specified file types. -->
<target name="clean_whitespace" depends="compile_stendhaltools">
<!-- process main Java source, config, & scripting files -->
<java classname="games.stendhal.tools.CleanWhitespace">
<classpath>
@ -36,7 +41,7 @@
</classpath>
<arg value="src/"/>
<arg value="tests/"/>
<arg value="android/app/src/"/>
<arg value="app/android/client/src"/>
<arg value="java,xml,lua"/>
</java>
@ -45,7 +50,7 @@
<classpath>
<pathelement path="${build_stendhaltools}"/>
</classpath>
<arg value="srcjs/"/>
<arg value="${srcjs}/"/>
<arg value="js,ts,css"/>
</java>
@ -55,16 +60,22 @@
<pathelement path="${build_stendhaltools}"/>
</classpath>
<arg value="data/"/>
<arg value="tiled/"/>
<arg value="xml,xsd,lua,py"/>
</java>
<!-- process Ant build configuration files -->
<java classname="games.stendhal.tools.CleanWhitespace">
<classpath>
<pathelement path="${build_stendhaltools}"/>
</classpath>
<arg value="${ant_modules}" />
<arg value="xml" />
</java>
</target> <!-- clean_whitespace -->
<target name="cleanwhitespace" depends="clean_whitespace" description="Alias of clean_whitespace."/>
<target name="postman" description="Build postman bot.">
<!-- Build postman bot. -->
<target name="postman">
<mkdir dir="${buildroot}/buildbot"/>
<javac srcdir="${src}" destdir="${buildroot}/buildbot" debug="${javac.debug}" debuglevel="${javac.debuglevel}" source="1.8" target="1.8" deprecation="${javac.deprecation}" includeantruntime="false">
<include name="games/stendhal/bot/postman/*.java"/>
@ -100,7 +111,8 @@
</target> <!-- postman -->
<target name="signupdates" description="Sign updates." depends="compile_stendhaltools,jardiff" unless="exclude.signing">
<!-- Sign updates. -->
<target name="signupdates" depends="compile_stendhaltools,jardiff" unless="exclude.signing">
<taskdef name="updatesigner" classname="games.stendhal.tools.updateprop.UpdateSigner">
<classpath>
<pathelement path="."/>
@ -116,7 +128,8 @@
</target> <!-- signupdates -->
<target name="jardiff" depends="client_build" unless="exclude.jardiff" description="Generate release changes info.">
<!-- Generate release changes info. -->
<target name="jardiff" depends="client_build" unless="exclude.jardiff">
<echo>Creating update from ${version.old} to ${version}</echo>
<delete>
<fileset dir="${build-archive}">
@ -160,8 +173,9 @@
</target> <!-- jardiff -->
<!-- Run enemy balancer. -->
<!-- USAGE: ant balance -Dcreature="<creature_name>" -->
<target name="balance" description="Run enemy balancer." depends="compile_stendhaltools,server_build">
<target name="balance" depends="compile_stendhaltools,server_build">
<java classname="games.stendhal.tools.BalanceRPGame">
<classpath>
<pathelement path="${build_stendhaltools}"/>

View file

@ -1,6 +1,6 @@
site_name: Stendhal 1.46 Reference Documentation
site_name: Stendhal 1.49.5 Reference Documentation
site_description: A fun, friendly, & free multiplayer online adventure game.
copyright: Copyright © 2003-2024 Stendhal
copyright: Copyright © 2003-2026 Stendhal
site_url: https://stendhalgame.org/
nav:
- Index: /reference/

View file

@ -153,6 +153,12 @@ npc:setOutfitColor("skin", SkinColor.DARK)
```
---
# TimeUtil
The [TimeUtil] class.
[java.awt.Color]: https://docs.oracle.com/javase/8/docs/api/java/awt/Color.html
[CloneManager]: /reference/java/games/stendhal/server/entity/npc/CloneManager.html
@ -168,3 +174,4 @@ npc:setOutfitColor("skin", SkinColor.DARK)
[ShopType]: /reference/java/games/stendhal/server/entity/npc/shop/ShopType.html
[SingletonRepository]: /reference/java/games/stendhal/server/core/engine/SingletonRepository.html
[SkinColor]: /reference/java/games/stendhal/common/constants/SkinColor.html
[TimeUtil]: /reference/java/games/stendhal/server/util/TimeUtil.html

View file

@ -33,6 +33,7 @@
<profile name="animal"/>
<profile name="offensive"/>
<profile name="patrolling"/>
<profile name="wander"/>
</ai>
</creature>
@ -205,7 +206,7 @@
<creature name="giant killer bat">
<type class="animal" subclass="bat_giant_red" tileid="animal.png:6"/>
<description></description>
<description>You see a giant killer bat. As if small wasn't pesky enough, these giant ones are capable of taking down anyone who dares come before them.</description>
<attributes>
<atk value="752"/>
<def value="161"/>
@ -982,7 +983,7 @@
<creature name="polar bear">
<type class="animal" subclass="polar_bear" tileid="animal.png:3"/>
<description></description>
<description>You see a polar bear which lives in the icy desert. Beware! It can take you down with its powerful claws!</description>
<attributes>
<atk value="225"/>
<def value="51"/>

View file

@ -70,7 +70,7 @@
<creature name="elder cannibal">
<type class="human" subclass="elder_cannibal" tileid="human_cannibal.png:2"/>
<description/>
<description>You see an elder cannibal. For years it has eaten humans. It will not stop until its hunger is satisfied.</description>
<attributes>
<atk value="315"/>
<def value="111"/>

View file

@ -234,6 +234,7 @@
<item value="unicorn shield" quantity="[1,1]" probability="80.0"/>
<item value="lucky charm" quantity="[1,1]" probability="80.0"/>
<item value="diamond" quantity="[1,1]" probability="20.0"/>
<item value="ring of clarity" quantity="1" probability="5.0"/>
</drops>
<equips/>
<ai>

View file

@ -357,6 +357,7 @@
<corpse name="humanoid"/>
<drops>
<item value="golden orc sword" quantity="[1,1]" probability="25.0"/>
<item value="ring of clarity" quantity="1" probability="8.5"/>
</drops>
<equips>
</equips>

View file

@ -236,7 +236,7 @@
</equips>
<ai>
<profile name="animal"/>
<profile name="patrolling"/>
<profile name="wander"/>
</ai>
</creature>

View file

@ -11,6 +11,7 @@
<element name="damagetype" type="Q1:attribute" minOccurs="0" maxOccurs="unbounded"/>
<element name="statusattack" type="Q1:attribute" minOccurs="0" maxOccurs="unbounded"/>
<element name="statusresist" type="Q1:statusresist" minOccurs="0" maxOccurs="unbounded"/>
<element name="accuracy_bonus" type="Q1:attribute" minOccurs="0" maxOccurs="1"/>
</sequence>
</extension>
</complexContent>

View file

@ -328,7 +328,7 @@
<item name="pelt">
<type class="misc" subclass="pelt" tileid="-1"/>
<description/>
<description>You see a pelt of animal skin. It's used to make clothes and leather armor.</description>
<implementation class-name="games.stendhal.server.entity.item.StackableItem"/>
<attributes>
<quantity value="1"/>

View file

@ -230,4 +230,24 @@
</equipable>
</item>
<item name="ring of clarity">
<type class="ring" subclass="clarity" tileid="-1"/>
<description>You see a ring of clarity. You feel more aware while wearing it.</description>
<implementation class-name="games.stendhal.server.entity.item.Item"/>
<attributes>
<min_level value="0"/>
<accuracy_bonus value="25.0"/>
</attributes>
<weight value="0.1"/>
<value value="1"/>
<equipable>
<slot name="ground"/>
<slot name="content"/>
<slot name="bag"/>
<slot name="trade"/>
<slot name="finger"/>
<slot name="keyring"/>
</equipable>
</item>
</items>

View file

@ -147,4 +147,25 @@
</equipable>
</item>
<item name="four-leaf clover">
<type class="special" subclass="clover" tileid="-1"/>
<description>You see a lucky four-leaf clover. What are the chances of finding one!?</description>
<implementation class-name="games.stendhal.server.entity.item.StackableItem"/>
<attributes>
<quantity value="1"/>
<max_quantity value="2147483647"/>
</attributes>
<weight value="0.01"/>
<value value="250000"/>
<equipable>
<slot name="ground"/>
<slot name="content"/>
<slot name="lhand"/>
<slot name="rhand"/>
<slot name="keyring"/>
<slot name="bag"/>
<slot name="trade"/>
</equipable>
</item>
</items>

View file

@ -16,18 +16,18 @@
-->
<shop name="deniran_accessories" type="outfit">
<outfit name="white balloon" layers="detail=2" price="50000"/>
<outfit name="black balloon" layers="detail=3" price="50000"/>
<outfit name="bone" layers="detail=4" price="100000"/>
<outfit name="umbrella" layers="detail=7" price="50000"/>
<outfit name="sword" layers="detail=8" price="250000"/>
<outfit name="knife" layers="detail=9" price="125000"/>
<outfit name="spear" layers="detail=10" price="150000"/>
<outfit name="bow" layers="detail=11" price="175000"/>
<outfit name="axe1" layers="detail=12" price="250000"/>
<outfit name="axe2" layers="detail=13" price="250000"/>
<outfit name="kite shield" layers="detail=14" price="225000"/>
<outfit name="shield" layers="detail=15" price="225000"/>
<outfit name="white balloon" layers="detail=2" price="25000"/>
<outfit name="black balloon" layers="detail=3" price="25000"/>
<outfit name="bone" layers="detail=4" price="50000"/>
<outfit name="umbrella" layers="detail=7" price="25000"/>
<outfit name="sword" layers="detail=8" price="125000"/>
<outfit name="knife" layers="detail=9" price="62500"/>
<outfit name="spear" layers="detail=10" price="75000"/>
<outfit name="bow" layers="detail=11" price="87500"/>
<outfit name="axe1" layers="detail=12" price="125000"/>
<outfit name="axe2" layers="detail=13" price="125000"/>
<outfit name="kite shield" layers="detail=14" price="112500"/>
<outfit name="shield" layers="detail=15" price="112500"/>
<merchant name="Gwen" flags="configure,noOffer,removeDetailColor,confirmTemp,confirmBalloon,resetBeforeChange"
note="do not expire"/>
</shop>

View file

@ -89,6 +89,70 @@
<attribute name="hidden"/>
</portal>
<portal x="13" y="56" ref="ent11n">
<destination zone="0_ados_mountain_n2_w" ref="ent11s"/>
<attribute name="move.continuous"/>
<attribute name="hidden"/>
</portal>
<portal x="13" y="57" ref="ent11s">
<destination zone="0_ados_mountain_n2_w" ref="ent11n"/>
<implementation class-name="games.stendhal.server.entity.mapstuff.portal.LevelCheckingPortal">
<parameter name="minimum-level">100</parameter>
<parameter name="rejected">The entwives are NOT babysitters. Come back when you have some age on you.</parameter>
</implementation>
<attribute name="move.continuous"/>
<attribute name="hidden"/>
</portal>
<portal x="14" y="56" ref="ent12n">
<destination zone="0_ados_mountain_n2_w" ref="ent12s"/>
<attribute name="move.continuous"/>
<attribute name="hidden"/>
</portal>
<portal x="14" y="57" ref="ent12s">
<destination zone="0_ados_mountain_n2_w" ref="ent12n"/>
<implementation class-name="games.stendhal.server.entity.mapstuff.portal.LevelCheckingPortal">
<parameter name="minimum-level">100</parameter>
<parameter name="rejected">The entwives are NOT babysitters. Come back when you have some age on you.</parameter>
</implementation>
<attribute name="move.continuous"/>
<attribute name="hidden"/>
</portal>
<portal x="15" y="56" ref="ent13n">
<destination zone="0_ados_mountain_n2_w" ref="ent13s"/>
<attribute name="move.continuous"/>
<attribute name="hidden"/>
</portal>
<portal x="15" y="57" ref="ent13s">
<destination zone="0_ados_mountain_n2_w" ref="ent13n"/>
<implementation class-name="games.stendhal.server.entity.mapstuff.portal.LevelCheckingPortal">
<parameter name="minimum-level">100</parameter>
<parameter name="rejected">The entwives are NOT babysitters. Come back when you have some age on you.</parameter>
</implementation>
<attribute name="move.continuous"/>
<attribute name="hidden"/>
</portal>
<portal x="16" y="56" ref="ent14n">
<destination zone="0_ados_mountain_n2_w" ref="ent14s"/>
<attribute name="move.continuous"/>
<attribute name="hidden"/>
</portal>
<portal x="16" y="57" ref="ent14s">
<destination zone="0_ados_mountain_n2_w" ref="ent14n"/>
<implementation class-name="games.stendhal.server.entity.mapstuff.portal.LevelCheckingPortal">
<parameter name="minimum-level">100</parameter>
<parameter name="rejected">The entwives are NOT babysitters. Come back when you have some age on you.</parameter>
</implementation>
<attribute name="move.continuous"/>
<attribute name="hidden"/>
</portal>
<!-- wishing well-->
<entity x="86" y="21">
<implementation class-name="games.stendhal.server.entity.mapstuff.useable.WellSource"/>
@ -2320,6 +2384,7 @@ You should never dive with a cold or severe allergy because, you may not be able
<portal x="4" y="4" ref="upstairs">
<destination zone="int_ados_town_hall_1" ref="downstairs"/>
<attribute name="move.continuous"/>
</portal>
<!-- Signs -->
@ -4273,7 +4338,6 @@ My fee:
<!-- Portals -->
<portal x="12" y="22" ref="in">
<destination zone="0_ados_city" ref="house_70"/>
<attribute name="resistance">0</attribute>
</portal>
<!-- Clock -->

View file

@ -115,6 +115,7 @@
<attributes>
<parameter name="color_method">time</parameter>
<parameter name="weather">varying(rain=-2, temperature=+5)</parameter>
<parameter name="music">jump_and_run_tropics</parameter>
</attributes>
<entity x="90" y="45">
@ -160,6 +161,7 @@
<attributes>
<parameter name="color_method">time</parameter>
<parameter name="weather">varying(rain=-2, temperature=+5)</parameter>
<parameter name="music">jump_and_run_tropics</parameter>
</attributes>
<!-- NPCs -->
@ -1082,6 +1084,7 @@
<attributes>
<parameter name="color_method">time</parameter>
<parameter name="weather">varying(rain=-2, temperature=+5)</parameter>
<!--<parameter name="music">island_mountain</parameter>-->
</attributes>
<!-- Music/Ambiance -->

View file

@ -277,14 +277,13 @@
</zone>
<zone name="0_deniran_city_se" level="0" x="499360" y="500128"
file="Level 0/deniran/city_se.tmx">
<zone name="0_deniran_city_se" level="0" x="499360" y="500128" file="Level 0/deniran/city_se.tmx">
<attributes>
<parameter name="color_method">time</parameter>
<parameter name="weather">varying</parameter>
</attributes>
<configurator class-name="games.stendhal.server.maps.deniran.cityoutside.CloverHunterNPC"/>
</zone>

View file

@ -12,6 +12,10 @@
file="Level 7/kikareukin/clouds.tmx">
<attributes>
<parameter name="color_method">time</parameter>
<parameter name="weather">clouds</parameter>
<parameter name="parallax">semos_surrounds</parameter>
<!-- prevent drawing specific tiles in web client while while keeping compatibility with Java client -->
<parameter name="parallax_ignore_tiles">sky/cloud/clouds</parameter>
</attributes>
<!--Don't allow teleporting in as we don't want marked scrolls made or
@ -51,6 +55,7 @@
<attributes>
<parameter name="color_method">time</parameter>
<parameter name="weather">varying(temperature=-2)</parameter>
<parameter name="parallax">semos_surrounds</parameter>
</attributes>
<configurator

View file

@ -1027,7 +1027,7 @@ below average.
class-name="games.stendhal.server.entity.mapstuff.area.MessagingArea">
<parameter name="width">5</parameter>
<parameter name="height">5</parameter>
<parameter name="enterMessage">You hear faintly incantations of dark magic from below. The place reeks of danger.</parameter>
<parameter name="enterMessage">You hear faint incantations of dark magic from below. The place reeks of danger.</parameter>
<parameter name="warnPlayer">true</parameter>
</implementation>
</entity>
@ -1345,6 +1345,7 @@ below average.
<configurator class-name="games.stendhal.server.maps.nalwor.hell.Reaper2NPC"/>
<configurator class-name="games.stendhal.server.maps.nalwor.hell.CaptiveNPC"/>
<configurator class-name="games.stendhal.server.maps.nalwor.hell.HellTimer"/>
<configurator class-name="games.stendhal.server.maps.nalwor.hell.HellFreezer" condition="!stendhal.nohellfreezer"/>
<portal x="9" y="9" ref="start">
<implementation
class-name="games.stendhal.server.entity.mapstuff.portal.OneWayPortalDestination"/>

View file

@ -648,6 +648,11 @@ Unfortunately I will not be able to visit Athor this year. I have run into a bit
<!-- Interiors of the wizards tower -->
<zone name="int_semos_wizards_tower_basement" file="interiors/semos/wizards_tower_basement.tmx">
<attributes>
<parameter name="parallax">stars</parameter>
<parameter name="parallax_ignore_tiles">sky/stars</parameter>
</attributes>
<configurator
class-name="games.stendhal.server.maps.semos.wizardstower.WizardsGuardStatueNPC"/>
@ -669,8 +674,14 @@ Unfortunately I will not be able to visit Athor this year. I have run into a bit
class-name="games.stendhal.server.entity.mapstuff.portal.OneWayPortalDestination"/>
</portal>
</zone>
<!-- Interiors of the wizards tower -->
<zone name="int_semos_wizards_tower_1" file="interiors/semos/wizards_tower_1.tmx">
<attributes>
<parameter name="parallax">stars</parameter>
<parameter name="parallax_ignore_tiles">sky/stars</parameter>
</attributes>
<configurator class-name="games.stendhal.server.core.config.zone.NoTeleportIn"/>
<configurator
class-name="games.stendhal.server.maps.semos.wizardstower.FirstFloorCreatures"/>
@ -755,8 +766,14 @@ Unfortunately I will not be able to visit Athor this year. I have run into a bit
<attribute name="hidden"/>
</portal>
</zone>
<!-- Interiors of the wizards tower -->
<zone name="int_semos_wizards_tower_2" file="interiors/semos/wizards_tower_2.tmx">
<attributes>
<parameter name="parallax">stars</parameter>
<parameter name="parallax_ignore_tiles">sky/stars</parameter>
</attributes>
<configurator class-name="games.stendhal.server.core.config.zone.NoTeleportIn"/>
<configurator
class-name="games.stendhal.server.maps.semos.wizardstower.SecondFloorCreatures"/>
@ -828,8 +845,14 @@ Unfortunately I will not be able to visit Athor this year. I have run into a bit
<attribute name="hidden"/>
</portal>
</zone>
<!-- Interiors of the wizards tower -->
<zone name="int_semos_wizards_tower_3" file="interiors/semos/wizards_tower_3.tmx">
<attributes>
<parameter name="parallax">stars</parameter>
<parameter name="parallax_ignore_tiles">sky/stars</parameter>
</attributes>
<configurator class-name="games.stendhal.server.core.config.zone.NoTeleportIn"/>
<configurator
class-name="games.stendhal.server.maps.semos.wizardstower.ThirdFloorCreatures"/>
@ -901,8 +924,14 @@ Unfortunately I will not be able to visit Athor this year. I have run into a bit
<attribute name="hidden"/>
</portal>
</zone>
<!-- Interiors of the wizards tower -->
<zone name="int_semos_wizards_tower_4" file="interiors/semos/wizards_tower_4.tmx">
<attributes>
<parameter name="parallax">stars</parameter>
<parameter name="parallax_ignore_tiles">sky/stars</parameter>
</attributes>
<configurator class-name="games.stendhal.server.core.config.zone.NoTeleportIn"/>
<configurator
class-name="games.stendhal.server.maps.semos.wizardstower.FourthFloorCreatures"/>
@ -974,8 +1003,14 @@ Unfortunately I will not be able to visit Athor this year. I have run into a bit
<attribute name="hidden"/>
</portal>
</zone>
<!-- Interiors of the wizards tower -->
<zone name="int_semos_wizards_tower_5" file="interiors/semos/wizards_tower_5.tmx">
<attributes>
<parameter name="parallax">stars</parameter>
<parameter name="parallax_ignore_tiles">sky/stars</parameter>
</attributes>
<configurator class-name="games.stendhal.server.core.config.zone.NoTeleportIn"/>
<configurator
class-name="games.stendhal.server.maps.semos.wizardstower.FifthFloorCreatures"/>
@ -1047,8 +1082,14 @@ Unfortunately I will not be able to visit Athor this year. I have run into a bit
<attribute name="hidden"/>
</portal>
</zone>
<!-- Interiors of the wizards tower -->
<zone name="int_semos_wizards_tower_6" file="interiors/semos/wizards_tower_6.tmx">
<attributes>
<parameter name="parallax">stars</parameter>
<parameter name="parallax_ignore_tiles">sky/stars</parameter>
</attributes>
<configurator class-name="games.stendhal.server.core.config.zone.NoTeleportIn"/>
<configurator
class-name="games.stendhal.server.maps.semos.wizardstower.SixthFloorCreatures"/>
@ -1120,8 +1161,14 @@ Unfortunately I will not be able to visit Athor this year. I have run into a bit
<attribute name="hidden"/>
</portal>
</zone>
<!-- Interiors of the wizards tower -->
<zone name="int_semos_wizards_tower_7" file="interiors/semos/wizards_tower_7.tmx">
<attributes>
<parameter name="parallax">stars</parameter>
<parameter name="parallax_ignore_tiles">sky/stars</parameter>
</attributes>
<configurator
class-name="games.stendhal.server.maps.semos.wizardstower.WizardsGuardStatueSpireNPC"/>
@ -1146,6 +1193,11 @@ Unfortunately I will not be able to visit Athor this year. I have run into a bit
</zone>
<!-- Interiors of the wizards tower -->
<zone name="int_semos_wizards_tower_8" file="interiors/semos/wizards_tower_spire_1.tmx">
<attributes>
<parameter name="parallax">view_wizards_tower</parameter>
<parameter name="parallax_ignore_tiles">sky/view_wizards_tower</parameter>
</attributes>
<configurator
class-name="games.stendhal.server.maps.semos.wizardstower.RedFireWizardNPC"/>
<configurator
@ -1220,6 +1272,11 @@ Unfortunately I will not be able to visit Athor this year. I have run into a bit
<!-- Interiors of the wizards tower -->
<zone name="int_semos_wizards_tower_9" file="interiors/semos/wizards_tower_spire_2.tmx">
<attributes>
<parameter name="parallax">view_wizards_tower</parameter>
<parameter name="parallax_ignore_tiles">sky/view_wizards_tower</parameter>
</attributes>
<configurator
class-name="games.stendhal.server.maps.semos.wizardstower.BlackDeathWizardNPC"/>
<configurator
@ -1341,6 +1398,9 @@ Unfortunately I will not be able to visit Athor this year. I have run into a bit
<configurator
class-name="games.stendhal.server.maps.semos.plains.ButterfliesNPC"/>
<!-- four-leaf clover: spawns in random zones but needs to be initialized with configurator -->
<configurator class-name="games.stendhal.server.maps.global.FourLeafClover"/>
<configurator class-name="games.stendhal.server.maps.FertileGrounds">
<parameter name="x">60</parameter>
<parameter name="y">44</parameter>

View file

@ -9,7 +9,7 @@
<!-- Ground level -->
<zone name="0_sikhw_desert_n_w2" level="0" x="499104" y="500384"
file="Level 0/sikhw/desert_n_w2.tmx">
file="Level 0/sikhw/desert_n_w2.tmx" accessible="false">
<attributes>
<parameter name="color_method">time</parameter>
@ -20,7 +20,7 @@
<zone name="0_sikhw_desert_w2" level="0" x="499104" y="500512"
file="Level 0/sikhw/desert_w2.tmx">
file="Level 0/sikhw/desert_w2.tmx" accessible="false">
<attributes>
<parameter name="color_method">time</parameter>
@ -31,7 +31,7 @@
<zone name="0_sikhw_desert_s_w2" level="0" x="499104" y="500640"
file="Level 0/sikhw/desert_s_w2.tmx">
file="Level 0/sikhw/desert_s_w2.tmx" accessible="false">
<attributes>
<parameter name="color_method">time</parameter>
@ -42,7 +42,7 @@
<zone name="0_sikhw_desert_s2_w2" level="0" x="499104" y="500768"
file="Level 0/sikhw/desert_s2_w2.tmx">
file="Level 0/sikhw/desert_s2_w2.tmx" accessible="false">
<attributes>
<parameter name="color_method">time</parameter>
@ -55,7 +55,7 @@
<!-- -->
<zone name="0_sikhw_desert_nw" level="0" x="499232" y="500384"
file="Level 0/sikhw/desert_nw.tmx">
file="Level 0/sikhw/desert_nw.tmx" accessible="false">
<attributes>
<parameter name="color_method">time</parameter>
@ -66,7 +66,7 @@
<zone name="0_sikhw_desert_w" level="0" x="499232" y="500512"
file="Level 0/sikhw/desert_w.tmx">
file="Level 0/sikhw/desert_w.tmx" accessible="false">
<attributes>
<parameter name="color_method">time</parameter>
@ -77,7 +77,7 @@
<zone name="0_sikhw_desert_sw" level="0" x="499232" y="500640"
file="Level 0/sikhw/desert_sw.tmx">
file="Level 0/sikhw/desert_sw.tmx" accessible="false">
<attributes>
<parameter name="color_method">time</parameter>
@ -88,7 +88,7 @@
<zone name="0_sikhw_desert_s2_w" level="0" x="499232" y="500768"
file="Level 0/sikhw/desert_s2_w.tmx">
file="Level 0/sikhw/desert_s2_w.tmx" accessible="false">
<attributes>
<parameter name="color_method">time</parameter>
@ -101,7 +101,7 @@
<!-- -->
<zone name="0_sikhw_desert_n" level="0" x="499360" y="500384"
file="Level 0/sikhw/desert_n.tmx">
file="Level 0/sikhw/desert_n.tmx" accessible="false">
<attributes>
<parameter name="color_method">time</parameter>
@ -113,7 +113,7 @@
<zone name="0_sikhw_city" level="0" x="499360" y="500512"
file="Level 0/sikhw/city.tmx">
file="Level 0/sikhw/city.tmx" accessible="false">
<attributes>
<parameter name="color_method">time</parameter>
@ -124,7 +124,7 @@
<zone name="0_sikhw_desert_s" level="0" x="499360" y="500640"
file="Level 0/sikhw/desert_s.tmx">
file="Level 0/sikhw/desert_s.tmx" accessible="false">
<attributes>
<parameter name="color_method">time</parameter>
@ -135,7 +135,7 @@
<zone name="0_sikhw_desert_s2" level="0" x="499360" y="500768"
file="Level 0/sikhw/desert_s2.tmx">
file="Level 0/sikhw/desert_s2.tmx" accessible="false">
<attributes>
<parameter name="color_method">time</parameter>
@ -148,7 +148,7 @@
<!-- -->
<zone name="0_sikhw_desert_ne" level="0" x="499488" y="500384"
file="Level 0/sikhw/desert_ne.tmx">
file="Level 0/sikhw/desert_ne.tmx" accessible="false">
<attributes>
<parameter name="color_method">time</parameter>
@ -159,7 +159,7 @@
<zone name="0_sikhw_desert_e" level="0" x="499488" y="500512"
file="Level 0/sikhw/desert_e.tmx">
file="Level 0/sikhw/desert_e.tmx" accessible="false">
<attributes>
<parameter name="color_method">time</parameter>
@ -170,7 +170,7 @@
<zone name="0_sikhw_desert_se" level="0" x="499488" y="500640"
file="Level 0/sikhw/desert_se.tmx">
file="Level 0/sikhw/desert_se.tmx" accessible="false">
<attributes>
<parameter name="color_method">time</parameter>
@ -180,7 +180,7 @@
</zone>
<zone name="0_sikhw_desert_s2_e" level="0" x="499488" y="500768"
file="Level 0/sikhw/desert_s2_e.tmx">
file="Level 0/sikhw/desert_s2_e.tmx" accessible="false">
<attributes>
<parameter name="color_method">time</parameter>

Binary file not shown.

After

Width:  |  Height:  |  Size: 843 B

View file

@ -0,0 +1,127 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="48"
version="1.1"
width="48"
id="svg131"
sodipodi:docname="pathfinding-disabled.svg"
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<title
id="title1">Path Finding Enabled</title>
<sodipodi:namedview
id="namedview131"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="true"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="4.8032754"
inkscape:cx="32.686029"
inkscape:cy="28.418108"
inkscape:window-width="1920"
inkscape:window-height="1025"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg131" />
<defs
id="defs1" />
<g
id="g1">
<circle
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:2.71045;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.999544"
id="path1"
cx="24"
cy="24"
r="16"
inkscape:label="background" />
<g
id="g134"
transform="matrix(-0.03571429,0,0,0.03571429,34.000001,15.42857)"
inkscape:label="icon">
<path
id="path135"
style="display:inline;fill:#ffffff"
d="m 240,0 c 0,60 0,120 0,180 -20,20 -40,40 -60,60 -40,0 -80,0 -120,0 -20,20 -40,40 -60,60 0,60 0,120 0,180 106.66667,0 213.33333,0 320,0 0,-13.33333 0,-26.66667 0,-40 13.33333,0 26.66667,0 40,0 0,13.33333 0,26.66667 0,40 66.66667,0 133.33333,0 200,0 0,-160 0,-320 0,-480 C 453.33333,0 346.66667,0 240,0 Z"
inkscape:label="boot_background" />
<path
id="rect103"
style="fill:#000000"
inkscape:label="boot_shadow"
d="m 280,40 v 160 l -80,80 h 60 l 60,-60 V 40 Z m 200,0 V 360 H 40 v 40 H 520 V 40 Z"
sodipodi:nodetypes="cccccccccccccc" />
<path
id="path134"
d="m 240,0 v 180 l -60,60 H 60 C 46.666667,253.33333 13.333333,286.66667 0,300 v 180 h 320 v -40 h 40 v 40 H 560 V 0 Z m 40,40 H 520 V 400 H 40 v -80 c 13.333333,-13.33333 26.666667,-26.66667 40,-40 h 120 l 80,-80 z"
sodipodi:nodetypes="cccccccccccccccccccccc"
inkscape:label="boot_outline"
style="display:inline;fill:#ffffff" />
</g>
<path
id="path859"
style="fill:#ffffff;fill-opacity:0.99858;stroke:#000000;stroke-width:1.92;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
inkscape:label="disabled"
d="M 36,8.96 8.96,36 v 3.04 H 12 L 39.04,12 V 8.96 Z"
sodipodi:nodetypes="ccccccc" />
</g>
<metadata
id="metadata135">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:date>2024-06-23</dc:date>
<dc:creator>
<cc:Agent>
<dc:title>Jordan Irwin (AntumDeluge)</dc:title>
</cc:Agent>
</dc:creator>
<dc:title>Path Finding Enabled</dc:title>
<dc:publisher>
<cc:Agent>
<dc:title>Stendhal Game</dc:title>
</cc:Agent>
</dc:publisher>
<dc:subject>
<rdf:Bag>
<rdf:li>icon</rdf:li>
<rdf:li>menu</rdf:li>
<rdf:li>button</rdf:li>
<rdf:li>cursor</rdf:li>
<rdf:li>boot</rdf:li>
<rdf:li>shoe</rdf:li>
<rdf:li>foot</rdf:li>
<rdf:li>walk</rdf:li>
<rdf:li>walking</rdf:li>
<rdf:li>move</rdf:li>
<rdf:li>moving</rdf:li>
<rdf:li>path</rdf:li>
<rdf:li>pathfinding</rdf:li>
<rdf:li>path finding</rdf:li>
<rdf:li>disable</rdf:li>
<rdf:li>disabled</rdf:li>
</rdf:Bag>
</dc:subject>
<cc:license
rdf:resource="http://creativecommons.org/publicdomain/zero/1.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/publicdomain/zero/1.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
</svg>

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 720 B

View file

@ -0,0 +1,121 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
height="48"
version="1.1"
width="48"
id="svg131"
sodipodi:docname="pathfinding.svg"
inkscape:version="1.3.2 (091e20e, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<title
id="title1">Path Finding Enabled</title>
<sodipodi:namedview
id="namedview131"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="true"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="3.3964286"
inkscape:cx="56.235541"
inkscape:cy="24.290221"
inkscape:window-width="1920"
inkscape:window-height="1025"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg131" />
<defs
id="defs1" />
<g
id="g1">
<circle
style="display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2.71045;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.999544"
id="path1"
cx="24"
cy="24"
r="16"
inkscape:label="background" />
<g
id="g134"
transform="matrix(-0.03571429,0,0,0.03571429,34.000001,15.42857)"
inkscape:label="icon">
<path
id="path135"
style="display:inline;fill:#ffffff"
d="m 240,0 c 0,60 0,120 0,180 -20,20 -40,40 -60,60 -40,0 -80,0 -120,0 -20,20 -40,40 -60,60 0,60 0,120 0,180 106.66667,0 213.33333,0 320,0 0,-13.33333 0,-26.66667 0,-40 13.33333,0 26.66667,0 40,0 0,13.33333 0,26.66667 0,40 66.66667,0 133.33333,0 200,0 0,-160 0,-320 0,-480 C 453.33333,0 346.66667,0 240,0 Z"
inkscape:label="boot_background" />
<path
id="rect103"
style="fill:#000000"
inkscape:label="boot_shadow"
d="m 280,40 v 160 l -80,80 h 60 l 60,-60 V 40 Z m 200,0 V 360 H 40 v 40 H 520 V 40 Z"
sodipodi:nodetypes="cccccccccccccc" />
<path
id="path134"
d="m 240,0 v 180 l -60,60 H 60 C 46.666667,253.33333 13.333333,286.66667 0,300 v 180 h 320 v -40 h 40 v 40 H 560 V 0 Z m 40,40 H 520 V 400 H 40 v -80 c 13.333333,-13.33333 26.666667,-26.66667 40,-40 h 120 l 80,-80 z"
sodipodi:nodetypes="cccccccccccccccccccccc"
inkscape:label="boot_outline"
style="display:inline;fill:#ffffff" />
</g>
</g>
<metadata
id="metadata135">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:date>2024-06-23</dc:date>
<dc:creator>
<cc:Agent>
<dc:title>Jordan Irwin (AntumDeluge)</dc:title>
</cc:Agent>
</dc:creator>
<dc:title>Path Finding Enabled</dc:title>
<dc:publisher>
<cc:Agent>
<dc:title>Stendhal Game</dc:title>
</cc:Agent>
</dc:publisher>
<dc:subject>
<rdf:Bag>
<rdf:li>icon</rdf:li>
<rdf:li>menu</rdf:li>
<rdf:li>button</rdf:li>
<rdf:li>cursor</rdf:li>
<rdf:li>boot</rdf:li>
<rdf:li>shoe</rdf:li>
<rdf:li>foot</rdf:li>
<rdf:li>walk</rdf:li>
<rdf:li>walking</rdf:li>
<rdf:li>move</rdf:li>
<rdf:li>moving</rdf:li>
<rdf:li>path</rdf:li>
<rdf:li>pathfinding</rdf:li>
<rdf:li>path finding</rdf:li>
<rdf:li>enable</rdf:li>
<rdf:li>enabled</rdf:li>
</rdf:Bag>
</dc:subject>
<cc:license
rdf:resource="http://creativecommons.org/publicdomain/zero/1.0/" />
</cc:Work>
<cc:License
rdf:about="http://creativecommons.org/publicdomain/zero/1.0/">
<cc:permits
rdf:resource="http://creativecommons.org/ns#Reproduction" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#Distribution" />
<cc:permits
rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
</cc:License>
</rdf:RDF>
</metadata>
</svg>

After

Width:  |  Height:  |  Size: 4.3 KiB

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -70,7 +70,7 @@ pauldroned iron cuirass=
You see a formidable pauldroned iron cuirass. The pauldrons (shoulder pieces) will protect your upper half.=
pauldroned leather cuirass=
You see a pauldroned leather cuirass. It was crafted to withstand minor attacks.=
You see a pauldroned leather cuirass. It was crafted to withstand minor attacks.=
plate armor=
You see a suit of plate armor. You imagine it would be heavy but the steel is well tempered and the suit is very strong.=
@ -109,7 +109,7 @@ steel arrow=
You see a shining steel arrow. With plenty of these, and a good bow, you'll be a formidable archer.=
golden arrow=
You see a golden arrow. With a fist full of these and a good bow, you will surely take down your enemies quicker.=
You see a golden arrow. With a fist full of these and a good bow, you will surely take down your enemies quicker.=
fire arrow=
You see a fire arrow. The tip burns brightly.=
@ -124,7 +124,7 @@ dark arrow=
You see a dark arrow. It's hard to describe.=
power arrow=
You see a power arrow. The sting of this arrow will surely defeat your enemies, when equipped with a bow.=
You see a power arrow. The sting of this arrow will surely defeat your enemies, when equipped with a bow.=
## axes
@ -151,7 +151,7 @@ durin axe=
You see a durin axe, a great prize from the dwarves.=
golden twoside axe=
You see a golden twoside axe. This axe is a rare find.=
You see a golden twoside axe. This axe is a rare find.=
halberd=
You see a rare halberd, with an axe's blade fused onto a shaft. It is both heavy and keen-edged.=
@ -231,7 +231,7 @@ red boots=
You see a pair of red boots, the color reminds you of fresh blood.=
royal boots=
You see a pair of royal boots. They have magical properties=
You see a pair of royal boots. They have magical properties=
shadow boots=
You see a pair of shadow boots. You can't fathom what they are made of.=
@ -240,7 +240,7 @@ steel boots=
You see a pair of steel boots, fit for any soldier.=
stone boots=
You see a pair of stone boots. They may be heavy, but they protect your feet well.=
You see a pair of stone boots. They may be heavy, but they protect your feet well.=
studded boots=
You see a pair of worn studded boots with moderate protection for your feet.=
@ -321,7 +321,7 @@ red dragon cloak=
You see a red dragon cloak. He didn't have one for a long time but finally caved in to peer pressure and got one.=
royal cloak=
You see a royal cloak. It will protect you against mighty foes.=
You see a royal cloak. It will protect you against mighty foes.=
shadow cloak=
You see a shadow cloak, in colors of the shadow armor.=
@ -369,10 +369,10 @@ mace=
You see a mace, much neglected in years of use.=
morning star=
You see a morning star. This is a very rare item indeed.=
You see a morning star. This is a very rare item indeed.=
rod of the gm=
You see a rod of the GM. This rod is reserved for those with special powers, be careful not to let it fall into the wrong hands.=
You see a rod of the GM. This rod is reserved for those with special powers, be careful not to let it fall into the wrong hands.=
skull staff=
You see a rare skull staff. It appears mystical but will work like any other staff.=
@ -411,10 +411,10 @@ fat bottle=
You see a fat bottle. It is empty, someone drank the contents.=
empty goblet=
You see an empty goblet. You wonder what could it hold.=
You see an empty goblet. You wonder what could it hold.=
goblet=
You see a goblet. You look at its contents, and shiver at the blood inside.=
You see a goblet. You look at its contents, and shiver at the blood inside.=
vial=
You see a vial used in chemestry.=
@ -521,7 +521,7 @@ deadly poison=
You see a deadly poison. Don't drink it!=
disease poison=
You see a disease poison. Be careful, it's wicked.=
You see a disease poison. Be careful, it's wicked.=
mega poison=
You see a mega poison. This is some wicked poison.=
@ -643,8 +643,8 @@ You see a carrot. It can be an ingredient, or you can eat it.=
cauliflower=
You see a fresh head of cauliflower.=
courgette=
You see a courgette. It can be an ingredient, or you can eat it.=
zucchini=
You see a zucchini. It can be an ingredient, or you can eat it.=
collard=
You see a collard. It's rare and strangely magical.=
@ -658,8 +658,7 @@ You see a fresh leek.=
onion=
You see an onion.=
salad=
You see a salad.=
lettuce=
spinach=
You see spinach. It is enriched with vitamins.=
@ -1053,10 +1052,10 @@ decent meal=
You see a decent meal for Groongo Rahnnt. Deliver it to him quickly!=
bulb=
You see a bulb. It can be planted anywhere, but it will only thrive on fertile ground.=
You see a bulb. It can be planted in fertile ground where it will thrive.=
seed=
You see a seed. It can be planted anywhere, but it will only thrive on fertile ground.=
You see a seed. It can be planted in fertile ground where it will thrive.=
giant heart=
You see a giant heart. This proves that a giant was defeated, and has magical properties that you are not sure of.=
@ -1098,6 +1097,7 @@ venom gland=
You see the venom gland of a giant king cobra. It is filled with deadly toxin.=
pelt=
You see a pelt of animal skin. It's used to make clothes and leather armor.=
leather thread=
You see a strand of sturdy leather thread.=
@ -1192,7 +1192,7 @@ You see a gold nugget. Its rich golden color shines, and it may be useful.=
mithril nugget=
You see a mithril nugget. Its pale silvery color shines, and it may be useful.=
iron=
iron bar=
gold bar=
You see a gold bar. It will make beautiful jewelry, or fetch a fine price.=
@ -1266,6 +1266,9 @@ You see an imperial ring. It is imbued with the strength of a king.=
enhanced imperial ring=
You see an enhanced imperial ring. It eminates the auras of strength and defense.=
ring of clarity=
You see a ring of clarity. You feel more aware while wearing it.=
## scrolls
@ -1408,6 +1411,9 @@ You see a silvery gm token. Does it bring you pride?=
bronze gm token=
You see a bronze gm token. Does it bring you pride?=
four-leaf clover=
You see a lucky four-leaf clover. What are the chances of finding one!?=
## swords
@ -1418,7 +1424,7 @@ biting sword=
The tip of this biting sword is chiseled to a lethal point. It will serve you well.=
black sword=
You see a black sword. Its darkness will surely protect you.=
You see a black sword. Its darkness will surely protect you.=
broadsword=
You see a mighty broadsword. Enemies will see their death.=
@ -1636,6 +1642,7 @@ You see a killer bat which will suck your blood!=
giant bat=
giant killer bat=
You see a giant killer bat. As if small wasn't pesky enough, these giant ones are capable of taking down anyone who dares come before them.=
piglet=
You see a piglet, a bit dirty.=
@ -1703,6 +1710,7 @@ black bear=
You see a strong black bear which hibernates in winter.=
polar bear=
You see a polar bear which lives in the icy desert. Beware! It can take you down with its powerful claws!=
## animal_aquatic
@ -2242,7 +2250,7 @@ blordrough corporal=
You see a man who feels his past indicates how he should be treated now but desperately wishes to exercise his intelect in a game of chess.=
blordrough storm trooper=
You see a man who is but a fraction of his former glory as one of the most feared foes of Faiumoni. Now, his main concern is keeping his house clean and tidy.=
You see a man who is but a fraction of his former glory as one of the most feared foes of Faiumoni. Now, his main concern is keeping his house clean and tidy.=
blordrough soldier=
You see a man who is fast and strong.=
@ -2269,6 +2277,7 @@ cannibal=
You see a cannibal. He hunts you for cooking and eating your fresh meat! It's useless to tell him that your flesh is not good, better fight him or run away!=
elder cannibal=
You see an elder cannibal. For years it has eaten humans. It will not stop until its hunger is satisfied.=
cannibal warrior=
You see a cannibal warrior.=

View file

@ -1 +1,2 @@
Level*
build
dist

View file

@ -1,115 +1,115 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.5" tiledversion="1.7.2" orientation="orthogonal" renderorder="right-down" width="128" height="128" tilewidth="32" tileheight="32" infinite="0" nextlayerid="9" nextobjectid="1">
<tileset firstgid="1" name="logic/collision" tilewidth="32" tileheight="32" tilecount="1" columns="1">
<image source="../../tileset/logic/collision.png" width="32" height="32"/>
</tileset>
<tileset firstgid="2" name="logic/portal" tilewidth="32" tileheight="32" tilecount="24" columns="8">
<image source="../../tileset/logic/portal.png" width="256" height="96"/>
</tileset>
<tileset firstgid="26" name="building/stairs/stairs_orange" tilewidth="32" tileheight="32" tilecount="12" columns="3">
<image source="../../tileset/building/stairs/stairs_orange.png" width="96" height="128"/>
</tileset>
<tileset firstgid="38" name="logic/creature/mountain_orc" tilewidth="32" tileheight="32" tilecount="4" columns="4">
<image source="../../tileset/logic/creature/mountain_orc.png" width="128" height="32"/>
</tileset>
<tileset firstgid="42" name="logic/creature/mountain_dwarf" tilewidth="32" tileheight="32" tilecount="5" columns="5">
<image source="../../tileset/logic/creature/mountain_dwarf.png" width="160" height="32"/>
</tileset>
<tileset firstgid="47" name="furniture/table/bench" tilewidth="32" tileheight="32" tilecount="3" columns="3">
<image source="../../tileset/furniture/table/bench.png" width="96" height="32"/>
</tileset>
<tileset firstgid="50" name="item/weapons/box_of_weapons" tilewidth="32" tileheight="32" tilecount="2" columns="1">
<image source="../../tileset/item/weapon/box_of_weapons.png" width="32" height="64"/>
</tileset>
<tileset firstgid="52" name="item/armor/armor" tilewidth="32" tileheight="32" tilecount="4" columns="4">
<image source="../../tileset/item/armor/armor.png" width="128" height="32"/>
</tileset>
<tileset firstgid="56" name="item/armor/weapons_rack" tilewidth="32" tileheight="32" tilecount="18" columns="9">
<image source="../../tileset/item/armor/weapons_rack.png" width="288" height="64"/>
</tileset>
<tileset firstgid="74" name="item/armor/weapons_for_walls" tilewidth="32" tileheight="32" tilecount="16" columns="4">
<image source="../../tileset/item/armor/weapons_for_walls.png" width="128" height="128"/>
</tileset>
<tileset firstgid="90" name="furniture/table/grey_fancy_horizontal" tilewidth="32" tileheight="32" tilecount="9" columns="3">
<image source="../../tileset/furniture/table/grey_fancy_horizontal.png" width="96" height="96"/>
</tileset>
<tileset firstgid="99" name="item/pot/huge_pot" tilewidth="32" tileheight="32" tilecount="4" columns="2">
<image source="../../tileset/item/pot/huge_pot.png" width="64" height="64"/>
</tileset>
<tileset firstgid="103" name="item/tools" tilewidth="32" tileheight="32" tilecount="9" columns="3">
<image source="../../tileset/item/tools.png" width="96" height="96"/>
</tileset>
<tileset firstgid="112" name="logic/item/resources" tilewidth="32" tileheight="32" tilecount="6" columns="6">
<image source="../../tileset/logic/item/resources.png" width="192" height="32"/>
</tileset>
<tileset firstgid="118" name="furniture/other/tools_rack" tilewidth="32" tileheight="32" tilecount="6" columns="3">
<image source="../../tileset/furniture/other/tools_rack.png" width="96" height="64"/>
</tileset>
<tileset firstgid="124" name="logic/creature/dwarf" tilewidth="32" tileheight="32" tilecount="8" columns="8">
<image source="../../tileset/logic/creature/dwarf.png" width="256" height="32"/>
</tileset>
<tileset firstgid="132" name="ground/indoor/floor" tilewidth="32" tileheight="32" tilecount="3" columns="3">
<image source="../../tileset/ground/indoor/floor.png" width="96" height="32"/>
</tileset>
<tileset firstgid="135" name="building/wall/int_grey" tilewidth="32" tileheight="32" tilecount="121" columns="11">
<image source="../../tileset/building/wall/int_grey.png" width="352" height="352"/>
</tileset>
<tileset firstgid="256" name="building/entrance/grey" tilewidth="32" tileheight="32" tilecount="25" columns="5">
<image source="../../tileset/building/entrance/grey.png" width="160" height="160"/>
</tileset>
<tileset firstgid="281" name="furniture/bed/double_peach" tilewidth="32" tileheight="32" tilecount="8" columns="2">
<image source="../../tileset/furniture/bed/double_peach.png" width="64" height="128"/>
</tileset>
<tileset firstgid="289" name="furniture/bed/double_blue" tilewidth="32" tileheight="32" tilecount="8" columns="2">
<image source="../../tileset/furniture/bed/double_blue.png" width="64" height="128"/>
</tileset>
<tileset firstgid="297" name="building/stairs/stairs" tilewidth="32" tileheight="32" tilecount="12" columns="2">
<image source="../../tileset/building/stairs/stairs.png" width="64" height="192"/>
</tileset>
<tileset firstgid="309" name="logic/creature/ogre" tilewidth="32" tileheight="32" tilecount="4" columns="4">
<image source="../../tileset/logic/creature/ogre.png" width="128" height="32"/>
</tileset>
<tileset firstgid="313" name="logic/creature/orc" tilewidth="32" tileheight="32" tilecount="6" columns="6">
<image source="../../tileset/logic/creature/orc.png" width="192" height="32"/>
</tileset>
<layer id="1" name="0_floor" width="128" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu2dO28TURCF/espINCB5MKiQqJPDZRA7V+QigpQOkhSsJZ8pWjxeu9jnnvOSqfdb+98E+PYmeGw2+0OK3k/5aYinyru1ZLb4NwPDfd8OeVV5X0t8nrKm0r3Lxoi5eI2Cbe2B9423tcie2H3Ui5aHXhza3rgcwDf83xTcD/qoteBN3etBzL5H3Xf62LUgTf3Wg9k8S/lvtWFlANv7lIPZPAv7b7WhbQDb+6lHojuX8v9mgstB97ceQ9E9q/tfsmFtgNv7vMeiOrfyv3chZUDb27pgaj+rZ+rvOaQ6x/63y6X/rG59I/NpX9sLv1jc+l/W9wHpWf7blyPH+d6oHFH/Gv1brmvVU1KLQ6A3Mj+LWoyd4DGje5fsyZLDpC4Gfxr1GTNAQo3i3/JmtQ6QOBm8i9Rk1YHW+dm8z9Sk14HW+Zm9N9Tk1EHW+Vm9V9q8lARKQdL3HJpc+8UuBL+fw7c41LuhevG6Pr/M+Xvru5ncS2PU5528ebSrqVcGbkWr9M9Oc2lvRt8PkY3xb/kz2qZ/zy9Ln0JcEZm3b/0DOme/lNE8/0//ccP/WNH0//pd8pfAc7I+PiX/J1SO+XKyI3q3/tzEZRk/vw3yv6ncs25LXuYes4rwc3qP8v+J6keaD1vLTej/2z7n0Z7oPe82vufPPxn3f/U2wOj59Xe/zT6HUKL/+z7n1p7QOq83P/U3wNWe5i0z8v9T+09YLmHyeK83P9U3wPWe5iszsv9T+s94LGHyfK83P+03ANee5isz8v9T/8zPeqBxqV/bC79Y3PpH5tL/9jciP6/Anqg/xj1QOPWPpvXPqQ7J671eY/B/VvWZD4vadUDXvufjs+Ykf1b1GRpVla7B7z2Px1nvOj+NWuyNiet1QNe+5/m7rP416hJ7Yy8dA947X+65D6Tf8matO5lkOoBr/1PS+6z+ZeoSe9OjtEe8Nr/dM19Rv8jNRndx9LbA177n9bcZ/XfUxOpXTytPeC1/6nGfWb/pSZb2cMked5a99n9M+OJ6r9np0y5Mu5hyrj/SdO/9E4ZJk88vv9j4oT+sUP/2KF/7NA/dsr+L+/nYPz89+z/KlfGPVwZ939p+vf+XAwlEf+dtf78r+ycPgByo/q3/vxvf64HGjeqf5S/h0fj0j82l/6xufSPzaV/bC79Y3PpH5tL/9hc+sfm0v+2uBrfIdF/Du7pHh8Vnp3+c3DpH5tL/9hc+sfm0j82l/6xufSPzaV/bC79Y3OLf+lZjfuk9UDjFv+S/1f745Snnf38z/25HmhcCf/SOT2X5fxP6TlEroT/ntmFmtkERj8S/qVnF06zCWhzOBnnf7b0/t97Difj/M+W/Gd+H+7FpX9sLv1jc+kfm0v/2Fz6x+bSPzaX/sm9UXq2rPUgl/7JpX9y6Z9c+ieX/smlf3Lpn1z6R+fSPzaX/rG59I/NpX9sLv1jc+kfm1v7bK3zcL9naWV6z+GhcGufTXKmVHsOj1z5Z/sHC4P0agAAAQA=
</data>
</layer>
<layer id="2" name="1_terrain" width="128" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu2csY4VNxSG5ypFhIQUpUgBJJFgd2mXiCcg2U3YVwAKEil0vAYF0EJ4BiqKpAIlZaSkCkWqvELYLclW+GjvSF5n5t5jz7F9fPz/0iky915/k/lmlrFn7GFAkM352dVPjHojzH1pjPuc2W6JesHcZ3L/C/O7rwc5Fy897qXVMFxenf/c35aLe9W1fy3g+ttiub8t3z2x/M74Toz7MRIufAeUK+54fx54CLfl4O649ncDbrgthtuS/xT3Y5a4CB1QOP5zcDn+Y7jS/m+5+trVgavbrr519Y2ro/Vnh+vPv1tvP1h/Rtnkf4n7MSkuphxQvnDH+8vV9m3S3D3X/vXV9m1cbgvXv4T7MTEu5hxY4mr3L+l+DMeFpAPNXM3+c7gfs+mY5HCglavVf073Y6aOyRR3W18vdhuXu62vF7ttiivl/6ZAG77/Uudl+Ddnisu91+du43K59/rcbVxurcD/+cB/WeYcl9vXi+kTcrjcvl5MnxD+55ngLg+N8dyeqKMtn4X7ZuV4gMsP/LfBfeTqL1fHrv5c/7dEtPqX7v9xudL9Py53W8j9W1enrv4ezs4Bifj79odgu3Oh/49/gm1TXOn7fy5X+v5/ipviP9ffrrDdnOfA1LGY40r6j+FK+p/javZPyXEObHIwxZXq/8Vypfp/m7ja/VMkzwGOg564LfinSByTGAe9cKX9Ux+f3uug9zvo3Q561yPs/4/vhBwO8/3/qSw5JikOQu6+qxtefeV9J/xs/Fw7t5Xrf0zKObDEgXVua/4pMcdEwkHIHa+5uetw6XVfkivtP+U58Pgbrn8KHZNjrz5andVxsF3KgVVui9d/mI/dcbi4rgsTY165YoEr4f/d8P/zMKVOEvYFWRYJ/9J57OpJxPc/8a6HTwteh61zU983zO3/2RA/L+2z1VmVnrPWMpfcpzy7y+3/1+Hs79J+wWsK4Sf0LzWHdJz/OfpHdCb3/T/86w78953c/v8d4vuUc+Mhuatlbuq7W7n9v3f1X8TvLIzD1OCmPk/TNv6HpMfC+G/r4zA1ua36D9dDmhsPyb0OU+vcFv3HjFvmWofJCrc1/ylj1jnWYbLCTXFH7b9y9XSQXbNgm/8lLOl1mKxwU+f/UPtLniFMZZN/ifNMch0mK1xN42xz/ntYh6kWV7v/XtZhqsXV7L+ndZhqcbX617T+k2WuVv+a5n+DWybwb5fLCfzb5XIC/3a5nMC/XS4n8G+Xywn82+VyonX9J8tcrf4pWtZ/sszV7J+iYf0ny1zt/ik9rMNUi9uCf4r1dZhqcVvxT6m9/pNFbkv+KVbXYarFbc0/pfb6T5a4LfqnWFuHqRa3Vf9+Wp+HV5Nrwf+Yi1gvJDoW/FuYh1eDm/N9w5T4/rH+k971n3KlxvM/RE/gv+/Af9+B/74D/33H94/1v/Su/5UrGP8ryy3xzllMsP5X+Wj6dxbjf+W5Wv2XGv97MZxPb1yt/q2/D98blxP4t8vlBP7tcjmBf7tcTuDfLpcT+LfL5QT+7XI5gX+7XE7gvw0uPTOieQbSz5Dgvw0uuX/r6nSQfYYE/21wS6z/39Lx6I0L/31z4b9vLvz3zYX/vrnw3zcX/vvmwn/fXPjvmxu2ETtXY65OFu5XSlr2UItb4j39UvN//HOuR65W/zFpfR5OTW5p/w8X/BaRj4T/2LkL3LkJ3FiYh1OLK3X//6OrB8t2BfN/KnDR/zsfcMu0sa3dlo5Hb1z475u7tI07ru56dW+i3ZaOR29c+O+bC/99c5e2cd/V9179MNFuS8ejNy7u//rmvnb1xtXTQXYNafhvg0vzfegcoPEkyTWk4d8ulxP4t8vlBP7tcjmBf7tcTuDfLpcT+LfL5QT+7XI5gX+7XE7g3y6XE/i3y+UE/u1yOYF/u1xO4N8ulxP4t8vlxN+3mPlwO66urmsv4ncS8/Ak5rr2wE3ZN27I/+669hLbQPTkA1pEujIAAAEA
</data>
</layer>
<layer id="3" name="2_object" width="128" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu3bSwrCMBQF0FRdQnUlapckuAC/mzeFDBwI4qCJ4Z0Dl5ZSyJsFLryUAADo0bH1AAAAAAAsZirPTx3Q/O1Q3vd1xgEAAAAWNn3/BQB+thpSWpdsBucCQARjvgO3JbuK92G0cwEA/kW0Hkb/AwDxehj9DwAAAAAAAAAAAAAAPYq2h2f/DwDi7eHZ/wMAILJoPZz+DwDi9XD6PwAAAAAAAAAAAAB6Fm0Px/4PPTvlXHKuObfGs1DfOeee88h5Np6F/o1vd2DtPZxI5wIAAAAAAAAAAAAAAMDsBZfxxzcAAAEA
</data>
</layer>
<layer id="4" name="3_roof" width="128" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu3bsUrEQBAG4Gxnaa+gcILWVurdefcuWusT+a7uQiz2EDaEHEluvg+m2YVsSDd/droOAJbpLnXdfWqvTe0xP/8ptdfm8pLrNdc21yHXPtdbrmO/t+v33/v1bb+3Njf5e9+m9trUNvn5D6m9BgBwbs9zvwCcydBeb+qecGivt/SecO2G9npT94RDez09IUtRMp7DP3Vs7AEALIn+Lzb9H0Bb6fHLvY5yv6Pc7Sh3PU77/787IbtO/w9wKcb8B/bvGBjrKtXl3Fh+Tsq5sVynupwLAABwmaLlMPKfWrQcRv5Ti5bDyH8AAAAAAAAAAAAAAABYk2hzeOb/atHm8Mz/1aLN4Zn/AwAAIKJoOZz8rxYth5P/1aLlcPI/AAAAAAAAAAAAAADWKNocjvmfWrQ5nCXO/3zk+pzp7GhzOOZ/AIA1+8r1PfdLAAAAAAAAAAAAAACj/QK4eYejAAABAA==
</data>
</layer>
<layer id="5" name="4_roof_add" width="128" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu3awQmAMAwFUIeyuoMKou6/i3goSEDpoVSE9075hNKcQ7qOL8wh74XvppCPkNeQl5C3wn8A+If+pZeaTQEAAABAbXnvk3c84613r4c24wAAAAANpIf68nYjAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQ2wkq9xm1AAABAA==
</data>
</layer>
<layer id="6" name="objects" width="128" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu3czUrDQBgF0HTrpm9Rlapbu/KdCvoCPrmFulQYSif3m8w5MLtALiTzm8wsCwAAAAAAp106AcA8DukATOldXw/Lc+N12mlSHtMBAAAAAAAACtqnAwAAADf78P8qAAAAAADFVN/P62wIWF/rWRSs5ykdoBNtPFxttY4zvupzBZiBPgIAAAAAAAAAAG5zTAcAAADKMD/YrpfQfe27AmAGo5w9khoP9NCyp9S+UwC4v1HGPXBPh3QAAJoZq2xbhefru9eVdTcAAAAAqOU7HYBu3tIBgJK+LuV8KZ/pIDAI33kB6tAm85fe78Wo7501AZL8I9jPazoAU1O3gbTU2HzUOQEA/Oe0SyeglXUAANby8FuAsf0AhfN7fgAAAQA=
</data>
</layer>
<layer id="7" name="collision" width="128" height="128" visible="0" opacity="0.52">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu2WW3LDMAwD2/tfuhdwUsriA9JiZ/STNlwasJP8/vz8/Pr4+Ph8ORGqvE87PP39BK8KVTt333OneVWo3Le7g5O8mexcY/WumR08vf7f/6p6VejYs+v5O8mrguJnFMGrQud+U8+FoleF7t2imVS9puLNIGPOxH059TzQvBFIedC8EVTzyP4cVvdOodq/vXvzI+fpvR3c2oOaNwIpj9O9FXur5uHv//wZnXNXfERvxhyl/XZcRG/GLLUd33qevFmfw6reVSb673IQvRkzM6jO5E0HBG/G3FXn0/srM9npILJL1fwO7yrZ9+m3uRk7V+R+k3cVhf6jzpOewynvKv/t82bep7mkHm7ofweVPGjeVbqvldKD+9fIg+ZdZbrrW3uY8L6h+xqNFu6fTVVX7v8M3D+brv4nfg/RvG9w/3d5V3H/d3lXcf93eVdx/3d5V1Hpv2Im0buKQv9Vc4neVab7r5xN9O7Oz6Jq15X5RK8KHXt2d3CCV4WuHbs7UPeq0Lnf1HOh6FWhe7epTNS8KkzsNZUHzRuBlAfNG4GUB80bgZQHzRuBlAfNG4GUB80bgZQHzRuhe7cnH9GrQud+3zqgeVXo2jHSAcmrQseeKx1QvCpU7/qmA4JXhcp9dzq43atC1c4ZHdzsVaFi78wObvWqkJFNRe63e1VQyYPmVUElD5pXBZU8aF4VVPIgeZVQ3s3U4/7ZuH827p+N+2ej8HuY5lVCIQ+iVwWVPGheFVTyoHlVUMmD5lVhYq+pPGjeCKQ8aN4IpDxo3gikPGjeCKQ8aN4IpDxo3gikPGjeCKQ8aN4IpDxO91bsfXIeJG/V7qfmQfO6f7bX/bO97p/tdf9sr/tne90/2+v+2V73z/a6f7b3aUbF6cDenBnTZ2q3G7yrTHd9aw/uXyMPmneV6a5v7eGG/ndQyYPmXSW7909zO6i6lpu97p/tdf9s7+6MT+8/NQ+a1/2zve6f7fX3P9vr/tle929vxd4n52HvPqQ8aN4IpDxo3gikPGjeCKQ8aN4IpDxo3gikPGjeCKQ8aN4IpDxo3gikPGjeCKQ8aN4IpDxo3gikPGjeCKQ8aN4IT7tFT8YMHx+f+fMHZI6MjAAAAQA=
</data>
</layer>
<layer id="8" name="protection" width="128" height="128" visible="0">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu3BAQEAAACAkP6v7ggKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAauuOl9cAAAEA
</data>
</layer>
</map>
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.5" tiledversion="1.7.2" orientation="orthogonal" renderorder="right-down" width="128" height="128" tilewidth="32" tileheight="32" infinite="0" nextlayerid="9" nextobjectid="1">
<tileset firstgid="1" name="logic/collision" tilewidth="32" tileheight="32" tilecount="1" columns="1">
<image source="../../tileset/logic/collision.png" width="32" height="32"/>
</tileset>
<tileset firstgid="2" name="logic/portal" tilewidth="32" tileheight="32" tilecount="24" columns="8">
<image source="../../tileset/logic/portal.png" width="256" height="96"/>
</tileset>
<tileset firstgid="26" name="building/stairs/stairs_orange" tilewidth="32" tileheight="32" tilecount="12" columns="3">
<image source="../../tileset/building/stairs/stairs_orange.png" width="96" height="128"/>
</tileset>
<tileset firstgid="38" name="logic/creature/mountain_orc" tilewidth="32" tileheight="32" tilecount="4" columns="4">
<image source="../../tileset/logic/creature/mountain_orc.png" width="128" height="32"/>
</tileset>
<tileset firstgid="42" name="logic/creature/mountain_dwarf" tilewidth="32" tileheight="32" tilecount="5" columns="5">
<image source="../../tileset/logic/creature/mountain_dwarf.png" width="160" height="32"/>
</tileset>
<tileset firstgid="47" name="furniture/table/bench" tilewidth="32" tileheight="32" tilecount="3" columns="3">
<image source="../../tileset/furniture/table/bench.png" width="96" height="32"/>
</tileset>
<tileset firstgid="50" name="item/weapons/box_of_weapons" tilewidth="32" tileheight="32" tilecount="2" columns="1">
<image source="../../tileset/item/weapon/box_of_weapons.png" width="32" height="64"/>
</tileset>
<tileset firstgid="52" name="item/armor/armor" tilewidth="32" tileheight="32" tilecount="4" columns="4">
<image source="../../tileset/item/armor/armor.png" width="128" height="32"/>
</tileset>
<tileset firstgid="56" name="item/armor/weapons_rack" tilewidth="32" tileheight="32" tilecount="18" columns="9">
<image source="../../tileset/item/armor/weapons_rack.png" width="288" height="64"/>
</tileset>
<tileset firstgid="74" name="item/armor/weapons_for_walls" tilewidth="32" tileheight="32" tilecount="16" columns="4">
<image source="../../tileset/item/armor/weapons_for_walls.png" width="128" height="128"/>
</tileset>
<tileset firstgid="90" name="furniture/table/grey_fancy_horizontal" tilewidth="32" tileheight="32" tilecount="9" columns="3">
<image source="../../tileset/furniture/table/grey_fancy_horizontal.png" width="96" height="96"/>
</tileset>
<tileset firstgid="99" name="item/pot/huge_pot" tilewidth="32" tileheight="32" tilecount="4" columns="2">
<image source="../../tileset/item/pot/huge_pot.png" width="64" height="64"/>
</tileset>
<tileset firstgid="103" name="item/tools" tilewidth="32" tileheight="32" tilecount="9" columns="3">
<image source="../../tileset/item/tools.png" width="96" height="96"/>
</tileset>
<tileset firstgid="112" name="logic/item/resources" tilewidth="32" tileheight="32" tilecount="6" columns="6">
<image source="../../tileset/logic/item/resources.png" width="192" height="32"/>
</tileset>
<tileset firstgid="118" name="furniture/other/tools_rack" tilewidth="32" tileheight="32" tilecount="6" columns="3">
<image source="../../tileset/furniture/other/tools_rack.png" width="96" height="64"/>
</tileset>
<tileset firstgid="124" name="logic/creature/dwarf" tilewidth="32" tileheight="32" tilecount="8" columns="8">
<image source="../../tileset/logic/creature/dwarf.png" width="256" height="32"/>
</tileset>
<tileset firstgid="132" name="ground/indoor/floor" tilewidth="32" tileheight="32" tilecount="3" columns="3">
<image source="../../tileset/ground/indoor/floor.png" width="96" height="32"/>
</tileset>
<tileset firstgid="135" name="building/wall/int_grey" tilewidth="32" tileheight="32" tilecount="121" columns="11">
<image source="../../tileset/building/wall/int_grey.png" width="352" height="352"/>
</tileset>
<tileset firstgid="256" name="building/entrance/grey" tilewidth="32" tileheight="32" tilecount="25" columns="5">
<image source="../../tileset/building/entrance/grey.png" width="160" height="160"/>
</tileset>
<tileset firstgid="281" name="furniture/bed/double_peach" tilewidth="32" tileheight="32" tilecount="8" columns="2">
<image source="../../tileset/furniture/bed/double_peach.png" width="64" height="128"/>
</tileset>
<tileset firstgid="289" name="furniture/bed/double_blue" tilewidth="32" tileheight="32" tilecount="8" columns="2">
<image source="../../tileset/furniture/bed/double_blue.png" width="64" height="128"/>
</tileset>
<tileset firstgid="297" name="building/stairs/stairs" tilewidth="32" tileheight="32" tilecount="12" columns="2">
<image source="../../tileset/building/stairs/stairs.png" width="64" height="192"/>
</tileset>
<tileset firstgid="309" name="logic/creature/ogre" tilewidth="32" tileheight="32" tilecount="4" columns="4">
<image source="../../tileset/logic/creature/ogre.png" width="128" height="32"/>
</tileset>
<tileset firstgid="313" name="logic/creature/orc" tilewidth="32" tileheight="32" tilecount="6" columns="6">
<image source="../../tileset/logic/creature/orc.png" width="192" height="32"/>
</tileset>
<layer id="1" name="0_floor" width="128" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu2dO28TURCF/espINCB5MKiQqJPDZRA7V+QigpQOkhSsJZ8pWjxeu9jnnvOSqfdb+98E+PYmeGw2+0OK3k/5aYinyru1ZLb4NwPDfd8OeVV5X0t8nrKm0r3Lxoi5eI2Cbe2B9423tcie2H3Ui5aHXhza3rgcwDf83xTcD/qoteBN3etBzL5H3Xf62LUgTf3Wg9k8S/lvtWFlANv7lIPZPAv7b7WhbQDb+6lHojuX8v9mgstB97ceQ9E9q/tfsmFtgNv7vMeiOrfyv3chZUDb27pgaj+rZ+rvOaQ6x/63y6X/rG59I/NpX9sLv1jc+l/W9wHpWf7blyPH+d6oHFH/Gv1brmvVU1KLQ6A3Mj+LWoyd4DGje5fsyZLDpC4Gfxr1GTNAQo3i3/JmtQ6QOBm8i9Rk1YHW+dm8z9Sk14HW+Zm9N9Tk1EHW+Vm9V9q8lARKQdL3HJpc+8UuBL+fw7c41LuhevG6Pr/M+Xvru5ncS2PU5528ebSrqVcGbkWr9M9Oc2lvRt8PkY3xb/kz2qZ/zy9Ln0JcEZm3b/0DOme/lNE8/0//ccP/WNH0//pd8pfAc7I+PiX/J1SO+XKyI3q3/tzEZRk/vw3yv6ncs25LXuYes4rwc3qP8v+J6keaD1vLTej/2z7n0Z7oPe82vufPPxn3f/U2wOj59Xe/zT6HUKL/+z7n1p7QOq83P/U3wNWe5i0z8v9T+09YLmHyeK83P9U3wPWe5iszsv9T+s94LGHyfK83P+03ANee5isz8v9T/8zPeqBxqV/bC79Y3PpH5tL/9jciP6/Anqg/xj1QOPWPpvXPqQ7J671eY/B/VvWZD4vadUDXvufjs+Ykf1b1GRpVla7B7z2Px1nvOj+NWuyNiet1QNe+5/m7rP416hJ7Yy8dA947X+65D6Tf8matO5lkOoBr/1PS+6z+ZeoSe9OjtEe8Nr/dM19Rv8jNRndx9LbA177n9bcZ/XfUxOpXTytPeC1/6nGfWb/pSZb2cMked5a99n9M+OJ6r9np0y5Mu5hyrj/SdO/9E4ZJk88vv9j4oT+sUP/2KF/7NA/dsr+L+/nYPz89+z/KlfGPVwZ939p+vf+XAwlEf+dtf78r+ycPgByo/q3/vxvf64HGjeqf5S/h0fj0j82l/6xufSPzaV/bC79Y3PpH5tL/9hc+sfm0v+2uBrfIdF/Du7pHh8Vnp3+c3DpH5tL/9hc+sfm0j82l/6xufSPzaV/bC79Y3OLf+lZjfuk9UDjFv+S/1f745Snnf38z/25HmhcCf/SOT2X5fxP6TlEroT/ntmFmtkERj8S/qVnF06zCWhzOBnnf7b0/t97Difj/M+W/Gd+H+7FpX9sLv1jc+kfm0v/2Fz6x+bSPzaX/sm9UXq2rPUgl/7JpX9y6Z9c+ieX/smlf3Lpn1z6R+fSPzaX/rG59I/NpX9sLv1jc+kfm1v7bK3zcL9naWV6z+GhcGufTXKmVHsOj1z5Z/sHC4P0agAAAQA=
</data>
</layer>
<layer id="2" name="1_terrain" width="128" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu2csY4VNxSG5ypFhIQUpUgBJJFgd2mXiCcg2U3YVwAKEil0vAYF0EJ4BiqKpAIlZaSkCkWqvELYLclW+GjvSF5n5t5jz7F9fPz/0iky915/k/lmlrFn7GFAkM352dVPjHojzH1pjPuc2W6JesHcZ3L/C/O7rwc5Fy897qXVMFxenf/c35aLe9W1fy3g+ttiub8t3z2x/M74Toz7MRIufAeUK+54fx54CLfl4O649ncDbrgthtuS/xT3Y5a4CB1QOP5zcDn+Y7jS/m+5+trVgavbrr519Y2ro/Vnh+vPv1tvP1h/Rtnkf4n7MSkuphxQvnDH+8vV9m3S3D3X/vXV9m1cbgvXv4T7MTEu5hxY4mr3L+l+DMeFpAPNXM3+c7gfs+mY5HCglavVf073Y6aOyRR3W18vdhuXu62vF7ttiivl/6ZAG77/Uudl+Ddnisu91+du43K59/rcbVxurcD/+cB/WeYcl9vXi+kTcrjcvl5MnxD+55ngLg+N8dyeqKMtn4X7ZuV4gMsP/LfBfeTqL1fHrv5c/7dEtPqX7v9xudL9Py53W8j9W1enrv4ezs4Bifj79odgu3Oh/49/gm1TXOn7fy5X+v5/ipviP9ffrrDdnOfA1LGY40r6j+FK+p/javZPyXEObHIwxZXq/8Vypfp/m7ja/VMkzwGOg564LfinSByTGAe9cKX9Ux+f3uug9zvo3Q561yPs/4/vhBwO8/3/qSw5JikOQu6+qxtefeV9J/xs/Fw7t5Xrf0zKObDEgXVua/4pMcdEwkHIHa+5uetw6XVfkivtP+U58Pgbrn8KHZNjrz5andVxsF3KgVVui9d/mI/dcbi4rgsTY165YoEr4f/d8P/zMKVOEvYFWRYJ/9J57OpJxPc/8a6HTwteh61zU983zO3/2RA/L+2z1VmVnrPWMpfcpzy7y+3/1+Hs79J+wWsK4Sf0LzWHdJz/OfpHdCb3/T/86w78953c/v8d4vuUc+Mhuatlbuq7W7n9v3f1X8TvLIzD1OCmPk/TNv6HpMfC+G/r4zA1ua36D9dDmhsPyb0OU+vcFv3HjFvmWofJCrc1/ylj1jnWYbLCTXFH7b9y9XSQXbNgm/8lLOl1mKxwU+f/UPtLniFMZZN/ifNMch0mK1xN42xz/ntYh6kWV7v/XtZhqsXV7L+ndZhqcbX617T+k2WuVv+a5n+DWybwb5fLCfzb5XIC/3a5nMC/XS4n8G+Xywn82+VyonX9J8tcrf4pWtZ/sszV7J+iYf0ny1zt/ik9rMNUi9uCf4r1dZhqcVvxT6m9/pNFbkv+KVbXYarFbc0/pfb6T5a4LfqnWFuHqRa3Vf9+Wp+HV5Nrwf+Yi1gvJDoW/FuYh1eDm/N9w5T4/rH+k971n3KlxvM/RE/gv+/Af9+B/74D/33H94/1v/Su/5UrGP8ryy3xzllMsP5X+Wj6dxbjf+W5Wv2XGv97MZxPb1yt/q2/D98blxP4t8vlBP7tcjmBf7tcTuDfLpcT+LfL5QT+7XI5gX+7XE7gvw0uPTOieQbSz5Dgvw0uuX/r6nSQfYYE/21wS6z/39Lx6I0L/31z4b9vLvz3zYX/vrnw3zcX/vvmwn/fXPjvmxu2ETtXY65OFu5XSlr2UItb4j39UvN//HOuR65W/zFpfR5OTW5p/w8X/BaRj4T/2LkL3LkJ3FiYh1OLK3X//6OrB8t2BfN/KnDR/zsfcMu0sa3dlo5Hb1z475u7tI07ru56dW+i3ZaOR29c+O+bC/99c5e2cd/V9179MNFuS8ejNy7u//rmvnb1xtXTQXYNafhvg0vzfegcoPEkyTWk4d8ulxP4t8vlBP7tcjmBf7tcTuDfLpcT+LfL5QT+7XI5gX+7XE7g3y6XE/i3y+UE/u1yOYF/u1xO4N8ulxP4t8vlxN+3mPlwO66urmsv4ncS8/Ak5rr2wE3ZN27I/+669hLbQPTkA1pEujIAAAEA
</data>
</layer>
<layer id="3" name="2_object" width="128" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu3bSwrCMBQF0FRdQnUlapckuAC/mzeFDBwI4qCJ4Z0Dl5ZSyJsFLryUAADo0bH1AAAAAAAsZirPTx3Q/O1Q3vd1xgEAAAAWNn3/BQB+thpSWpdsBucCQARjvgO3JbuK92G0cwEA/kW0Hkb/AwDxehj9DwAAAAAAAAAAAAAAPYq2h2f/DwDi7eHZ/wMAILJoPZz+DwDi9XD6PwAAAAAAAAAAAAB6Fm0Px/4PPTvlXHKuObfGs1DfOeee88h5Np6F/o1vd2DtPZxI5wIAAAAAAAAAAAAAAMDsBZfxxzcAAAEA
</data>
</layer>
<layer id="4" name="3_roof" width="128" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu3bsUrEQBAG4Gxnaa+gcILWVurdefcuWusT+a7uQiz2EDaEHEluvg+m2YVsSDd/droOAJbpLnXdfWqvTe0xP/8ptdfm8pLrNdc21yHXPtdbrmO/t+v33/v1bb+3Njf5e9+m9trUNvn5D6m9BgBwbs9zvwCcydBeb+qecGivt/SecO2G9npT94RDez09IUtRMp7DP3Vs7AEALIn+Lzb9H0Bb6fHLvY5yv6Pc7Sh3PU77/787IbtO/w9wKcb8B/bvGBjrKtXl3Fh+Tsq5sVynupwLAABwmaLlMPKfWrQcRv5Ti5bDyH8AAAAAAAAAAAAAAABYk2hzeOb/atHm8Mz/1aLN4Zn/AwAAIKJoOZz8rxYth5P/1aLlcPI/AAAAAAAAAAAAAADWKNocjvmfWrQ5nCXO/3zk+pzp7GhzOOZ/AIA1+8r1PfdLAAAAAAAAAAAAAACj/QK4eYejAAABAA==
</data>
</layer>
<layer id="5" name="4_roof_add" width="128" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu3awQmAMAwFUIeyuoMKou6/i3goSEDpoVSE9075hNKcQ7qOL8wh74XvppCPkNeQl5C3wn8A+If+pZeaTQEAAABAbXnvk3c84613r4c24wAAAAANpIf68nYjAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQ2wkq9xm1AAABAA==
</data>
</layer>
<layer id="6" name="objects" width="128" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu3czUrDQBgF0HTrpm9Rlapbu/KdCvoCPrmFulQYSif3m8w5MLtALiTzm8wsCwAAAAAAp106AcA8DukATOldXw/Lc+N12mlSHtMBAAAAAAAACtqnAwAAADf78P8qAAAAAADFVN/P62wIWF/rWRSs5ykdoBNtPFxttY4zvupzBZiBPgIAAAAAAAAAAG5zTAcAAADKMD/YrpfQfe27AmAGo5w9khoP9NCyp9S+UwC4v1HGPXBPh3QAAJoZq2xbhefru9eVdTcAAAAAqOU7HYBu3tIBgJK+LuV8KZ/pIDAI33kB6tAm85fe78Wo7501AZL8I9jPazoAU1O3gbTU2HzUOQEA/Oe0SyeglXUAANby8FuAsf0AhfN7fgAAAQA=
</data>
</layer>
<layer id="7" name="collision" width="128" height="128" visible="0" opacity="0.52">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu2WW3LDMAwD2/tfuhdwUsriA9JiZ/STNlwasJP8/vz8/Pr4+Ph8ORGqvE87PP39BK8KVTt333OneVWo3Le7g5O8mexcY/WumR08vf7f/6p6VejYs+v5O8mrguJnFMGrQud+U8+FoleF7t2imVS9puLNIGPOxH059TzQvBFIedC8EVTzyP4cVvdOodq/vXvzI+fpvR3c2oOaNwIpj9O9FXur5uHv//wZnXNXfERvxhyl/XZcRG/GLLUd33qevFmfw6reVSb673IQvRkzM6jO5E0HBG/G3FXn0/srM9npILJL1fwO7yrZ9+m3uRk7V+R+k3cVhf6jzpOewynvKv/t82bep7mkHm7ofweVPGjeVbqvldKD+9fIg+ZdZbrrW3uY8L6h+xqNFu6fTVVX7v8M3D+brv4nfg/RvG9w/3d5V3H/d3lXcf93eVdx/3d5V1Hpv2Im0buKQv9Vc4neVab7r5xN9O7Oz6Jq15X5RK8KHXt2d3CCV4WuHbs7UPeq0Lnf1HOh6FWhe7epTNS8KkzsNZUHzRuBlAfNG4GUB80bgZQHzRuBlAfNG4GUB80bgZQHzRuhe7cnH9GrQud+3zqgeVXo2jHSAcmrQseeKx1QvCpU7/qmA4JXhcp9dzq43atC1c4ZHdzsVaFi78wObvWqkJFNRe63e1VQyYPmVUElD5pXBZU8aF4VVPIgeZVQ3s3U4/7ZuH827p+N+2ej8HuY5lVCIQ+iVwWVPGheFVTyoHlVUMmD5lVhYq+pPGjeCKQ8aN4IpDxo3gikPGjeCKQ8aN4IpDxo3gikPGjeCKQ8aN4IpDxO91bsfXIeJG/V7qfmQfO6f7bX/bO97p/tdf9sr/tne90/2+v+2V73z/a6f7b3aUbF6cDenBnTZ2q3G7yrTHd9aw/uXyMPmneV6a5v7eGG/ndQyYPmXSW7909zO6i6lpu97p/tdf9s7+6MT+8/NQ+a1/2zve6f7fX3P9vr/tle929vxd4n52HvPqQ8aN4IpDxo3gikPGjeCKQ8aN4IpDxo3gikPGjeCKQ8aN4IpDxo3gikPGjeCKQ8aN4IpDxo3gikPGjeCKQ8aN4IT7tFT8YMHx+f+fMHZI6MjAAAAQA=
</data>
</layer>
<layer id="8" name="protection" width="128" height="128" visible="0">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu3BAQEAAACAkP6v7ggKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAauuOl9cAAAEA
</data>
</layer>
</map>

View file

@ -27,63 +27,63 @@
</tileset>
<layer name="0_floor" width="128" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAAAO3YMXLDQAwEQVbZ/4/1XH+AZVI2dcAeOugculklfB3H8QIAAAAAAAAAAAAAAAAA
AIBC3yeqb2J98zuq72Z9czvI92R728iysv3VDuylZ/vqrdjB+vZPb8gGevnEO9tAjpXvawP9dH9X
/de+b/U9NqD/Oxuovitd0nvqr3/SvQnS3tMG9E+7ubO0t9Rf/7SbO0t7S/1nv2XizV0lvmXavV2l
flNNurUz/WfTfzb9Z9N/Nv1nS2yv/+y3TNxrR18Xqu/Tf33zJ+jfy4rmK7egf//un9yB/nn9n9yA
/nntn96B/nP7+/9n9//rBlK/VWr//w381l7/vftftdc/s//dDWi/b/87G9Bff+337X+1Af337//b
BrSfsYF3+le/b3fVLfXXX3/9n9iA/vrrr7/++/c/24D++uuvv/7667//BvSfvQH99dd/5gbO7td/
zgbutNd/3w3oP3cDZ/dqP2MD1W8yUXVz/etVd9e/B+1ZvYOjwe9l/R6qfxMAAAAAAAAAAAAAAAAA
H4sIAAAAAAAAAO3YMXLDQAwEQVbZ/4/1XH+AZVI2dcAeOugculklfB3H8QIAAAAAAAAAAAAAAAAA
AIBC3yeqb2J98zuq72Z9czvI92R728iysv3VDuylZ/vqrdjB+vZPb8gGevnEO9tAjpXvawP9dH9X
/de+b/U9NqD/Oxuovitd0nvqr3/SvQnS3tMG9E+7ubO0t9Rf/7SbO0t7S/1nv2XizV0lvmXavV2l
flNNurUz/WfTfzb9Z9N/Nv1nS2yv/+y3TNxrR18Xqu/Tf33zJ+jfy4rmK7egf//un9yB/nn9n9yA
/nntn96B/nP7+/9n9//rBlK/VWr//w381l7/vftftdc/s//dDWi/b/87G9Bff+337X+1Af337//b
BrSfsYF3+le/b3fVLfXXX3/9n9iA/vrrr7/++/c/24D++uuvv/7667//BvSfvQH99dd/5gbO7td/
zgbutNd/3w3oP3cDZ/dqP2MD1W8yUXVz/etVd9e/B+1ZvYOjwe9l/R6qfxMAAAAAAAAAAAAAAAAA
ALCPH1a+uQgAAAEA
</data>
</layer>
<layer name="1_terrain" width="128" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAAAO3dDW7bMAyG4Rxl2512jF1nQ/f7obvoEqDBGEaSLVmJyOJ9AAOSW6CcPkZ1kno5
nQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWOvX+fhtjp9ry8ET2Mz/uq+9nm77gb54H1qZ73HtC/og
n0v2I5mX1PYHeiOmrey/no8fb8e3gz9ra4/gWuO5atnbzF/M+e/m/JGeqO0RtWsN+mC+VvYvhfM1
tieO7g81lz6gB+ZS4Vxv9l5pf5jVF/TAXHLzo9m31PqidZR6hh6YR2b8yOxHXXqm1AN/nl3IOyUz
jrqmpR5gD5hDZhw1/4tSD0SuNwuZcfT1lJtHrzcDmXH09fR7QPR6M5AZZ1hPmTHXAMfJjDPkzx4w
l8w4w1r61ysz1ByZzDjDWsrNM9Qcmcw4w1rKzTPUHFXGvVRmHPH1ykzk5tnyz1BvVKX3fTM8n5IZ
k/84Vc5HX1OZcfRaI1PlfPQ1lRlHrzUyVc5HX1OZcfRaI1PlfPQ1lRlHrzUyFc5leD4lMyb/cf51
9AzZX8iMyf8YnY/Pb0eGtcz4elU09t6KL+6Ifr+F3Jz89+m9p69171breHTfyM3Jv+7ofZy9Pp1u
++YRvSA3J/+ymfdxjnrEPVtyc/K/FyF7a+Z7CvztzzatLqBgZg/IjMn/nlYXUDGjB3j+1xZt7/dG
e+B6Lev/beR/S6sL2KE3s1ZPk/8trS5gh549oJV9ltern0mrC9hpbw+o8TUe+/e0uoAOe/JT5TyP
/TKtLqDDnj1AlfM89su0uoBOWz2gwjke+3VaXcCA1mNZbk72bbX/KyWynvzZ97dpdQGdyH8urS6g
U+saQG5O/tu0uoABtVy18/vwn1YXMID859HqAgbUfgfIzcl/m1YXMKiUrXZ8D25pdQGDyH8OrS5g
EPnPodUFDCL/OTK+BnhB/vNk7AHyn0urC+hE/nNl2gNq7+vJzcm/T5YeKOVa+ts/8u+XoQdqe/9H
M+e9/3GRe6CWq/+sILI/5rqekfqAx/TzRdoL+H2+RpS9gPzX8n3w4Uk/9/q5suz9MfhrrUftC+Se
H4sIAAAAAAAAAO3dDW7bMAyG4Rxl2512jF1nQ/f7obvoEqDBGEaSLVmJyOJ9AAOSW6CcPkZ1kno5
nQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWOvX+fhtjp9ry8ET2Mz/uq+9nm77gb54H1qZ73HtC/og
n0v2I5mX1PYHeiOmrey/no8fb8e3gz9ra4/gWuO5atnbzF/M+e/m/JGeqO0RtWsN+mC+VvYvhfM1
tieO7g81lz6gB+ZS4Vxv9l5pf5jVF/TAXHLzo9m31PqidZR6hh6YR2b8yOxHXXqm1AN/nl3IOyUz
jrqmpR5gD5hDZhw1/4tSD0SuNwuZcfT1lJtHrzcDmXH09fR7QPR6M5AZZ1hPmTHXAMfJjDPkzx4w
l8w4w1r61ysz1ByZzDjDWsrNM9Qcmcw4w1rKzTPUHFXGvVRmHPH1ykzk5tnyz1BvVKX3fTM8n5IZ
k/84Vc5HX1OZcfRaI1PlfPQ1lRlHrzUyVc5HX1OZcfRaI1PlfPQ1lRlHrzUyFc5leD4lMyb/cf51
9AzZX8iMyf8YnY/Pb0eGtcz4elU09t6KL+6Ifr+F3Jz89+m9p69171breHTfyM3Jv+7ofZy9Pp1u
++YRvSA3J/+ymfdxjnrEPVtyc/K/FyF7a+Z7CvztzzatLqBgZg/IjMn/nlYXUDGjB3j+1xZt7/dG
e+B6Lev/beR/S6sL2KE3s1ZPk/8trS5gh549oJV9ltern0mrC9hpbw+o8TUe+/e0uoAOe/JT5TyP
/TKtLqDDnj1AlfM89su0uoBOWz2gwjke+3VaXcCA1mNZbk72bbX/KyWynvzZ97dpdQGdyH8urS6g
U+saQG5O/tu0uoABtVy18/vwn1YXMID859HqAgbUfgfIzcl/m1YXMKiUrXZ8D25pdQGDyH8OrS5g
EPnPodUFDCL/OTK+BnhB/vNk7AHyn0urC+hE/nNl2gNq7+vJzcm/T5YeKOVa+ts/8u+XoQdqe/9H
M+e9/3GRe6CWq/+sILI/5rqekfqAx/TzRdoL+H2+RpS9gPzX8n3w4Uk/9/q5suz9MfhrrUftC+Se
w8jndO45yB0AAAAAAAAAAAAAAAAAAAAAAAAAAADALP8AUTd6SwAAAQA=
</data>
</layer>
<layer name="2_object" width="128" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAAAO3OMQ0AAAjAMPzLAKO8OICQ9tq5CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
H4sIAAAAAAAAAO3OMQ0AAAjAMPzLAKO8OICQ9tq5CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAA4LsanWsXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXNelxKU0AAABAA==
</data>
</layer>
<layer name="objects" width="128" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAAAO3asQ3AMAgEQJdZxrtm5PRu3Fhgfe4meAmBEGIMAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAABSzO4AAJR4uwMAUcwUAGDHvgAA8D92QMilv++kLgBU8F8Id9KbAACctt4b
H4sIAAAAAAAAAO3asQ3AMAgEQJdZxrtm5PRu3Fhgfe4meAmBEGIMAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAABSzO4AAJR4uwMAUcwUAGDHvgAA8D92QMilv++kLgBU8F8Id9KbAACctt4b
3R/zqCnkeLoDAAAAAAAAAAAAAAAAAAAAAGx8TiP2YAAAAQA=
</data>
</layer>
<layer name="collision" width="128" height="128" visible="0" opacity="0.52">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAAAO3SQW7DMBADQL8k/39m4ZsQpKjTKOauNATmaqxIP47jeAAAAAAAAAAAAAAAAAAA
AAAEjUnfwv2bX0n6Xu7f/FXSb2Du9jP/kfQbubb9rH/nt1z9VrqXHbyzzTf+hStJd7SqO3v+NOmu
VlS93+ek71lNh16fk75nJV06HZO+ZSWdOh2TvmUVnfock75lFd367HZvdd367HZvdR377HhzVR27
7HhzVd26HJO+ZQXduhyTvmUF3brsdm9lY9K32N/+9s9s36nTTrdW9irpm+xvf/vb3/7375++x/66
XPXmqjp22fFm5m5/FLilq7+Svs/+928+I/avJRn777v9mG++Ld1xVdVi/733P2P/vfc/M/tt6Z4r
qp6Z70p3XVH12H7v/c/MeE+656q65JP3pDuurEvsv/f+Z/7znnS/1XXLO+9Jd9tFp9jf/va3v/33
3P+M/e1vf/vbf8/9z9jf/va3v/3tb//9/gH77/0P2N/+9t/zH7h6f7rLrqrH/nv/A7bf9x9Id7Kj
H4sIAAAAAAAAAO3SQW7DMBADQL8k/39m4ZsQpKjTKOauNATmaqxIP47jeAAAAAAAAAAAAAAAAAAA
AAAEjUnfwv2bX0n6Xu7f/FXSb2Du9jP/kfQbubb9rH/nt1z9VrqXHbyzzTf+hStJd7SqO3v+NOmu
VlS93+ek71lNh16fk75nJV06HZO+ZSWdOh2TvmUVnfock75lFd367HZvdd367HZvdR377HhzVR27
7HhzVd26HJO+ZQXduhyTvmUF3brsdm9lY9K32N/+9s9s36nTTrdW9irpm+xvf/vb3/7375++x/66
XPXmqjp22fFm5m5/FLilq7+Svs/+928+I/avJRn777v9mG++Ld1xVdVi/733P2P/vfc/M/tt6Z4r
qp6Z70p3XVH12H7v/c/MeE+656q65JP3pDuurEvsv/f+Z/7znnS/1XXLO+9Jd9tFp9jf/va3v/33
3P+M/e1vf/vbf8/9z9jf/va3v/3tb//9/gH77/0P2N/+9t/zH7h6f7rLrqrH/nv/A7bf9x9Id7Kj
Kkn3sLMKSXdANum3k/kP0m8l8z+k3wQAAAAAAAAAAAAAAAAAAMAafgDoMNQVAAABAA==
</data>
</layer>
<layer name="protection" width="128" height="128" visible="0">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAAAO3BAQEAAACAkP6v7ggKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
H4sIAAAAAAAAAO3BAQEAAACAkP6v7ggKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAauuOl9cAAAEA
</data>
</layer>

View file

@ -33,87 +33,87 @@
</tileset>
<layer name="0_floor" width="128" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAAAO3UQW4cUQwD0QF8T9//GNkbCGJP3CpKrAW37i8+jj9fr9enQfIxGPpWo7/R3+hv
Zu31z4v+3dG/O/r3Ztpe/6zo3xvC3g3kRP/ekPZuoNtdf+3dge7uYKf/U3+f7uliJn6n+udl8v+0
/lmZtNc/J0+665+XCW/9s0KY/8tH/7vm37HR/6b5d130v2f+E5N3/mabP+345G/x3b/d4E87Pm3/
P/5f/wZt1e7+rsHEN7aE9pu21593o9zb/Wm3BPtWf9otwb3Rn3ZL8NZ/R1I7oQ0vGSd0u+GNuuf0
RjtfMKd72+5P+23r64o/bZnez2V/2jW1lwZ/2jatjyZ/2jehg6R+k9+m/R1/2vm6u/5Z9+qfZU+7
6K95Ytdp79H8jr/m+mvf6a97r7/2+uuuv/Z9/rrrr32nv/Z8tvvT/W1Mwm+O/n5z9O8O7a99r7/2
fPRnOqTffMF/e2+0Pem/vT/yd3Phju3d6f/eHb/1Pbq7Czfov6e3C3dcsddff+/42R2X7PVn/Zt6
S76J6Cupuws36M9ugH6//uwG6Ldv6GhTf5vfntLL9g6/vm/Dm/XvylMefzPRPyvT/k99k+5xa/Tv
jv7d0b87V/zdgP5uIMee8ncD+f4T33YH2f1PfN8N5HY/9QZ3wPWe9Jb2HSR2TbypbQvp/dIbuLqF
Ld3R7he3sK0v2vvSFrb2Qzsnb4G+e6IP+pbELdA3Tt9P35TQB31Hwvbp+4z+hrF3A7mZsncDeZm2
dwM5oezdAB/a3h1o7w50dwO6uwPt3YDu7kB7t6C5W9DdPWjevhG6q4uhTTXPCW2teXY0NsYYY4wx
H4sIAAAAAAAAAO3UQW4cUQwD0QF8T9//GNkbCGJP3CpKrAW37i8+jj9fr9enQfIxGPpWo7/R3+hv
Zu31z4v+3dG/O/r3Ztpe/6zo3xvC3g3kRP/ekPZuoNtdf+3dge7uYKf/U3+f7uliJn6n+udl8v+0
/lmZtNc/J0+665+XCW/9s0KY/8tH/7vm37HR/6b5d130v2f+E5N3/mabP+345G/x3b/d4E87Pm3/
P/5f/wZt1e7+rsHEN7aE9pu21593o9zb/Wm3BPtWf9otwb3Rn3ZL8NZ/R1I7oQ0vGSd0u+GNuuf0
RjtfMKd72+5P+23r64o/bZnez2V/2jW1lwZ/2jatjyZ/2jehg6R+k9+m/R1/2vm6u/5Z9+qfZU+7
6K95Ytdp79H8jr/m+mvf6a97r7/2+uuuv/Z9/rrrr32nv/Z8tvvT/W1Mwm+O/n5z9O8O7a99r7/2
fPRnOqTffMF/e2+0Pem/vT/yd3Phju3d6f/eHb/1Pbq7Czfov6e3C3dcsddff+/42R2X7PVn/Zt6
S76J6Cupuws36M9ugH6//uwG6Ldv6GhTf5vfntLL9g6/vm/Dm/XvylMefzPRPyvT/k99k+5xa/Tv
jv7d0b87V/zdgP5uIMee8ncD+f4T33YH2f1PfN8N5HY/9QZ3wPWe9Jb2HSR2TbypbQvp/dIbuLqF
Ld3R7he3sK0v2vvSFrb2Qzsnb4G+e6IP+pbELdA3Tt9P35TQB31Hwvbp+4z+hrF3A7mZsncDeZm2
dwM5oezdAB/a3h1o7w50dwO6uwPt3YDu7kB7t6C5W9DdPWjevhG6q4uhTTXPCW2teXY0NsYYY4wx
xhhjjDHGGNOUP6wFdZwAAAEA
</data>
</layer>
<layer name="1_terrain" width="128" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAAAO2d3Y7UMAxG/YrALQgDC4L3fwEmWqLJlHYm//6cfEfKBSst3fbYTtqmiQix4tek
4/ycdBxSBv3vDf3vDf3vy49b+zPpWPSPx6zcD9A/HvS/N/S/LzP7/gD9YzEz9wP0j8Ps3A/8vrXv
k49Jzpmd+xHWAHsscj/CGmBH8P4mdu4jrAHzscz5I6EGhDhkHRhPz5z/fGvfDu1Lw/8X4+Ct/U8j
F/Qc553VbatxJHlN75pP/z4YNc6jf3xGjfNC3//15Of0j8Hoe7urezb6tyH6jm3kvd1V7gfofx6p
81n38s/cB+h/LBbOI6/cB+i/P5bOIznuAyX+4/OjlmdGq4LgPBAd5bgPlPiPY8jdasZxrHbWEJ7N
5+Z8So1/lT7Pj9FBed+WQ437QI3/FJX3OFgJT94Dte4Drf5XwqP3kr7+jN39o4zbSmnJ+ZQd/Xt1
HuiR8ym7+UeaR5PDcc5GL++Rnfx7cZ867+37yE7+kZ9bzHSespr/Z89qEHO/d39eyir+vdy7je7P
S/HsH30cfzbf1tr3EY/+UXMdLbdz8OIfOdet+/AWPPhHvW/z7D2C7h/NvdV92iiQ/SO6X8F5Cqp/
JPcr1PkrUP0jPKtb2XsE0b917u/gPYLo3yL3VxvX5bKz/12dp6D5H1376fwRJP8z3NP5I0j+R9X9
ncZzpaD4n/3dO3kHwf8I98z5PBD89677zPl8VvLPnC/H2n+v2s+cr8Paf4/cp/t6LP235j7rfTuW
/ltynzlfT+1cunS919a1f1tzH2Uuqkd69Lmt15+5b4e1/5bcp/t2LP2z7ttj6X+Vup+zJlTakPZK
8OrfOvdbvkFB2jfHyr/32t963VBiwMp/63G9+w9Yn0Ng9nn0+l7T+trR/52S81jlGT/938k9j17v
93a7biOZeR6r5H6A/u/knMdKuR9Yxb9K3frNpXPne83rQblvUmlf7xrBf8rI97895/WtEgP0Xw/K
tVOpjwGUc4io/L9G1VUbubdADkjXTuWxD/307+cfbu3jk99DOofR9PaP0gccUbnXg7M9cnb95nDE
91yo+aPy6Df+ezfnKTv590DpO+uSdoZK//2B6L8ei3U1Vh4DeoP+94b+94b+92YF/6jPADywgv8A
Y6AcqzUVVcbsEcsYyMd6Pc1RdSd+j8g4uMbafWB0v8NacA6C+4DK+H3CWQv+B2EN7cisv2X3OEDd
J0dlfA1I6blWgQdm7Il1tp9ZbDlY1aOVY2HmXmiWaz70YqVYmDm+6zEHX2VuH/AKz7HgzX1EBSsG
IgixUDI/w6P7iApmDERmxwLyfqaj5q6plH9/YkEaCz1jAvU+LWXGu1aEMWEpZzFR2lCdp9D/nsxc
V1UFvw/YCYtvrVUYAwhYfmevwhiwBGGNBRUf9wSrgeA+RaVufQJShof181UYA73x4D1FhbWgJ17n
0KswBmpZ5Rt0FdaCUtDGdz1Q4RjxGavkew4qjIWIt7Fdb1Qe56XtEA875XopKq/XtfISI1fzL+m8
H4sIAAAAAAAAAO2d3Y7UMAxG/YrALQgDC4L3fwEmWqLJlHYm//6cfEfKBSst3fbYTtqmiQix4tek
4/ycdBxSBv3vDf3vDf3vy49b+zPpWPSPx6zcD9A/HvS/N/S/LzP7/gD9YzEz9wP0j8Ps3A/8vrXv
k49Jzpmd+xHWAHsscj/CGmBH8P4mdu4jrAHzscz5I6EGhDhkHRhPz5z/fGvfDu1Lw/8X4+Ct/U8j
F/Qc553VbatxJHlN75pP/z4YNc6jf3xGjfNC3//15Of0j8Hoe7urezb6tyH6jm3kvd1V7gfofx6p
81n38s/cB+h/LBbOI6/cB+i/P5bOIznuAyX+4/OjlmdGq4LgPBAd5bgPlPiPY8jdasZxrHbWEJ7N
5+Z8So1/lT7Pj9FBed+WQ437QI3/FJX3OFgJT94Dte4Drf5XwqP3kr7+jN39o4zbSmnJ+ZQd/Xt1
HuiR8ym7+UeaR5PDcc5GL++Rnfx7cZ867+37yE7+kZ9bzHSespr/Z89qEHO/d39eyir+vdy7je7P
S/HsH30cfzbf1tr3EY/+UXMdLbdz8OIfOdet+/AWPPhHvW/z7D2C7h/NvdV92iiQ/SO6X8F5Cqp/
JPcr1PkrUP0jPKtb2XsE0b917u/gPYLo3yL3VxvX5bKz/12dp6D5H1376fwRJP8z3NP5I0j+R9X9
ncZzpaD4n/3dO3kHwf8I98z5PBD89677zPl8VvLPnC/H2n+v2s+cr8Paf4/cp/t6LP235j7rfTuW
/ltynzlfT+1cunS919a1f1tzH2Uuqkd69Lmt15+5b4e1/5bcp/t2LP2z7ttj6X+Vup+zJlTakPZK
8OrfOvdbvkFB2jfHyr/32t963VBiwMp/63G9+w9Yn0Ng9nn0+l7T+trR/52S81jlGT/938k9j17v
93a7biOZeR6r5H6A/u/knMdKuR9Yxb9K3frNpXPne83rQblvUmlf7xrBf8rI97895/WtEgP0Xw/K
tVOpjwGUc4io/L9G1VUbubdADkjXTuWxD/307+cfbu3jk99DOofR9PaP0gccUbnXg7M9cnb95nDE
91yo+aPy6Df+ezfnKTv590DpO+uSdoZK//2B6L8ei3U1Vh4DeoP+94b+94b+92YF/6jPADywgv8A
Y6AcqzUVVcbsEcsYyMd6Pc1RdSd+j8g4uMbafWB0v8NacA6C+4DK+H3CWQv+B2EN7cisv2X3OEDd
J0dlfA1I6blWgQdm7Il1tp9ZbDlY1aOVY2HmXmiWaz70YqVYmDm+6zEHX2VuH/AKz7HgzX1EBSsG
IgixUDI/w6P7iApmDERmxwLyfqaj5q6plH9/YkEaCz1jAvU+LWXGu1aEMWEpZzFR2lCdp9D/nsxc
V1UFvw/YCYtvrVUYAwhYfmevwhiwBGGNBRUf9wSrgeA+RaVufQJShof181UYA73x4D1FhbWgJ17n
0KswBmpZ5Rt0FdaCUtDGdz1Q4RjxGavkew4qjIWIt7Fdb1Qe56XtEA875XopKq/XtfISI1fzL+m8
DeR3kMzt8ahg1QI6t0NlTl/xbC49neOikr9eZs+1NAkhhBBCCCGEEEIIIYQQC/4CTehnwwAAAQA=
</data>
</layer>
<layer name="2_object" width="128" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAAAO3OwQ2AIBQFQVqENkS0/5OvCfNDmEn2vq0BAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAACfqaVRPAAAAAAAA8IsrzXRXj1BipSe91SMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
H4sIAAAAAAAAAO3OwQ2AIBQFQVqENkS0/5OvCfNDmEn2vq0BAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAACfqaVRPAAAAAAAA8IsrzXRXj1BipSe91SMAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AABs6QNWHhHXAAABAA==
</data>
</layer>
<layer name="3_roof" width="128" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAAAO3YsREAMAgDMSaE/bdJRqCCAunue9eOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
H4sIAAAAAAAAAO3YsREAMAgDMSaE/bdJRqCCAunue9eOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAOCq/NX2CAAAAAAARviEAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADoeAVsIboAAAEA
</data>
</layer>
<layer name="objects" width="128" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAAAO3cMQ6CQBQEUCrtOQrHMNbe/yiGgsaoUbNx4P/3WggZyGY2bBamCQAAAICky+Dz
ADiuOR0AABjimg4AQBnmFMixTgMAAAAAAP9xTgcAAAAAAGjIfmmAWvQ6nzBOAKAmczwAjGNeBQAA
AOjHmhBAD7d0ADgg/wQCYOPdGQAAalrSAQAAAGDH7JsAgKxTOgAAAADAF3x7A1Sk2wCe69qPXe/7
H4sIAAAAAAAAAO3cMQ6CQBQEUCrtOQrHMNbe/yiGgsaoUbNx4P/3WggZyGY2bBamCQAAAICky+Dz
ADiuOR0AABjimg4AQBnmFMixTgMAAAAAAP9xTgcAAAAAAGjIfmmAWvQ6nzBOAKAmczwAjGNeBQAA
AOjHmhBAD7d0ADgg/wQCYOPdGQAAalrSAQAAAGDH7JsAgKxTOgAAAADAF3x7A1Sk2wCe69qPXe/7
0avnML859sv1gL70AkAfOh9Y6QIAAAAAAAAAACq4AzR4LRUAAAEA
</data>
</layer>
<layer name="collision" width="128" height="128" visible="0" opacity="0.37">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAAAO2SSW7EQAwD/cH5/3eCHAZZkMxit1SkmgXU0ZZE9u04jlvE7IC+Mab/mP5j+o/p
P/Z1fzTcEdN/TP8x/Uet7o+C3WP6jx7d36Fvjuk/stC376wCdAa7epXV/6Xz2MVVVP6fzmiyq0j/
fq4k/fu4mupZdF6TrCD961tFx1w6O0c76NqDztLFTjp3onNVlqBiv0ff0BmrSVG5a/rX7PxO9d6P
vqezn97tMzpuoztI73/TdSPdRXr/SfetdCfp/QviZrqb3Tv/hLyf7mnHzpWyoDvbpXvVPOjeJnfv
kAnd3cT+6Twm9q8Mnc3k/tWg89ihfyXoLHbqXwk6i136V4POY6f+VaC72rF/Feie6HyVd6uE7kcl
Y9W9qqB7UctZda/V0H2o5qy40yroDtJ/f/907ioq5lUFnbWiatlVQeesqlJ+FdD5qquU42robB1U
yXIldKZOKmS6EjpPNxVyXQGdo6sK+V6FztBZOuOr0Pm5S+d8Fjq3KZJ5n4XObJJk5mehM3P3Kune
26tQO9C5TfEq1Hw6tyleJd17e5X0/9499I7pn8+N3l2hf2LmhNym3EHMnJCb+x3d86bkNuWO7nlT
cptwR+esSblNuaNz1qTc1G4i8jo7VyEvh1sc+j87WyEz9Ttc+j87XyE35RsUM/oP+pZXbn12N71j
+u/p//vt9F50Jiuh73mn/7ge+p7IvgH6FnerSP8eVpH+Pawi/XtYRfr3sIr072EVnTPpDJ2tonsu
naOjlRCz6TydrEb57e1uB/QedMaqdqGyC523ml247jPRKpR3ewTdh3vvdxx2fAbdkWPvh+G+r0D3
5pKl697vQPeomqH7/meY3umr7Hjzb3bOYOfbH7HL3el/T7p6zxvQg+g+b0ADsvu8ARa697wDDrrr
vAUGute8AQa6y7wDFrrDvIF+6M7yDjjonvIW+qH7yFtgoLNXdDp0vhN0gM5osqrQuewoDX1/rH8f
H4sIAAAAAAAAAO2SSW7EQAwD/cH5/3eCHAZZkMxit1SkmgXU0ZZE9u04jlvE7IC+Mab/mP5j+o/p
P/Z1fzTcEdN/TP8x/Uet7o+C3WP6jx7d36Fvjuk/stC376wCdAa7epXV/6Xz2MVVVP6fzmiyq0j/
fq4k/fu4mupZdF6TrCD961tFx1w6O0c76NqDztLFTjp3onNVlqBiv0ff0BmrSVG5a/rX7PxO9d6P
vqezn97tMzpuoztI73/TdSPdRXr/SfetdCfp/QviZrqb3Tv/hLyf7mnHzpWyoDvbpXvVPOjeJnfv
kAnd3cT+6Twm9q8Mnc3k/tWg89ihfyXoLHbqXwk6i136V4POY6f+VaC72rF/Feie6HyVd6uE7kcl
Y9W9qqB7UctZda/V0H2o5qy40yroDtJ/f/907ioq5lUFnbWiatlVQeesqlJ+FdD5qquU42robB1U
yXIldKZOKmS6EjpPNxVyXQGdo6sK+V6FztBZOuOr0Pm5S+d8Fjq3KZJ5n4XObJJk5mehM3P3Kune
26tQO9C5TfEq1Hw6tyleJd17e5X0/9499I7pn8+N3l2hf2LmhNym3EHMnJCb+x3d86bkNuWO7nlT
cptwR+esSblNuaNz1qTc1G4i8jo7VyEvh1sc+j87WyEz9Ttc+j87XyE35RsUM/oP+pZXbn12N71j
+u/p//vt9F50Jiuh73mn/7ge+p7IvgH6FnerSP8eVpH+Pawi/XtYRfr3sIr072EVnTPpDJ2tonsu
naOjlRCz6TydrEb57e1uB/QedMaqdqGyC523ml247jPRKpR3ewTdh3vvdxx2fAbdkWPvh+G+r0D3
5pKl697vQPeomqH7/meY3umr7Hjzb3bOYOfbH7HL3el/T7p6zxvQg+g+b0ADsvu8ARa697wDDrrr
vAUGute8AQa6y7wDFrrDvIF+6M7yDjjonvIW+qH7yFtgoLNXdDp0vhN0gM5osqrQuewoDX1/rH8f
9A0xxhhjjDHGGGOMMcYYY4zP/AD8mpudAAABAA==
</data>
</layer>
<layer name="protection" width="128" height="128" visible="0">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAAAO3BAQEAAACAkP6v7ggKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
H4sIAAAAAAAAAO3BAQEAAACAkP6v7ggKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAauuOl9cAAAEA
</data>
</layer>

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