Compare commits

..

25 commits

Author SHA1 Message Date
Jordan Irwin
785675f13d Show joystick/d-pad by default if pointer device is not detected
Some checks failed
Java CI / build (push) Has been cancelled
2024-04-20 23:59:14 +02:00
Jordan Irwin
2e9ade5a23 Add option to config manager to check if a key value is set 2024-04-20 23:54:42 +02:00
Jordan Irwin
b8359f3a81
Add Gradle wrapper SHA-256 checksum info recommend by F-Droid
https://gitlab.com/fdroid/fdroiddata/-/merge_requests/14774#note_1837005543
2024-04-04 01:39:26 -07:00
Jordan Irwin
1ff055b2f0
Update description for F-Droid 2024-04-04 01:24:04 -07:00
Jordan Irwin
ab5a10400a
Add Android meta data for F-Droid 2024-03-30 16:29:28 -07:00
Jordan Irwin
c8eb546590
Fix changes 2024-03-26 19:14:56 -07:00
Jordan Irwin
14fa450dfd
Add support for single globalized zone music to Java client
Doesn't restart if changed zone uses same music.
2024-03-26 19:07:03 -07:00
Jordan Irwin
8241fc9686
Fix changes 2024-03-26 19:06:46 -07:00
Hendrik Brummermann
328ec57136
fixed compiler error 2024-03-24 16:30:24 -07:00
Jordan Irwin
92da86aef6
Update changes 2024-03-21 15:03:31 -07:00
Jordan Irwin
6e3cb4b3bd
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 15:01:35 -07:00
Jordan Irwin
423f94f25e Move sbin scripts to bin
https://github.com/arianne/stendhal/issues/628
2024-03-19 20:22:11 +01:00
Jordan Irwin
010375d6d5 Change Eclipse's build output directory to build/eclipse
https://github.com/arianne/stendhal/issues/628
2024-03-19 20:19:54 +01:00
Jordan Irwin
17864b85c7
Add tab to about dialog to display contributor information
https://github.com/arianne/stendhal/issues/651
2024-03-18 22:04:22 -07:00
Jordan Irwin
ba585d7a91
Allow passing element to Component & Panel constructors 2024-03-18 22:04:01 -07:00
Jordan Irwin
a68991e38b
Convert contributors.md to HTML for use in web client 2024-03-18 22:03:48 -07:00
Jordan Irwin
e56d8680d9
Disable Android built-in about dialog
Web client now has about dialog.
2024-03-18 12:53:29 -07:00
Jordan Irwin
68f21d5eeb
Support opening chat log context menu with touch
Closes: https://github.com/arianne/stendhal/issues/603
2024-03-18 03:34:52 -07:00
Jordan Irwin
8af5ae1bbb
Add option to enable/disable pinch & double-tap zoom
Closes: https://github.com/arianne/stendhal/issues/687
2024-03-18 03:07:04 -07:00
Jordan Irwin
22fa54ab6a
Fix controlling mute & volume level of single global music instance
Closes: https://github.com/arianne/stendhal/issues/688
2024-03-18 01:32:27 -07:00
Jordan Irwin
6b57ebe3f8
Update changes 2024-03-17 00:52:08 -07:00
Jordan Irwin
f1523798c7
Fix redundant check 2024-03-17 00:38:18 -07:00
Jordan Irwin
4fb31e2a7d
Revert "Fix multi-touch support in item inventories"
This reverts commit 1551389c75.
2024-03-17 00:38:04 -07:00
Jordan Irwin
0b619f9d8c
Fix corpse & chest cursor when quick pickup enabled
Closes: https://github.com/arianne/stendhal/issues/601
2024-03-16 18:37:54 -07:00
Hendrik Brummermann
edf4297854 updated version 2024-03-15 19:51:55 +01:00
3938 changed files with 51345 additions and 61025 deletions

View file

@ -7,56 +7,16 @@ on:
pull_request:
paths:
- 'app/android/**'
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- id: job_info
uses: daleyjem/gh-job-id@v1
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
job_name: 'build'
- uses: actions/checkout@v3
- name: Checkout Repository
uses: actions/checkout@v3
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v3
- 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
- name: Build Android Packages
run: cd app/android/client && gradle assemble

View file

@ -29,15 +29,15 @@ jobs:
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
uses: github/codeql-action/init@v2
# 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@v3
- name: Autobuild
uses: github/codeql-action/autobuild@v2
# Command-line programs to run using the OS shell.
# 📚 https://git.io/JvXDl
@ -46,7 +46,9 @@ jobs:
# and modify them (or add more) to build your code if your project
# uses a compiled language
- run: ant -noinput -f build.xml clean compile
#- run: |
# make bootstrap
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
uses: github/codeql-action/analyze@v2

1
.gitignore vendored
View file

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

View file

