Commit 97d7e25d authored by Markus Koschany's avatar Markus Koschany

New upstream version 0.7.2

parent b7d5cde1
version: 2
jobs:
build:
docker:
- image: buildpack-deps:stretch
steps:
- checkout
- run:
name: Build bam
command: |
apt-get update -y
apt-get install libsdl2-dev libfreetype6-dev -y
git clone https://github.com/matricks/bam.git ~/bam
cd ~/bam/
git reset --hard f012dd9a3e38295b8a45af5a101d29573381f169
./make_unix.sh
- run:
name: Build teeworlds
command: ~/bam/bam conf=release all
\ No newline at end of file
......@@ -2,6 +2,8 @@
/.bam
/config.lua
/build
/other/*/lib
/other/*/include
__pycache__/
*.pyc
*.pyo
......@@ -9,3 +11,4 @@ scripts/work/
/SDL.dll
/freetype.dll
/autoexec.cfg
_test.exe
[submodule "datasrc/languages"]
path = datasrc/languages
url = git://github.com/teeworlds/teeworlds-translation.git
branch = master
[submodule "datasrc/maps"]
path = datasrc/maps
url = git://github.com/teeworlds/teeworlds-maps.git
branch = master
......@@ -8,7 +8,7 @@ Import("other/freetype/freetype.lua")
config = NewConfig()
config:Add(OptCCompiler("compiler"))
config:Add(OptTestCompileC("stackprotector", "int main(){return 0;}", "-fstack-protector -fstack-protector-all"))
config:Add(OptTestCompileC("minmacosxsdk", "int main(){return 0;}", "-mmacosx-version-min=10.6 -isysroot /Developer/SDKs/MacOSX10.6.sdk"))
config:Add(OptTestCompileC("minmacosxsdk", "int main(){return 0;}", "-mmacosx-version-min=10.7 -isysroot /Developer/SDKs/MacOSX10.7.sdk"))
config:Add(OptLibrary("zlib", "zlib.h", false))
config:Add(SDL.OptFind("sdl", true))
config:Add(FreeType.OptFind("freetype", true))
......@@ -120,11 +120,17 @@ function GenerateMacOSXSettings(settings, conf, arch, compiler)
os.exit(1)
end
settings.cc.flags:Add("-mmacosx-version-min=10.6")
settings.link.flags:Add("-mmacosx-version-min=10.6")
-- c++ stdlib needed
settings.cc.flags:Add("--stdlib=libc++")
settings.link.flags:Add("--stdlib=libc++")
-- this also needs the macOS min SDK version to be at least 10.7
settings.cc.flags:Add("-mmacosx-version-min=10.7")
settings.link.flags:Add("-mmacosx-version-min=10.7")
if config.minmacosxsdk.value == 1 then
settings.cc.flags:Add("-isysroot /Developer/SDKs/MacOSX10.6.sdk")
settings.link.flags:Add("-isysroot /Developer/SDKs/MacOSX10.6.sdk")
settings.cc.flags:Add("-isysroot /Developer/SDKs/MacOSX10.7.sdk")
settings.link.flags:Add("-isysroot /Developer/SDKs/MacOSX10.7.sdk")
end
settings.link.frameworks:Add("Carbon")
......@@ -154,6 +160,7 @@ function GenerateMacOSXSettings(settings, conf, arch, compiler)
settings.link.frameworks:Add("AGL")
-- FIXME: the SDL config is applied in BuildClient too but is needed here before so the launcher will compile
config.sdl:Apply(settings)
settings.link.extrafiles:Merge(Compile(settings, "src/osxlaunch/client.m"))
BuildClient(settings)
-- Content
......@@ -162,6 +169,7 @@ end
function GenerateLinuxSettings(settings, conf, arch, compiler)
if arch == "x86" then
settings.cc.flags:Add("-msse2") -- for the _mm_pause call
settings.cc.flags:Add("-m32")
settings.link.flags:Add("-m32")
elseif arch == "x86_64" then
......@@ -209,7 +217,7 @@ end
function GenerateWindowsSettings(settings, conf, target_arch, compiler)
if compiler == "cl" then
if (target_arch == "x86" and arch ~= "ia32") or
(target_arch == "x86_64" and arch ~= "x64" and arch ~= "x86_64") then
(target_arch == "x86_64" and arch ~= "ia64" and arch ~= "amd64") then
print("Cross compiling is unsupported on Windows.")
os.exit(1)
end
......@@ -268,7 +276,7 @@ function SharedCommonFiles()
if not shared_common_files then
local network_source = ContentCompile("network_source", "generated/protocol.cpp")
local network_header = ContentCompile("network_header", "generated/protocol.h")
AddDependency(network_source, network_header)
AddDependency(network_source, network_header, "src/engine/shared/protocol.h")
local nethash = CHash("generated/nethash.cpp", "src/engine/shared/protocol.h", "src/game/tuning.h", "src/game/gamecore.cpp", network_header)
shared_common_files = {network_source, nethash}
......@@ -451,7 +459,7 @@ if ScriptArgs['arch'] then
else
if arch == "ia32" then
archs = {"x86"}
elseif arch == "x64" or arch == "amd64" then
elseif arch == "ia64" or arch == "amd64" then
archs = {"x86_64"}
else
archs = {arch}
......
dependencies:
pre:
- |
sudo apt-get install libsdl2-dev libfreetype6-dev
if [ ! -d ~/bam ]; then
git clone https://github.com/matricks/bam.git ~/bam
cd ~/bam/
git reset --hard f012dd9a3e38295b8a45af5a101d29573381f169
./make_unix.sh
fi
cache_directories:
- "~/bam/"
test:
override:
- ~/bam/bam conf=release all
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
{"authors": {
"originally created by": "Watz",
"modified by": [
""
"Watz, 2014 (Transifex)"
]},
"translated strings": [
{
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -9,6 +9,11 @@
"name": "Bosanski",
"code": 70
},
{
"file": "breton",
"name": "Brezhoneg",
"code": 950
},
{
"file": "brazilian_portuguese",
"name": "Português brasileiro",
......@@ -19,6 +24,11 @@
"name": "Български",
"code": 100
},
{
"file": "catalan",
"name": "Català",
"code": 951
},
{
"file": "czech",
"name": "Česky",
......@@ -39,6 +49,16 @@
"name": "Nederlands",
"code": 528
},
{
"file": "esperanto",
"name": "Esperanto",
"code": 952
},
{
"file": "estonian",
"name": "Eesti",
"code": 233
},
{
"file": "finnish",
"name": "Suomi",
......@@ -49,6 +69,16 @@
"name": "Français",
"code": 250
},
{
"file": "gaelic_scottish",
"name": "Gàidhlig",
"code": 903
},
{
"file": "galician",
"name": "Galego",
"code": 953
},
{
"file": "german",
"name": "Deutsch",
......@@ -64,11 +94,21 @@
"name": "Magyar",
"code": 348
},
{
"file": "irish",
"name": "Gaeilge",
"code": 372
},
{
"file": "italian",
"name": "Italiano",
"code": 380
},
{
"file": "lithuanian",
"name": "Lietuvių kalba",
"code": 440
},
{
"file": "japanese",
"name": "日本語",
......@@ -119,6 +159,11 @@
"name": "Slovensky",
"code": 703
},
{
"file": "slovenian",
"name": "Slovenščina",
"code": 705
},
{
"file": "spanish",
"name": "Español",
......@@ -139,6 +184,11 @@
"name": "Українська",
"code": 804
},
{
"file": "chinese",
"name": "汉语",
"code": 156
},
{
"file": "simplified_chinese",
"name": "简体中文",
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
All content is released under CC-BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0/).
Information about the authors can be found within the according file.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Copyright (c) 2013 Magnus Auvinen
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Please visit http://www.teeworlds.com for up-to-date information about
the game, including new versions, custom maps and much more.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
{"authors": {
"originally created by": "MK124",
"modified by": [
"TsFreddie 2013-05-15 19:17:44"
"TsFreddie 2013-05-15 19:17:44",
"tiwb, 2018 (Transifex)",
"TsFreddie, 2014 (Transifex)",
"tiwb, 2018 (Transifex)"
]},
"translated strings": [
{
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
No preview for this file type
All content is released under CC-BY-SA 3.0 (http://creativecommons.org/licenses/by-sa/3.0/).
Copyright (c) 2015 Magnus Auvinen
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Please visit http://www.teeworlds.com for up-to-date information about
the game, including new versions, custom maps and much more.
import os, imp, sys
import os
import sys
from datatypes import *
import content
import network
......@@ -316,8 +317,13 @@ if gen_network_source:
lines += ['\tif(pUnpacker->Error())']
lines += ['\t\tm_pMsgFailedOn = "(unpack error)";']
lines += ['\t']
lines += ['\tif(m_pMsgFailedOn || m_pObjFailedOn)']
lines += ['\tif(m_pMsgFailedOn || m_pObjFailedOn) {']
lines += ['\t\tif(!m_pMsgFailedOn)']
lines += ['\t\t\tm_pMsgFailedOn = "";']
lines += ['\t\tif(!m_pObjFailedOn)']
lines += ['\t\t\tm_pObjFailedOn = "";']
lines += ['\t\treturn 0;']
lines += ['\t}']
lines += ['\tm_pMsgFailedOn = "";']
lines += ['\tm_pObjFailedOn = "";']
lines += ['\treturn m_aMsgData;']
......
......@@ -17,10 +17,11 @@ class SoundSet(Struct):
self.sounds.Add(Sound(name))
class Image(Struct):
def __init__(self, name="", filename=""):
def __init__(self, name="", filename="", linear_mapping=0):
Struct.__init__(self, "CDataImage")
self.name = String(name)
self.filename = String(filename)
self.flag = Int(linear_mapping)
self.id = TextureHandle()
class SpriteSet(Struct):
......@@ -233,16 +234,20 @@ container.sounds.Add(SoundSet("menu", ["audio/music_menu.wv"]))
image_null = Image("null", "")
image_particles = Image("particles", "particles.png")
image_game = Image("game", "game.png")
image_browseicons = Image("browseicons", "ui/icons/browse.png")
image_browseicons = Image("browseicons", "ui/icons/browse.png", 1)
image_emoticons = Image("emoticons", "emoticons.png")
image_demobuttons = Image("demobuttons", "ui/demo_buttons.png")
image_fileicons = Image("fileicons", "ui/file_icons.png")
image_guibuttons = Image("guibuttons", "ui/gui_buttons.png")
image_guiicons = Image("guiicons", "ui/gui_icons.png")
image_menuicons = Image("menuicons", "ui/icons/menu.png")
image_toolicons = Image("toolicons", "ui/icons/tools.png")
image_friendicons = Image("friendicons", "ui/icons/friend.png")
image_infoicons = Image("infoicons", "ui/icons/info.png")
image_demobuttons = Image("demobuttons", "ui/demo_buttons.png", 1)
image_fileicons = Image("fileicons", "ui/file_icons.png", 1)
image_guibuttons = Image("guibuttons", "ui/gui_buttons.png", 1)
image_guiicons = Image("guiicons", "ui/gui_icons.png", 1)
image_menuicons = Image("menuicons", "ui/icons/menu.png", 1)
image_toolicons = Image("toolicons", "ui/icons/tools.png", 1)
image_arrowicons = Image("arrowicons", "ui/icons/arrows.png", 1)
image_friendicons = Image("friendicons", "ui/icons/friend.png", 1)
image_infoicons = Image("infoicons", "ui/icons/info.png", 1)
image_levelicons = Image("levelicons", "ui/icons/level.png", 1)
image_sidebaricons = Image("sidebaricons", "ui/icons/sidebar.png", 1)
image_chatwhisper = Image("chatwhisper", "ui/icons/chat_whisper.png", 1)
container.images.Add(image_null)
container.images.Add(image_game)
......@@ -261,8 +266,12 @@ container.images.Add(image_guiicons)
container.images.Add(Image("no_skinpart", "ui/no_skinpart.png"))
container.images.Add(image_menuicons)
container.images.Add(image_toolicons)
container.images.Add(image_arrowicons)
container.images.Add(image_friendicons)
container.images.Add(image_infoicons)
container.images.Add(image_levelicons)
container.images.Add(image_sidebaricons)
container.images.Add(image_chatwhisper)
container.pickups.Add(Pickup("health"))
container.pickups.Add(Pickup("armor"))
......@@ -279,6 +288,7 @@ set_tee_decoration = SpriteSet("tee_decoration", image_null, 2, 1)
set_tee_hands = SpriteSet("tee_hands", image_null, 2, 1)
set_tee_feet = SpriteSet("tee_feet", image_null, 2, 1)
set_tee_eyes = SpriteSet("tee_eyes", image_null, 2, 4)
set_tee_hats = SpriteSet("tee_hats", image_null, 1, 4)
set_browseicons = SpriteSet("browseicons", image_browseicons, 4, 2)
set_emoticons = SpriteSet("emoticons", image_emoticons, 4, 4)
set_demobuttons = SpriteSet("demobuttons", image_demobuttons, 5, 1)
......@@ -287,8 +297,11 @@ set_guibuttons = SpriteSet("guibuttons", image_guibuttons, 12, 4)
set_guiicons = SpriteSet("guiicons", image_guiicons, 8, 2)
set_menuicons = SpriteSet("menuicons", image_menuicons, 2, 2)
set_toolicons = SpriteSet("toolicons", image_toolicons, 4, 2)
set_arrowicons = SpriteSet("arrowicons", image_arrowicons, 4, 3)
set_friendicons = SpriteSet("friendicons", image_friendicons, 2, 2)
set_infoicons = SpriteSet("infoicons", image_infoicons, 1, 2)
set_levelicons = SpriteSet("levelicons", image_levelicons, 4, 4)
set_sidebaricons = SpriteSet("sidebaricons", image_sidebaricons, 4, 2)
container.spritesets.Add(set_particles)
container.spritesets.Add(set_game)
......@@ -298,6 +311,7 @@ container.spritesets.Add(set_tee_decoration)
container.spritesets.Add(set_tee_hands)
container.spritesets.Add(set_tee_feet)
container.spritesets.Add(set_tee_eyes)
container.spritesets.Add(set_tee_hats)
container.spritesets.Add(set_browseicons)
container.spritesets.Add(set_emoticons)
container.spritesets.Add(set_demobuttons)
......@@ -306,8 +320,12 @@ container.spritesets.Add(set_guibuttons)
container.spritesets.Add(set_guiicons)
container.spritesets.Add(set_menuicons)
container.spritesets.Add(set_toolicons)
container.spritesets.Add(set_arrowicons)
container.spritesets.Add(set_friendicons)
container.spritesets.Add(set_infoicons)
container.spritesets.Add(set_levelicons)
container.spritesets.Add(set_sidebaricons)
container.sprites.Add(Sprite("part_slice", set_particles, 0,0,1,1))
container.sprites.Add(Sprite("part_ball", set_particles, 1,0,1,1))
......@@ -387,6 +405,11 @@ container.sprites.Add(Sprite("pickup_ninja", set_game, 2,10,8,2))
container.sprites.Add(Sprite("flag_blue", set_game, 12,8,4,8))
container.sprites.Add(Sprite("flag_red", set_game, 16,8,4,8))
container.sprites.Add(Sprite("ninja_bar_full_left", set_game, 21,4,1,2))
container.sprites.Add(Sprite("ninja_bar_full", set_game, 22,4,1,2))
container.sprites.Add(Sprite("ninja_bar_empty", set_game, 23,4,1,2))
container.sprites.Add(Sprite("ninja_bar_empty_right", set_game, 24,4,1,2))
container.sprites.Add(Sprite("tee_body_outline", set_tee_body, 0,0,1,1))
container.sprites.Add(Sprite("tee_body", set_tee_body, 1,0,1,1))
container.sprites.Add(Sprite("tee_body_shadow", set_tee_body, 0,1,1,1))
......@@ -409,6 +432,11 @@ container.sprites.Add(Sprite("tee_eyes_pain", set_tee_eyes, 0,1,1,1))
container.sprites.Add(Sprite("tee_eyes_happy", set_tee_eyes, 1,1,1,1))
container.sprites.Add(Sprite("tee_eyes_surprise", set_tee_eyes, 0,2,1,1))
container.sprites.Add(Sprite("tee_hats_top1", set_tee_hats, 0,0,1,1))
container.sprites.Add(Sprite("tee_hats_top2", set_tee_hats, 0,1,1,1))
container.sprites.Add(Sprite("tee_hats_side1", set_tee_hats, 0,2,1,1))
container.sprites.Add(Sprite("tee_hats_side2", set_tee_hats, 0,3,1,1))
container.sprites.Add(Sprite("oop", set_emoticons, 0, 0, 1, 1))
container.sprites.Add(Sprite("exclamation", set_emoticons, 1, 0, 1, 1))
container.sprites.Add(Sprite("hearts", set_emoticons, 2, 0, 1, 1))
......@@ -472,6 +500,19 @@ container.sprites.Add(Sprite("tool_edit_b", set_toolicons, 2,1,1,1))
container.sprites.Add(Sprite("tool_x_a", set_toolicons, 3,0,1,1))
container.sprites.Add(Sprite("tool_x_b", set_toolicons, 3,1,1,1))
container.sprites.Add(Sprite("arrow_left_a", set_arrowicons, 0,0,1,1))
container.sprites.Add(Sprite("arrow_left_b", set_arrowicons, 0,1,1,1))
container.sprites.Add(Sprite("arrow_left_c", set_arrowicons, 0,2,1,1))
container.sprites.Add(Sprite("arrow_up_a", set_arrowicons, 1,0,1,1))
container.sprites.Add(Sprite("arrow_up_b", set_arrowicons, 1,1,1,1))
container.sprites.Add(Sprite("arrow_up_c", set_arrowicons, 1,2,1,1))
container.sprites.Add(Sprite("arrow_right_a", set_arrowicons, 2,0,1,1))
container.sprites.Add(Sprite("arrow_right_b", set_arrowicons, 2,1,1,1))
container.sprites.Add(Sprite("arrow_right_c", set_arrowicons, 2,2,1,1))
container.sprites.Add(Sprite("arrow_down_a", set_arrowicons, 3,0,1,1))
container.sprites.Add(Sprite("arrow_down_b", set_arrowicons, 3,1,1,1))
container.sprites.Add(Sprite("arrow_down_c", set_arrowicons, 3,2,1,1))
container.sprites.Add(Sprite("friend_plus_a", set_friendicons, 0,0,1,1))
container.sprites.Add(Sprite("friend_plus_b", set_friendicons, 0,1,1,1))
container.sprites.Add(Sprite("friend_x_a", set_friendicons, 1,0,1,1))
......@@ -480,6 +521,24 @@ container.sprites.Add(Sprite("friend_x_b", set_friendicons, 1,1,1,1))
container.sprites.Add(Sprite("info_a", set_infoicons, 0,0,1,1))
container.sprites.Add(Sprite("info_b", set_infoicons, 0,1,1,1))
container.sprites.Add(Sprite("level_a_on", set_levelicons, 0,0,1,1))
container.sprites.Add(Sprite("level_a_a", set_levelicons, 0,1,1,1))
container.sprites.Add(Sprite("level_a_b", set_levelicons, 0,2,1,1))
container.sprites.Add(Sprite("level_b_on", set_levelicons, 1,0,1,1))
container.sprites.Add(Sprite("level_b_a", set_levelicons, 1,1,1,1))
container.sprites.Add(Sprite("level_b_b", set_levelicons, 1,2,1,1))
container.sprites.Add(Sprite("level_c_on", set_levelicons, 2,0,1,1))
container.sprites.Add(Sprite("level_c_a", set_levelicons, 2,1,1,1))
container.sprites.Add(Sprite("level_c_b", set_levelicons, 2,2,1,1))
container.sprites.Add(Sprite("sidebar_refresh_a", set_sidebaricons, 0,0,1,1))
container.sprites.Add(Sprite("sidebar_refresh_b", set_sidebaricons, 0,1,1,1))
container.sprites.Add(Sprite("sidebar_friend_a", set_sidebaricons, 1,0,1,1))
container.sprites.Add(Sprite("sidebar_friend_b", set_sidebaricons, 1,1,1,1))
container.sprites.Add(Sprite("sidebar_filter_a", set_sidebaricons, 2,0,1,1))
container.sprites.Add(Sprite("sidebar_filter_b", set_sidebaricons, 2,1,1,1))
container.sprites.Add(Sprite("sidebar_info_a", set_sidebaricons, 3,0,1,1))
container.sprites.Add(Sprite("sidebar_info_b", set_sidebaricons, 3,1,1,1))
anim = Animation("base")
anim.body.frames.Add(AnimKeyframe(0, 0, -4, 0))
......@@ -552,7 +611,7 @@ weapon.damage.Set(1)
weapon.ammoregentime.Set(500)
weapon.visual_size.Set(64)
weapon.offsetx.Set(32)
weapon.offsety.Set(4)
weapon.offsety.Set(-4)
weapon.muzzleoffsetx.Set(50)
weapon.muzzleoffsety.Set(6)
container.weapons.gun.base.Set(weapon)
......
......@@ -20,6 +20,26 @@
"id": "XWA",
"code": 904
},
{
"id": "XBZ",
"code": 950,
"blocked": true
},
{
"id": "XCA",
"code": 951,
"blocked": true
},
{
"id": "XES",
"code": 952,
"blocked": true
},
{
"id": "XGA",
"code": 953,
"blocked": true
},
{
"id": "default",
"code": -1
......
datasrc/editor/cursor.png

1.33 KB | W: | H:

datasrc/editor/cursor.png

1.76 KB | W: | H:

datasrc/editor/cursor.png
datasrc/editor/cursor.png
datasrc/editor/cursor.png
datasrc/editor/cursor.png
  • 2-up
  • Swipe
  • Onion skin
datasrc/game.png

129 KB | W: | H:

datasrc/game.png

137 KB | W: | H:

datasrc/game.png
datasrc/game.png
datasrc/game.png
datasrc/game.png
  • 2-up
  • Swipe
  • Onion skin
datasrc/mapres/bg_cloud1.png

27.8 KB | W: | H:

datasrc/mapres/bg_cloud1.png

51.7 KB | W: | H:

datasrc/mapres/bg_cloud1.png
datasrc/mapres/bg_cloud1.png
datasrc/mapres/bg_cloud1.png
datasrc/mapres/bg_cloud1.png
  • 2-up
  • Swipe
  • Onion skin
datasrc/mapres/bg_cloud2.png

18.4 KB | W: | H:

datasrc/mapres/bg_cloud2.png

45.3 KB | W: | H:

datasrc/mapres/bg_cloud2.png
datasrc/mapres/bg_cloud2.png
datasrc/mapres/bg_cloud2.png
datasrc/mapres/bg_cloud2.png
  • 2-up
  • Swipe
  • Onion skin
datasrc/mapres/bg_cloud3.png

8.4 KB | W: | H:

datasrc/mapres/bg_cloud3.png

15.2 KB | W: | H:

datasrc/mapres/bg_cloud3.png
datasrc/mapres/bg_cloud3.png
datasrc/mapres/bg_cloud3.png
datasrc/mapres/bg_cloud3.png
  • 2-up
  • Swipe
  • Onion skin
datasrc/mapres/desert_doodads.png

149 KB | W: | H:

datasrc/mapres/desert_doodads.png

133 KB | W: | H:

datasrc/mapres/desert_doodads.png
datasrc/mapres/desert_doodads.png
datasrc/mapres/desert_doodads.png
datasrc/mapres/desert_doodads.png
  • 2-up
  • Swipe
  • Onion skin
datasrc/mapres/desert_main.png

89.5 KB | W: | H:

datasrc/mapres/desert_main.png

106 KB | W: | H:

datasrc/mapres/desert_main.png
datasrc/mapres/desert_main.png
datasrc/mapres/desert_main.png
datasrc/mapres/desert_main.png
  • 2-up
  • Swipe
  • Onion skin