Compare commits

..

19 commits

Author SHA1 Message Date
Jordan Irwin
a41681759f Don't assume on-time delivery when timestamp isn't available
Some checks failed
Java CI / build (push) Has been cancelled
2024-06-07 07:58:32 +02:00
Jordan Irwin
52dbfcbaa1 Fix parsing completions count of Kill Enemy Army quest 2024-06-07 07:58:16 +02:00
Jordan Irwin
5c957584f6 Add failsafe to DeliverItemTask.isDeliveryTooLate 2024-06-07 07:57:40 +02:00
Hendrik Brummermann
6c3d66277e updated Android release notes 2024-05-30 23:23:26 +02:00
Jordan Irwin
34b735f1ec
Reword changes 2024-05-26 12:51:59 -07:00
Jordan Irwin
d6143973e5
Disable sliders when sound not enabled 2024-05-26 12:49:36 -07:00
Jordan Irwin
cfd976738e
Add ComponentBase.setEnabled method 2024-05-26 12:49:35 -07:00
Jordan Irwin
5b15d1d35d
Add SettingsComponent.getValue method 2024-05-26 12:49:35 -07:00
Jordan Irwin
518ad38b09
Add sliders for remaining sound layers in settings dialog 2024-05-26 12:49:34 -07:00
Jordan Irwin
77c60c33de
Fix button spacing of chat log context menu 2024-05-26 05:03:42 -07:00
Jordan Irwin
2688cf8a18
Support plain text download in Android client
Closes: https://github.com/arianne/stendhal/issues/727
2024-05-26 04:30:05 -07:00
Jordan Irwin
042b286c21
Clean up extra trailing semicolon 2024-05-26 04:29:45 -07:00
Jordan Irwin
1424391ec5
Update changes pertaining to Android release 2024-05-25 20:08:57 -07:00
Jordan Irwin
a89d346d95
Reword changes 2024-05-25 01:12:50 -07:00
Jordan Irwin
fc13470c92
Disable Portuguese translation pending review 2024-05-25 01:06:19 -07:00
Jordan Irwin
bba21bd166
In case of logout in arena, update deathmatch slot after teleport to...
...allow player to start again

Closes: https://github.com/arianne/stendhal/issues/724
2024-05-25 01:01:04 -07:00
Jordan Irwin
14e29cf0c2
Show number of hot deliveries in Pizza Delivery quest history 2024-05-24 21:04:22 -07:00
Jordan Irwin
e77b903648
Class for adding a customized result to BuiltQuest history 2024-05-24 21:04:09 -07:00
Hendrik Brummermann
c4fe94dd86 updated version numbers 2024-05-24 06:13:17 +02:00
513 changed files with 10084 additions and 15904 deletions

View file

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

View file

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

View file

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

View file

