Compare commits
25 commits
master
...
VERSION_01
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
785675f13d | ||
|
|
2e9ade5a23 | ||
|
|
b8359f3a81 | ||
|
|
1ff055b2f0 | ||
|
|
ab5a10400a | ||
|
|
c8eb546590 | ||
|
|
14fa450dfd | ||
|
|
8241fc9686 | ||
|
|
328ec57136 | ||
|
|
92da86aef6 | ||
|
|
6e3cb4b3bd | ||
|
|
423f94f25e | ||
|
|
010375d6d5 | ||
|
|
17864b85c7 | ||
|
|
ba585d7a91 | ||
|
|
a68991e38b | ||
|
|
e56d8680d9 | ||
|
|
68f21d5eeb | ||
|
|
8af5ae1bbb | ||
|
|
22fa54ab6a | ||
|
|
6b57ebe3f8 | ||
|
|
f1523798c7 | ||
|
|
4fb31e2a7d | ||
|
|
0b619f9d8c | ||
|
|
edf4297854 |
50
.github/workflows/android-build.yml
vendored
|
|
@ -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
|
||||
|
|
|
|||
12
.github/workflows/codeql-analysis.yml
vendored
|
|
@ -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
|
|
@ -50,3 +50,4 @@ build_server_xmlconf
|
|||
/node_modules/
|
||||
/log/
|
||||
/build-archive/
|
||||
/srcjs/contributors.html
|
||||
|
|
|
|||
11
.project
|
|
@ -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>
|
||||
|
|
|
|||
48
README.md
|
|
@ -20,38 +20,19 @@ So what are you waiting for?! A whole new world awaits...
|
|||
|
||||
## How to play
|
||||
|
||||
### Web Browser
|
||||
|
||||
[](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
|
||||
|
||||
[](https://stendhalgame.org/account/mycharacters.html)
|
||||
[](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
|
|
@ -1 +0,0 @@
|
|||
/godot/
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()) {
|
||||
|
|
@ -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!
|
||||
|
|
@ -1 +1 @@
|
|||
Ein Multiplayer-Adventure mit klassischer 2D-Grafik
|
||||
Stendhal ist ein Multiplayer-Adventure mit klassischer 2D-Grafik. Es ist vollständig Open Source.
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 335 KiB |
|
Before Width: | Height: | Size: 647 KiB |
|
Before Width: | Height: | Size: 597 KiB |
|
|
@ -1 +1 @@
|
|||
A multiplayer adventure with classic 2D graphics
|
||||
Stendhal is a multiplayer adventure with classic 2D graphics. It is completely open source.
|
||||
|
|
|
|||
|
|
@ -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!
|
||||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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!
|
||||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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!
|
||||
|
|
@ -1 +1 @@
|
|||
Un'avventura multiplayer con la classica grafica 2D
|
||||
Stendhal è un'avventura multiplayer con la classica grafica 2D. È completamente open source.
|
||||
|
|
|
|||
|
|
@ -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!
|
||||
|
|
@ -1 +0,0 @@
|
|||
Wieloosobowa gra przygodowa z klasyczną grafiką 2D
|
||||
|
|
@ -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!
|
||||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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!
|
||||
|
|
@ -1 +0,0 @@
|
|||
O aventură multijucător cu grafică 2D clasică
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 49 KiB |
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
1
app/neutralinojs/.gitignore
vendored
|
|
@ -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*
|
||||
|
|
|
|||
1
app/neutralinojs/extensions/binary/steam_appid.txt
Normal file
|
|
@ -0,0 +1 @@
|
|||
2267890
|
||||
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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');
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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())
|
||||
|
|
@ -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
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
|
@ -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"/>
|
||||
|
|
|
|||
|
|
@ -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."/>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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="/data/maps/tileset""
|
||||
match="data-tileset-path="/tileset""
|
||||
replace="data-tileset-path="/data/tileset""
|
||||
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>
|
||||
|
|
|
|||
|
|
@ -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"/>
|
||||
|
|
|
|||
|
|
@ -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 <target> [<target>...]" />
|
||||
<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>
|
||||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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="<string name="build_version">.*?</string>"
|
||||
replace="<string name="build_version">${version}</string>"
|
||||
byline="true"/>
|
||||
<replaceregexp file="app/neutralinojs/neutralino.config.json"
|
||||
match=""version": ".*""
|
||||
replace=""version": "${version}""
|
||||
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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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"/>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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>
|
||||
|
|
@ -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}">
|
||||
|
|
|
|||
|
|
@ -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}"/>
|
||||
|
|
|
|||
|
|
@ -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 *
|
||||
|
|
@ -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/
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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"/>
|
||||
|
|
|
|||
|
|
@ -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"/>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -236,7 +236,7 @@
|
|||
</equips>
|
||||
<ai>
|
||||
<profile name="animal"/>
|
||||
<profile name="wander"/>
|
||||
<profile name="patrolling"/>
|
||||
</ai>
|
||||
</creature>
|
||||
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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"/>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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 -->
|
||||
|
|
|
|||
|
|
@ -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 -->
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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"/>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 843 B |
|
|
@ -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 |
|
Before Width: | Height: | Size: 720 B |
|
|
@ -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
|
|
@ -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.=
|
||||
|
|
|
|||
|
|
@ -1,2 +1 @@
|
|||
build
|
||||
dist
|
||||
Level*
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
@ -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">
|
||||
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
|
||||
</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>
|
||||
|
|
@ -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">
|
||||
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
|
||||
</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">
|
||||
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>
|
||||
|
|
@ -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">
|
||||
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
|
||||
</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>
|
||||
|
|
@ -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>
|
||||