@ -20,15 +20,4 @@
<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,38 +20,19 @@ So what are you waiting for?! A whole new world awaits...
## How to play
### 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
[![Play now](https://arianne-project.org/images/playbutton.png)](https://stendhalgame.org/account/mycharacters.html) &nbsp; &nbsp; &nbsp; &nbsp;
[![Download](https://stendhalgame.org/images/downloadbutton.png)](https://arianne-project.org/download/stendhal.zip)
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.
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.
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:
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:
`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
@ -63,18 +44,13 @@ There is a [manual](https://stendhalgame.org/wiki/Stendhal_Manual), and there is
## 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.
Stendhal is free software. You can redistribute it and/or modify under the following terms:
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.
- 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.
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.
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-2026, arianne-general at lists dot sourceforge dot net
Stendhal(c) is copyright of the Arianne Project, 2006-2024, arianne-general at lists dot sourceforge dot net
Please have a look at the list of [contributors](doc/contributors.md#contributors).
Please have a look at the list of [contributors](https://github.com/arianne/stendhal/blob/master/doc/contributors.md#contributors).

1
app/.gitignore vendored
View file

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

View file

@ -10,23 +10,15 @@ android {
applicationId namespace
minSdk 21
targetSdk 32
versionCode 1049005
versionName "1.49.5"
versionCode 1046000
versionName "1.46"
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.versionName}")
project.setProperty("archivesBaseName", "${namespace}-${defaultConfig.versionCode}")
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,11 +28,12 @@ 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;
@ -57,13 +58,10 @@ public class Logger {
/**
* Initializes logs directory.
*/
public static void init(final File dir) {
if (Logger.initialized) {
Logger.warn(true, "tried to re-initialize logger");
return;
}
Logger.initialized = true;
public static void init(final File dir, final MainActivity activity) {
logsDir = new File(dir.getPath() + "/logs");
mainActivity = activity;
writeLine("\n // -- debugging initialized -- //", null);
writeLine("logs directory: " + logsDir.getPath());
}
@ -242,16 +240,16 @@ public class Logger {
* Logging verbosity level.
*/
public static void notify(final String text, LogLevel level) {
if (!Logger.initialized) {
if (mainActivity == null) {
System.err.println("ERROR: Logger not initialized. Call Logger.init.");
return;
}
if (level == null) {
level = LogLevel.INFO;
level = LogLevel.DEBUG;
}
final AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.get());
final AlertDialog.Builder builder = new AlertDialog.Builder(ClientView.get().getContext());
builder.setTitle(level.label);
builder.setMessage(text);

View file

@ -13,19 +13,21 @@ 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.ViewGroup;
import android.view.inputmethod.BaseInputConnection;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputConnection;
import android.view.inputmethod.InputMethodManager;
import android.webkit.DownloadListener;
import android.webkit.WebChromeClient;
@ -33,6 +35,7 @@ import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ImageView;
/**
@ -40,6 +43,9 @@ import android.webkit.WebViewClient;
*/
public class ClientView extends WebView {
/** Image used as title page background. */
private ImageView splash;
/** Client URL path. */
private String clientUrlSuffix = "client";
@ -49,13 +55,23 @@ public class ClientView extends WebView {
private boolean testServer = false;
private Boolean debugging;
/** ID of page currently loaded. */
private PageId currentPage;
private static 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.
@ -101,12 +117,10 @@ public class ClientView extends WebView {
* Initializes client WebView interface.
*/
private void onInit() {
setActive(false); // main activity manages initial visibility
setBackgroundColor(Color.TRANSPARENT);
// FIXME: may be considered unsafe as this is not technically a singleton
instance = this;
// expand to size of parent constraints
setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
setBackgroundColor(android.graphics.Color.TRANSPARENT);
final WebSettings viewSettings = getSettings();
viewSettings.setJavaScriptEnabled(true);
@ -133,30 +147,6 @@ 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.
*/
@ -190,11 +180,7 @@ public class ClientView extends WebView {
if (!UrlHelper.isInternalUri(uri)) {
// open external links in default browser/app
// FIXME: should we ask for confirmation?
try {
MainActivity.get().startActivity(new Intent(Intent.ACTION_VIEW, uri));
} catch (final ActivityNotFoundException e) {
Notifier.toast("No app found to open this link");
}
MainActivity.get().startActivity(new Intent(Intent.ACTION_VIEW, uri));
return true;
}
view.loadUrl(UrlHelper.checkClientUrl(uri.toString()));
@ -233,7 +219,7 @@ public class ClientView extends WebView {
} else if (url.equals("") || url.equals("about:blank")) {
setPage(PageId.TITLE);
if (PreferencesActivity.getBoolean("title_music", true)) {
MusicPlayer.playTitleMusic();
playTitleMusic();
}
} else {
setPage(PageId.OTHER);
@ -251,7 +237,7 @@ public class ClientView extends WebView {
public boolean dispatchKeyEvent(final KeyEvent event) {
final boolean ret = super.dispatchKeyEvent(event);
// hide keyboard when "enter" pressed
if (isGameActive() && event.getAction() == KeyEvent.ACTION_UP
if (ClientView.isGameActive() && event.getAction() == KeyEvent.ACTION_UP
&& event.getKeyCode() == KeyEvent.KEYCODE_ENTER) {
((InputMethodManager) MainActivity.get()
.getSystemService(Context.INPUT_METHOD_SERVICE))
@ -268,9 +254,6 @@ 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
@ -346,7 +329,7 @@ public class ClientView extends WebView {
* One of "main", "test", or "none".
*/
public String getSelectedClient() {
if (onTitleScreen()) {
if (ClientView.onTitleScreen()) {
return "none";
}
return testClient ? "test" : "main";
@ -359,7 +342,7 @@ public class ClientView extends WebView {
* One of "main", "test", or "none".
*/
public String getSelectedServer() {
if (onTitleScreen()) {
if (ClientView.onTitleScreen()) {
return "none";
}
return testServer ? "test" : "main";
@ -429,7 +412,7 @@ public class ClientView extends WebView {
public void loadTitleScreen() {
reset();
setPage(PageId.TITLE);
SplashUtil.get().setVisible(true);
setSplashResource(R.drawable.splash);
loadUrl("about:blank");
Menu.get().show();
}
@ -448,11 +431,25 @@ 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(getContext());
final AlertDialog.Builder builder = new AlertDialog.Builder(ClientView.get().getContext());
builder.setMessage("Select client");
builder.setPositiveButton("Main", new DialogInterface.OnClickListener() {
@ -483,7 +480,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(getContext());
final AlertDialog.Builder builder = new AlertDialog.Builder(ClientView.get().getContext());
builder.setMessage("Select server");
builder.setPositiveButton("Main", new DialogInterface.OnClickListener() {
@ -514,8 +511,8 @@ public class ClientView extends WebView {
// create a unique state
stateId = generateRandomString();
seed = generateRandomString();
// hide splash image
SplashUtil.get().setVisible(false);
// remove splash image
setSplashResource(android.R.color.transparent);
final String initialPage = UrlHelper.getInitialPageUrl();
Logger.debug("Loading initial page: " + initialPage);
@ -545,7 +542,7 @@ public class ClientView extends WebView {
* @return
* `true` if current page matches `PageId.TITLE`.
*/
public boolean onTitleScreen() {
public static boolean onTitleScreen() {
return currentPage == PageId.TITLE;
}
@ -555,7 +552,7 @@ public class ClientView extends WebView {
* @return
* `true` if current page matches `PageId.WEBCLIENT`.
*/
public boolean isGameActive() {
public static boolean isGameActive() {
return currentPage == PageId.WEBCLIENT;
}
@ -565,10 +562,46 @@ public class ClientView extends WebView {
* @return
* Current `PageId`.
*/
public PageId getCurrentPageId() {
public static 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.
*
@ -576,10 +609,10 @@ public class ClientView extends WebView {
* Page ID to be used.
*/
private void setPage(final PageId newPage) {
previousPage = currentPage;
currentPage = newPage;
previousPage = ClientView.currentPage;
ClientView.currentPage = newPage;
if (previousPage == null) {
previousPage = currentPage;
previousPage = ClientView.currentPage;
}
}

View file

@ -13,8 +13,6 @@ 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;
@ -28,175 +26,61 @@ import android.util.Base64;
* created by the web client page.
*/
public class DownloadHandler {
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;
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) {
public void download(final String url, final String mimetype) {
final Uri uri = Uri.parse(url);
final String scheme = uri.getScheme();
final String storageState = Environment.getExternalStorageState();
final DownloadType dtype = checkMimeType(url, mimetype);
if (!MainActivity.get().getActiveClientView().isGameActive()) {
if (!ClientView.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 (DownloadType.UNSUPPORTED.equals(dtype)) {
} else if (!"image/png".equals(mimetype) || !url.startsWith("data:image/png;base64,")) {
this.message = "mimetype not supported: " + mimetype;
} else if (!Environment.MEDIA_MOUNTED.equals(storageState)) {
this.message = "storage not available for writing (state: " + storageState + ")";
} else if (DownloadType.IMAGE_PNG.equals(dtype)) {
} else {
final File targetDir = new File(Environment.getExternalStorageDirectory()
+ "/Pictures/Screenshots");
if (targetName == null) {
// default filename
targetName = "stendhal_" + new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss").format(new Date())
+ ".png";
}
final String targetName = "stendhal_"
+ new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss").format(new Date()) + ".png";
Logger.debug("Saving screenshot: " + targetDir.getPath()
+ "/" + targetName + " (" + mimetype + ")");
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;
String msg;
String stacktrace = null;
try {
if (!targetDir.exists()) {
targetDir.mkdirs();
}
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);
}
downloadInternal(targetDir, targetName, data);
if (this.result) {
this.message = "file saved to " + targetDir.getPath() + "/" + targetName;
this.message = msg;
if (stacktrace != null) {
Logger.error(stacktrace.toString());
}
} 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,17 +11,13 @@
***************************************************************************/
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;
/**
@ -29,10 +25,12 @@ import androidx.appcompat.app.AppCompatActivity;
*/
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;
@ -44,7 +42,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 MainActivity.instance;
return instance;
}
/**
@ -55,17 +53,20 @@ public class MainActivity extends AppCompatActivity {
try {
super.onCreate(savedInstanceState);
// FIXME: may be considered unsafe as this is not technically a singleton
MainActivity.instance = this;
instance = this;
// initialize debug logging mechanism
Logger.init(getExternalFilesDir(null));
Logger.init(getExternalFilesDir(null), this);
updateOrientation();
setContentView(R.layout.activity_main);
clientList = findViewById(R.id.clientList);
createClientView();
// NOTE: client view instance must be created before initializing menu
menu = Menu.get();
updateOrientation();
// FIXME: is this used?
layout = (ConstraintLayout) findViewById(R.id.content);
client = (ClientView) findViewById(R.id.clientWebView);
menu = new Menu(client.getContext());
client.loadTitleScreen();
} catch (final Exception e) {
// TODO: add option to save to file or copy to clipboard the error
e.printStackTrace();
@ -102,92 +103,11 @@ 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() {
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;
client.loadLogin();
}
/**
@ -216,7 +136,7 @@ public class MainActivity extends AppCompatActivity {
* Opens a dialog to confirm exiting activity.
*/
public void onRequestQuit() {
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
final AlertDialog.Builder builder = new AlertDialog.Builder(client.getContext());
builder.setMessage("Quit Stendhal?");
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@ -244,16 +164,12 @@ public class MainActivity extends AppCompatActivity {
//~ }
/**
* Listens for changes to orientation.
* Updates direction pad position when screen orientation changes.
*/
@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();
}
}
//~ @Override
//~ public void onConfigurationChanged(final Configuration config) {
//~ super.onConfigurationChanged(config);
//~ }
/**
* Called when main activity ends.
@ -277,6 +193,6 @@ public class MainActivity extends AppCompatActivity {
* Creates preferences activity.
*/
public void showSettings() {
startActivity(new Intent(this, PreferencesActivity.class));
startActivity(new Intent(MainActivity.this, PreferencesActivity.class));
}
}

View file

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

View file

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

View file

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

View file

@ -1,90 +0,0 @@
/***************************************************************************
* 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 = MainActivity.get().getActiveClientView();
final ClientView client = ClientView.get();
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 = MainActivity.get().getActiveClientView().checkCustomServer();
final String cs = ClientView.get().checkCustomServer();
if (cs != null) {
return UrlHelper.stripHost(cs).equals(host);
}

View file

@ -9,10 +9,13 @@
* (at your option) any later version. *
* *
***************************************************************************/
package org.stendhalgame.client;
package org.stendhalgame.client.sound;
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;
@ -66,42 +69,6 @@ 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

@ -1,9 +0,0 @@
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 @@
Ein Multiplayer-Adventure mit klassischer 2D-Grafik
Stendhal ist ein Multiplayer-Adventure mit klassischer 2D-Grafik. Es ist vollständig Open Source.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 335 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 647 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 597 KiB

View file

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

View file

@ -1,9 +0,0 @@
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 @@
Una aventura multijugador con gráficos 2D clásicos
Stendhal es una aventura multijugador con gráficos 2D clásicos. Es completamente de código abierto.

View file

@ -1,10 +0,0 @@
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 @@
Une aventure multijoueur avec des graphismes 2D classiques
Stendhal est une aventure multijoueur avec des graphismes 2D classiques. C'est complètement open source.

View file

@ -1,9 +0,0 @@
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 @@
Un'avventura multiplayer con la classica grafica 2D
Stendhal è un'avventura multiplayer con la classica grafica 2D. È completamente open source.

View file

@ -1,9 +0,0 @@
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

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

View file

@ -1,9 +0,0 @@
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 @@
Uma aventura multijogador com gráficos 2D clássicos
Stendhal é uma aventura multijogador com gráficos 2D clássicos. É totalmente de código aberto.

View file

@ -1,9 +0,0 @@
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

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

View file

@ -1,3 +1,65 @@
PUT RELEASE ANNOUNCEMENT LINES HERE
Please see the complete change log for further details: https://arianne-project.org/game/stendhal.html#changes
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

Binary file not shown.

Before

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="fitCenter"
android:scaleType="centerCrop"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"
/>
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/clientList"
<org.stendhalgame.client.ClientView
android:id="@+id/clientWebView"
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">
</androidx.constraintlayout.widget.ConstraintLayout>
app:layout_constraintTop_toTopOf="parent"
/>
<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.49.5</string>
<string name="build_version">1.46</string>
</resources>

View file

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

View file

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

View file

@ -18,7 +18,6 @@ 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,12 +1,9 @@
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;
@ -19,10 +16,6 @@ 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();
@ -119,70 +112,58 @@ 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 {
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 (_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 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!("\
{{\
@ -200,10 +181,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,7 +11,6 @@ neutralino.js
# Neutralinojs related files
.storage
*.log
extensions/binary/steam_appid.txt
extensions/binary/*.so
extensions/binary/*.dll
extensions/binary/nativehelper*

View file

@ -0,0 +1 @@
2267890

View file

@ -1,7 +1,7 @@
{
"$schema": "https://raw.githubusercontent.com/neutralinojs/neutralinojs/main/schemas/neutralino.config.schema.json",
"applicationId": "org.stendhalgame.client",
"version": "1.49.5",
"applicationId": "stendhal_client",
"version": "0.4.0",
"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": "6.2.0",
"clientVersion": "6.2.0"
"binaryVersion": "5.0.0",
"clientVersion": "5.0.1"
}
}

View file

@ -2,9 +2,6 @@ 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 = [];
@ -31,24 +28,8 @@ 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();
}
@ -75,14 +56,8 @@ 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');

View file

@ -1,146 +0,0 @@
#!/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

View file

@ -1,90 +0,0 @@
#!/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,6 +1,6 @@
@echo off
set STENDHAL_VERSION=1.49.5
set STENDHAL_VERSION=1.46
set SERVER_JAR=stendhal-server-%STENDHAL_VERSION%.jar
:: change to server directory

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

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

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.49
version = 1.49.5
version.old = 1.45
version = 1.46
# FIXME: dynamic method to set this property?
version.android = 1049005
version.android = 1046000
# javac options
javac.deprecation = true
@ -102,17 +102,18 @@ javac.debug = true
javac.debuglevel = source,lines
# change these only if you know what you are doing
build = build
buildroot = ${build}
buildroot = build
build-archive = build-archive
src = src
testsrc = tests
srcjs = ${src}/js
docs = doc
data = data
gui = ${data}/gui
maps = ${data}/maps
sprites = ${data}/sprites
srcjs = srcjs
docu = data/docu
maps = data/maps
data = data/gui
sprites = data/sprites
layers = data/layers
tiled = tiled
build = build
lib = ${buildroot}/lib
marauroa_root = ../marauroa
marauroa_src = ${marauroa_root}/src

102
build.xml
View file

@ -1,33 +1,103 @@
<?xml version='1.0'?>
<project name="stendhal" default="help" basedir=".">
<description>
Project:
Name: .......... ${game_name}
Version: ....... ${version}
Root: .......... ${basedir}
<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"/>
Build system:
Ant version: ... ${ant.version.number}
Ant home: ...... ${ant.location}
Java version: .. ${java.version}
Java home: ..... ${java.home}
<condition property="os.win">
<os family="windows"/>
</condition>
Execute `ant help` for more information.
</description>
<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>
<!-- 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 build-essential libssl-dev pkg-config mingw-w64
apt-get install mingw-w64
cargo install cargo-license
rustup target add x86_64-pc-windows-gnu
-->
@ -37,7 +37,6 @@
<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" />
@ -58,17 +57,15 @@
</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="${executable.neu}" dir="app/neutralinojs" failonerror="true">
<exec executable="neu" dir="app/neutralinojs" failonerror="true">
<arg value="update" />
</exec>
</target>
<target name="neutralinojs" depends="prepare-neutralinojs">
<exec executable="${executable.neu}" dir="app/neutralinojs" failonerror="true">
<exec executable="neu" dir="app/neutralinojs" failonerror="true">
<arg value="build" />
</exec>
<delete failonerror="false">
@ -78,33 +75,23 @@
<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-client-linux" />
<include name="stendhal*" />
<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>
@ -161,8 +148,7 @@
</target> <!-- client_android_build -->
<!-- Create Android client package for release and distribution. -->
<target name="android">
<target name="android" description="Create Android client package for release and distribution.">
<echo
if:set="exclude.webview"
message="ANDROID_SDK_ROOT environment variable not set. Skipping Android WebView client build."/>

View file

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

View file

@ -19,15 +19,13 @@
</condition>
<!-- Build server and clients. -->
<target name="jar" depends="client_build,server_build">
<target name="jar" depends="client_build,server_build" description="Build server and clients.">
<!-- XXX: client & server builds are not exclusive to NetBeans, remove this output? -->
<echo>Built client and server for NetBeans.</echo>
</target>
<!-- Sign client distribution. -->
<target name="signjar" unless="exclude.signing">
<target name="signjar" unless="exclude.signing" description="Sign client distribution.">
<signjar
alias="${keystore.alias}"
keystore="keystore.ks"
@ -36,30 +34,24 @@
</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" />
<target name="compile" depends="server_build,client_build,server_build" description="Generate JAR files for both client and server."/>
<!-- Create all packages for Stendhal release. -->
<target name="dist" depends="clean,dist_binary,dist_source,signupdates" />
<target name="dist" depends="clean,dist_binary,dist_source,signupdates" description="Create all 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" />
<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."/>
<!-- START: source -->
<!-- Create all source packages for Stendhal release. -->
<target name="dist_source">
<target name="dist_source" description="Create all source packages for Stendhal release.">
<mkdir dir="${buildroot}/stendhal-${version}-src"/>
<copy todir="${buildroot}/stendhal-${version}-src/src">
<fileset dir="src">
<exclude name="js/*compiled*"/>
<exclude name="js/contributors.html"/>
</fileset>
<fileset dir="src"/>
</copy>
<mkdir dir="${buildroot}/stendhal-${version}-src/libs"/>
@ -73,7 +65,12 @@
<copy todir="${buildroot}/stendhal-${version}-src/data">
<fileset dir="data">
<exclude name="maps/world/**"/>
</fileset>
</copy>
<copy todir="${buildroot}/stendhal-${version}-src/tiled">
<fileset dir="${tiled}">
<exclude name="world/**"/>
</fileset>
</copy>
@ -90,8 +87,8 @@
<include name="*.html"/>
</fileset>
</copy>
<copy todir="${buildroot}/stendhal-${version}-src/${docs}">
<fileset dir="${docs}"/>
<copy todir="${buildroot}/stendhal-${version}-src/doc">
<fileset dir="doc"/>
<fileset dir="." includes="LICENSE.txt"/>
</copy>
@ -109,8 +106,7 @@
<!-- START: client data -->
<!-- Build client data files. -->
<target name="build_client_data">
<target name="build_client_data" description="Build client data files.">
<!-- base data -->
<mkdir dir="${build_client_data}"/>
<copy todir="${build_client_data}/data/sprites">
@ -126,8 +122,8 @@
<exclude name="items/meta/"/>
</fileset>
</copy>
<copy todir="${build_client_data}/data/maps/tileset">
<fileset dir="${maps}/tileset">
<copy todir="${build_client_data}/data/tileset">
<fileset dir="${tiled}/tileset">
<exclude name="**/*.bz2"/>
<exclude name="**/*.gz"/>
<exclude name="**/*.psd"/>
@ -138,15 +134,11 @@
<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="${gui}">
<fileset dir="${data}">
<exclude name="paneldrock009.jpg"/>
<exclude name="panelmetal003.gif"/>
<exclude name="panelrock016.jpg"/>
@ -185,8 +177,7 @@
<!-- START: server -->
<!-- Compile JAR file for Stendhal server. -->
<target name="server_build" depends="init,checkxml">
<target name="server_build" depends="init,checkxml" description="Compile JAR file for Stendhal server.">
<mkdir dir="${build_server}"/>
<copy todir="${build_server}/data/conf" file="data/conf/stendhalcreateaccount.properties"/>
@ -273,7 +264,7 @@
</javac>
<copy todir="${build_server_maps}/data/maps">
<fileset dir="${maps}">
<fileset dir="${tiled}">
<include name="**/*.tmx"/>
</fileset>
</copy>
@ -347,8 +338,7 @@
</target> <!-- server_build -->
<!-- Create server package for release and distribution. -->
<target name="dist_server_binary" depends="server_build">
<target name="dist_server_binary" depends="server_build" description="Create server package for release and distribution.">
<mkdir dir="${buildroot}/stendhal-server-${version}"/>
<copy todir="${buildroot}/stendhal-server-${version}/data/script">
@ -374,8 +364,8 @@
<copy todir="${buildroot}/stendhal-server-${version}/libs">
<fileset dir="libs"/>
</copy>
<copy todir="${buildroot}/stendhal-server-${version}/${docs}">
<fileset dir="${docs}"/>
<copy todir="${buildroot}/stendhal-server-${version}/doc">
<fileset dir="doc"/>
<fileset dir="." includes="LICENSE.txt"/>
</copy>
@ -400,12 +390,10 @@
</target> <!-- dist_server_binary -->
<!-- Build and push container image. -->
<target name="dist_docker" depends="docker_build,docker_push" />
<target name="dist_docker" depends="docker_build,docker_push" description="Build and push container image."/>
<!-- Prepare container image build. -->
<target name="docker_build_prepare" depends="dist_server_binary">
<target name="docker_build_prepare" depends="dist_server_binary" description="Prepare container image build.">
<mkdir dir="${build_docker}" />
<copy file="${buildtools_docker}/Dockerfile" todir="${build_docker}" />
<copy file="${buildtools_docker}/.dockerignore" todir="${build_docker}" />
@ -414,8 +402,7 @@
</target> <!-- docker_build_prepare -->
<!-- Build container image. -->
<target name="docker_build" depends="docker_build_prepare">
<target name="docker_build" depends="docker_build_prepare" description="Build container image.">
<exec dir="${build_docker}" executable="docker">
<arg value="build" />
<arg value="-t" />
@ -425,57 +412,28 @@
</target> <!-- docker_build -->
<!-- Push container image. -->
<target name="docker_push" />
<target name="docker_push" description="Push container image."/>
<!-- Run server. -->
<target name="server_run" depends="server_build,compilejs">
<mkdir dir="run_srvr/libs"/>
<mkdir dir="run_srvr/js"/>
<target name="server_run" depends="server_build,compilejs" description="Run server.">
<mkdir dir="run_srvr"/>
<copy todir="run_srvr">
<fileset file="build/lib/${server_jarname}"/>
<fileset file="build/lib/${xmlconf_jarname}"/>
<fileset file="build/lib/${maps_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>
<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>
<chmod file="run_srvr/${server_jarname}" perm="+x"/>
<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>
<exec dir="." executable="java">
<arg line="-Xmx256m -cp run_srvr -jar run_srvr/${server_jarname} -c server.ini -l"/>
</exec>
<!-- we've run the program, so delete the jars -->
<delete dir="run_srvr"/>
@ -486,8 +444,7 @@
<!-- START: java client -->
<!-- Compile client JAR file. -->
<target name="client_build" depends="init,build_client_data">
<target name="client_build" depends="init,build_client_data" description="Compile client JAR file.">
<mkdir dir="${build_client}"/>
<copy todir="${build_client}/games/stendhal/client">
@ -535,7 +492,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.8" target="1.8" deprecation="${javac.deprecation}" includeantruntime="false">
<javac srcdir="${src}" destdir="${build_client}" debug="${javac.debug}" debuglevel="${javac.debuglevel}" source="1.7" target="1.7" deprecation="${javac.deprecation}" includeantruntime="false">
<include name="games/stendhal/client/update/Starter.java"/>
<compilerarg value="-encoding"/>
@ -580,8 +537,7 @@
</target> <!-- client_build -->
<!-- Compile text client. -->
<target name="compile_textclient">
<target name="compile_stendhaltextclient" description="Compile text client.">
<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">
@ -602,12 +558,8 @@
</javac>
</target> <!-- compile_stendhaltextclient -->
<!-- Alias of `compile_textclient`. -->
<target name="compile_stendhaltextclient" depends="compile_textclient" />
<!-- Create Java client package for release and distribution. -->
<target name="dist_client_binary" depends="clean_client_data,client_build">
<target name="dist_client_binary" depends="clean_client_data,client_build" description="Create Java client package for release and distribution.">
<mkdir dir="${buildroot}/stendhal-${version}"/>
<mkdir dir="${buildroot}/stendhal-${version}/lib"/>
<mkdir dir="${buildroot}/stendhal-${version}/log"/>
@ -627,8 +579,8 @@
<include name="*.html"/>
</fileset>
</copy>
<copy todir="${buildroot}/stendhal-${version}/${docs}">
<fileset dir="${docs}"/>
<copy todir="${buildroot}/stendhal-${version}/doc">
<fileset dir="doc"/>
<fileset file="LICENSE.txt"/>
</copy>
<touch file="${buildroot}/stendhal-${version}/log/stendhal.txt"/>
@ -643,8 +595,8 @@
</target> <!-- dist_client_binary -->
<!-- Create Java client starter package (obsolete). -->
<target name="dist_client_starter" depends="client_build">
<!-- XXX: is this still used? -->
<target name="dist_client_starter" depends="client_build" description="Create Java client starter package.">
<mkdir dir="${buildroot}/stendhal-${version}"/>
<copy todir="${buildroot}/stendhal-${version}" file="${lib}/${client_starter_jarname}"/>
<copy todir="${buildroot}/stendhal-${version}/lib">
@ -653,8 +605,10 @@
<include name="*.html"/>
</fileset>
</copy>
<copy todir="${buildroot}/stendhal-${version}/${docs}">
<fileset dir="${docs}"/>
<copy todir="${buildroot}/stendhal-${version}/doc">
<fileset dir="doc">
<exclude name="mkdocs/"/>
</fileset>
<fileset file="LICENSE.txt"/>
</copy>
<copy todir="${buildroot}/stendhal-${version}" file="README.md"/>
@ -666,8 +620,7 @@
</target> <!-- dist_client_starter -->
<!-- Run Java client. -->
<target name="client_run" depends="client_build">
<target name="client_run" depends="client_build" description="Run Java client.">
<mkdir dir="run_clnt"/>
<mkdir dir="run_clnt/lib"/>
@ -703,97 +656,135 @@
</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" />
<target name="run" depends="client_run" description="Run client for NetBeans trick."/>
<!-- END: java client -->
<!-- START: web client -->
<target name="js-prepare-contribs">
<!-- convert contributors markdown to HTML -->
<exec executable="npm${executable.suffix}" failonerror="true">
<arg value="install"/>
<arg value="showdown"/>
<arg value="--no-save"/>
</exec>
<exec executable="npx${executable.suffix}" failonerror="true">
<arg value="showdown"/>
<arg value="makehtml"/>
<arg value="--input"/>
<arg value="doc/contributors.md"/>
<arg value="--output"/>
<arg value="${srcjs}/contributors.html"/>
</exec>
</target>
<target name="js-prepare-marauroa">
<mkdir dir="node_modules/marauroa"/>
<unzip dest="node_modules/marauroa" src="libs/marauroa.jar">
<mapper type="flatten"/>
<mkdir dir="build/js"/>
<unzip dest="build" src="libs/marauroa.jar">
<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 || {};
<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"
}
//CI
}
stendhal.data.build = {
version: "${version}",
build: "${datetime}",
dist: "webclient"
}
</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"/>
<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="${executable.npm}" failonerror="true">
<exec executable="npm${executable.suffix}" failonerror="true">
<arg value="install"/>
<arg value="--no-save"/>
</exec>
</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="${docs}/contributors.md"/>
<arg value="--output"/>
<arg value="${srcjs}/contributors.html"/>
</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="${executable.npx}" dir="${srcjs}/stendhal" failonerror="true">
<exec executable="npx${executable.suffix}" dir="srcjs/stendhal" failonerror="true">
<arg value="tsc"/>
</exec>
<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>
<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>
<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 -->
@ -802,8 +793,7 @@ export function version(marauroa, stendhal) {
</target>
<!-- Compile web client. -->
<target name="compilejs" depends="cleanjs">
<target name="compilejs" depends="cleanjs" description="Compile web client.">
<antcall target="js-prepare" unless:set="exclude.webclient"/>
<antcall target="js-invoke-compiler" unless:set="exclude.webclient"/>
@ -812,14 +802,13 @@ export function version(marauroa, stendhal) {
</target> <!-- compilejs -->
<!-- Compile and stage web client files. -->
<target name="webclient_build" depends="compilejs,clean_client_data,build_client_data">
<target name="webclient_build" depends="compilejs,clean_client_data,build_client_data" description="Compile and stage web client files.">
<mkdir dir="${build_webclient}"/>
<copy todir="${build_webclient}">
<fileset dir="${srcjs}">
<include name="stendhal.html"/>
<include name="css/**/*.css"/>
<include name="stendhal.css"/>
<include name="stendhal-compiled.js"/>
<include name="LICENSE.html"/>
<include name="favicon.ico"/>
@ -828,23 +817,24 @@ export function version(marauroa, stendhal) {
</copy>
<replaceregexp file="${build_webclient}/stendhal.html"
match="data-tileset-path=&quot;/data/maps/tileset&quot;"
match="data-tileset-path=&quot;/tileset&quot;"
replace="data-tileset-path=&quot;/data/tileset&quot;"
byline="false"/>
</target> <!-- webclient_build -->
<!-- Create web client package for release and distribution. -->
<target name="dist_webclient_binary" depends="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.">
<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="${docs}" prefix="doc">
<zipfileset dir="doc" prefix="doc">
<include name="contributors.md"/>
<include name="ReleaseNotes.txt"/>
<include name="Licenses/**"/>
<include name="sources/**"/>
</zipfileset>

View file

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

View file

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

View file

@ -2,8 +2,7 @@
<project xmlns:if="ant:if" xmlns:unless="ant:unless">
<!-- Update version and resource info. -->
<target name="init">
<target name="init" description="Update version and resource info.">
<mkdir dir="${lib}"/>
<!-- update version -->
@ -39,14 +38,6 @@
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"
@ -90,8 +81,7 @@
</target> <!-- init -->
<!-- Verify XML files are well-formed. -->
<target name="checkxml">
<target name="checkxml" description="Verify XML files are well-formed.">
<schemavalidate failonerror="yes" lenient="yes" warn="yes">
<schema namespace="stendhal" file="${config_dir}/zones.xsd"/>
<fileset dir="${config_dir}/zones">
@ -169,8 +159,7 @@
</target> <!-- checkxml -->
<!-- Add date to pre-release test client. -->
<target name="internalUpdatePrereleaseVersion" if="PRE_RELEASE">
<target name="internalUpdatePrereleaseVersion" if="PRE_RELEASE" description="Add date to pre-release test client.">
<tstamp prefix="date">
<format property="iso" pattern="yyyy-MM-dd"/>
</tstamp>

View file

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

View file

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

View file

@ -1,77 +0,0 @@
<?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

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

View file

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

View file

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

View file

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

View file

@ -153,12 +153,6 @@ 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
@ -174,4 +168,3 @@ The [TimeUtil] class.
[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,7 +33,6 @@
<profile name="animal"/>
<profile name="offensive"/>
<profile name="patrolling"/>
<profile name="wander"/>
</ai>
</creature>
@ -206,7 +205,7 @@
<creature name="giant killer bat">
<type class="animal" subclass="bat_giant_red" tileid="animal.png:6"/>
<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>
<description></description>
<attributes>
<atk value="752"/>
<def value="161"/>
@ -983,7 +982,7 @@
<creature name="polar bear">
<type class="animal" subclass="polar_bear" tileid="animal.png:3"/>
<description>You see a polar bear which lives in the icy desert. Beware! It can take you down with its powerful claws!</description>
<description></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>You see an elder cannibal. For years it has eaten humans. It will not stop until its hunger is satisfied.</description>
<description/>
<attributes>
<atk value="315"/>
<def value="111"/>

View file

@ -234,7 +234,6 @@
<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,7 +357,6 @@
<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="wander"/>
<profile name="patrolling"/>
</ai>
</creature>

View file

@ -11,7 +11,6 @@
<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>You see a pelt of animal skin. It's used to make clothes and leather armor.</description>
<description/>
<implementation class-name="games.stendhal.server.entity.item.StackableItem"/>
<attributes>
<quantity value="1"/>

View file

@ -230,24 +230,4 @@
</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,25 +147,4 @@
</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="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"/>
<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"/>
<merchant name="Gwen" flags="configure,noOffer,removeDetailColor,confirmTemp,confirmBalloon,resetBeforeChange"
note="do not expire"/>
</shop>

View file

@ -89,70 +89,6 @@
<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"/>
@ -2384,7 +2320,6 @@ 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 -->
@ -4338,6 +4273,7 @@ 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,7 +115,6 @@
<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">
@ -161,7 +160,6 @@
<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 -->
@ -1084,7 +1082,6 @@
<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,13 +277,14 @@
</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,10 +12,6 @@
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
@ -55,7 +51,6 @@
<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 faint incantations of dark magic from below. The place reeks of danger.</parameter>
<parameter name="enterMessage">You hear faintly incantations of dark magic from below. The place reeks of danger.</parameter>
<parameter name="warnPlayer">true</parameter>
</implementation>
</entity>
@ -1345,7 +1345,6 @@ 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,11 +648,6 @@ 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"/>
@ -674,14 +669,8 @@ 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"/>
@ -766,14 +755,8 @@ 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"/>
@ -845,14 +828,8 @@ 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"/>
@ -924,14 +901,8 @@ 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"/>
@ -1003,14 +974,8 @@ 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"/>
@ -1082,14 +1047,8 @@ 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"/>
@ -1161,14 +1120,8 @@ 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"/>
@ -1193,11 +1146,6 @@ 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
@ -1272,11 +1220,6 @@ 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
@ -1398,9 +1341,6 @@ 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" accessible="false">
file="Level 0/sikhw/desert_n_w2.tmx">
<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" accessible="false">
file="Level 0/sikhw/desert_w2.tmx">
<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" accessible="false">
file="Level 0/sikhw/desert_s_w2.tmx">
<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" accessible="false">
file="Level 0/sikhw/desert_s2_w2.tmx">
<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" accessible="false">
file="Level 0/sikhw/desert_nw.tmx">
<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" accessible="false">
file="Level 0/sikhw/desert_w.tmx">
<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" accessible="false">
file="Level 0/sikhw/desert_sw.tmx">
<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" accessible="false">
file="Level 0/sikhw/desert_s2_w.tmx">
<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" accessible="false">
file="Level 0/sikhw/desert_n.tmx">
<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" accessible="false">
file="Level 0/sikhw/city.tmx">
<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" accessible="false">
file="Level 0/sikhw/desert_s.tmx">
<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" accessible="false">
file="Level 0/sikhw/desert_s2.tmx">
<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" accessible="false">
file="Level 0/sikhw/desert_ne.tmx">
<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" accessible="false">
file="Level 0/sikhw/desert_e.tmx">
<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" accessible="false">
file="Level 0/sikhw/desert_se.tmx">
<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" accessible="false">
file="Level 0/sikhw/desert_s2_e.tmx">
<attributes>
<parameter name="color_method">time</parameter>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 843 B

View file

@ -1,127 +0,0 @@
<?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>

Before

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 720 B

View file

@ -1,121 +0,0 @@
<?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>

Before

Width:  |  Height:  |  Size: 4.3 KiB

1779
data/languages/en.txt Normal file

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.=
zucchini=
You see a zucchini. It can be an ingredient, or you can eat it.=
courgette=
You see a courgette. It can be an ingredient, or you can eat it.=
collard=
You see a collard. It's rare and strangely magical.=
@ -658,7 +658,8 @@ You see a fresh leek.=
onion=
You see an onion.=
lettuce=
salad=
You see a salad.=
spinach=
You see spinach. It is enriched with vitamins.=
@ -1052,10 +1053,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 in fertile ground where it will thrive.=
You see a bulb. It can be planted anywhere, but it will only thrive on fertile ground.=
seed=
You see a seed. It can be planted in fertile ground where it will thrive.=
You see a seed. It can be planted anywhere, but it will only thrive on fertile ground.=
giant heart=
You see a giant heart. This proves that a giant was defeated, and has magical properties that you are not sure of.=
@ -1097,7 +1098,6 @@ 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 bar=
iron=
gold bar=
You see a gold bar. It will make beautiful jewelry, or fetch a fine price.=
@ -1266,9 +1266,6 @@ 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
@ -1411,9 +1408,6 @@ 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
@ -1424,7 +1418,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.=
@ -1642,7 +1636,6 @@ 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.=
@ -1710,7 +1703,6 @@ 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
@ -2250,7 +2242,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.=
@ -2277,7 +2269,6 @@ 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,2 +1 @@
build
dist
Level*

View file

@ -1,75 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.10.2" orientation="orthogonal" renderorder="right-down" width="64" height="128" tilewidth="32" tileheight="32" infinite="0" nextlayerid="7" nextobjectid="1">
<tileset firstgid="1" name="../../tileset/ground/brown.png" tilewidth="32" tileheight="32" tilecount="5" columns="5">
<image source="../../tileset/ground/brown.png" trans="ff00ff" width="160" height="32"/>
</tileset>
<tileset firstgid="6" name="../../tileset/building/stairs/stairs.png" tilewidth="32" tileheight="32" tilecount="12" columns="2">
<image source="../../tileset/building/stairs/stairs.png" width="64" height="192"/>
</tileset>
<tileset firstgid="18" name="../../tileset/item/corpse/skull_dark.png" tilewidth="32" tileheight="32" tilecount="2" columns="2">
<image source="../../tileset/item/corpse/skull_dark.png" trans="ff00ff" width="64" height="32"/>
</tileset>
<tileset firstgid="20" name="../../tileset/plant/bush/various_small.png" tilewidth="32" tileheight="32" tilecount="9" columns="3">
<image source="../../tileset/plant/bush/various_small.png" trans="ff00ff" width="96" height="96"/>
</tileset>
<tileset firstgid="29" name="../../tileset/plant/mosses.png" tilewidth="32" tileheight="32" tilecount="16" columns="4">
<image source="../../tileset/plant/mosses.png" trans="ff00ff" width="128" height="128"/>
</tileset>
<tileset firstgid="45" name="../../tileset/plant/bush/large_brown.png" tilewidth="32" tileheight="32" tilecount="9" columns="3">
<image source="../../tileset/plant/bush/large_brown.png" trans="ff00ff" width="96" height="96"/>
</tileset>
<tileset firstgid="54" name="logic/portal" tilewidth="32" tileheight="32" tilecount="24" columns="8">
<image source="../../tileset/logic/portal.png" width="256" height="96"/>
</tileset>
<tileset firstgid="78" name="../../tileset/logic/creature/animal.png" tilewidth="32" tileheight="32" tilecount="32" columns="8">
<image source="../../tileset/logic/creature/animal.png" width="256" height="128"/>
</tileset>
<tileset firstgid="110" name="../../tileset/logic/creature/rodent.png" tilewidth="32" tileheight="32" tilecount="8" columns="8">
<image source="../../tileset/logic/creature/rodent.png" width="256" height="32"/>
</tileset>
<tileset firstgid="118" name="../../tileset/logic/creature/dwarf.png" tilewidth="32" tileheight="32" tilecount="8" columns="8">
<image source="../../tileset/logic/creature/dwarf.png" width="256" height="32"/>
</tileset>
<tileset firstgid="126" name="../../tileset/logic/item/resources.png" tilewidth="32" tileheight="32" tilecount="6" columns="6">
<image source="../../tileset/logic/item/resources.png" width="192" height="32"/>
</tileset>
<tileset firstgid="132" name="logic/collision" tilewidth="32" tileheight="32" tilecount="1" columns="1">
<image source="../../tileset/logic/collision.png" width="32" height="32"/>
</tileset>
<tileset firstgid="133" name="int_sandstone" tilewidth="32" tileheight="32" tilecount="15" columns="3">
<image source="../../tileset/building/wall/int_sandstone.png" width="96" height="160"/>
</tileset>
<tileset firstgid="148" name="door_s" tilewidth="32" tileheight="32" tilecount="6" columns="3">
<image source="../../tileset/building/door/door_s.png" width="96" height="64"/>
</tileset>
<layer id="1" name="0_floor" width="64" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu3WwQ3CMBBE0UgUnwrolxIAxd5Z2+/wz+wbBch9XdctSZKG9CosbeXn5+fn509skHb+6k/fw8/Pz8/PP8q0w/80Pz8/Pz8/P/8s/4z4+U+Jf0//6c8/Pz9/T3/FZ/Lz8/Pz83fzd+pkOz8/Pz9/xv/kP3pW/Pwd/JV3pOLn5+fn/+7fcSf+td5XOvpXfhdM+zpssMJWaXva32WD9C5pa9rfcQN+/pP91RukrfzZXdKm9AZpD3+9ubO/8rePP+/l39tf7enkT9tS9rSr2p62rGKf/VuTiJ+f/0z7r/70jfxn+2fe1d0/+7aV7SNu5O9p58/7ZzfittTmFf7E87mKP/2d49/TP7uq3bp2sv2pP317lf+9sf+ffdK3SJIkSZK0Uh8Z1RuxAIAAAA==
</data>
</layer>
<layer id="2" name="1_terrain" width="64" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu2cy27EIAxFs6rUD5+q76rzxQ0LFERJYhhsbsw9ElIXHSUHDOHhZFkIIYQQ0ovPtXwZlA8roUp+jK7zbXSdWuivx3Py94z+KfTH5G0tLwbXQfUPpDFwW8u7Qnk18Ggl9UduJy3ov0H/+aD/Bv19ULOuvSe/8+LfOq+lvw/o3wb9fUD/Nujvg1b/38XH3r/Vvp6EETEV9vU09rEkJd9P9NKnpOSxR38fSNeU9+x3Xvz5TG2D/j5A9s/HJo05F7J/vLcnxWtewV/zmvRvg/76xHuLOTez+efrPY18A+maMl3/3ZTuBRmP52k10H+D/vNB/w3622KVz4+aT4G07x9A8dfKa0XLe93zn2Ucon8Z+s8B/cvQ/z+luRLqe4pSavxL/3v1ONnzL+W15Oe0Aa/+UjTyfyz7Vk3ei8V7bymhbpHGlxFrJaQ62IsV7bhAqoMSFnGBXAdW/QK1DizHBcTn7ez+Vu+EBxD9A/wugM2zEdV/j95942r+gZ59g/7XIN0rKa2bW0H0L+0L9XROQfSfff5DfztG5EbXvr+hhUVuXHC38qlB2z22+SzueYyXvEflAGjnBEhjHHGs7YF0vKa/TyT+nvOwz/w9uwfO/L3GfYT+xyD4a+ZaHPkj9P29+Umv858j/9FtfzY361EHRzmvo9te8mx+tI2Qc77of0yPGM3PauL5hGYuj3T8Pjov0eqfaGd3pfvRHJuu4K/ZN2f31/72U+zPrf4Iz+VHiD7S8TWd/1zdPdDavzy4B5C/A2DB2fgSx4d8v9lD20uI9TOLLyGEEEIIIYQQ0os/y3joQwCAAAA=
</data>
</layer>
<layer id="3" name="2_object" width="64" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu3by26DMBCFYZ6hWSCxZd17+6ZRL29bW0okd2QEaTG25/yfZCUhUsRgA+NxGAYAAIA23NXegQLGS1M0Je/TY3Ay21WPj+Vx/KfS+E7mO/s5mjLbAAAAAByDfDxPdf46Dprzd8WYI1ufmKvsBVqS1m3mwf+YuN4DvdfqAAAoKc0fFO+pMZ9QnEukbPzzoJFLpnJzyjn5TplC/GrjfY1Cny9Rqi9RUwYAADnkxX2j/4B+cf7qYn6OKPd8jpq16+BkmgeKa3L4O3IFbLF1fcPbeBoz79XW/tb6finX8LQmlotlad1vKe4ec4x0nI8L2+13quzx4RoB+NXj9fwoSte+HI/xb/mfk42beoQPe9zfe6xJ3jrePbP95zX2ErksuQJQDufXb16vzTm5vEIp/sg+1w8tPebW2E8P57z6GL0P7SG0xwK/3Xr9PdaBnkJ7Du2lwO+3HP+1BvYa2lto7xX3pbaW+6k0pedEraNjn5PX/9Sg91rHbbHf07hKz6FajB/H8Nb3S7Umpf98qMR5q/Pl9aPqXtTzGdpXaN+1dwQAAAAAgM78AClbHpgAgAAA
</data>
</layer>
<layer id="4" name="objects" width="64" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu3aTQ7CIBAGUI6lF3DpUfzZ2OrGq3sCAzbgQHlv1aSk/ZoyCWWaEgAANa2Z86+CazxrBNmRY3QANsvN95J6ABhFbg0AAIxliQ5A1x7RAQKoCQAAappxTT3jM9OPQ9B9e/mWPEcHIFTr9/8uHLekmJro4Z+b9csxAACxbhXG3msEAQAghL1zZmPO09olOgAA0NQve+oAsGcz9Iiv0QEAAJK+A/3Sd2V2agD+r6RHo48DwBan6AAAAADAcD5772juAIAAAA==
</data>
</layer>
<layer id="5" name="collision" width="64" height="128" visible="0" opacity="0.37">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu3TwRGDMBRDQRefwtNBJiTGz8BqRme0H3iNMV6qqqqqk7oitZGfn5+/ukHt+9Zf7+Dn5+fn5+fnn2E6knozPz8/Pz8/P/9q/xmp71Dfvt7Cz88/3/Vt6s38/Pz39694Jj8/P/+O/p36ZDs/Pz8/f7+D/3n+nbKLv/4e+Pn5+fn5+ffx3/FO/L+n3n6lWx1Nba39Y8LeO9ylttX+sYGv9o/AtJt/LHDw732D2sjf3qW21DeoHfz8/GvNV/CvSu3k56/8d/McCft6d/1P1e+53lfa+fuNpb/eV/rrbfz8/I2/3vVp45P8Z++7on3mTv5r+s98Zu0u38+K/LOn/OZmhX9f/4r7/uqvt5f+evdM/9HUm/nX3qfeoKqqqqqqqqrX6huhbEomAIAAAA==
</data>
</layer>
<layer id="6" name="protection" width="64" height="128" visible="0">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu3BAQEAAACAkP6v7ggKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABim/B8BAIAAAA==
</data>
</layer>
</map>

View file

@ -1,112 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.8" tiledversion="1.8.4" orientation="orthogonal" renderorder="right-down" width="128" height="128" tilewidth="32" tileheight="32" infinite="0" nextlayerid="9" nextobjectid="1">
<tileset firstgid="1" name="ground/brown" tilewidth="32" tileheight="32" tilecount="5" columns="5">
<image source="../../tileset/ground/brown.png" trans="ff00ff" width="160" height="32"/>
</tileset>
<tileset firstgid="6" name="logic/collision" tilewidth="32" tileheight="32" tilecount="1" columns="1">
<image source="../../tileset/logic/collision.png" width="32" height="32"/>
</tileset>
<tileset firstgid="7" name="logic/creature/chaos" tilewidth="32" tileheight="32" tilecount="7" columns="7">
<image source="../../tileset/logic/creature/chaos.png" width="224" height="32"/>
</tileset>
<tileset firstgid="14" name="ground/ground" tilewidth="32" tileheight="32" tilecount="33" columns="3">
<image source="../../tileset/ground/ground.png" width="96" height="352"/>
</tileset>
<tileset firstgid="47" name="ground/water/pool" tilewidth="32" tileheight="32" tilecount="72" columns="3">
<image source="../../tileset/ground/water/pool.png" width="96" height="768"/>
</tileset>
<tileset firstgid="119" name="ground/brown_edges" tilewidth="32" tileheight="32" tilecount="18" columns="6">
<image source="../../tileset/ground/brown_edges.png" width="192" height="96"/>
</tileset>
<tileset firstgid="137" name="ground/brown_corners" tilewidth="32" tileheight="32" tilecount="8" columns="4">
<image source="../../tileset/ground/brown_corners.png" width="128" height="64"/>
</tileset>
<tileset firstgid="145" name="ground/earth_edges" tilewidth="32" tileheight="32" tilecount="18" columns="6">
<image source="../../tileset/ground/earth_edges.png" width="192" height="96"/>
</tileset>
<tileset firstgid="163" name="ground/grass_corners" tilewidth="32" tileheight="32" tilecount="24" columns="6">
<image source="../../tileset/ground/grass_corners.png" width="192" height="128"/>
</tileset>
<tileset firstgid="187" name="ground/rock/green_crystal2" tilewidth="32" tileheight="32" tilecount="20" columns="5">
<image source="../../tileset/ground/rock/green_crystal2.png" width="160" height="128"/>
</tileset>
<tileset firstgid="207" name="ground/rock/pebbles" tilewidth="32" tileheight="32" tilecount="3" columns="1">
<image source="../../tileset/ground/rock/pebbles.png" width="32" height="96"/>
</tileset>
<tileset firstgid="210" name="ground/rock/blue_crystal" tilewidth="32" tileheight="32" tilecount="20" columns="5">
<image source="../../tileset/ground/rock/blue_crystal.png" width="160" height="128"/>
</tileset>
<tileset firstgid="230" name="ground/rock/rocks_3" tilewidth="32" tileheight="32" tilecount="16" columns="4">
<image source="../../tileset/ground/rock/rocks_3.png" width="128" height="128"/>
</tileset>
<tileset firstgid="246" name="plant/bush/various_small" tilewidth="32" tileheight="32" tilecount="9" columns="3">
<image source="../../tileset/plant/bush/various_small.png" width="96" height="96"/>
</tileset>
<tileset firstgid="255" name="plant/mosses" tilewidth="32" tileheight="32" tilecount="16" columns="4">
<image source="../../tileset/plant/mosses.png" width="128" height="128"/>
</tileset>
<tileset firstgid="271" name="logic/creature/hybrid" tilewidth="32" tileheight="32" tilecount="16" columns="8">
<image source="../../tileset/logic/creature/hybrid.png" trans="ff00ff" width="256" height="64"/>
</tileset>
<tileset firstgid="287" name="ground/grass_2" tilewidth="32" tileheight="32" tilecount="21" columns="3">
<image source="../../tileset/ground/grass_2.png" width="96" height="224"/>
</tileset>
<tileset firstgid="308" name="ground/water/whirlpool" tilewidth="32" tileheight="32" tilecount="8" columns="1">
<image source="../../tileset/ground/water/whirlpool.png" width="32" height="256"/>
</tileset>
<tileset firstgid="316" name="logic/creature/mythical_being" tilewidth="32" tileheight="32" tilecount="24" columns="8">
<image source="../../tileset/logic/creature/mythical_being.png" width="256" height="96"/>
</tileset>
<tileset firstgid="340" name="building/wall/int_sandstone" tilewidth="32" tileheight="32" tilecount="15" columns="3">
<image source="../../tileset/building/wall/int_sandstone.png" width="96" height="160"/>
</tileset>
<tileset firstgid="355" name="building/entrance/shadow" tilewidth="32" tileheight="32" tilecount="3" columns="1">
<image source="../../tileset/building/entrance/shadow.png" width="32" height="96"/>
</tileset>
<tileset firstgid="358" name="plant/flower/hothouse_flowers" tilewidth="32" tileheight="32" tilecount="72" columns="6">
<image source="../../tileset/plant/flower/hothouse_flowers.png" width="192" height="384"/>
</tileset>
<tileset firstgid="430" name="logic/creature/insect" tilewidth="32" tileheight="32" tilecount="5" columns="5">
<image source="../../tileset/logic/creature/insect.png" width="160" height="32"/>
</tileset>
<layer id="1" name="0_floor" width="128" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu2cy4rbQBBFFfIHWSZg8JcMhsAku0wW8x2B+X9IDDHRKGqpH/W4VX0Xd+lRVZ2jatmD/fphWV4ZhmEYhmEYhmEYhoHPx6Uc79oYH+7knzc13Mk/Z1rYk3/stLIm/zwh93nD+36+SDAn/7gh+zkifZ+TPX60mZM9Zqy4kz1OLJmTPU48uJP/nLzJPjZ7ib/lPYMZo3Gvkjl+NPcz2WPHYjeTO154Hs8bsp83fBafM5rPeAxuRt/T0YO4kWRP/rEizZ4exMgIT3oQN1LcuBfiRYMRPcCPNhc+J+DGkgMdwIn37OkBPnereSPWlDHoM6YHGLNlrXkScZZ8Lph7fnw2nHtmvb0g98Q52fXl0aNVTZFmgsBfqnfPehD6j8hacg5edWbjjTTTSLVm4o4yz2j1RmeONs9o9ZI/+WdxIFoP3lyzuRCtZm+W2TyIUmdGp8gSLz38vF2IuHfQ08rMYy9EPncipGe2Vh54nDPWfiNkpB9JF0b2DQLzzA54zlFj1si1oTrQ2gvajCP5icof7V5DqCELf00HtDhEYJ/VgdGeZuMfyYGWuXl4R/44DpB/Xv418yP/3PzPZkj+svV+Xv7Fm3vtDMlfh//XP/nyN8gOkL88/9uK/V6Q+Es4QP7v+a/v/ZrM5IC2VxH5Wzigzb+WF/nXRYqJtQNn15mB/7MQf2kHpO/Pnmtp1IzGX2IHaPGx4l+6FvnXs9biZOmA5i5BYr/lX3MGeNTYMk9v7pH5n+0ArxrpgD9/lJq1HcvigCR/tJrJX67nTwH504Gc/Fvr15xLRA96ajrjb82+tY9oDmi4MFIHIv/W3qI6MOKC1LUz8O+dpTd3hCCe/6OMou8D8h/nRAf6+O99BuzNvZeR1b6JnDv/KDugt0c6MDd/etDG/wcofwku3jvHm3eJP/r7QE8Heq5ptVtGr1HLP5sDvR5I/23N2rPzl7qPNK7pPZdZ+Hs5cHZd75nMxN/TgVIN3vMY4X/bYY/OH8kDlPTyv9/7P5f/Pw/07oceyPde2v17Z4F3X9b8I3rQ2tuW/X33v5F/OA96e9q79zPw1/QAyYfRHlr40wE8D6T5P5/wj+jAuvarsg+R2D/47+2AX0n5r6O9F7T8kKynxP9tycP/yAFvH7yzx399Btx25uTNUtsFbybe/Gu+C+zNkB7o8rf+LrB3ZvWg9P+f2t+D8OZGD/T49/wmkDc/eiDHv9eBbE5k9uCMPx3IvQ/W/I8ckPIgqwveHC3404P3/C8JPOjhX/veIKsfR/yjObDl37IDXjYZ5X05mCmKI+s615mNf8mJpwpmT4WUZluas4YXNde+LPu1zs7/aDc88r3jddv9IOHH3t5pzfa1Ec+BPf7SPmj59K0QK/4ZzoEa/mg+1PpS8mObK/l3p4cPoldXIQ9m49/qBvpueeyDrQu1bkR7BtDkL+2P5Rm1PhvOEpl/FBckd1Drs8SZBxnYZ/ZD4lw48iDD54D0oN+DyOx/A/Jq0JkAAAEA
</data>
</layer>
<layer id="2" name="1_terrain" width="128" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu2dS48cNRDHPUoUKQp8JT5FVgQWVpsD3wEOUQ6QA5G4ceLUIHGCj8GR55lTeIblERFIwkoBMcVOhdpaP6r86LZ76ic5k52Z7umZf7lctstu5wzDMAzDMAzDMAzDGIHDjXOveMrLm6WvzGgJ6n5zW566s4LA/181/VcJ1R34i7xG7cD0Xx+HO91P2fNPSfndWf0fnVCbfpNoChpTOzjdPXd9+56XtuVF039IDpnOPnj9p1i9Hxeq/Z/ufEznPH9j20/twfQfj1hMF+KUPJr+Y3MU0ezL3SOv+1x3bPut3e+XVFxHNZb4AHqMad8nhx6dJdqiro8E7zXt+4O36SG4LfwqPP+JM5/fG766XhMeA5j2fSCt65xfCj4T/IbF+svA4zicg5GA43NQDnb6feF53wN3/px/b8s/7BxW9+eHjtFINYe66tOM9vuekPdyqM2Y7svA51uRk8gx1xOaxfr9FPPzyxHS3Qedf5HU0yNyTl9sZ/V9WSRzMSW++QY71nz88vA+XKjOW997fWB95zEYz61CrF1eDxJfT7Ecm/XA+3SSMVjTf2ykY7W+/vjD3ePxxnKtR+TQE9v54rzfPM/z/pqNw45HatyFao79u4PAMfBe8wNjkBrL4X152g8Hm3niOQYxO+iX1PycpC9Px2oOEuMCaAe2Hmt5pGN42nG7UHsA+ObzzDfMi2ROHuflcsbwbiT8AJ6fY3bQnlSdrzW3wtsEDcdmA9VJ1fmS+p6Cz+XE7AH9gvmCOlDdQ7m1c+fM3BD6BehTmC/Ip0V8V5NUrIiYL9AjbeeXnqOV2gD2Hc0G4khi+97m5qW5XoD5gouk5mtwnVwvdZ4D+n+vPGbffYE0Fwfprc5TjiKxqQ/8rvtmAzlraHqt8xT0/39kHMvHk+eyh9B61dpj21xzTT3puc5TQu2/b04ptr8HcFzpt0/pKl3Xor0e3/oZKSOshfDVm5L1gHytP8DHkFr5hVhd9OVJ+ea+cu2KMoKPB7BP+tidxXv4Pb/OPF/s9+e+Y+k8lNj8eIyvAs+PtgZCm0Ma4pQ9Ivg7hXKSSvX/sezw6ixtz1okfXzeB4zlmp86v+8PMdrvlWK07wP639s+fkOeA7/vyytqUVr6yFzf/iDzONj/bLS+r6/+994/0fS1ahynZam+bw6o/7fb8p3rX/va/gfmOCA3Psc2Qsfw53seG+c5AD1r3wJpjiQnlWPto7Vf8PXhe7S5XtHYAsZ50nlSH7XGQfjc4g/urC9Pr9PQkdKV/q7SvJkYObZAdcf2O3adhg5fbIzjh744Pze3MidekI7b1NRfOrfSeu5lTmI6xvp6mtzK2Pl9vxlqD/10uscWwOfqSvVvsT/gSH3kVDsg/S6l9nCs1OGeOxvTydG/9Z6QQM99Io7EBrTfRRozPIy/HEQz91Qyt1nKKPGJZJw8x6/lxAy+uSe+L6f0d601/5PLKG2BtJ9XYs8xW9CMTz1RXIcmx7MVI9kA16fVWF9pvDCS/sAo7QAS+91a5MTD5+GYjm9uFfoCdJ7W9G+LpD2o+Z18OsXaBNO/PZoxwlJQJ6zjqfwK038eYjZQsw0IrcWguTa0X7BW/Wk/tRdiv2Etu/Z9RizPaq36c3oYUw75AGifa/kA0Ck0FnSf/F877je6/sjSOTex37GGDUjHH7Q552vRnzO3Pfj0oXsq1fh++Bl0rpffT1n7OWvVnzPHGFNrHwCE5g2wL2j6h6E+4barbw+15gpzPwvGh0x/GaB/izlIen8UH7XHBDDeA04yzl+Sv1aTlvq/vS1vsXKHvF5zPeKcY0K+e7GU7Au4FK1yzlH3O6k3EmrYwlxjQjVZsh1oUfdBe43uPkpsIRUL9jBuQVnSB9TWv4b2HLzG14TXqtlDbd9tQKP/R4nXW2jvQ5rzN9o+eku0Axr9Jxe3gduF1yJFes2aOtWDL5hb/5zY773Ia73pD3AbCM3b97CXYsn+0BpK9kYJ6T+X7we0PlvrB3poD1rYQumeOJc3Yf3nqvuUEj+QYmlfQClZ41Z7T5ye9Nf25bR5nT3ZABC7/+9ce3z0pD8lpx8rua9XL+1BL4T0f2db3pjzQhg5+ktjQ8DswLkrkfYfWNIH5I7rjRwXLMHkwmMAS7cBSM48nCbW3mcbgH22em0DkNJ1YD4b4HuX7mt78FzHbQBSOqeh6W/tkx1c3n3HyfXdBtTSJJVPAuTmflFG3Duq134gpbSd1sQFJTmvvB/6uWvjV0J7yGg+A/f87T0GQFrnftb4XK4/rCXC3OIadkD3qoI8xU+35TN35tugaH1XbBwY6MkHALXXgtX+XDgnakJBG/jEyfbJj+2fHxrbAF+T03aNpD9Q0w/E1hogJ+RzU/VXO+9Ltcy5PwyAcQ2cax/0B2q3Bdr2INTmYpypvcdFDrgvN123ptEf+n+wR/eI+gO14ypNXEDrLd9T7Kc6l5N1nxTtHNFo7b+PJe3AR+7+6Ln34IB2Pzf3+91t+TDy+gj6I7XzX2vsR0uRtguhe+Lwc5XkA1zdpLUHRtK/1Vh+KEb4WXke2Fsu1zfQNeu17ocV8/vISPoDrcdwS31Cjbiwlp+T6N/bGJCU1vN6kj3sWgDjB7X0n1x6HQAwqg3ccvOMw6dyudA+HsdP8x8+G4LnWt0PT+IDgNHaAeDNbblL/l5qfi8n12+u+3utWX8AbADXKqMtLL3HTU+sXX8K2sJd9vw+zfsj2J+Q6j9qDODD5xOAfbSDycliQGANPoDj8wn7ZgcaH/C6W48foOyzHUj1R9AOsKzJHmLx4lrtQKs/h9vDWmyil/5jK67uvsfk5DGAlLXEi/viD0p9gA/qF9ZgC7fY32taO9JCf8oaYkeuPzC6L8A5zMnVbwN8+GKFUeIGn/7IqPddoLT2ARJS9rGUjVxyK9SfXXMP+ksI2UiJXVwSlNXpz5i25X1S5mgPaiLxHSUllis1YhxA8w0fwT/s2ic3tj0swWh+4HLgevkaaWBy+bbwsTtvS2u1q9H0v4Dw+icn1xO0/yBwngduvr4H54UG51zTmMAzyPe5H37XMyZ33h5C2oeOobYQ8xu1fEltOxjBB9DcNFjfdqWja56cznYeeY5d0g5G0B+R5i5quMqP8ZxDu9bxQjwSua5rm/I2JdcWWt2DYSku5Dlv/tdX0hbkcE1gP8H3EiZXHl9q7WCkuq+lRh5rjRLySc/vnue+osa4VsoOaq3JmYt/ATb8NvgAAAEA
</data>
</layer>
<layer id="3" name="2_object" width="128" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu3bMQrAIAwFUHOrnqU6tPe/RCkOHUUQrPjelDGQ5ROSlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2dcbsDpjpMn8AoEORHQAAaMhRc6O9437eXeMdXw0AAAAAAAAAAACMcbjLAwAW5b8A+sn/AAAAAAAAAAAAAPAvD8b9VLMAAAEA
</data>
</layer>
<layer id="4" name="3_roof" width="128" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu3c20rDQBAG4Lz/O1lBL6q3HloVD/sceuMUWppeGKOwmbL7ffBDSgM7sJDdzEKGAQAAAAAAAAAAAIBaPiNf2UUAAAAAAAAAAAAAQEdKdgEAAFRVRtebrCJY1F3kPrsI0mwjTxP/l4XqIMdr5C3yuP/tud+f58hLdhGkeY98ZBcB/MvDcFy/6Y/1u2/Wb8b0dNq3e0//6Rtbv/V0aNuhpwMAQJt27wIluwigqpJdAGnKjHv0/fqm79e+qbNefb/2Oevtm7NeDuz3+ma/1zf7PQAAAAAAAAAAMlxEVtlFcGI8J7eVx7qKXFceg79Zck7WkZuFxmKeqTm5rDhu7WcNAHA+rPsA0Laa/QMAAAAAAAAAAAAAAADOxzeEbpmpAAABAA==
</data>
</layer>
<layer id="5" name="4_roof_add" width="128" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu3OAQ0AAAgDoPfPZyBj3E1IQAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwy7QDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABPLYaZVTEAAAEA
</data>
</layer>
<layer id="6" name="objects" width="128" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu3cQQqDMBAF0Liytr1C73/NIrgqoVA1nZh5b+PGxQdlNF9MKQAAAAAAAABAhHt0AAAAAAAAgIE8ogMAAAAAX83b0Roe8nhGBwAAAICij8pqTy/xmk6PcViPma7MPBjf5zWeq2cBtOeZA0BrvscDe9XmR6v3V91Wv3QmwEp/AQAAwC9u0QEAAAAAACAx/xBAbvbzBQAAAKBGXwQAAFyNven+w3oRODIHzBDO4l4a0xIdAOiOeQ8AAAAAAAAAAAAAAJDXG8ZnpKUAAAEA
</data>
</layer>
<layer id="7" name="collision" width="128" height="128" visible="0" opacity="0.58">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu2T22prQQxD91P//5NLHgohNMlcbC95tgSihXP2WNZyf67r+rFt27Zt27Zt27Zt27bl/Z/oTDbD/U90Npvj/vfTPs/fROezazi/E53b5thfAtltjv0lkN9muF8CO9gcfzq/ncN55Bt6JzuW+Yzo3WyG+yWwn73HfPdG6F3tee6j373+2/P/p3e157XzDr2rvcY+6i16XzuPVdQ7NsOdzmabvV3H/Fl0TptjfwlktTn2l0Bem2N/CWS2c5mP3gW9hx3P/k8j39C72DH8d2+G3sleZxj1zspbNsf9SnozaoatyX7lBiLm2ftsqudVZrAZ9iv3QHd0ohW7/ia6sxOs3u830fk6u0unI6IzdnOnHkdF5+zgrt3NiM6q5u59rYjOTPukjlZF51buic5awZ/cuSqP4u6q/J/VNU/Wuyq+nn6+/p4lBf6Rohkq/V2NqEvOUdEcM9hn9m7+Ou6wQ4V25tD9RHRK56H574ruaKVTOgO9f6bo/ez4W9j9xtb3J63ezac3ojI/56E77O53WrmZT8rKS/fX3e+08+03ReRbecuOv4GdeyAyRu9QkanTDax2OfutGvPMfJ1vQLXfKtFMIzupmPFp9k4WSjRTxRuIYNKB/Z9oppF8yNtbzaEgmmU0D2reynwF0Sw73MCMzJ+/gYw5o7zMn7+Bylvbma0gml8WF4L97FwFrWSlmY/0WHVjO/MUNJuVZj3LJ3vGziwFncC/6gY+zTJ/8zf/+96A+fOO2HN1ZkbmCq3kpDtb6ZO+TcUbWM2YsVt2nzTju/GvyjUzm+asdgM7+ap2yeqT5q1wAxn8szLO5u14A9WK5l+hjE5p7gT/3Wxd+He7gewuo/J04t/1BiJ7jc5AsP80P7JHmnfUHWTO7sh/JjPNWs3f+iGV9fdEd67kkW4oRe4V/f4pHumEUvRuWXM6e6QLBWXfAs1Bhf+7Lmhl7Ro9o5tHe6CVvXPWLHWP7k+rkn/GTFWP7q6iqv0jZmXmruZ/8g2M7pbZ7W7215kn83+I4L86Nyt/RMaZN9SkfgOk7sD/oegbmNlVjf/Py+934P9Q1g3M7qzS2e5+Kvc8K5U7oBS1V+cOHrrbHUTu0233/5TJP6KPqC4zdjiB/0NVN0D2Us2/2w08VHkHlf1k5VXaMUrVN5DZXUUe87+PV/rqKLpnVa901V1050pe7egE0d0reLWf00Rz6Mbfd3CGo7s4RTQXBf5RPXQXzYjkH7V/d9GcSP7RHXQXzYziH71/V9HMaP5VHaiKZqbQMZ2bvBF6Z9X+6F2q7oLeTb2n1Zl0F3f0fwzURHd0sk8U3Wknq4jMQjPoyF/pdqJEs6DdXVE70BxUfUfRnav6taPTRfdtf7/DCtH7RvsXoMjHOgAAAQA=
</data>
</layer>
<layer id="8" name="protection" width="128" height="128" visible="0">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu3BAQEAAACAkP6v7ggKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAauuOl9cAAAEA
</data>
</layer>
</map>

View file

@ -1,158 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.10.2" orientation="orthogonal" renderorder="right-down" width="128" height="128" tilewidth="32" tileheight="32" infinite="0" nextlayerid="11" nextobjectid="1">
<tileset firstgid="1" name="ground 1" tilewidth="32" tileheight="32" tilecount="33" columns="3">
<image source="../../tileset/ground/ground.png" width="96" height="352"/>
</tileset>
<tileset firstgid="34" name="water 1" tilewidth="32" tileheight="32" tilecount="72" columns="3">
<image source="../../tileset/ground/water/pool.png" width="96" height="768"/>
</tileset>
<tileset firstgid="106" name="water 3" tilewidth="32" tileheight="32" tilecount="72" columns="3">
<image source="../../tileset/ground/water/pool_corners.png" width="96" height="768"/>
</tileset>
<tileset firstgid="178" name="grass 1" tilewidth="32" tileheight="32" tilecount="36" columns="12">
<image source="../../tileset/ground/grass_edges.png" width="384" height="96"/>
</tileset>
<tileset firstgid="214" name="grass 2" tilewidth="32" tileheight="32" tilecount="24" columns="6">
<image source="../../tileset/ground/grass_corners.png" width="192" height="128"/>
</tileset>
<tileset firstgid="238" name="tree 1" tilewidth="32" tileheight="32" tilecount="6" columns="2">
<image source="../../tileset/plant/tree/palm_tree.png" width="64" height="96"/>
</tileset>
<tileset firstgid="244" name="animal" tilewidth="32" tileheight="32" tilecount="32" columns="8">
<image source="../../tileset/logic/creature/animal.png" width="256" height="128"/>
</tileset>
<tileset firstgid="276" name="logic/collision" tilewidth="32" tileheight="32" tilecount="1" columns="1">
<image source="../../tileset/logic/collision.png" width="32" height="32"/>
</tileset>
<tileset firstgid="277" name="ridge" tilewidth="32" tileheight="32" tilecount="96" columns="12">
<image source="../../tileset/ground/ridge/earth_pale.png" width="384" height="256"/>
</tileset>
<tileset firstgid="373" name="tent" tilewidth="32" tileheight="32" tilecount="9" columns="3">
<image source="../../tileset/object/tent.png" width="96" height="96"/>
</tileset>
<tileset firstgid="382" name="ironlamp" tilewidth="32" tileheight="32" tilecount="3" columns="1">
<image source="../../tileset/furniture/light/iron_lamp.png" width="32" height="96"/>
</tileset>
<tileset firstgid="385" name="flames" tilewidth="32" tileheight="32" tilecount="6" columns="6">
<image source="../../tileset/furniture/light/flames.png" width="192" height="32"/>
</tileset>
<tileset firstgid="391" name="table" tilewidth="32" tileheight="32" tilecount="3" columns="1">
<image source="../../tileset/furniture/table/long_front_on_pale.png" width="32" height="96"/>
</tileset>
<tileset firstgid="394" name="chair" tilewidth="32" tileheight="32" tilecount="4" columns="2">
<image source="../../tileset/furniture/chair/wooden_pale.png" width="64" height="64"/>
</tileset>
<tileset firstgid="398" name="meal" tilewidth="32" tileheight="32" tilecount="2" columns="2">
<image source="../../tileset/item/food/meals_1.png" width="64" height="32"/>
</tileset>
<tileset firstgid="400" name="wine" tilewidth="32" tileheight="32" tilecount="4" columns="2">
<image source="../../tileset/item/drink/red_wine.png" width="64" height="64"/>
</tileset>
<tileset firstgid="404" name="fishing equip" tilewidth="32" tileheight="32" tilecount="12" columns="4">
<image source="../../tileset/item/fishrods.png" width="128" height="96"/>
</tileset>
<tileset firstgid="416" name="wall wood" tilewidth="32" tileheight="32" tilecount="16" columns="4">
<image source="../../tileset/building/wall/wood.png" width="128" height="128"/>
</tileset>
<tileset firstgid="432" name="door1" tilewidth="32" tileheight="32" tilecount="6" columns="2">
<image source="../../tileset/building/door/door_e.png" width="64" height="96"/>
</tileset>
<tileset firstgid="438" name="door2" tilewidth="32" tileheight="32" tilecount="6" columns="2">
<image source="../../tileset/building/door/door_w.png" width="64" height="96"/>
</tileset>
<tileset firstgid="444" name="barell" tilewidth="32" tileheight="32" tilecount="2" columns="1">
<image source="../../tileset/item/pot/barrel_tall.png" width="32" height="64"/>
</tileset>
<tileset firstgid="446" name="fence" tilewidth="32" tileheight="32" tilecount="21" columns="3">
<image source="../../tileset/building/fence/fence_chunky.png" width="96" height="224"/>
</tileset>
<tileset firstgid="467" name="bush bluegreen" tilewidth="32" tileheight="32" tilecount="1" columns="1">
<image source="../../tileset/plant/bush/blue_green.png" width="32" height="32"/>
</tileset>
<tileset firstgid="468" name="sheep food" tilewidth="32" tileheight="32" tilecount="1" columns="1">
<image source="../../tileset/logic/item/sheepfood.png" width="32" height="32"/>
</tileset>
<tileset firstgid="469" name="sheep" tilewidth="32" tileheight="32" tilecount="1" columns="1">
<image source="../../tileset/logic/creature/sheep.png" width="32" height="32"/>
</tileset>
<tileset firstgid="470" name="logic/creature/amazon" tilewidth="32" tileheight="32" tilecount="16" columns="8">
<image source="../../tileset/logic/creature/amazon.png" width="256" height="64"/>
</tileset>
<tileset firstgid="486" name="coconut" tilewidth="32" tileheight="32" tilecount="16" columns="8">
<image source="../../tileset/logic/item/fruits.png" width="256" height="64"/>
</tileset>
<tileset firstgid="502" name="pineapple plant" tilewidth="32" tileheight="32" tilecount="6" columns="2">
<image source="../../tileset/plant/pineapple_plant.png" width="64" height="96"/>
</tileset>
<tileset firstgid="508" name="logic/portal" tilewidth="32" tileheight="32" tilecount="24" columns="8">
<image source="../../tileset/logic/portal.png" width="256" height="96"/>
</tileset>
<tileset firstgid="532" name="grass_2" tilewidth="32" tileheight="32" tilecount="21" columns="3">
<image source="../../tileset/ground/grass_2.png" width="96" height="224"/>
</tileset>
<tileset firstgid="553" name="dim_yellow_light_7x5" tilewidth="32" tileheight="32" tilecount="35" columns="7">
<image source="../../tileset/light/dim_yellow_light_7x5.png" width="224" height="160"/>
</tileset>
<tileset firstgid="588" name="yellow_light_5x5" tilewidth="32" tileheight="32" tilecount="25" columns="5">
<image source="../../tileset/light/yellow_light_5x5.png" width="160" height="160"/>
</tileset>
<tileset firstgid="613" name="huts" tilewidth="32" tileheight="32" tilecount="338" columns="26">
<image source="../../tileset/building/huts.png" width="832" height="416"/>
</tileset>
<tileset firstgid="951" name="spider" tilewidth="32" tileheight="32" tilecount="3" columns="3">
<image source="../../tileset/logic/creature/spider.png" width="96" height="32"/>
</tileset>
<tileset firstgid="954" name="reptile" tilewidth="32" tileheight="32" tilecount="7" columns="7">
<image source="../../tileset/logic/creature/reptile.png" width="224" height="32"/>
</tileset>
<layer id="1" name="0_floor" width="128" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu2czW7cOgxGjaDdNLMt0PX0P+//gE0XBhxDkkWK9EdKH3DP6qZTy+eY8jhGH9u2PQghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEJIGl6FoI+X2PK3AFtYhy8F/myyDthCXkr+2cE6tPwfO+B9wpz0+NfOAnYQn08nPDpAr5H0+5d0IJ0F7CMeNf9es4AtxKLlv7eFvQPp8wN2gafXf+9MKPWgfb7EFuL5l3Rw17xAnLeox3WX/9EGaj1EbiDysWn59rJt7/81uauD2t7hcT9xN2jPLf8lNB149GA1HzyY4XdmNf+tHkb2DMt7B6T3t4HjQjvX+LduwKKHq+8ZHpy9t44rQwMS/5FbiMjVM1K0+xH/rfsENtE/C7L772lh9PtF1BYkx9WaBbP4v+qg9bOZ5oL2uCLuBx7+z241f8Zy/7Dqx+LzozXg6d9yjiA68PrsSPcEaMdRGkDMmgj3BGi/mg6ORNlLsjaA9jrSg1dTI2RrAO0RjdSv5DOt7gnoH9+A9vOizwL0uY+ClfvWZ1o0YN0B+ryvQOQG0OdmFaI2gD4vK9HyX+vAuwH0OVmJ3X+rAc0cGOkAfU5W4uhf2oHXHECfk9UoNVDqoDQHfjo0gD4fK3PVwLkDjxmAPgdEthdYN4BeO7luwPNeAL1u8tF/rQOvBtDrJtgG0Gsm7Q68G0CvlWAbQK+TyP1bNoBeJ8E2gF4j6WvA6zkxen2krwHJ7wxbz4npPyetBuh/DV467wUkewB6TUTuv9SA9j1S9JqIjX/tPoBeE/Hz3zMD0Gsi2AbQ6yH6Bka/D9B/Tnb/tQbof26k/mt7AP3nRdpAaQY8to+f88Ie0uDlvwR6raTdgHYP6PXPDmJydKOZAVL/bCAed/tnB7FA+WcDMUD6ZwN4ji4Q/tkB/bMD+mcDuf233i/cYQPxsPDf417TAfrczM75fGv8S92zgTiM+n89/Oznws/vcD+IiZX/lvurDthADP/a3wH2um91IGmAHcTx/zj9/+c730/8cGpA2sHXDtA+UP573D8L1/5j++i99p5orQOLBq46OPrVfv7x75F2FxmJ/9r7Hy3vPR1YNVDzYuFd2lwWjuu58l97/6PX/c5vR/93g/aHngEa///xnAH0b9eAl//zDMjaANpbVv+zzAC0t8z+Z2gA7S2T/18TNoD2FtF/zfOM9wJobxH9r7QXoL1Zukf7zzAH0K48G7jz+3/GGYB25H39a5//W/qPOgPQjiL4rz3/n90/2s9K/kt7ALoBtJ/V/EebAWg/d/jX3PtZ+C89K6D/HP73f/9t9ut/1gaO69Pe+6/if7YGzmvTzn4P/29B/c/UQM279Npf4fvfbA0c1zJy33eH/2jus/uXun9euLf2f5799B/Lvaf/DLM/cwMt/73u7/Qf1X1G/y33vXt+yb2l/wyzP7t/y7mv8V97Nyjyd76Z/Y/Mfavrv8c9/Y/7t577Fv7pPv6133I/4j+j+2z+a+6trn2t/6zuZ/Fvse/X/F+9/0339/ofufatr//M7mfxfz7/d/nP7p7+y/wDryGCLQAAAQA=
</data>
</layer>
<layer id="2" name="1_terrain" width="128" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu2dOY9dNRTH7/0SgKBgh4JFQAUEqIBAmZAaUScghpEQCISULgvwDVgqPgFNWEKBAmmB4TNAAw00IWmwNdcax/jaZ7V9H+cnWfe9ed7e/R8fn+P3ZmaaDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwDMMwjBE5E5XXO8/F6I/ZgeExGzBsXzACZgeGx+xgt/gZUP7ItDMb2A3+cuXvwtVz4Mqv03/twHzBblCzgXD9aVq3A4sVtwlU+9gfeDvI7QmBM4Vi9jE+UBsoxQclzB7GJad17udrtkCxCbOFMShpXHp9zSZ8rJDaRe5nsa3YftGXNe1r9Wr1S218fgGJJ0azhdPTmPOigtESWh+TW0D2jxFsIegeM8K8OGC1p/SJ2T+8T6jZQynPqBWKTjndc2zNDlpqD62X8w/YPKNGTaegdyhYtmAD2H2cs99T5xLHCZDzamwusuYjJNiCL+CuVc6Y0DlB5wLNT0v5CKes2dqu2oDEWNz23KvkmKVzsa3ZQMuxuDkH9ayCk7dC9qut2ICk9lpnCNL5qWT+ivEHW4gJqGDXmZb2aTtKv1I+ai2H2VUbCEj5FMm4s9Q/dcy358PrO3O9/dZsgLvupLRqGZukY5Y46zR/d9H9vfnw+Vo/4XoleX0EG8DsgdC+WqzTHqTr/f3l+sGcf90Tzz0XF/aMCSh7oMYZgba+150eNxZNbmTWKYR0veeo+QNPiAtjO3iTNiURODEwth5kDGmC9um1Np8c6XrHvh6T2kEPPyChEyfP1o7vArH21wHaa/ujtT2hpx+AoJHjaZ8FpOv+BmP9cyi9zzguHO2MgLO+c+0xfUPnUgPr+7XiV2hu6BnBBrjap/1wxuDOAYp2/rp29ftA/B373nuB9H2XtAEttMaDxk6e2BeMmBf2mkOruUjHI5TX45hQ2wYgNsntk0qvswSpvYgTz7TwAxp+tqfvoMYllNi0hQ1cjepJ20AL7VvaANdvS9rAWnvse4j3AU8rG5DssyWS2mP7rI0FrZdeW31m1DPWk0DKX5f61CY3Xqq/R9sPcOthx+P6Ia72I9tAugcEpGxAw2dixuPagJTNaIyRA3IWmY6X+/sLEudD3HutvU6x7bFQ1j/HBjCfRebGk/wOkbSGUuNBY2ntvYgy9xKp1iUbKI0XxwNaZ8TSewHVVrjjQsH4AQ7Y7yLk0M4HuPFAz3UqUX9izrMGR3tPGg9q+ICW2mPsQso2se1Go+f3SLeSW7XMJ7R83to4rb8voPm+RlxjnNywVYyS+gDt7wuM7hOlkdQeE3tAxvFw4wCKjv83G/BgzwXSOLJ2z7Cvx/W4cQA016b0RbUR6n2SGAPbnru+a/3UbIyzB2jkbVLaQ+8DBek5atkSRI80DqTuARI2wL0vGnlFbSwsreJ7jF+WyAUvz4dF2gagULXPjaMdo/TuXzoPODsf6e/LJ6586spnrny+/B6b5nvG9o3RnmqHUnPVorT+NfJArg1Ixpm1dlQb4MbpU+U1acJYB1O73yWVtIGWPgW7rinxJzcXwFDaA1qfA3FiwxbrBbuuKetfog8sa3tAi98b4thADyTzHOgY2NcD19xe+0/lc8Ge639tDq32RencTUN7yv7huRZ9Lgy1AQ9H/29c+bZQLgPm0Mqfa+WXGnOjjFn7bsBaX1T9vfa/Ver8Ph3awdeFOlI5IsaXUON6TRuV8DFY7T0U/WPt31rKF/NhCc9jvB2UbCA3RwyUGBsb10vOhdqHRp8U/YP2+8v10nyk/5eL/e1NN9sBxQak8wOsn+2xV7SIN2Oo/n8/epzTPxDbAccGMH69h/aYuWDbatlAuodD9d9Pnpf0D+wtVy0bgNB6bWnOTWJdpOe/qa5QIPp7Yhso5QYeCW1ucXO5VaDc1vhzDGx8iukzXKlrnwvGBgLh7yFi7tPdrs09rtwrUO5z5X4lG9DwPZC1w/38n8MbyxVjAwHIewvavzbX7ynEv76qZAOa+07aV26MHmd/nr3o8Y+E9lLa1/qr2QCHHjFHOtbB1O/vilP2gRgp7df+1m54Le7jMff88WQv4tAj3kzH7OUDPJx9wMPVHjtO0H+t7575A4YR9gAPZR/4wd3/75PC1f4j1+6cKx/PNz9OKa3/Fv5cYoyR1r+Huw8cOD0eceXRivYlP+81Px/pfz7Rf239tzxPkOx7lPUf4NpA0J96n0v61/b/NR1a2gCnjxH093BsIF7/FLzmFyL9w+P0XtXWf4BzRidJLU7xjKK/B2MDB/PRNegvzQnX57GoPOPKs8j4v6Rvi/y/Zpvx34nsrb+nlhN8t9z/K/NRgez/WE4seh+PykuuvLyh/L8WM6RnwPvC41Og5ATp/s+9p0F7r/crUTkldP6HnSfnfZXajrb2A5hzAR/XP+XK067chbCBtXqx9qfmchsK2DheI+Yb1fcHsD7gBafTiwUbuN397I5FyzuXOljtAy389NrPoX4Cyqj6e7BngycjGziWlAdceXDR8yF3fThT5xhAe024ZwgU/7AF/T3QOCD4geNJeSLR88lMneOR9i1zsVwdqs/HzLvX5/9QsPpfXDQ+mcRsvjyX6P98po5kfBeg6Kh5hhhzNXk+Quwfg9X/3IrPrn2+l6NHjI/pS6KPkc59cmD0T89sc/9Ld421uqPoJtFXrm2s/2hr3xP0/9OVXwD1L0T61f7XbkypLub8ltIWC+QMsTYPv+9/NR3t/SOu/dPLFaq958NFP+/TMf9LN64L+T/spddanOnlgOaPHqnv/GpxOnoMjfsx/p7SF0f7XjaQG3/E894USt6H8ffYviTWv7YNxP1vWXsPdt/3YPw9pa+S9jU4uR+Gmg2MHu97KL5fG8k8ADOO5Dn/pWlba98D1f+iwJqv0dqPS+acW/H7Hor+6blP6bynRqntFmygFu+P6vc9se+H7v3xuY9EDqB5FpRD4+wgbrMVv0/RPhDOfSRygFwf2tpL5g5bj/mw2nvCuY9EDrDWB/aMbQ2s5pzcYQtrn6t9C7DaY+tBz+4gZ9Bb2vd3QXtoPapPp9iAZ/S1v0vaa/cHsYEt7ftb0D7Q+gxfCm39/wUF6puRAAABAA==
</data>
</layer>
<layer id="3" name="2_object" width="128" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu2bSZIdNRCG63XDKZhuASwxa+BKvoEdYTYMa07AxgsvbS8Nt2DagL0xO9SBK+JFdUnKOaWq/4tQvO43KFWZKeVQ7y0LAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgk7/L+KfyCI5PzfbwhXMCHzg31zZfgQ+cg9Z+x3lwfLY2pr6v934wBxxbcm2PnGJsPPYxaos5iLL9FvhCPl7658YHnA85cPQdZRfklbFQfcDKLlr/QV5hT+Se09io1Z/am9/CR87gb9HnrUR/lvUpVS7V9kfyBQ0cPXDOHIl/cvpYPZkSvzszlvHEc2/V1qfpb+I8sI0nGfWAx9pnRLJ+D1vNXAuOvnZODKTONbPPn42Wf3JyXIsay4O3l2X593L/EfwPVfetOKyphyLODI7tcXbV2bOTts72zpe5+z8iXs/qY619XkNSZ1vfhxhh/8/aK6L0vHqMkGNQ8Zh31n6hhe1XuDHAQqYED9vU1j+yD0T3XLZk2L4mV4vFvYhIsm2/ktH725PLyUdatRHl89Fw8nnpnJFYyebGpJoNe7bNzAc8YmymP1v3K6U+UJPRI1pvHjE268zmyqZet/Z6OJ/L3DsjxHstVjG79l5vMvfOaDkoF2ms7l135pkchfTMtJBn0ReR9iOon7O0CaUXGekD0vxEuj7rPo9FbO5dh5Xfc+5FRPiAxb6x3qeteT3qFW4MkMqq2b7mA1l5AAWJD0jOGYpcC/1w6gANs3wXgWJTjg9Y2crD9itRMXd0298hrZ8t4jllXZr1UecHdSxt76VvqQ9m1uAzYK2bEfXMPQes6liqnAzOti+o12ndy6DIyeJs8ZHbF5D6ACd/ttT9WezoASe3aL3es63XedKaUyrLIkZQ9aBBO4dX/6lnB6/cyyp+aW3E1YMUC//07kHsze8Vf59dbHxAoxdJTVlbk2eO4p0H9+b38IE7+6/juzK+L+OHMn4s4+HFz+9WLOtzr1xpb/4sMuR76VSiz9ZaNHGCk4dnk5G7a3ygF9ctkfgANw9vzRFBVh0u9QHvXLYGp/6mxl1N3LGu3zLQ5IYZcOtrrQxKra8la/+vcH0gO2ZSawopFvHjDup94RHyEMuanIpVbyGil9KSvccIv1OWEuUDmrzeO+ewOGNato/OnbhofYCTY0vy+kg0fTTOnFY8fedzP5XHnxXfS7KuD1rze9XrFnajnAMjnd+WaOoDbp3lkdNp5+Gu8Yh4Xa+37bVI/BM+cAwk/td739H0l30NXvI9zp6RzjVLOP5MuW5uLLD2Ae+ewvb/mff/CsWv7557XXmNOt/6+GbZ16WW6L15ZB/Yvlaz/aubZfmljF9veHLe7DyvJeNcPqIPbJ+r2f63YvPfy/ijjD/L+IvpAy25MzH7+mv0zvzL7bLclHFbxntlvH+rk7Vlljx79PW1eNn4zXsv3n9Q7P1hGR+V8XEZn1zZ/9HVvE8qv6m+lrXVYUStZSVj5v1fsz811/u02PyzMj7f7P1rmz/ayNibk1MnWPmCVT131P2v8enHV/N+e/U31bZb2SPX3aOth0PN/tFwe3S1/RYRL6jPz0Br/0cxS/3fy1Nm5EWx//MdH7iO/5a+8EWR9aCML9/JtJIRFR+O2ANuYZ13fVXs/nUZ3+z8zkkKN4/X2u9I94AoUHQl1WnUOb1ypr0bxevsBexA7Sm0OMPejiBLh9R7kL3PAznRtVhL/plithcPG/2C2muj5fjwgT6PjftCFjq3zNu06zl6/rjt2Vswms61/f6j2t4Tav+29nyEzqn1I5BR018rV4+O2Ufs9Y5CzY4U20f5gKZuBG1a+5/6WW8fyD5/joxVHUCVI5WH/e9D1h7OmgPcJ8MHJJzN9tZ9nxqj1HPUz54Fj77PFi/bU+/5WswJ5Hic/dS6kSP3bGd/FNzvklDm6eXqXB+A7X2g6NXr+0YcH4Dt7bHcU9K6jOoDiPv2oIcGwH3+A/o8NokAAAEA
</data>
</layer>
<layer id="4" name="3_roof" width="128" height="128">
<data encoding="base64" compression="gzip">
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
</data>
</layer>
<layer id="5" name="4_roof_add" width="128" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu3cy27cMAxAUefT0w9uds023RgdqCNbD759DxAEKJp4RqQlSubkOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAODt99+vr853PBu5gBM5AHKgtq+B/8OagFNbMyI3zRiyx4hNI/YjcwM54E8r9qOYD/y0cfJex1kjfF3N18TlGbTr+d386dWS5GcuKzFarSt2coR80zMzfhpz0t11qWPnaN0TmutR73XuXPPJOfBKopbw2JNIXJP5AKesObCSw95nCJgzGl+vGg1xXM0H72I/u8fS8v1xHH8+/n2HrJ1nPK8/G2GdpGabM9o3Mkpj7L+D3fMVcmx2byeVA1nP3d49D8/w+r16fKRrDInrr8raA+Fdz3v3mFnFJmIOeMc+iifkQLQ+kGh26hGtGklKO79KxN6zNtO6du/Zr8Z1rLS1qFTsX3+npdlrR91LRHotVUVf48gBPdFjj3m9swGLNTu70TGRWi+le+qsYmo9J1tcz7rPSTpWEc4lZ8w+i9TMAak+J6vrac7l2vfaGfPRf8+kSm+IRX2QIdYr6/vdGRnqi1Rv79SU7L3tRDt7O7FXxCirz4ZFvVeeTLr/bec6sCX1bPfuvtaKPXPJOqmY3D2z1O55e7dOra5fEnX/VR+F1JoqcX6tpY2DpV7crOaJ3r3g+ZpaFjGJuPfQHu+r53c9V5/drr62Wb2/Xy/nlVrXlMz1bP312UiPqfY8N/t8inPseys50KszLcw+n1rt47Vedzznt51rR/k80cmy77VSbRKxd/bKbn/+rsrrR6Yc8Hg2WTn2J6t+tQy55nmOY+3TYI/Yitgf2pKeY7x7Kkat5sDsGW+VvrOKZnNg9YxXo67Xfo6frW5eZfU+I/WdHZPXrp4Dp6fk/EreVR+TVtX3qzHnaK9FVj6bvnev96A1hlqxb2WMfY9ULEY+S6g5luwx9u3WbKs5sMvzbOEJJN6n935AS/Uc0NhzIwfP/r7MdXYFXj0UFvV2lf2cFssew9HakDjlxroPTZpzOfNObB49rJXns0xrrefnsyrnwClyLsyOf6Tn01VEHFPvHmP421mro8532XiPYZT56MnYi0Hqb0VI3cvkj71oYy7RH4850XJgFjHfN/v3QizH/Oqsg9jraT+3HWGOfcpZbybW64d3DuJ/2WsI6KOvJzZiAnIAVsi1GLRq6ZF1nhyoaebsYDQH2PP5GK3bd86H7nKA2OuQGleJ38NaYCviPUUOAAC8/AD4iIR/AAABAA==
</data>
</layer>
<layer id="6" name="objects" width="128" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu3dS07DMBAA0JbegPvfA1ZwCb4FCVaIQyDBAqoWKVUUJ4499nurSpXaRI3tsWfsbjYAAAAAAAAAAAAAAAAAAAAAAPTkq/QFkOxjW/oKgJo96yOAFYgl21Iyvrzdlfvumr0az6mAuBJi+i59AYWJU2M4HWOsdQKQg/nMfENrE9YroD/7Ce3+Ux9BopeRZ2fsffI7XW+K1tZv5KG6Yp0ptje/H/zzoE0AAH+uzG0BCG5njstE0XIRcz12dr+pensuSroOPgdRN9YfOUIAAGCIvcZADezFAwBII446UlPQLvXBv9SDQDr7D2E6cWY7nCOynilnT1GP6LXAcKAuHJYRJQ4+ty/AfxkBQHlR4okcst37RabPBVZ1t2Af0XLur7UzZ+4z3U/P423v1IfFcej3l+z/IVVr4ytHl+aL4T1th18D9ErtRxnmmkBNnP9Dj6z5U6tzOUnxIxxpD8CY9wr6ibX7Kv8BUTe5Y4B5lsjrqw0AWiS/A8AcPwXPbccAAAEA
</data>
</layer>
<layer id="7" name="collision" width="128" height="128" visible="0" opacity="0.37">
<data encoding="base64" compression="gzip">
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
</data>
</layer>
<layer id="8" name="protection" width="128" height="128" visible="0">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu3BAQEAAACAkP6v7ggKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAauuOl9cAAAEA
</data>
</layer>
<layer id="9" name="blend_ground" width="128" height="128" visible="0" opacity="0.43">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu3ZSWoEMQwF0MK3yTynM89TJ/e/TwSpbWtTNMTWe/BXXgosS54mAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAMey2adqL7EcOIoeRo/Z3ttPyc/p3ErU8jZxFziMXkcu5vsctP6d/V1HL68hN5DZyF7mf67tq+Tn9e4xaPkWeIy+R18jbXN+Hlp/Tv4+o5WfkK7KOfEd+5vq+t/wcgLrMiLWZEWszI9ZmRqzNjAhkzAi1mRFqMyPUts0ZIest+s7/sM0ZIest+s74st6i74xj012e9Ra7qXFkd/mm3mI3NQ53eW3u8trc5TAeO5ra7Ghq866vzbu+Nu96Mv73avO/V5v/vdr879WWvQ+9HQEA+rdkp2Mf1L8lOx37oP4t2enYB/VvyU7HPqh/S3Y69kEAAJD7BRiGSAkAAAEA
</data>
</layer>
<layer id="10" name="blend_roof" width="128" height="128" visible="0" opacity="0.3">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu3ZwUpDMRAF0JD/s6K2am1tqf7/PzhboY08w4Mmcw7MKsuBTOamFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA+TzUUjZRj/V/54zrKXr6HPUStY3a1WXnjO01+vkW9R61j/qoy84Z2yH6eYz6jDpFneuyc8Z3iZ5+RX3f6O1f5wDkZUfMy46Ymx0xNzsidkSgxY6Qlx0hNztCbmvvCK3ZYu7ch7V2hNZsMXfm15ot5s5crt3lrdkim5pH6y5vzRbZ1Bzc5bm5y3GXw3xkNHnJaHLzrs/Nux7velr87+Xlfy83/3u5+d/D/x4AwNx6Mh150Nh6Mh150Ph6Mh150Ph6Mh150Bx6Mh15EAAAAPz2A8EgmCoAAAEA
</data>
</layer>
</map>

View file

@ -1,131 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.10.2" orientation="orthogonal" renderorder="right-down" width="128" height="128" tilewidth="32" tileheight="32" infinite="0" nextlayerid="11" nextobjectid="1">
<tileset firstgid="1" name="ground 1" tilewidth="32" tileheight="32" tilecount="33" columns="3">
<image source="../../tileset/ground/ground.png" width="96" height="352"/>
</tileset>
<tileset firstgid="34" name="water 1" tilewidth="32" tileheight="32" tilecount="72" columns="3">
<image source="../../tileset/ground/water/pool.png" width="96" height="768"/>
</tileset>
<tileset firstgid="106" name="pool_deep" tilewidth="32" tileheight="32" tilecount="72" columns="3">
<image source="../../tileset/ground/water/pool_deep.png" width="96" height="768"/>
</tileset>
<tileset firstgid="178" name="water 3" tilewidth="32" tileheight="32" tilecount="72" columns="3">
<image source="../../tileset/ground/water/pool_corners.png" width="96" height="768"/>
</tileset>
<tileset firstgid="250" name="grass 1" tilewidth="32" tileheight="32" tilecount="36" columns="12">
<image source="../../tileset/ground/grass_edges.png" width="384" height="96"/>
</tileset>
<tileset firstgid="286" name="grass 2" tilewidth="32" tileheight="32" tilecount="24" columns="6">
<image source="../../tileset/ground/grass_corners.png" width="192" height="128"/>
</tileset>
<tileset firstgid="310" name="ladder bridge" tilewidth="32" tileheight="32" tilecount="3" columns="3">
<image source="../../tileset/ground/ladder/vertical_dark.png" width="96" height="32"/>
</tileset>
<tileset firstgid="313" name="tree 1" tilewidth="32" tileheight="32" tilecount="6" columns="2">
<image source="../../tileset/plant/tree/palm_tree.png" width="64" height="96"/>
</tileset>
<tileset firstgid="319" name="tree 2" tilewidth="32" tileheight="32" tilecount="16" columns="4">
<image source="../../tileset/plant/tree/tree_realistic.png" width="128" height="128"/>
</tileset>
<tileset firstgid="335" name="logic/creature/animal" tilewidth="32" tileheight="32" tilecount="32" columns="8">
<image source="../../tileset/logic/creature/animal.png" width="256" height="128"/>
</tileset>
<tileset firstgid="367" name="logic/collision" tilewidth="32" tileheight="32" tilecount="1" columns="1">
<image source="../../tileset/logic/collision.png" width="32" height="32"/>
</tileset>
<tileset firstgid="368" name="bushes" tilewidth="32" tileheight="32" tilecount="9" columns="3">
<image source="../../tileset/plant/bush/various_small.png" width="96" height="96"/>
</tileset>
<tileset firstgid="377" name="ridge" tilewidth="32" tileheight="32" tilecount="96" columns="12">
<image source="../../tileset/ground/ridge/earth_pale.png" width="384" height="256"/>
</tileset>
<tileset firstgid="473" name="tent" tilewidth="32" tileheight="32" tilecount="9" columns="3">
<image source="../../tileset/object/tent.png" width="96" height="96"/>
</tileset>
<tileset firstgid="482" name="amazons" tilewidth="32" tileheight="32" tilecount="16" columns="8">
<image source="../../tileset/logic/creature/amazon.png" width="256" height="64"/>
</tileset>
<tileset firstgid="498" name="ironlamp" tilewidth="32" tileheight="32" tilecount="3" columns="1">
<image source="../../tileset/furniture/light/iron_lamp.png" width="32" height="96"/>
</tileset>
<tileset firstgid="501" name="flames" tilewidth="32" tileheight="32" tilecount="6" columns="6">
<image source="../../tileset/furniture/light/flames.png" width="192" height="32"/>
</tileset>
<tileset firstgid="507" name="rocks" tilewidth="32" tileheight="32" tilecount="4" columns="2">
<image source="../../tileset/ground/rock/rocks_2.png" width="64" height="64"/>
</tileset>
<tileset firstgid="511" name="logic/portal" tilewidth="32" tileheight="32" tilecount="24" columns="8">
<image source="../../tileset/logic/portal.png" width="256" height="96"/>
</tileset>
<tileset firstgid="535" name="coconut" tilewidth="32" tileheight="32" tilecount="16" columns="8">
<image source="../../tileset/logic/item/fruits.png" width="256" height="64"/>
</tileset>
<tileset firstgid="551" name="pineapple plant" tilewidth="32" tileheight="32" tilecount="6" columns="2">
<image source="../../tileset/plant/pineapple_plant.png" width="64" height="96"/>
</tileset>
<tileset firstgid="557" name="grass_2.png" tilewidth="32" tileheight="32" tilecount="21" columns="3">
<image source="../../tileset/ground/grass_2.png" width="96" height="224"/>
</tileset>
<tileset firstgid="578" name="dim_yellow_light_7x5" tilewidth="32" tileheight="32" tilecount="35" columns="7">
<image source="../../tileset/light/dim_yellow_light_7x5.png" width="224" height="160"/>
</tileset>
<tileset firstgid="613" name="yellow_light_5x5" tilewidth="32" tileheight="32" tilecount="25" columns="5">
<image source="../../tileset/light/yellow_light_5x5.png" width="160" height="160"/>
</tileset>
<tileset firstgid="638" name="spider" tilewidth="32" tileheight="32" tilecount="3" columns="3">
<image source="../../tileset/logic/creature/spider.png" width="96" height="32"/>
</tileset>
<tileset firstgid="641" name="reptile" tilewidth="32" tileheight="32" tilecount="7" columns="7">
<image source="../../tileset/logic/creature/reptile.png" width="224" height="32"/>
</tileset>
<layer id="1" name="0_floor" width="128" height="128">
<data encoding="base64" compression="gzip">
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
</data>
</layer>
<layer id="2" name="1_terrain" width="128" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu2dS68ktRXHu4dhE6Er3d0MA2syBHE3zDL5CHyWZBkeYQHhuYBEJKsor1VeK8IwMywRXwKBBvEdZjeblJWyrjlzjs/D59iuvvWTrL63u8rlqv/f9rHLXX047OzIuC1IO1ebn44uwM5wkgf2tuD0+GxJ/0XS58T22Qd7P7F9PmM+pzxAsfcT24HTPrN74PSA2t85Hg7PLelmkV45Xn6+e+B0wLR/dtX6F8XrDeABaXyQ2T0wH1Lt8yv0AGT3wLa4W/zNaZ+5AfqFm2tfkX3BtQW7B+ah1P9MoH3i58f/vwdfbyH9Q23MuDOeUv/zI639N+srpT3lgcTugXmB+iewev/d+vdDpO9v9cA+XzQOrv5nvl///2F5fST0gGXMuLcJfSn1v1i0eroS25fk/uDbYnvogQT0we6BubgP/pd6gOoPqLjgxu6BabkL/j9H6jGk7A8yuV+QeEA6XyRZi2BJO5dA/c8Q7SSUfQK1PzWHqJ1PbqX01lWHq/9SD8A+gdqvNofY2weJFi9g+22pnaHmfy31H+sTIGVfgN1XSozwQEYadyRtXwT7wffK9zX08g92vxdr+68dLlMLtT6h9f6ihLyuRRN3HA4/1gPqK0Xiq5p/IvwA2/3EGaKRh/6S9gSbP6aS1B/lWqaSkTEHxgsOeVBQ28OxX+LseKlz+WrxADdXjG2LzR1ScPpJ1rOM9oG1XZH2U1y+1Pgfaq3V36J9be6QgtJOupYpo/UBtUbS2k5ZqLUFGk9BD5wdn9Rbo79Ge2qfRPLBc8fLdUiUH7DrbkXSpmjzt3gA85f0HoolRoH3gbPWj44+HtBsK5k/knDn+OQ6BSxJxx/aNqVE0hZQsUpJVHtStgGwD9D2A5axo8YDNe0ySfvniXJI7leWelnqPAWmn8ZX94g8akjzhx64vvpA045nNNpT+0piBmwt0s2K9tQxqLizpjvXvkj7Ky2a2ELbZlHxIDUnYOH2suOLzM41D0jbCqn2pQfKdWwc56A8EE0ca6XmA2t/JfWApY4n7X+2pJcqHrCMGbRlq23P6ZbrPTVPSo1nqDxr7UgZ//aKgROadkBD1j6/QlrGjVpfStayYZrkNbKWsmF5Yj6q7R/ZnpREtQOU9hkqXotA25e0jGm9Xmv3TrzBPJDjwta+oDdUWSO098qbO2aOWbgxbgvYPHFuCyTX4/EEvuCuo/Z/zzJwcSq1vzVfC60e0BLRnvRsq7RjEO/jRZyjpwc0sdOMYG2aR3+R+ZXhvLfiAU1sX1Jec89rLcWzv48qU4+6E+EB6WfY5z2udes5RSCNByKQegCjppM0ThvpAck5afP03q+HB2se4NDUf+z110t6bUmvE+mNJb0pbD8kRMYrXu0dtV8kpQeur6+a7xFRcNr/dknvLuk9Ir2/pA9WD2jyl5Splo/X+UquwyyxcUs7gMGdc9b+68o2Xzl7QBurtpxvSzlHYfUA145jidNe4gFLvZqh/s8M5oFzpsxcO46lrxXXo/QAh7We9ar/3seNAHrgnLmOv1ve/72hLlK8imz/6fLeH5RaSssQXf+jjxsB9kwBqpxZ/8g4J+sfNTaLjv+jjhsF1L9WTqz+e5Hz09R/Ko9WD1jHcNLjzeIBuOZIW/+9KPOz1n9vNNpbxiSjPYGtN9PUf29a6v8vncvTMtZs8UAvqLWGV6X+S/LWHN+i48j2DfsuKfwuOUZE/YfXrqX/txzvqoHV/TQXzLX9CSr+twLz+c2S/rqkvxnz1sZ/mjw5uD5oFr9hdT/rz127pP+fl/Sgsp00zqG0/8+S7je0p571e9R8QRRUvy+t//9c3vtX4YFE0u2t9e+3l9d3nLWP7oelefWeL4gAq/sJrP5LPPCXJX24pI/W7T5eXj9Z39ckTvtR8bK39qM9gM35Z7D6X/PAv9f0R/D5n4rPpClrn9C2HVFoj6ct7yhPYB7I9V/DF8v295b0d7DfP9b3Nek+c+zZ67/VozN5gPt+pJRo/7eUr2VMwX3e2kf0pnbvr1amxwKfSOtBD/9H9h9bjw2x58lLyuSxTY82PSKGoPKwfm9qZEzI3fuz6jtD/6eNI0eMM0+l/tc8wBERB1jbHosHuM+l2/XkJwf83q/mOnhoL8kL+1zjUe2xI+KCkfEPRu135Fq1127fqn1PvVry5LbrRU37CLaqV09deh4Le348R+v6iohrGqnXqWqfoH4/IJoeHvCE6488j9HLA9zvB0TREleOHEN6HisyfpGC/X5sdDk8tJ/RA5Z9Rmpf1v1W7SPG9q1xvrRM+XmWkudaejJS+wR8ZrS1PJHbt9YTbrvyeZbccy21aOYkRsz5QP092tna9tjzXyREtpVQe+7ZhlJG120J0vpvnYehsFyTyOup1d5aJ2bzQO17fq0eoIiIlz2QPq8rqk6MAD4v/sika6D8rV6xEB2baPKCeUrPfyZq6/8g0CPXOvu8VftID3iff892I3nggSBBsh+uKa6B9Xy8tO/hAe98ZwH6JFP6IGKs4629x9hRkofmHsmW4oZM9kPm4vhkjJBpPS9qe3iNpdpHxqlatqh95v7hxz7APNDr/Li4jNuu5HHw9d+y5hQ5lsT6g94ekG434npT1wB79tHW0I4pn65oEK3NTNqXfLP+/+1G/QDjghoXwAuZLbSHUePR79b3Hk563lIk48oS6IUZPdAjnvx+/fyHSc45ktIjJReFDzzieQ+sZcA+L/v6rbf3XmBeqP0uQS8PvCo4lkZ7yKm0957AMSXVJ3jNK0j0jJq3ukrtvRbpeIKbe8TgtG9pT2aMXbaKZDxxccTvU3r22VJOeWw3ktp4ogR6oeccsNvYDrRvO3W4cUTph+j5/9q8nqSvf2r57OWJNU/rhsvfqZb8jn1PKC8ksBhCes9KQmu/X2pfu/fem1JzjC14gbqOXFzZywOl9l/KdwsD0xz7rXv4G9bYb9nP0l5gMUSN8l6WhFPQPuueKTV/HomfLL9nPoMXMpK4khpfYGg9MIv2pe6l5tj3gqhzLL1AJaq9mMELEGzsyd3X1MxFzKR95g5Rz61jZ/h6q+KFGT2QqMWUELgukmK09lT/LqnvVu0lXpjVAxnuvmYm+eD6mmCfMUL7ci6Veu4z9j0gLdJ5VSyO2IoHatT6jOyHUvuedT+VDdM+9/fPBmkv3f5UPJDg+oxR/T32nY/Ieq/dr/TArONILbDPGD3Ggx7I63a9PGDdD/NAjS16YRY4D/RGO5bc0jhyVizP/pIi/U5tjdq4ozbvtNV+ojfYM79nQzIGhW0FNye9e+IS7Jm/EK/1LN4xZm0syc1Jn0Jc6QGnf+saO+98tPlhcQQXW14lH9T0187ncfTWnqIWW5beuAptgvaZ/60e8KJ23Jay3EJ8kDiVuQiI5DlgkNEekGjfWpbafSqMLfoAewaklV4ekBzHuwyauYittAk17R8pr13efgbta/u15sute9jKnFTt2a+Z2lr1EevYo2JO671tjFqfMYsPpM/9ra1Vb/3Omtf6AuvxvD/HwOYg7smLHELS/nrxf+2+X22test31lrHlNI2mjuetdwW8v2skfpD7RNnnfrtTGs/q80/au7KwjPrfiP6gMj1PhhYntZ+23rM2Twwcm0L9ZzPiPrfY2zOHbPFA5LPsG0kMfGtwR6Aa5G86/+I+SDPdqXFH9KYOHtgVCyAPa8Pnrdl/B+hvTZe8MDqDyomxtqFkbFABnten/QaUtehVyzhgXV9irY8WLuQ9U9twAweSNSe31oSFV9JjjULmvJg7cIM48FM6QEYD2rHada4SpL3LHiVa4Y+IJPvAebvrHisBS6xzsF6zRNIzkFzvp7zAbkNGOkDuA7UYz047F89x2i1/LjtrHlJz0cK1geM8gD1nZBEj/Gh9VqOqv/c+UjJHih1p56x0ZuoucFTxXqtJHHA/wA2VF6cAAABAA==
</data>
</layer>
<layer id="3" name="2_object" width="128" height="128">
<data encoding="base64" compression="gzip">
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
</data>
</layer>
<layer id="4" name="3_roof" width="128" height="128">
<data encoding="base64" compression="gzip">
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
</data>
</layer>
<layer id="5" name="4_roof_add" width="128" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu3dW3KsMAxF0c6wbuY/sFtdKSodCvBLso/kvX7ykTRtkPwG8noBAAAAAHDt++v1+vf1+xP7+Cbe2yL2+6qJ/blfoH/AGzkAcgDkAMgBMDaMi9jt7XMeSA4Ae/FaA6RP0ecZe+yJ2O/nc3+g9m+RQ299JwdADoD9ZYx6Gn+QV23O9XG1UuxaykgOtFHJgberfqKnXo/kwI7tiGcOrJo79Hz+rqz0LzG1xK02T2uOedeGqY+Blcs2qhQPy2O2fF6Vctne1OtSLeWyK5ctM8s2yqIso6LX0SxtTa/SOWe9Plf1Luu5lozOqUu/nz1eLh1zRZubMadK9x6qjpdXxH4HnzFUPeeRcvW0V6rXwYt122rZR1iX6+r4CuP6rHYcm+EaOQByABH6BPXyHVTK2VuG2s+tOkeFa1sjSjmveOaAxXhe/dquKJ/aPMl7j0Y1B1TLpax3HZt1gl+7n//O2IfZF/VeR2ssRmNX+nxrHfXYT7bcd9ilzanZ62+5H3cVq/fqRGzjlHJVqSytIsb+oHTdI9xffxY59mjT079FymXcy1TPV+TjrO/ziFOm2H+qvSd81vf1umqPrdrdrLE/1Fwf5b6rtg9uxXr9X4o50HrfOeOwWLziZb1uSF6Ne5pbKecAfnjXhSjHhB/ihYgU5hHUnXrWe8sqPHOg5TxHng1XzmPV5wK9y9Ea+zvKsY2qdx7FnDa+q7pWE1PvuXdUWdZ7nsremzPZRbwus/palXFOr1J9jn5+nqJfG8t3G8HfzHVmYu/L4lkErxywjr3amoCV3npo+RyK6jgsa8wPs+aJVvf4zJy3ZY35YVZbrPpuySc7xv6wOgarvj97W99idQ7MRszrRF83vULs26nmQOvaArHvp5IDT/02a8K+at4h4Kk3hsR+HpV24kDstd215zwLmJ/Xs4C1x8Yco+/t7HnnFAAgB7V5BQCskOW+dtRjv3o/vTFfuUYPG571nFzQNrONJxe0rOzfyYH1Vsdg9fcDAHQwh8QZuTCXVf3zqMeK79DKJOK7TGCj9Owe/XI+I22pSg6Qj+vMuO708/si9j4itJcjz2CVns+rGcdknmfs0GeOzl2zmn1upXtEPHMxe46r835Hzzl3MtfbaGa+W96rn6b9KFsxTpr57i9y4N6K9tbyO3cYB9/hmfcfWc4jA9X9BbXyzMS+D2agHV7H+r6K1rYiQux3afssz/Pu/2b05Fvrur3Fsc6Ov82eC9Y5kGkvhbEQDuQAAEv/ASD8xwcAAAEA
</data>
</layer>
<layer id="6" name="objects" width="128" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu3dS07DMBAA0MIdEOJkSCw4CmUDB+UvcQmEWFCJtCWJXc/Y753AchN7ZjJ2NxsAgOVez1qPgBqu/a7M8HDeegRAVPYTAIDc3gvFc+pHgPoRAPShVI5wiLoysM/cvMJ6Mt9ngDlTR4L1ItZhLgOOaY21e0zE34hp2falbONdorf1BCCzK2syLHbquK1WDHVnHYBw1MXjks8CAJR1mzT2FRfmoOYBHPKcdA/6NkJPwX/dW+sBqhNXt/Fo3jmx6HHVNvj4IDLvDzCyJ3U06F7mWj/jci75x4f39w+9KGNq8e33wrNGYW/WdACA1HrN0fU8kZGad34R67+eK+hD1nO4jMM9huzyPDCHPQ7KWto3K3eEdfR9QV0Zv2W5EwaI+M0oMn2oUMaNdyk1uSUcp44JMAY5IvyKXmNyZgP68GLvTcn/m0IO0eM5YBxiB4BYrMtkIadpw7zHolclr91zKKfozXNWGgCgHbUWIAL9z0ypfU+G3j/ojzojrJfxniqgDnnafOYMoH96ofabysnNVwzuZYNp287fDTUeILre12GAKV/DdU0wAAABAA==
</data>
</layer>
<layer id="7" name="collision" width="128" height="128" visible="0" opacity="0.38">
<data encoding="base64" compression="gzip">
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
</data>
</layer>
<layer id="8" name="protection" width="128" height="128" visible="0">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu3BAQEAAACAkP6v7ggKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAauuOl9cAAAEA
</data>
</layer>
<layer id="9" name="blend_ground" width="128" height="128" visible="0" opacity="0.23">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu3YSU7DQABEUctHIwMkIQOZISNJ7n8GasvCSJEQGPo96e+8sFSLVndVAQAAAAAAfPZQV1UndVMv9dNjeqp/+8/4CYPsPEyj9JzGaZKm9i/CLDu/pHlapGVapbX9i7DJztv0mt7SLu3TwblQhGP2PKVzek+XdK2dC6VzLpTtq3OB/6/pXLjZHwDgz/DWXzZvOmXzplM2bzpl86YDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQIke6qrqpG7qpX56TE/193xPuw2y2zCN0nMap0maNux57/e02yy7vaR5WqRlWqV1w573fk+7bbLbNr2mt7RL+3Ro2PPe72m3Y3Y7pXN6T5d0TbeGPe/9HgBoH/f/srn/l839v2zu/2Vz/wcAgHb4AO9RD3UAAAEA
</data>
</layer>
<layer id="10" name="blend_roof" width="128" height="128" visible="0" opacity="0.17">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu3Yy4rCUBAE0Es+VsX3W1E/3lq6GMxkMWOkz4Ha9SJQgUt3awAAAAAA70261qbJrPv0l/Df5ul8kSyTVbL2D5SySd/bZJfsk4P+Szmm71NyTi7J9aV/70INt/R7Tx4vPXsXavMu1PbuXaCGn94FAAC+i5tOXW46tbnp1Oamg5sOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABVNutamyaz7m3nGa54OF8kyWSXrnk6HzjNum/S3TXbJPjn09Dl0nnE7pr9Tck4uybWnz6HzjN8tHd6Txy+7HDoPAIyP/b8u+39t9v/a7P/Y/wEAAOAznoeHVYEAAAEA
</data>
</layer>
</map>

View file

@ -1,107 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.10.2" orientation="orthogonal" renderorder="right-down" width="128" height="128" tilewidth="32" tileheight="32" infinite="0" nextlayerid="8" nextobjectid="1">
<tileset firstgid="1" name="../../tileset/ground/ground.png" tilewidth="32" tileheight="32" tilecount="33" columns="3">
<image source="../../tileset/ground/ground.png" trans="ffffff" width="96" height="352"/>
</tileset>
<tileset firstgid="34" name="../../tileset/ground/water/pool.png" tilewidth="32" tileheight="32" tilecount="72" columns="3">
<image source="../../tileset/ground/water/pool.png" trans="ffffff" width="96" height="768"/>
</tileset>
<tileset firstgid="106" name="../../tileset/ground/ridge/earth_dark.png" tilewidth="32" tileheight="32" tilecount="96" columns="12">
<image source="../../tileset/ground/ridge/earth_dark.png" trans="ffffff" width="384" height="256"/>
</tileset>
<tileset firstgid="202" name="../../tileset/ground/ridge/earth_pale.png" tilewidth="32" tileheight="32" tilecount="96" columns="12">
<image source="../../tileset/ground/ridge/earth_pale.png" trans="ffffff" width="384" height="256"/>
</tileset>
<tileset firstgid="298" name="../../tileset/ground/grass_edges.png" tilewidth="32" tileheight="32" tilecount="36" columns="12">
<image source="../../tileset/ground/grass_edges.png" trans="ffffff" width="384" height="96"/>
</tileset>
<tileset firstgid="334" name="../../tileset/ground/grass_corners.png" tilewidth="32" tileheight="32" tilecount="24" columns="6">
<image source="../../tileset/ground/grass_corners.png" trans="ffffff" width="192" height="128"/>
</tileset>
<tileset firstgid="358" name="../../tileset/ground/earth_edges.png" tilewidth="32" tileheight="32" tilecount="18" columns="6">
<image source="../../tileset/ground/earth_edges.png" trans="ffffff" width="192" height="96"/>
</tileset>
<tileset firstgid="376" name="../../tileset/ground/rock/pebbles.png" tilewidth="32" tileheight="32" tilecount="3" columns="1">
<image source="../../tileset/ground/rock/pebbles.png" trans="ffffff" width="32" height="96"/>
</tileset>
<tileset firstgid="379" name="../../tileset/ground/ladder/steps.png" tilewidth="32" tileheight="32" tilecount="6" columns="3">
<image source="../../tileset/ground/ladder/steps.png" trans="ffffff" width="96" height="64"/>
</tileset>
<tileset firstgid="385" name="../../tileset/plant/grasses.png" tilewidth="32" tileheight="32" tilecount="6" columns="3">
<image source="../../tileset/plant/grasses.png" trans="ffffff" width="96" height="64"/>
</tileset>
<tileset firstgid="391" name="../../tileset/plant/flower/daisy_red.png" tilewidth="32" tileheight="32" tilecount="8" columns="2">
<image source="../../tileset/plant/flower/daisy_red.png" trans="ffffff" width="64" height="128"/>
</tileset>
<tileset firstgid="399" name="../../tileset/plant/flower/daisy_yellow.png" tilewidth="32" tileheight="32" tilecount="8" columns="2">
<image source="../../tileset/plant/flower/daisy_yellow.png" trans="ffffff" width="64" height="128"/>
</tileset>
<tileset firstgid="407" name="../../tileset/plant/flower/daisy_blue.png" tilewidth="32" tileheight="32" tilecount="8" columns="2">
<image source="../../tileset/plant/flower/daisy_blue.png" trans="ffffff" width="64" height="128"/>
</tileset>
<tileset firstgid="415" name="../../tileset/item/corpse/huge_animal.png" tilewidth="32" tileheight="32" tilecount="16" columns="2">
<image source="../../tileset/item/corpse/huge_animal.png" trans="ffffff" width="64" height="256"/>
</tileset>
<tileset firstgid="431" name="../../tileset/item/pot/dark_barrel.png" tilewidth="32" tileheight="32" tilecount="2" columns="1">
<image source="../../tileset/item/pot/dark_barrel.png" trans="ffffff" width="32" height="64"/>
</tileset>
<tileset firstgid="433" name="../../tileset/item/statue/green_stone.png" tilewidth="32" tileheight="32" tilecount="12" columns="4">
<image source="../../tileset/item/statue/green_stone.png" trans="ffffff" width="128" height="96"/>
</tileset>
<tileset firstgid="445" name="../../tileset/logic/creature/orc.png" tilewidth="32" tileheight="32" tilecount="6" columns="6">
<image source="../../tileset/logic/creature/orc.png" width="192" height="32"/>
</tileset>
<tileset firstgid="451" name="../../tileset/logic/creature/animal.png" tilewidth="32" tileheight="32" tilecount="32" columns="8">
<image source="../../tileset/logic/creature/animal.png" width="256" height="128"/>
</tileset>
<tileset firstgid="483" name="logic/portal" tilewidth="32" tileheight="32" tilecount="24" columns="8">
<image source="../../tileset/logic/portal.png" width="256" height="96"/>
</tileset>
<tileset firstgid="507" name="logic/collision" tilewidth="32" tileheight="32" tilecount="1" columns="1">
<image source="../../tileset/logic/collision.png" width="32" height="32"/>
</tileset>
<tileset firstgid="508" name="spruce" tilewidth="32" tileheight="32" tilecount="6" columns="2">
<image source="../../tileset/plant/tree/spruce.png" width="64" height="96"/>
</tileset>
<tileset firstgid="514" name="taller trees" tilewidth="32" tileheight="32" tilecount="32" columns="8">
<image source="../../tileset/plant/tree/taller_trees.png" width="256" height="128"/>
</tileset>
<tileset firstgid="546" name="bush multicolored" tilewidth="32" tileheight="32" tilecount="6" columns="3">
<image source="../../tileset/plant/bush/bush_mult_colored.png" width="96" height="64"/>
</tileset>
<layer id="1" name="0_floor" width="128" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu3aS27bQBAFQCKOF4muETj3v2E2MSDIFC0Oh+yenlq8paHprmd+BL0vy/JePL/kaaJt+PPnz58/f/78+fPnz58/f/b82fNnz58/f/782fPnz589f/78+fPnz58/f/78o/c5WqK9+PPnz58/f/78+fPnz589f/782fPnz589f/782fNnP69/9L6qJdqTPf8Z7bPMG+06m322uaNtM+wgo/1V+4j2rWp99p6znit6nozJvDfu49r32CP7Gv6te2Vfy36URNuwZ8+eP3v+7Nkz58+eP3v27Pmz58+fP3v+/Pnzn9s/encVEm3Inj97/vx1gD9//jrAnj9/HeDOn/08/tHzC/fZw17Yy55u7O1P9AwiIiIiIq/m50aizyZx9jpRNy3uejFmzrDe2wH9qOn9agdcJ+awd6/grgPM9YC5HrDXA8Y6wH3GHkTvLlPeDv59tCX34/6fqdyD6D1nzdtKRu9B9E5Hypr/0R6wHidb/tl7EL27CnnF/0gP2OfOHv/WHrDPmxb/qB5E76pijvhfdU+I3lHlHPXv8c4ocfnxPxV6cNUZs8zb079nByL2c8YZM855pv9ZHTh7V1ecuWoPHv3XknlP0d6j9+PzGXvEDkRbVujA/XtWRAda9xFtGD1/r/+bx3ftqA7Mnius1/LsO5dXngv0IlcHWj5z63u3vR0YsR8tZz57zivvh783/Ct2oOc82Wft4V+pA1fZZ5n3Vf/qHYhwz7aD7/wrdSDaNsMOzvDv3QGJvw7+WXQgW668Hv598NeBubLmrwPz5LZ8vQfs6YAejJ3b0qcDujBmPpbtDuz114OxcrvLs2eB1h5Ezyb9/F0LamaPv2eCemnx945QJ/fPf1vvAUc7ED2nrOe2kpYOXPk7Aunv3+M6sNWB6DllPf8AZQHUywAAAQA=
</data>
</layer>
<layer id="2" name="1_terrain" width="128" height="128">
<data encoding="base64" compression="gzip">
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
</data>
</layer>
<layer id="3" name="2_object" width="128" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu2dS27VMBRA6U7YRVfVIajqsE+CCWJQBKgMgMKMATCHTfDZDQxIpEZYkZPY1597bZ8jRSo0jm/u3/Z78OABAADAPldn2hIAwKhckn8AVLgg9kCB2e/oOwEA2oK8DaWhLwUAAACwDXv4EAvryLHB/v3DOh4AjiBPANSHuIM1rOWhNHt5h5xUDtbcUAvqSB+UyMfzM8nzY4LdAQAAAOyQa3+AHq8tYtfq7CP1BfEK0A/EMwAAhELNGBeJ7TnD6wfsOBafp+uTthAAAAAAAI0Seh66vm8+d+Vz0mPCmnts1vaX7Ke5ueOKf1N5WMglkBN6kv45OT9TN/qG+pCOGyNLfkSvYxJaH4/uW3r2Gvn3cfkpYAV9FMSCzwDYYavHqx2n9Jr10dT5uifk85Yg4Ym2ALDJUkNK1pKbjTmhHpr7q2/1poYV1O8xCendcufl0/EtsKKV+Iz1Fen3u6AMqbHOeW0d1nruSe89vUspWrB/qTx9Uehc8sXqz7f5pxiaXH3kiPU/5zuzz2KTvZyWy/7Y3i4WazjoII3T0XzoosI5xfJduFq5M8c8VvP8o0LPTa2Pl5xheznPrJPn0/Xs4J4lh/lyWWx+K/0Z1lifcffbrcaoS277vxGMkX6+pNV4rim3z76xNs/tIzXw6djNE0c2WHzSd9/e2BZiPoQWba7FUoOs2N6KHKOgafujOI2J4/U7rMfmqCWplPo/AUdA0ieH2tf1nZI+UdpWo+2vSAnRUyldhq4XeqqDpWJqfm5Int8bLxmXymL/PR/ryf57rPVe6r2l9tXykdbY0o3v+//aLLK2ZE++x/SfWD/auz/EB9x7NHosK3aP1VXo7311vAValHkLiQ208nlv65ytfVqt9wz1gxT/l+zXxDyvNjk/P1gr39fUWY7akXOunsm11ynNP7n9KiUPtlgrasX/lk/UPGPtOVbPFc9WtubNaavYdVVMj1nSL6z7nJX1nhVC7KXd/8XypTF5pRz1+SFjemPWwdfEd3w3jX9//4ze9ZVCqVx/qqDzvdi5m37+gN3F530zLa4NFqz2MDXiIpTW8+Ja/pb9NRar/p2CW7Nrcq2oyxxza8Xx341r5qFAJmp2OtbzgsQvWuGHtgArLNbDP9oCGMZSb2iF0jq5NaZzzV7EArO9r++v09m4MeH6ZW2fyKF36XjX/ltcC+Rr2Y9+Cca8nK5X0/U6sywxSPzItf/vMmINwd10fZiuj5HjctdD1/5PPc/2zXc6iP+ROYqnmHiroeMjeVz7L/e2nKut4dPljaJ+Q+bu1f6aep/5eX9t/c5Hr7aQEKML9Aal6NW35v7Q1yO2RIr8MWN79gEIo4QPWPMrnzwaMlrbJ5ai3YNKsOaTOUl5t571korUz6XjNM4qsL89fDYp1dPs2b+nPirnnqcEK7rspQfJTaj9S9hxb+7Wz68ty14iFlLe90iePV84mlfSk/ie+W36u++Gbeqi0UvVjFeLudyiTDOW89BI/APOQoPUAAABAA==
</data>
</layer>
<layer id="4" name="3_roof" width="128" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu3b2UrEMBQG4HbcwH1fbtX3v1HQ1xBfxy2iFx2ZgRmEhub/Puh9zjlJ2jRJ15Hkre+69752K6jlo9T+M7j+s1nXbcxqt2IcxyXOk5BYV7Vb8rEXkpPrEudNSKyrOi35OAvOiTkhmzmBdLel/9+V5944YMDaOFv62pi2ee8BaTbLfLcVMudtlzh3QmJd1X7Jx0GDOVm0XjkscR41GOt/nJd8XPzmZNn4mOK30aL1ymVp/9WEYhib8ZHN+KAlSecZ1pWw1zk8z+D/9byEvc7heQb/rwEAYJ41UjZrJKAVU9y3ZHz2CbIl3Xvkx3D/K/3eY6KE/S8AAAAAAGD6nN/L8rfezu9lUW++JdzlZTlnGaA9zi8DAABjcjcum7tx2dyNAwAAAAAAAAAAAAAAAAAAAAAAoLbX2g2gOn0AfQB9AH0AfQCAlnnPte+ldgNomjkE6jLH51FzpmSs7wTjIpO6AwAAAMB0PfRd99jXbgW1PJXaP6s/AGv6AsdoUeEAAAEA
</data>
</layer>
<layer id="5" name="objects" width="128" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu3cOw3AMAwFwJQ/qSylEAjlkC0Auj4lan2HwIN/g+XWAAAAAAAAAAAAAAAAAAAAAAAAAAAAznqu0xEAAAAAAAAAAAAAAAAAAAAAAEBe918HAH7FbAcAAAAAAAAAKnM7AUA1Zh8AAF9llwXI0VOpZsp5gK1ufRcACBn2CohRTwAAAPC2AGsoDicAAAEA
</data>
</layer>
<layer id="6" name="collision" width="128" height="128" visible="0" opacity="0.49">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu2a2XLbUAxD0///ZL+0mkynqmJLd+ECgDwzfklsmQBIaklev76+Xn9eqrzE9e2i7o+6vl3U/VHXN8vVD3V/1PXtou6Pur47RrSr+1Nt382i7oe6vlmqzYO6vl2U/fmk7e/PVXXPoOqDqi5rFH1a1aToxROKmhU1WfDuvKfolaImL9S8UtPjjdq1sJKWKFR6QEFDFgrePd3vj3yWyYN39Va+91HQkIWCd/33rnUUfFHQkIWCdwoaslDwrsKzrStnjTt6FbxS0JCFgncKGrJgvP+9wl5/Jp1/w+4fe/3ZsO8A5toRYM5/tG5WfVGw+sNaNxqMO4CtXkus8+r8a8OWP1OtLDD1AEud2cz4xJI/Q42Z7P4vEKK359oQ69sFRRdKHWeUsr9qQdOGVMsBUi07POWO4jtKHeda2JnJPrsnUPJHqMGC2RwR+iCz51D6z4JVLdn7IKPXOvvx43n7FNljCllf8dQW0QfeuShnfxA9P9bXk+y7JZOsazWP/Nn2SjaZe63zz0XtnGatRcmbK2rZH6Dlj+av4j3rmez8kT1Vz/7A49mFAhWyP0DJH8lj9czPoOSPQqXsD6y0fjoOk59MtVrhnT8TChpm6fy/qTj7B53/N+z1r2DZ8+z+sdc/i/W+Y/av2u730MvqX6XsPZ9nMXpYKfsDT73IPj49m6iCp17GWWKrd4eIfNj8ZKt3h8j8GTxlqtWCKK0snrLUaUV0/sjeMtRoSbReBG+v97rvXhXI0Jvp70juVbI/yNCb5XNn/5MszVk7p2LGd2TnPzOLK7Paud+Dfi6efX/v9Tmq5N+8h92fzn2P9gkb757u/HGJOL91/njsXueu3B81OazkZ9kDnX8sXjt99VidfxwZ96p9j5xPtudP3989YA/ajD3Vg1InM+z7lbFmFJhzP6OgwYtK11KKmlapkvk7VHXOzHLV7M+oaO6M/2dGF7svnftPVnQy+FQ50xl2vEHxtWd5j12vMn3u7O2w7gNvOmsfdjyNyqGz9gexD3rO41ntg5HPXH/26bi94/Ox6oG7Y/S1HD7WfTD6vs4di9l8dvJfraf76J5dP2Z3u1etM9n3eegfVloiZu/T5y2yX82fvQ+sdUT7tXJMj/yZ+8BTg6dXCL6r9IeXhpHZ2q0XgWo9MKrJer+ie8mg4e67rXIZ0amW/QjRWjx2ueeOiM7+6Ts8vt9LU5aPjPMateNWavHWUxWvzC18RqhBlRWP7n7vlUGVrKNqjfbLKq+nzzBnf+CZC8qMqM2sJZY7Dt1nlNqQfNk9zymcE6NqZ/NIOfMrkXOg7Bcz2Tmz+6dK1HwrzFCzjsoebdZQOpc283T+ten8a9P516bz52Y3N7XnKdXwyL97oA4Kz4WbdX4D0pyrxwAAAQA=
</data>
</layer>
<layer id="7" name="protection" width="128" height="128" visible="0">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu3BAQEAAACAkP6v7ggKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAauuOl9cAAAEA
</data>
</layer>
</map>

File diff suppressed because one or more lines are too long

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