@ -30,28 +30,29 @@ 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.
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).
[F-Droid App Store](https://f-droid.org/) or download it from https://stendhalgame.org/download.html.
### Classic Desktop
[![Download](https://stendhalgame.org/images/downloadbutton.png)](https://arianne-project.org/download/stendhal.zip)
Play using the classic desktop client. You will need Java which you can download from
[java.com](https://www.java.com/en/download) on Microsoft Windows. Java is included in
[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
@ -66,7 +67,7 @@ There is a [manual](https://stendhalgame.org/wiki/Stendhal_Manual), and there is
Stendhal is free software. You can redistribute it and/or modify under the following terms:
- The **server**, **java client**, and **Android client**: *GNU General Public License* 2 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
- 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
@ -75,6 +76,6 @@ even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE
[LICENSE.txt](LICENSE.txt) and [src/js/LICENSE.html](src/js/LICENSE.html) file for more details.
Stendhal(c) is copyright of Miguel Angel Blanch Lardin, 2005-2008, arianne_rpg at users dot sourceforge dot net and others<br>
Stendhal(c) is copyright of the Arianne Project, 2006-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).

1
app/.gitignore vendored
View file

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

View file

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

View file

@ -14,7 +14,6 @@ package org.stendhalgame.client;
import java.util.Random;
import android.app.AlertDialog;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
@ -190,11 +189,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()));
@ -268,9 +263,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

View file

@ -112,10 +112,8 @@ public class DownloadHandler {
* 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();
@ -134,11 +132,8 @@ public class DownloadHandler {
} else if (DownloadType.IMAGE_PNG.equals(dtype)) {
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 + ")");
@ -152,11 +147,9 @@ public class DownloadHandler {
// `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";
}
// default filename
final String targetName = "stendhal_" + new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss")
.format(new Date()) + ".txt";
Logger.debug("Saving file: " + targetDir.getPath()
+ "/" + targetName + " (" + mimetype + ")");
@ -185,18 +178,6 @@ public class DownloadHandler {
}
}
/**
* 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;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 335 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 647 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 597 KiB

View file

@ -1,3 +1,9 @@
PUT RELEASE ANNOUNCEMENT LINES HERE
Pizza is a popular meal of choice. With growing demand, Leander is looking to hire reliable workers to transport his hot and delicious cuisine to patrons. Couriers with reputations of on-time deliveries are being recognized for their work ethic.
Please see the complete change log for further details: https://arianne-project.org/game/stendhal.html#changes
Some adventurers may be distressed and feel that their quest for the title of "Ultimate Collector" is in vain. Well fret no more, as Balduin is offering a ray of hope. Requests to bring him a different item are now accepted afer some time has passed.
Speaking of weapons, some creatures have once again taken up arms. For example the angel and dark angel have new swords.
Last but not least: We released an official Android App, which is available in the download section of our website or on F-Droid.
Please see the complete change log for further details: http://localhost/game/stendhal.html#changes

View file

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

View file

@ -19,7 +19,7 @@ import android.content.DialogInterface;
/**
* Semi-functional logger for release builds.
*
*
* Displays notification dialogs but does not write to logs directory.
*/
public class Logger {

View file

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

View file

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

View file

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

View file

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

View file

@ -0,0 +1 @@
2267890

View file

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

View file

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

View file

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

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

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

View file

@ -91,10 +91,10 @@ updates_server_fallback = http://arianne.sourceforge.net/stendhal/updates
version_server = http://arianne.sourceforge.net/stendhal.version
# current version of stendhal
version.old = 1.49
version = 1.49.5
version.old = 1.46
version = 1.47
# FIXME: dynamic method to set this property?
version.android = 1049005
version.android = 1047000
# javac options
javac.deprecation = true
@ -102,17 +102,17 @@ 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
docu = data/docu
maps = data/maps
data = data/gui
sprites = data/sprites
layers = data/layers
build = build
lib = ${buildroot}/lib
marauroa_root = ../marauroa
marauroa_src = ${marauroa_root}/src

102
build.xml
View file

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

View file

@ -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" />
@ -63,12 +62,12 @@
-->
<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 +77,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 +150,7 @@
</target> <!-- client_android_build -->
<!-- Create Android client package for release and distribution. -->
<target name="android">
<target name="android" description="Create Android client package for release and distribution.">
<echo
if:set="exclude.webview"
message="ANDROID_SDK_ROOT environment variable not set. Skipping Android WebView client build."/>

View file

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

View file

@ -19,15 +19,13 @@
</condition>
<!-- Build server and clients. -->
<target name="jar" depends="client_build,server_build">
<target name="jar" depends="client_build,server_build" description="Build server and clients.">
<!-- XXX: client & server builds are not exclusive to NetBeans, remove this output? -->
<echo>Built client and server for NetBeans.</echo>
</target>
<!-- Sign client distribution. -->
<target name="signjar" unless="exclude.signing">
<target name="signjar" unless="exclude.signing" description="Sign client distribution.">
<signjar
alias="${keystore.alias}"
keystore="keystore.ks"
@ -36,23 +34,20 @@
</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">
@ -90,8 +85,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 +104,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">
@ -138,15 +132,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 +175,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"/>
@ -347,8 +336,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 +362,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 +388,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 +400,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 +410,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 +442,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 +490,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 +535,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 +556,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 +577,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 +593,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 +603,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 +618,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,9 +654,8 @@
</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 -->
@ -713,46 +663,34 @@
<!-- START: web client -->
<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-marauroa,js-prepare-build,js-prepare-node,js-prepare-contribs"/>
<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>
@ -760,11 +698,11 @@ export function version(marauroa, stendhal) {
<target name="js-prepare-contribs" depends="js-prepare-node">
<exec executable="${executable.npx}" failonerror="true">
<exec executable="npx${executable.suffix}" failonerror="true">
<arg value="showdown"/>
<arg value="makehtml"/>
<arg value="--input"/>
<arg value="${docs}/contributors.md"/>
<arg value="doc/contributors.md"/>
<arg value="--output"/>
<arg value="${srcjs}/contributors.html"/>
</exec>
@ -773,19 +711,72 @@ export function version(marauroa, stendhal) {
<!-- 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" />
@ -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,8 +802,7 @@ 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}">
@ -835,16 +824,17 @@ export function version(marauroa, stendhal) {
</target> <!-- webclient_build -->
<!-- Create web client package for release and distribution. -->
<target name="dist_webclient_binary" depends="webclient_build">
<target name="build_webclient" depends="webclient_build" description="Alias of webclient_build."/>
<target name="dist_webclient_binary" depends="webclient_build" description="Create web client package for release and distribution.">
<zip destfile="${buildroot}/stendhal-webclient-${version}.zip">
<zipfileset dir="${build_client_data}"/>
<zipfileset dir="${build_client_music_data}"/>
<zipfileset dir="${build_client_sound_data}"/>
<zipfileset dir="${build_webclient}" prefix="js"/>
<zipfileset dir="${docs}" prefix="doc">
<zipfileset dir="doc" prefix="doc">
<include name="contributors.md"/>
<include name="ReleaseNotes.txt"/>
<include name="Licenses/**"/>
<include name="sources/**"/>
</zipfileset>

View file

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

View file

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

View file

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

View file

@ -2,8 +2,7 @@
<project xmlns:if="ant:if" xmlns:unless="ant:unless">
<!-- Update version and resource info. -->
<target name="init">
<target name="init" description="Update version and resource info.">
<mkdir dir="${lib}"/>
<!-- update version -->
@ -43,10 +42,6 @@
match="&quot;version&quot;: &quot;.*&quot;"
replace="&quot;version&quot;: &quot;${version}&quot;"
byline="true"/>
<replaceregexp file="${src}/games/stendhal/client/update/HttpClient.java"
match="StendhalClient/.* \("
replace="StendhalClient/${version} \("
byline="true"/>
<!-- update location of resources -->
<replaceregexp file="${src}/games/stendhal/client/update/game-default.properties"
@ -90,8 +85,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 +163,7 @@
</target> <!-- checkxml -->
<!-- Add date to pre-release test client. -->
<target name="internalUpdatePrereleaseVersion" if="PRE_RELEASE">
<target name="internalUpdatePrereleaseVersion" if="PRE_RELEASE" description="Add date to pre-release test client.">
<tstamp prefix="date">
<format property="iso" pattern="yyyy-MM-dd"/>
</tstamp>

View file

@ -4,8 +4,7 @@
<import file="tools.xml" />
<!-- Convert TMX maps to PNG images scaled 1:16. -->
<target name="rendermaps" depends="compile_stendhaltools">
<target name="rendermaps" description="Convert TMX maps to PNG images scaled 1:16." depends="compile_stendhaltools">
<taskdef name="maprenderer" classname="games.stendhal.tools.MapRenderer">
<classpath>
<pathelement path="${build_stendhaltools}"/>
@ -13,9 +12,9 @@
</classpath>
</taskdef>
<mkdir dir="${maps}/world"/>
<mkdir dir="tiled/world"/>
<maprenderer imagePath="${maps}/world/">
<fileset dir="${maps}">
<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"/>
<mkdir dir="tiled/world"/>
<maprenderer imagePath="${maps}/world/" zoom="0.0625">
<fileset dir="${maps}">
<fileset dir="tiled">
<include name="Level 0/**/*.tmx"/>
<exclude name="**/memory/**"/>
</fileset>
</maprenderer>
<mkdir dir="${maps}/world/large"/>
<mkdir dir="tiled/world/large"/>
<maprenderer imagePath="${maps}/world/large" zoom="0.25">
<fileset dir="${maps}">
<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>
@ -79,7 +79,7 @@
</classpath>
</taskdef>
<maprenderer imagePath="${maps}/world/" zoom="1.0">
<fileset dir="${maps}/world">
<fileset dir="tiled/world">
<include name="world.tmx"/>
</fileset>
</maprenderer>
@ -88,8 +88,7 @@
</target> <!-- renderworldmap -->
<!-- Load and save TMX maps to fix tilesets changes. -->
<target name="updatemaps" depends="compile_stendhaltools">
<target name="updatemaps" description="Load and save TMX maps to fix tilesets changes." depends="compile_stendhaltools">
<taskdef name="mapupdater" classname="games.stendhal.tools.MapUpdater">
<classpath>
<pathelement path="${build_stendhaltools}"/>
@ -98,7 +97,7 @@
</taskdef>
<mapupdater>
<fileset dir="${maps}">
<fileset dir="tiled">
<include name="Level */**/*.tmx"/>
<include name="interiors/**/*.tmx"/>
</fileset>

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -89,70 +89,6 @@
<attribute name="hidden"/>
</portal>
<portal x="13" y="56" ref="ent11n">
<destination zone="0_ados_mountain_n2_w" ref="ent11s"/>
<attribute name="move.continuous"/>
<attribute name="hidden"/>
</portal>
<portal x="13" y="57" ref="ent11s">
<destination zone="0_ados_mountain_n2_w" ref="ent11n"/>
<implementation class-name="games.stendhal.server.entity.mapstuff.portal.LevelCheckingPortal">
<parameter name="minimum-level">100</parameter>
<parameter name="rejected">The entwives are NOT babysitters. Come back when you have some age on you.</parameter>
</implementation>
<attribute name="move.continuous"/>
<attribute name="hidden"/>
</portal>
<portal x="14" y="56" ref="ent12n">
<destination zone="0_ados_mountain_n2_w" ref="ent12s"/>
<attribute name="move.continuous"/>
<attribute name="hidden"/>
</portal>
<portal x="14" y="57" ref="ent12s">
<destination zone="0_ados_mountain_n2_w" ref="ent12n"/>
<implementation class-name="games.stendhal.server.entity.mapstuff.portal.LevelCheckingPortal">
<parameter name="minimum-level">100</parameter>
<parameter name="rejected">The entwives are NOT babysitters. Come back when you have some age on you.</parameter>
</implementation>
<attribute name="move.continuous"/>
<attribute name="hidden"/>
</portal>
<portal x="15" y="56" ref="ent13n">
<destination zone="0_ados_mountain_n2_w" ref="ent13s"/>
<attribute name="move.continuous"/>
<attribute name="hidden"/>
</portal>
<portal x="15" y="57" ref="ent13s">
<destination zone="0_ados_mountain_n2_w" ref="ent13n"/>
<implementation class-name="games.stendhal.server.entity.mapstuff.portal.LevelCheckingPortal">
<parameter name="minimum-level">100</parameter>
<parameter name="rejected">The entwives are NOT babysitters. Come back when you have some age on you.</parameter>
</implementation>
<attribute name="move.continuous"/>
<attribute name="hidden"/>
</portal>
<portal x="16" y="56" ref="ent14n">
<destination zone="0_ados_mountain_n2_w" ref="ent14s"/>
<attribute name="move.continuous"/>
<attribute name="hidden"/>
</portal>
<portal x="16" y="57" ref="ent14s">
<destination zone="0_ados_mountain_n2_w" ref="ent14n"/>
<implementation class-name="games.stendhal.server.entity.mapstuff.portal.LevelCheckingPortal">
<parameter name="minimum-level">100</parameter>
<parameter name="rejected">The entwives are NOT babysitters. Come back when you have some age on you.</parameter>
</implementation>
<attribute name="move.continuous"/>
<attribute name="hidden"/>
</portal>
<!-- wishing well-->
<entity x="86" y="21">
<implementation class-name="games.stendhal.server.entity.mapstuff.useable.WellSource"/>

View file

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

View file

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

View file

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

View file

@ -1027,7 +1027,7 @@ below average.
class-name="games.stendhal.server.entity.mapstuff.area.MessagingArea">
<parameter name="width">5</parameter>
<parameter name="height">5</parameter>
<parameter name="enterMessage">You hear faint incantations of dark magic from below. The place reeks of danger.</parameter>
<parameter name="enterMessage">You hear faintly incantations of dark magic from below. The place reeks of danger.</parameter>
<parameter name="warnPlayer">true</parameter>
</implementation>
</entity>

View file

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

View file

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 843 B

View file

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

Before

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 720 B

View file

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

Before

Width:  |  Height:  |  Size: 4.3 KiB

1779
data/languages/en.txt Normal file

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1097,7 +1097,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.=
@ -1266,9 +1265,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 +1407,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
@ -1642,7 +1635,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 +1702,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
@ -2277,7 +2268,6 @@ cannibal=
You see a cannibal. He hunts you for cooking and eating your fresh meat! It's useless to tell him that your flesh is not good, better fight him or run away!=
elder cannibal=
You see an elder cannibal. For years it has eaten humans. It will not stop until its hunger is satisfied.=
cannibal warrior=
You see a cannibal warrior.=

View file

@ -1,112 +1,212 @@
<?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"/>
<!DOCTYPE map SYSTEM "http://mapeditor.org/dtd/1.0/map.dtd">
<map version="1.0" orientation="orthogonal" width="128" height="128" tilewidth="32" tileheight="32">
<tileset firstgid="1" name="ground/brown" tilewidth="32" tileheight="32">
<image source="../../tileset/ground/brown.png" trans="ff00ff"/>
</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 firstgid="6" name="logic/collision" tilewidth="32" tileheight="32">
<image source="../../tileset/logic/collision.png"/>
</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 firstgid="7" name="logic/creature/chaos" tilewidth="32" tileheight="32">
<image source="../../tileset/logic/creature/chaos.png"/>
</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 firstgid="14" name="ground/ground" tilewidth="32" tileheight="32">
<image source="../../tileset/ground/ground.png"/>
</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 firstgid="47" name="ground/water/pool" tilewidth="32" tileheight="32">
<image source="../../tileset/ground/water/pool.png"/>
</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 firstgid="119" name="ground/brown_edges" tilewidth="32" tileheight="32">
<image source="../../tileset/ground/brown_edges.png"/>
</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 firstgid="137" name="ground/brown_corners" tilewidth="32" tileheight="32">
<image source="../../tileset/ground/brown_corners.png"/>
</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 firstgid="145" name="ground/earth_edges" tilewidth="32" tileheight="32">
<image source="../../tileset/ground/earth_edges.png"/>
</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 firstgid="163" name="ground/grass_corners" tilewidth="32" tileheight="32">
<image source="../../tileset/ground/grass_corners.png"/>
</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 firstgid="187" name="ground/rock/green_crystal2" tilewidth="32" tileheight="32">
<image source="../../tileset/ground/rock/green_crystal2.png"/>
</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 firstgid="207" name="ground/rock/pebbles" tilewidth="32" tileheight="32">
<image source="../../tileset/ground/rock/pebbles.png"/>
</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 firstgid="210" name="ground/rock/blue_crystal" tilewidth="32" tileheight="32">
<image source="../../tileset/ground/rock/blue_crystal.png"/>
</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 firstgid="230" name="ground/rock/rocks_3" tilewidth="32" tileheight="32">
<image source="../../tileset/ground/rock/rocks_3.png"/>
</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 firstgid="246" name="plant/bush/various_small" tilewidth="32" tileheight="32">
<image source="../../tileset/plant/bush/various_small.png"/>
</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 firstgid="255" name="plant/mosses" tilewidth="32" tileheight="32">
<image source="../../tileset/plant/mosses.png"/>
</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 firstgid="271" name="logic/creature/hybrid" tilewidth="32" tileheight="32">
<image source="../../tileset/logic/creature/hybrid.png" trans="ff00ff"/>
</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 firstgid="287" name="ground/grass_2" tilewidth="32" tileheight="32">
<image source="../../tileset/ground/grass_2.png"/>
</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 firstgid="308" name="ground/water/whirlpool" tilewidth="32" tileheight="32">
<image source="../../tileset/ground/water/whirlpool.png"/>
</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 firstgid="316" name="logic/creature/mythical_being" tilewidth="32" tileheight="32">
<image source="../../tileset/logic/creature/mythical_being.png"/>
</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 firstgid="340" name="building/wall/int_sandstone" tilewidth="32" tileheight="32">
<image source="../../tileset/building/wall/int_sandstone.png"/>
</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 firstgid="355" name="building/entrance/shadow" tilewidth="32" tileheight="32">
<image source="../../tileset/building/entrance/shadow.png"/>
</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 firstgid="358" name="plant/flower/hothouse_flowers" tilewidth="32" tileheight="32">
<image source="../../tileset/plant/flower/hothouse_flowers.png"/>
</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 firstgid="430" name="logic/creature/insect" tilewidth="32" tileheight="32">
<image source="../../tileset/logic/creature/insect.png"/>
</tileset>
<layer id="1" name="0_floor" width="128" height="128">
<layer 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">
<layer name="1_terrain" width="128" height="128">
<data encoding="base64" compression="gzip">
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
Zyr+BYtELmkAAAEA
</data>
</layer>
<layer id="3" name="2_object" width="128" height="128">
<layer name="2_object" width="128" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu3bMQrAIAwFUHOrnqU6tPe/RCkOHUUQrPjelDGQ5ROSlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD2dcbsDpjpMn8AoEORHQAAaMhRc6O9437eXeMdXw0AAAAAAAAAAACMcbjLAwAW5b8A+sn/AAAAAAAAAAAAAPAvD8b9VLMAAAEA
H4sIAAAAAAAAAO3bzQpAQBQGUPNWngULnkeKN5YsbKYkynDPWVlN6s7P12WqCgAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAACCuJr39BrypV38A4IJOdgAA4ESb9tyo7xjP1msc0vEMAAAA
AAAAAEAZZv9yQEh31/5o7yhK/UA9nhgDgH+4mhMmZwg3uF9QlkU9PkF2pzR6BOQ4U+D/ZBKIybdl
cswLAAAAIEcfGQAAiGYFWjgd9QAAAQA=
</data>
</layer>
<layer id="4" name="3_roof" width="128" height="128">
<layer 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==
H4sIAAAAAAAAAO3c20rDQBAG4Lz/O1lBL6q3HloVD/sceuMUWppeGKOwmbL7ffBDSgM7sJDdzEKG
AQAAAAAAAAAAAIBaPiNf2UUAAAAAAAAAAAAAQEdKdgEAAFRVRtebrCJY1F3kPrsI0mwjTxP/l4Xq
IMdr5C3yuP/tud+f58hLdhGkeY98ZBcB/MvDcFy/6Y/1u2/Wb8b0dNq3e0//6Rtbv/V0aNuhpwMA
QJt27wIluwigqpJdAGnKjHv0/fqm79e+qbNefb/2Oevtm7NeDuz3+ma/1zf7PQAAAAAAAAAAMlxE
VtlFcGI8J7eVx7qKXFceg79Zck7WkZuFxmKeqTm5rDhu7WcNAHA+rPsA0Laa/QMAAAAAAAAAAAAA
AADOxzeEbpmpAAABAA==
</data>
</layer>
<layer id="5" name="4_roof_add" width="128" height="128">
<layer name="4_roof_add" width="128" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu3OAQ0AAAgDoPfPZyBj3E1IQAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwy7QDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABPLYaZVTEAAAEA
H4sIAAAAAAAAAO3OAQ0AAAgDoPfPZyBj3E1IQAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwy7QD
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABPLYaZVTEAAAEA
</data>
</layer>
<layer id="6" name="objects" width="128" height="128">
<layer name="objects" width="128" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu3cQQqDMBAF0Liytr1C73/NIrgqoVA1nZh5b+PGxQdlNF9MKQAAAAAAAABAhHt0AAAAAAAAgIE8ogMAAAAAX83b0Roe8nhGBwAAAICij8pqTy/xmk6PcViPma7MPBjf5zWeq2cBtOeZA0BrvscDe9XmR6v3V91Wv3QmwEp/AQAAwC9u0QEAAAAAACAx/xBAbvbzBQAAAKBGXwQAAFyNven+w3oRODIHzBDO4l4a0xIdAOiOeQ8AAAAAAAAAAAAAAJDXG8ZnpKUAAAEA
H4sIAAAAAAAAAO3cSw6CMBQF0DrC3xZcjTt2hcbEiaYxUmheP+dMmDC4CeTSPgIpAQAAAAAAAAAR
ztEBAAAAAAAABnKJDgAAAAD8tLyP9vAwj2t0AAAAAEjmUbMqmUvcDrvH2KzFTD3TB+P7vsZL9iyA
+jxzAKjN+3igVK4/aq1fzbbaZWYCvJhfAAAAsMYxOgAAAAAAAEzMNwQwN//zBQAAACDHvAgAAOhN
j/+mu3eY2X6xXI/XG3K29IAOyfunH3TIJ/fSmE7RAYDm6HsAAEZjxsNa7hmAfelVAIB5WQsCAAA9
e9jTAAATewI4cp9TAAABAA==
</data>
</layer>
<layer id="7" name="collision" width="128" height="128" visible="0" opacity="0.58">
<layer name="collision" width="128" height="128" visible="0" opacity="0.58">
<data encoding="base64" compression="gzip">
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
9vc7rBC9b7T/AUzTPD0AAAEA
</data>
</layer>
<layer id="8" name="protection" width="128" height="128" visible="0">
<layer name="protection" width="128" height="128" visible="0">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu3BAQEAAACAkP6v7ggKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAauuOl9cAAAEA
H4sIAAAAAAAAAO3BAQEAAACAkP6v7ggKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAauuOl9cAAAEA
</data>
</layer>
</map>

File diff suppressed because one or more lines are too long

View file

@ -1,6 +1,6 @@
<?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="10" nextobjectid="1">
<tileset firstgid="1" name="ground" tilewidth="32" tileheight="32" tilecount="33" columns="3">
<map version="1.9" tiledversion="1.9.2" orientation="orthogonal" renderorder="right-down" width="128" height="128" tilewidth="32" tileheight="32" infinite="0" nextlayerid="9" 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/ridge/earth_dark.png" tilewidth="32" tileheight="32" tilecount="96" columns="12">
@ -36,111 +36,101 @@
<tileset firstgid="268" name="palm_tree" tilewidth="32" tileheight="32" tilecount="6" columns="2">
<image source="../../tileset/plant/tree/palm_tree.png" width="64" height="96"/>
</tileset>
<tileset firstgid="274" name="tree_blue" tilewidth="32" tileheight="32" tilecount="25" columns="5">
<tileset firstgid="274" name="Untitled" tilewidth="32" tileheight="32" tilecount="25" columns="5">
<image source="../../tileset/plant/tree/tree_blue.png" width="160" height="160"/>
</tileset>
<tileset firstgid="299" name="tree_golden_large" tilewidth="32" tileheight="32" tilecount="24" columns="4">
<tileset firstgid="299" name="Untitled" tilewidth="32" tileheight="32" tilecount="24" columns="4">
<image source="../../tileset/plant/tree/tree_golden_large.png" width="128" height="192"/>
</tileset>
<tileset firstgid="323" name="tree_golden_small" tilewidth="32" tileheight="32" tilecount="6" columns="2">
<tileset firstgid="323" name="Untitled" tilewidth="32" tileheight="32" tilecount="6" columns="2">
<image source="../../tileset/plant/tree/tree_golden_small.png" width="64" height="96"/>
</tileset>
<tileset firstgid="329" name="green_stone_2" tilewidth="32" tileheight="32" tilecount="6" columns="2">
<tileset firstgid="329" name="Untitled" tilewidth="32" tileheight="32" tilecount="6" columns="2">
<image source="../../tileset/item/statue/green_stone_2.png" width="64" height="96"/>
</tileset>
<tileset firstgid="335" name="blue_circle" tilewidth="32" tileheight="32" tilecount="4" columns="2">
<tileset firstgid="335" name="Untitled" tilewidth="32" tileheight="32" tilecount="4" columns="2">
<image source="../../tileset/building/decoration/blue_circle.png" width="64" height="64"/>
</tileset>
<tileset firstgid="339" name="logic/creature/naga" tilewidth="32" tileheight="32" tilecount="4" columns="4">
<image source="../../tileset/logic/creature/naga.png" width="128" height="32"/>
</tileset>
<tileset firstgid="343" name="daisy_white" tilewidth="32" tileheight="32" tilecount="8" columns="2">
<tileset firstgid="343" name="Untitled" tilewidth="32" tileheight="32" tilecount="8" columns="2">
<image source="../../tileset/plant/flower/daisy_white.png" width="64" height="128"/>
</tileset>
<tileset firstgid="351" name="daisy_yellow" tilewidth="32" tileheight="32" tilecount="8" columns="2">
<tileset firstgid="351" name="Untitled" tilewidth="32" tileheight="32" tilecount="8" columns="2">
<image source="../../tileset/plant/flower/daisy_yellow.png" width="64" height="128"/>
</tileset>
<tileset firstgid="359" name="stump_pale_brown" tilewidth="32" tileheight="32" tilecount="4" columns="2">
<tileset firstgid="359" name="Untitled" tilewidth="32" tileheight="32" tilecount="4" columns="2">
<image source="../../tileset/plant/stump/stump_pale_brown.png" width="64" height="64"/>
</tileset>
<tileset firstgid="363" name="stump_brown" tilewidth="32" tileheight="32" tilecount="4" columns="2">
<tileset firstgid="363" name="Untitled" tilewidth="32" tileheight="32" tilecount="4" columns="2">
<image source="../../tileset/plant/stump/stump_brown.png" width="64" height="64"/>
<tile id="0">
<properties>
<property name="foo" value="foo"/>
</properties>
</tile>
</tileset>
<tileset firstgid="367" name="floor_sparkle" tilewidth="32" tileheight="32" tilecount="18" columns="3">
<tileset firstgid="367" name="Untitled" tilewidth="32" tileheight="32" tilecount="18" columns="3">
<image source="../../tileset/building/decoration/floor_sparkle.png" width="96" height="192"/>
</tileset>
<tileset firstgid="385" name="green_stone_3" tilewidth="32" tileheight="32" tilecount="3" columns="1">
<tileset firstgid="385" name="Untitled" tilewidth="32" tileheight="32" tilecount="3" columns="1">
<image source="../../tileset/item/statue/green_stone_3.png" width="32" height="96"/>
</tileset>
<tileset firstgid="388" name="vine" tilewidth="32" tileheight="32" tilecount="3" columns="1">
<tileset firstgid="388" name="Untitled" tilewidth="32" tileheight="32" tilecount="3" columns="1">
<image source="../../tileset/plant/vine.png" width="32" height="96"/>
</tileset>
<tileset firstgid="391" name="clouds" tilewidth="32" tileheight="32" tilecount="32" columns="4">
<image source="../../tileset/sky/cloud/clouds.png" width="128" height="256"/>
<tileset firstgid="391" name="clouds" tilewidth="32" tileheight="32" tilecount="16" columns="4">
<image source="../../tileset/sky/cloud/clouds.png" width="128" height="128"/>
</tileset>
<tileset firstgid="423" name="logic/creature/fairy" tilewidth="32" tileheight="32" tilecount="4" columns="4">
<tileset firstgid="407" name="logic/creature/fairy" tilewidth="32" tileheight="32" tilecount="4" columns="4">
<image source="../../tileset/logic/creature/fairy.png" width="128" height="32"/>
</tileset>
<tileset firstgid="427" name="logic/creature/demon" tilewidth="32" tileheight="32" tilecount="7" columns="7">
<tileset firstgid="411" name="logic/creature/demon" tilewidth="32" tileheight="32" tilecount="7" columns="7">
<image source="../../tileset/logic/creature/demon.png" width="224" height="32"/>
</tileset>
<tileset firstgid="434" name="logic/creature/elemental" tilewidth="32" tileheight="32" tilecount="16" columns="8">
<tileset firstgid="418" name="logic/creature/elemental" tilewidth="32" tileheight="32" tilecount="16" columns="8">
<image source="../../tileset/logic/creature/elemental.png" width="256" height="64"/>
</tileset>
<tileset firstgid="450" name="suspension bridge" tilewidth="32" tileheight="32" tilecount="24" columns="3">
<tileset firstgid="434" name="suspension bridge" tilewidth="32" tileheight="32" tilecount="24" columns="3">
<image source="../../tileset/object/suspension_bridge.png" width="96" height="256"/>
</tileset>
<tileset firstgid="474" name="logic/creature/angel" tilewidth="32" tileheight="32" tilecount="6" columns="6">
<tileset firstgid="458" name="logic/creature/angel" tilewidth="32" tileheight="32" tilecount="6" columns="6">
<image source="../../tileset/logic/creature/angel.png" width="192" height="32"/>
</tileset>
<layer id="9" name="0_floor_parallax" width="128" height="128" visible="0">
<data encoding="base64" compression="gzip">
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
</data>
</layer>
<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">
H4sIAAAAAAAACu3cyW7UQBAGYOfOIrGFHR6AiBB2kLhkkVieitdL8k5UDpa4xLE9Xtpd3yfVZTQTefx3V7edmWkaAAAAxrq11zS399Y+CtZyJ7K/K3+gUsfR30569rghz61JzfuA03hfZz3f25DnbslN+doH1K3Nd5d53ve1NfeSOZ3HObsYUZcDzvUu87zva/USqMPPmMe/zOW0fkf2fzryHzs+7BHqcNP4uI49Qnn0+tzGzuUh2r6v/89vrXPc1Ufavq//z2+tc7xEH2E8vTc3vZe+XBPkZi2nD31iu6bYD+oT29Pm3nc/6LqhLkOvA8ZcNxgzubnWhHpN1d+tE+Xpk8lU/d06UZ4lMjHvczPvAQAAAAAAAAAgN989y813z6Bp7sUcuB/1IOph1CNzIpX9yPtx1JOop1HP5J/K88j7RdTLqFdRr+UPAABQJPdvcnP/Jjf3bwDm4XMCufmcAAAAAEA93OvLzb0+mJ/f78/N7/cD0MU+ITf7hPKYk7mZkwD1K2WtL+U4sillrW+PwzjIrZTxyG6OI8MTOaZ1GtmfyX9V1tLc7KnK9XehPK6yt6fKa+7s38TfPjC2qtW1j38bjx9GvYs6Mgaq1LWPfx+Pf4j6GPVJ/ul8jsy/RH2N+jZh/var2/D9v4x+TJiX/SrkoufntsS9qqXuuTCetR+mZ33Nzf+CuGJ9BZZgrcmpzd1ak5Pct0vPzs3cBQAAAKA0/wD8LuvAAAABAA==
H4sIAAAAAAAAA+3cyW7UQBAGYOfOIrGFHR6AiBB2kLhkkVieitdK8m5UDpa4xLE9Xtpd3yfVZTQTefx3V7edmWkaAAAAxrq11zS399Y+CtZyJ7K/K3+gUsfR30569rghz61JzfuA03hfZz3f25DnbslN+doH1K3Nd5d53ve1NfeSOZ3HObsYUZcDzvUu87zva/USqMPPmMe/zOW0fkf2fzryHzs+7BHqcNP4uI49Qnn0+tzGzuUh2r6v/89vrXPc1Ufavq//z2+tc7xEH2E8vTc3vZe+XBPkZi2nD31iu6bYD+oT29Pm3nc/6LqhLkOvA8ZcNxgzubnWhHpN1d+tE+Xpk8lU/d06UZ4lMjHvczPvAQAAAAAAAAAgN989y813z6Bp7sUcuB/1IOph1CNzIpX9yPtx1JOop1HP5J/K88j7RdTLqFdRr+UPAABQJPdvcnP/Jjf3bwDm4XMCufmcAAAAAEA93OvLzb0+mJ/f78/N7/cD0MU+ITf7hPKYk7mZkwD1K2WtL+U4sillrW+PwzjIrZTxyG6OI8MTOaZ1GtmfyX9V1tLc7KnK9XehPK6yt6fKa+7s38TfPjC2qtW1j38bjx9GvYs6Mgaq1LWPfx+Pf4j6GPVJ/ul8jsy/RH2N+jZh/var2/D9v4x+TJiX/SrkoufntsS9qqXuuTCetR+mZ33Nzf+CuGJ9BZZgrcmpzd1ak5Pct0vPzs3cBQAAAKA0/wDK3sJsAAABAA==
</data>
</layer>
<layer id="5" name="4_roof_add" width="128" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu3dSwqAMAwFwGTv59LeTr2T3kCR0hY7A9mHZhVIeREAAAAAAABATVNGzNm6C1pZ7tmv5g8AAFCdfXxs9nEAAAAAAAAAAAAAAAAAAOAP9ow4OqnTH24AAAAAAAAAAAAAAAAAAB7Ilh6bbGkAAAAAAAAAKMstxtjcYgAAAPTpTbaYzK9vNu8GAAAAAAAAAAAA3bgAIDyWQQAAAQA=
H4sIAAAAAAAAA+3dSwqAMAwFwGTv59LeSr2b3kCR0hY7A9mHZhVIeREAAAAAAABATVNGzNm6C1pZ7tmv5g8AAFCdfXxs9nEAAAAAAAAAAAAAAAAAAOAP9ow4OqnTH24AAAAAAAAAAAAAAAAAAB7Ilh6bbGkAAAAAAAAAKMstxtjcYgAAAPTpTbaYzK9vNu8GAAAAAAAAAAAA3bgAGq/hpQAAAQA=
</data>
</layer>
<layer id="6" name="objects" width="128" height="128">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu3cQRKCIBQGYDtjdcmmdYex7tG2VZvGETUQHn7f1g3jE/iBYhgAAAAgn9updgso4beu7zrNAIKJPCeMgdu+xZpaRa4rlHDXJ+hUrfH+qk+xs6PlvlxkQqBHsj0AWz3NIcBK9iMAgCOay0DOCAGAaFrf32m9fdCro/7uwJoOYtJ3WUKuBAAAAAAA2MfS87uz8xs64w4jAEiTAft2UV+CkuUpxbcFQDRHzfTu3wSAWKy3Kcn3BdAn4/u8qHtC6goAAOW42xHyeOhLADTMf7yAL+MBQB72AQAgNnM5ALTLPA1MMTYAAFu95IjVRu9skkwKQGT3xDyWeg7EIMvHlKpbD3W1nmpTD98WrGU8onXWZgAAkIf1X13/vn/1AwAAAGr6AKp6a7EAAAEA
H4sIAAAAAAAAA+3cQRKCIBQGYDtjdbmmdYex7tO2VZvGETUQHn7f1g3jE/iBYhgAAAAgn9updgso4beu7zrNAIKJPCeMgdu+xZpaRa4rlHDXJ+hUrfH+qk+xs6PlvlxkQqBHsj0AWz3NIcBK9iMAgCOay0DOCAGAaFrf32m9fdCro/7uwJoOYtJ3WUKuBAAAAAAA2MfS87uz8xs64w4jAEiTAft2UV+CkuUpxbcFQDRHzfTu3wSAWKy3Kcn3BdAn4/u8qHtC6goAAOW42xHyeOhLADTMf7yAL+MBQB72AQAgNnM5ALTLPA1MMTYAAFu95IjVRu9skkwKQGT3xDyWeg7EIMvHlKpbD3W1nmpTD98WrGU8onXWZgAAkIf1X13/vn/1AwAAAGr6AHVYJfEAAAEA
</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
H4sIAAAAAAAAA+3BAQEAAACAkP6v7ggKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAauuOl9cAAAEA
</data>
</layer>
</map>

View file

@ -1,70 +1,163 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.10" tiledversion="1.10.2" orientation="orthogonal" renderorder="right-down" width="64" height="64" tilewidth="32" tileheight="32" infinite="0" nextlayerid="9" nextobjectid="1">
<tileset firstgid="1" name="logic/collision" tilewidth="32" tileheight="32" tilecount="1" columns="1">
<image source="../../tileset/logic/collision.png" width="32" height="32"/>
<!DOCTYPE map SYSTEM "http://mapeditor.org/dtd/1.0/map.dtd">
<map version="1.0" orientation="orthogonal" width="64" height="64" tilewidth="32" tileheight="32">
<tileset firstgid="1" name="logic/collision" tilewidth="32" tileheight="32">
<image source="../../tileset/logic/collision.png"/>
</tileset>
<tileset firstgid="2" name="logic/portal" tilewidth="32" tileheight="32" tilecount="24" columns="8">
<image source="../../tileset/logic/portal.png" width="256" height="96"/>
<tileset firstgid="2" name="logic/portal" tilewidth="32" tileheight="32">
<image source="../../tileset/logic/portal.png"/>
</tileset>
<tileset firstgid="26" name="sparkles" tilewidth="32" tileheight="32" tilecount="18" columns="3">
<image source="../../tileset/building/decoration/floor_sparkle.png" width="96" height="192"/>
<tileset firstgid="26" name="sparkles" tilewidth="32" tileheight="32">
<image source="../../tileset/building/decoration/floor_sparkle.png"/>
</tileset>
<tileset firstgid="44" name="clouds" tilewidth="32" tileheight="32" tilecount="16" columns="4">
<image source="../../tileset/sky/cloud/clouds.png" width="128" height="128"/>
<tileset firstgid="44" name="clouds" tilewidth="32" tileheight="32">
<image source="../../tileset/sky/cloud/clouds.png"/>
</tileset>
<tileset firstgid="60" name="logic/creature/elemental" tilewidth="32" tileheight="32" tilecount="16" columns="8">
<image source="../../tileset/logic/creature/elemental.png" width="256" height="64"/>
<tileset firstgid="60" name="logic/creature/elemental" tilewidth="32" tileheight="32">
<image source="../../tileset/logic/creature/elemental.png"/>
</tileset>
<tileset firstgid="76" name="dark clouds" tilewidth="32" tileheight="32" tilecount="256" columns="16">
<image source="../../tileset/sky/cloud/cloudtile.png" width="512" height="512"/>
<tileset firstgid="76" name="dark clouds" tilewidth="32" tileheight="32">
<image source="../../tileset/sky/cloud/cloudtile.png"/>
</tileset>
<tileset firstgid="332" name="friendly cloud" tilewidth="32" tileheight="32" tilecount="270" columns="18">
<image source="../../tileset/sky/cloud/friendlycloud.png" width="576" height="480"/>
<tileset firstgid="332" name="friendly cloud" tilewidth="32" tileheight="32">
<image source="../../tileset/sky/cloud/friendlycloud.png"/>
</tileset>
<tileset firstgid="602" 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 firstgid="602" name="logic/creature/mythical_being" tilewidth="32" tileheight="32">
<image source="../../tileset/logic/creature/mythical_being.png"/>
</tileset>
<tileset firstgid="626" name="logic/creature/angel" tilewidth="32" tileheight="32" tilecount="6" columns="6">
<image source="../../tileset/logic/creature/angel.png" width="192" height="32"/>
<tileset firstgid="626" name="logic/creature/angel" tilewidth="32" tileheight="32">
<image source="../../tileset/logic/creature/angel.png"/>
</tileset>
<layer id="1" name="0_floor" width="64" height="64">
<layer name="0_floor" width="64" height="64">
<data encoding="base64" compression="gzip">
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
</data>
</layer>
<layer id="2" name="1_terrain" width="64" height="64">
<layer name="1_terrain" width="64" height="64">
<data encoding="base64" compression="gzip">
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
skCCAEAAAA==
</data>
</layer>
<layer id="3" name="2_object" width="64" height="64">
<layer name="2_object" width="64" height="64">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu2avUrEQBDHExEOK7/AAys/D+0UP+4QCxXxTkFfwCcQH0HwASytBGtBe9Fe7JXjrC3UwkpFxVJnMasx3ibZ3dlskpsf/OGK7O5MdjOZzJzjEIQamxpjD9GsIEyjus87ngqu4zScb92DXPf3mldd4zLOnW0DLNPhRl8jYhvPjH/oxqcHFCuIvPCEONc64lxJwHx/tG0EIU1WcjSWUzRsG5ECrm0bEJMN0K5tIyxShZxnGjQC6tfIf0Q840+JRhn87fb5PAG/1yTvwU2Ma9L4LBTBz8kmvg5L+h83t2TngH93pYFRgZ8Lks/BO445iTMT4uOU5Blok7w+DTGhBjb3COzuVYyDdXVzlPjQHM/uQQm0FPBXNgYESfo+MGRrN2eeTkBj4O8sqA+0AlrV9N818B4N4yrZ5f7A8903ULsr9p3nGbLv1zhkoW7H3jfzrnpsCSOqbreHv6QUVS/XYP53IZ+BT42xJmt2fvjec2FxizeVFeYSjpNpw0QsSANlA36dgy5Bp/hTZ4Jj0L6FdU3m6rLn/wB0YcQSXGox/VLJs4/kh/ywpTHWBLrfGUSCBPZKVD/JM2XvG4ZpscX8X25Bn/NAocX37MW2AYYoGqqlBKn41ih5NbIhy2eK1RMGvVqCDSqW7gGvofn7NgMx7dD5bxMWsn0FP8FenZ+s5JGq/ot6dRzZnpUtVPcpTq6pc7aSQrWvENar4+S1lsQQ9eo6vb4N03iO/Wc069WlMe7p9s6i8PfqTK8lSxZikA5R//XM+zNIEARBEARBEAQeXw8YFY8AQAAA
H4sIAAAAAAAAAO2avUrEQBDHExEOK7/AAys/D+0UP+4QCxXxTkFfwCcQH0HwASytBGtBe9Fe7JXj
rC3UwkpFxVJnMasx3ibZ3dlskpsf/OGK7O5MdjOZzJzjEIQamxpjD9GsIEyjus87ngqu4zScb92D
XPf3mldd4zLOnW0DLNPhRl8jYhvPjH/oxqcHFCuIvPCEONc64lxJwHx/tG0EIU1WcjSWUzRsG5EC
rm0bEJMN0K5tIyxShZxnGjQC6tfIf0Q840+JRhn87fb5PAG/1yTvwU2Ma9L4LBTBz8kmvg5L+h83
t2TngH93pYFRgZ8Lks/BO445iTMT4uOU5Blok7w+DTGhBjb3COzuVYyDdXVzlPjQHM/uQQm0FPBX
NgYESfo+MGRrN2eeTkBj4O8sqA+0AlrV9N818B4N4yrZ5f7A8903ULsr9p3nGbLv1zhkoW7H3jfz
rnpsCSOqbreHv6QUVS/XYP53IZ+BT42xJmt2fvjec2FxizeVFeYSjpNpw0QsSANlA36dgy5Bp/hT
Z4Jj0L6FdU3m6rLn/wB0YcQSXGox/VLJs4/kh/ywpTHWBLrfGUSCBPZKVD/JM2XvG4ZpscX8X25B
n/NAocX37MW2AYYoGqqlBKn41ih5NbIhy2eK1RMGvVqCDSqW7gGvofn7NgMx7dD5bxMWsn0FP8Fe
nZ+s5JGq/ot6dRzZnpUtVPcpTq6pc7aSQrWvENar4+S1lsQQ9eo6vb4N03iO/Wc069WlMe7p9s6i
8PfqTK8lSxZikA5R//XM+zNIEARBEARBEAQeXw8YFY8AQAAA
</data>
</layer>
<layer id="4" name="3_roof" width="64" height="64" visible="0" locked="1">
<layer name="3_roof" width="64" height="64">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu2aSU7DMBhG0zJK7AAxHICxrJkKrBnLjhm2DIWyBkRhj8QROAIXQOIiPQILZjbd8JBaVEWVmqZJnCbfk56sRJX6/7FjO7YtSwghhBBOGUpa1jCO4CiO4TimcCJpOjrvyFa5N0l+UziNMziLaZzDeVxwkf9dw5EGxyL5LeFyKc9VyjXM4HpI6r6ZnmeceTIdgEHURpuDIqYSpqMwx0qIc89g3nQQBjnAnOkgXJIOcbuKCq884zd8xw/8xC/8xh+Dz9/PPuV/XGUumsAktmArtmE7dmBnSOaqftFNfj3YW8qzj7IfB3DQp9w3qNdN3MJt3MFd3MP9iL/vh+R3hMd4glk8xTPM4XnE878gv0u8wgLX15R5vMHbiOcuoke1tZ+4EMd+vFAq/ezHXzyJ1F/UjwshvCYue0bV8GPPqJIgx2s33+5O9ozc7gWY/u4qt2tTBDleF23Xle3aKff47GVQBrG361r81c8DPjbwn/WueYd5/d4NQa95F2r/pG66IlYnQpjeI22m/XT7OCrChddzFKf1bfodKmOfo8SxvWqMFiK8ZwgCQWcIAj9DIIQQQgghhF/8AiHa9iYAQAAA
H4sIAAAAAAAAAO2aSU7DMBhG0zJK7AAxHICxrJkKrBnLjhm2DIWyBkRhj8QROAIXQOIiPQILZjbd
8JBaVEWVmqZJnCbfk56sRJX6/7FjO7YtSwghhBBOGUpa1jCO4CiO4TimcCJpOjrvyFa5N0l+UziN
MziLaZzDeVxwkf9dw5EGxyL5LeFyKc9VyjXM4HpI6r6ZnmeceTIdgEHURpuDIqYSpqMwx0qIc89g
3nQQBjnAnOkgXJIOcbuKCq884zd8xw/8xC/8xh+Dz9/PPuV/XGUumsAktmArtmE7dmBnSOaqftFN
fj3YW8qzj7IfB3DQp9w3qNdN3MJt3MFd3MP9iL/vh+R3hMd4glk8xTPM4XnE878gv0u8wgLX15R5
vMHbiOcuoke1tZ+4EMd+vFAq/ezHXzyJ1F/UjwshvCYue0bV8GPPqJIgx2s33+5O9ozc7gWY/u4q
t2tTBDleF23Xle3aKff47GVQBrG361r81c8DPjbwn/WueYd5/d4NQa95F2r/pG66IlYnQpjeI22m
/XT7OCrChddzFKf1bfodKmOfo8SxvWqMFiK8ZwgCQWcIAj9DIIQQQgghhF/8AiHa9iYAQAAA
</data>
</layer>
<layer id="5" name="4_roof_add" width="64" height="64" visible="0" locked="1">
<layer name="4_roof_add" width="64" height="64">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu3ToREAAAgDse6/MoYVMFxNMsGbTwAAgKtpBwCvPA4AAAAAAAAAAAAAADQtVS9QswBAAAA=
H4sIAAAAAAAAAO3ToREAAAgDse6/MoYVMFxNMsGbTwAAgKtpBwCvPA4AAAAAAAAAAAAAADQtVS9Q
swBAAAA=
</data>
</layer>
<layer id="6" name="objects" width="64" height="64">
<layer name="objects" width="64" height="64">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu3ZywnAIAwAUOmhU3WUbtHP/F1AKEqqFt87epAgmhhNCQDaWHsHAECVLTN2LOXzqAPMJHdugBjqSX+j5bjR4gGIcFX0XACzcQ8ERlaao+Q0WrHX4r2t6a6/AwY3S204g/Lxl+92t5oRzr8iAAAA8GcPfSksnQBAAAA=
H4sIAAAAAAAAAO3ZywnAIAwAUOmhU3WUbtHP/F1AKEqqFt87epAgmhhNCQDaWHsHAECVLTN2LOXz
qAPMJHdugBjqSX+j5bjR4gGIcFX0XACzcQ8ERlaao+Q0WrHX4r2t6a6/AwY3S204g/Lxl+92t5oR
zr8iAAAA8GcPfSksnQBAAAA=
</data>
</layer>
<layer id="7" name="collision" width="64" height="64" visible="0" opacity="0.37">
<layer name="collision" width="64" height="64" visible="0" opacity="0.37">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu2VwQ6DMAxDu//d/593mjQh2rWJE6fUlnwCHL8UxKu19pJlWU7yrzJnVuC9in0WLO6n85/A7hG7O4Od3bka+457eRv5r5yja1UdKTYbm78Beu2+A1SfCOaMHSDPIvP8EXuZ3f3KrN3ZEd9hND9K0V1O57fMqMzP+g4QusvK6BXBj9prNP/J7BH81XmfyL/Ki+x7l1+VH9l5lF+Nf+be3c4cvSdrDpsJ8X5Y+dlcbH5vjmVOBf6Z7NP5vTtYzR3dN6OIvUacUy/Xq8yuiP6e56O+Tessq1C7i+T/N4+hbP67mSxdO2SwX2ezhDh3Zn+vqvEzdlmFn/k+sXdgyendH/FPyuK3dB1dW8nNZPfm7MzvzRk9Y83Neve9ORG9vOxIfrSzO1Th7vVhza7Az5rNYmf7dH5ZlmW576/YPcQvy7Lc9wcfY9XjAEAAAA==
H4sIAAAAAAAAAO2VwQ6DMAxDu//d/593mjQh2rWJE6fUlnwCHL8UxKu19pJlWU7yrzJnVuC9in0W
LO6n85/A7hG7O4Od3bka+457eRv5r5yja1UdKTYbm78Beu2+A1SfCOaMHSDPIvP8EXuZ3f3KrN3Z
Ed9hND9K0V1O57fMqMzP+g4QusvK6BXBj9prNP/J7BH81XmfyL/Ki+x7l1+VH9l5lF+Nf+be3c4c
vSdrDpsJ8X5Y+dlcbH5vjmVOBf6Z7NP5vTtYzR3dN6OIvUacUy/Xq8yuiP6e56O+Tessq1C7i+T/
N4+hbP67mSxdO2SwX2ezhDh3Zn+vqvEzdlmFn/k+sXdgyendH/FPyuK3dB1dW8nNZPfm7MzvzRk9
Y83Neve9ORG9vOxIfrSzO1Th7vVhza7Az5rNYmf7dH5ZlmW576/YPcQvy7Lc9wcfY9XjAEAAAA==
</data>
</layer>
<layer id="8" name="protection" width="64" height="64" visible="0">
<layer name="protection" width="64" height="64" visible="0">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAACu3BMQEAAADCoPVPbQwfoAAAAAAAAAAAAAAAAAAAAIC3AYbSVKsAQAAA
H4sIAAAAAAAAAO3BMQEAAADCoPVPbQwfoAAAAAAAAAAAAAAAAAAAAIC3AYbSVKsAQAAA
</data>
</layer>
</map>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 346 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 332 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 7.4 KiB

Before After
Before After

View file

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

View file

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Before After
Before After

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -1,6 +1,6 @@
--[[
***************************************************************************
* Copyright © 2022-2024 - Stendhal *
* Copyright © 2022-2023 - Stendhal *
***************************************************************************
***************************************************************************
* *
@ -589,20 +589,7 @@ local prepareMetalDetectorLender = function()
end
-- hint to players that they can borrow metal detector
--~ lender:addOffer("I also have some items that I don't mind #loaning out.")
-- must remove original response to "offer" else function to force "loan" chat option trigger
-- doesn't work
lender:removeTransition(ConversationStates.ATTENDING, ConversationPhrases.OFFER_MESSAGES, nil)
lender:add(
ConversationStates.ATTENDING,
ConversationPhrases.OFFER_MESSAGES,
nil,
ConversationStates.ATTENDING,
"Please check the blackboard for a list of items that I buy. I also have some items that I"
.. " don't mind #loaning out.",
function(player, sentence, raiser)
lender:forceWordsInCurrentConversation({"loan"})
end)
lender:addOffer("I also have some items that I don't mind #loaning out.")
lender:add(
ConversationStates.ATTENDING,
@ -612,9 +599,7 @@ local prepareMetalDetectorLender = function()
"So, you want to borrow my metal detector? Well, I don't lend things out"
.. " without some form of collateral. What would you like to leave"
.. " behind?",
function(player, sentence, raiser)
lender:forceWordsInCurrentConversation({"nothing"})
end)
nil)
lender:add(
ConversationStates.ATTENDING,

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 371 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 371 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 371 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 371 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 307 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 478 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 380 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 409 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 596 B

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