refactor: move to net5

This commit is contained in:
Anna 2021-08-23 02:36:41 -04:00
parent 6adeaa0d9c
commit 6b06b16c19
12 changed files with 274 additions and 143 deletions

View File

@ -8,13 +8,13 @@ namespace Tourist {
public Commands(Plugin plugin) {
this.Plugin = plugin;
this.Plugin.Interface.CommandManager.AddHandler("/tourist", new CommandInfo(this.OnCommand) {
this.Plugin.CommandManager.AddHandler("/tourist", new CommandInfo(this.OnCommand) {
HelpMessage = "Opens the Tourist interface",
});
}
public void Dispose() {
this.Plugin.Interface.CommandManager.RemoveHandler("/tourist");
this.Plugin.CommandManager.RemoveHandler("/tourist");
}
private void OnCommand(string command, string arguments) {

View File

@ -5,11 +5,6 @@
OutputPath="$(OutputPath)"
AssemblyName="$(AssemblyName)"
VersionComponents="3"
MakeZip="true"
Include="
Tourist.dll;
Tourist.pdb;
Tourist.json
"/>
MakeZip="true"/>
</Target>
</Project>

View File

@ -1,5 +0,0 @@
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
<ILMerge>
<IncludeAssemblies>FFXIVWeather\.Lumina</IncludeAssemblies>
</ILMerge>
</Weavers>

View File

@ -2,7 +2,7 @@
using System.Numerics;
using System.Runtime.InteropServices;
using Dalamud.Hooking;
using Dalamud.Plugin;
using Dalamud.Logging;
namespace Tourist {
public class GameFunctions : IDisposable {
@ -25,20 +25,20 @@ namespace Tourist {
public GameFunctions(Plugin plugin) {
this.Plugin = plugin;
var vistaUnlockedPtr = this.Plugin.Interface.TargetModuleScanner.ScanText("E8 ?? ?? ?? ?? E9 ?? ?? ?? ?? 41 8B CD E8 ?? ?? ?? ??");
this.VistaUnlockedHook = new Hook<VistaUnlockedDelegate>(vistaUnlockedPtr, new VistaUnlockedDelegate(this.OnVistaUnlock));
var vistaUnlockedPtr = this.Plugin.SigScanner.ScanText("E8 ?? ?? ?? ?? E9 ?? ?? ?? ?? 41 8B CD E8 ?? ?? ?? ??");
this.VistaUnlockedHook = new Hook<VistaUnlockedDelegate>(vistaUnlockedPtr, this.OnVistaUnlock);
this.VistaUnlockedHook.Enable();
var maskPtr = this.Plugin.Interface.TargetModuleScanner.GetStaticAddressFromSig("8B F2 48 8D 0D ?? ?? ?? ?? 8B D3");
var maskPtr = this.Plugin.SigScanner.GetStaticAddressFromSig("8B F2 48 8D 0D ?? ?? ?? ?? 8B D3");
this.SightseeingMaskPointer = maskPtr;
var createVfxPtr = this.Plugin.Interface.TargetModuleScanner.ScanText("E8 ?? ?? ?? ?? F3 0F 10 35 ?? ?? ?? ?? 48 89 43 08");
var createVfxPtr = this.Plugin.SigScanner.ScanText("E8 ?? ?? ?? ?? F3 0F 10 35 ?? ?? ?? ?? 48 89 43 08");
this.CreateVfx = Marshal.GetDelegateForFunctionPointer<CreateVfxDelegate>(createVfxPtr);
var playVfxPtr = this.Plugin.Interface.TargetModuleScanner.ScanText("E8 ?? ?? ?? ?? 8B 4B 7C 85 C9");
var playVfxPtr = this.Plugin.SigScanner.ScanText("E8 ?? ?? ?? ?? 8B 4B 7C 85 C9");
this.PlayVfxInternal = Marshal.GetDelegateForFunctionPointer<PlayVfxDelegate>(playVfxPtr);
var removeVfxPtr = this.Plugin.Interface.TargetModuleScanner.ScanText("40 53 48 83 EC 20 48 8B D9 48 8B 89 ?? ?? ?? ?? 48 85 C9 74 28 33 D2");
var removeVfxPtr = this.Plugin.SigScanner.ScanText("40 53 48 83 EC 20 48 8B D9 48 8B 89 ?? ?? ?? ?? 48 85 C9 74 28 33 D2");
this.RemoveVfx = Marshal.GetDelegateForFunctionPointer<RemoveVfxDelegate>(removeVfxPtr);
}

View File

@ -2,8 +2,8 @@
using System.Collections.Generic;
using System.Linq;
using System.Numerics;
using Dalamud.Game.Internal;
using Dalamud.Plugin;
using Dalamud.Game;
using Dalamud.Logging;
using Lumina.Excel.GeneratedSheets;
namespace Tourist {
@ -17,22 +17,22 @@ namespace Tourist {
public Markers(Plugin plugin) {
this.Plugin = plugin;
this.Plugin.Interface.ClientState.TerritoryChanged += this.OnTerritoryChange;
this.Plugin.Interface.Framework.OnUpdateEvent += this.OnFrameworkUpdate;
this.Plugin.ClientState.TerritoryChanged += this.OnTerritoryChange;
this.Plugin.Framework.OnUpdateEvent += this.OnFrameworkUpdate;
if (this.Plugin.Config.ShowArrVistas) {
this.SpawnVfxForCurrentZone(this.Plugin.Interface.ClientState.TerritoryType);
this.SpawnVfxForCurrentZone(this.Plugin.ClientState.TerritoryType);
}
}
public void Dispose() {
this.Plugin.Interface.Framework.OnUpdateEvent -= this.OnFrameworkUpdate;
this.Plugin.Interface.ClientState.TerritoryChanged -= this.OnTerritoryChange;
this.Plugin.Framework.OnUpdateEvent -= this.OnFrameworkUpdate;
this.Plugin.ClientState.TerritoryChanged -= this.OnTerritoryChange;
this.RemoveAllVfx();
}
internal void RemoveVfx(ushort index) {
var adventure = this.Plugin.Interface.Data.GetExcelSheet<Adventure>()
var adventure = this.Plugin.DataManager.GetExcelSheet<Adventure>()
.Skip(index)
.First();
@ -54,7 +54,7 @@ namespace Tourist {
internal void SpawnVfxForCurrentZone(ushort territory) {
var row = 0;
foreach (var adventure in this.Plugin.Interface.Data.GetExcelSheet<Adventure>()) {
foreach (var adventure in this.Plugin.DataManager.GetExcelSheet<Adventure>()) {
if (row >= 80) {
break;
}
@ -77,7 +77,7 @@ namespace Tourist {
}
}
private void OnTerritoryChange(object sender, ushort territory) {
private void OnTerritoryChange(object? sender, ushort territory) {
if (!this.Plugin.Config.ShowArrVistas) {
return;
}

View File

@ -1,5 +1,11 @@
using System;
using System.Reflection;
using Dalamud.Data;
using Dalamud.Game;
using Dalamud.Game.ClientState;
using Dalamud.Game.Command;
using Dalamud.Game.Gui;
using Dalamud.Game.Text.SeStringHandling;
using Dalamud.Plugin;
using FFXIVWeather.Lumina;
@ -8,26 +14,50 @@ namespace Tourist {
public class Plugin : IDalamudPlugin {
public string Name => "Tourist";
internal DalamudPluginInterface Interface { get; private set; } = null!;
internal Configuration Config { get; private set; } = null!;
internal PluginUi Ui { get; private set; } = null!;
internal FFXIVWeatherLuminaService Weather { get; private set; } = null!;
internal GameFunctions Functions { get; private set; } = null!;
private Commands Commands { get; set; } = null!;
internal Markers Markers { get; private set; } = null!;
internal DalamudPluginInterface Interface { get; }
internal ClientState ClientState { get; }
internal CommandManager CommandManager { get; }
internal DataManager DataManager { get; }
internal Framework Framework { get; }
internal GameGui GameGui { get; }
internal SeStringManager SeStringManager { get; }
internal SigScanner SigScanner { get; }
public void Initialize(DalamudPluginInterface pluginInterface) {
internal Configuration Config { get; }
internal PluginUi Ui { get; }
internal FFXIVWeatherLuminaService Weather { get; }
internal GameFunctions Functions { get; }
private Commands Commands { get; }
internal Markers Markers { get; }
public Plugin(
DalamudPluginInterface pluginInterface,
ClientState clientState,
CommandManager commandManager,
DataManager dataManager,
Framework framework,
GameGui gameGui,
SeStringManager seStringManager,
SigScanner sigScanner
) {
this.Interface = pluginInterface;
this.ClientState = clientState;
this.CommandManager = commandManager;
this.DataManager = dataManager;
this.Framework = framework;
this.GameGui = gameGui;
this.SeStringManager = seStringManager;
this.SigScanner = sigScanner;
this.Config = this.Interface.GetPluginConfig() as Configuration ?? new Configuration();
this.Config.Initialise(this);
var gameDataField = this.Interface.Data.GetType().GetField("gameData", BindingFlags.Instance | BindingFlags.NonPublic);
var gameDataField = this.DataManager.GetType().GetField("gameData", BindingFlags.Instance | BindingFlags.NonPublic);
if (gameDataField == null) {
throw new Exception("Missing gameData field");
}
var lumina = (Lumina.GameData) gameDataField.GetValue(this.Interface.Data);
var lumina = (Lumina.GameData) gameDataField.GetValue(this.DataManager)!;
this.Weather = new FFXIVWeatherLuminaService(lumina);
this.Functions = new GameFunctions(this);

View File

@ -18,16 +18,16 @@ namespace Tourist {
public PluginUi(Plugin plugin) {
this.Plugin = plugin;
this.Plugin.Interface.UiBuilder.OnBuildUi += this.Draw;
this.Plugin.Interface.UiBuilder.OnOpenConfigUi += this.OpenConfig;
this.Plugin.Interface.UiBuilder.Draw += this.Draw;
this.Plugin.Interface.UiBuilder.OpenConfigUi += this.OpenConfig;
}
public void Dispose() {
this.Plugin.Interface.UiBuilder.OnOpenConfigUi -= this.OpenConfig;
this.Plugin.Interface.UiBuilder.OnBuildUi -= this.Draw;
this.Plugin.Interface.UiBuilder.OpenConfigUi -= this.OpenConfig;
this.Plugin.Interface.UiBuilder.Draw -= this.Draw;
}
private void OpenConfig(object sender, EventArgs eventArgs) {
private void OpenConfig(object? sender, EventArgs eventArgs) {
this.Show = true;
}
@ -102,7 +102,7 @@ namespace Tourist {
this.Plugin.Config.Save();
if (showArrVistas) {
var territory = this.Plugin.Interface.ClientState.TerritoryType;
var territory = this.Plugin.ClientState.TerritoryType;
this.Plugin.Markers.SpawnVfxForCurrentZone(territory);
} else {
this.Plugin.Markers.RemoveAllVfx();
@ -130,7 +130,7 @@ namespace Tourist {
if (ImGui.BeginChild("tourist-adventures", new Vector2(0, 0))) {
const uint first = 2162688;
var adventures = this.Plugin.Interface.Data.GetExcelSheet<Adventure>()
var adventures = this.Plugin.DataManager.GetExcelSheet<Adventure>()
.Select(adventure => (idx: adventure.RowId - first, adventure))
.OrderBy(entry => this.Plugin.Config.SortMode switch {
SortMode.Number => entry.idx,
@ -142,7 +142,7 @@ namespace Tourist {
var lastTree = false;
foreach (var (idx, adventure) in adventures) {
if (this.Plugin.Config.OnlyShowCurrentZone && adventure.Level.Value.Territory.Row != this.Plugin.Interface.ClientState.TerritoryType) {
if (this.Plugin.Config.OnlyShowCurrentZone && adventure.Level.Value.Territory.Row != this.Plugin.ClientState.TerritoryType) {
continue;
}
@ -194,7 +194,7 @@ namespace Tourist {
? string.Empty
: $" ({(countdown.Value - DateTimeOffset.UtcNow).ToHumanReadable()})";
var name = this.Plugin.Interface.SeStringManager.Parse(adventure.Name.RawData.ToArray());
var name = this.Plugin.SeStringManager.Parse(adventure.Name.RawData.ToArray());
var header = ImGui.CollapsingHeader($"#{idx + 1} - {name.TextValue}{next}###adventure-{adventure.RowId}");
if (has || available) {
@ -231,7 +231,7 @@ namespace Tourist {
if (Weathers.All.TryGetValue(adventure.RowId, out var weathers)) {
var weatherString = string.Join(", ", weathers
.OrderBy(id => id)
.Select(id => this.Plugin.Interface.Data.GetExcelSheet<Weather>().GetRow(id))
.Select(id => this.Plugin.DataManager.GetExcelSheet<Weather>().GetRow(id))
.Select(weather => weather.Name));
ImGui.TextUnformatted(weatherString);
} else {
@ -241,7 +241,7 @@ namespace Tourist {
ImGui.Columns();
if (ImGui.Button($"Open map##{adventure.RowId}")) {
this.Plugin.Interface.OpenMapLocation(adventure);
this.Plugin.GameGui.OpenMapLocation(adventure);
}
}

View File

@ -2,10 +2,12 @@
<PropertyGroup>
<Version>1.2.3</Version>
<TargetFramework>net48</TargetFramework>
<TargetFramework>net5-windows</TargetFramework>
<LangVersion>latest</LangVersion>
<Nullable>enable</Nullable>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<ProduceReferenceAssembly>false</ProduceReferenceAssembly>
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
</PropertyGroup>
<ItemGroup>
@ -29,17 +31,11 @@
<HintPath>$(AppData)\XIVLauncher\addon\Hooks\dev\Lumina.Excel.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="System.Memory">
<HintPath>C:\Users\Anna\AppData\Roaming\XIVLauncher\addon\Hooks\dev\System.Memory.dll</HintPath>
<Private>False</Private>
</Reference>
</ItemGroup>
<ItemGroup>
<PackageReference Include="DalamudPackager" Version="1.2.1"/>
<PackageReference Include="DalamudPackager" Version="2.0.0"/>
<PackageReference Include="FFXIVWeather.Lumina" Version="1.2.2"/>
<PackageReference Include="Fody" Version="6.5.1" PrivateAssets="all"/>
<PackageReference Include="ILMerge.Fody" Version="1.16.0" PrivateAssets="all"/>
</ItemGroup>
</Project>

View File

@ -1,5 +1,6 @@
name: Tourist
author: ascclemens
punchline: Finish your sightseeing log.
description: |-
Tourist adds a window to assist with the sightseeing log.
@ -8,4 +9,7 @@ description: |-
- Open vista locations on your map
- Hide already completed or unavailable vistas
- Show the command needed for each vista
Icon: sightseeing by muhammad from the Noun Project
repo_url: https://git.sr.ht/~jkcclemens/Tourist
icon_url: https://annaclemens.io/assets/plugins/icons/tourist.png

View File

@ -2,8 +2,8 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Dalamud.Game.Gui;
using Dalamud.Game.Text.SeStringHandling.Payloads;
using Dalamud.Plugin;
using FFXIVWeather.Lumina;
using Lumina.Excel.GeneratedSheets;
@ -11,7 +11,7 @@ namespace Tourist {
public static class Util {
private static Dictionary<uint, (DateTimeOffset start, DateTimeOffset end)> Availability { get; } = new();
public static void OpenMapLocation(this DalamudPluginInterface @interface, Adventure adventure) {
public static void OpenMapLocation(this GameGui gameGui, Adventure adventure) {
var loc = adventure.Level?.Value;
var map = loc?.Map?.Value;
var terr = map?.TerritoryType?.Value;
@ -21,14 +21,13 @@ namespace Tourist {
}
var mapLink = new MapLinkPayload(
@interface.Data,
terr.RowId,
map!.RowId,
(int) (loc!.X * 1_000f),
(int) (loc.Z * 1_000f)
);
@interface.Framework.Gui.OpenMapWithMapLink(mapLink);
gameGui.OpenMapWithMapLink(mapLink);
}
private static DateTimeOffset EorzeaTime(DateTimeOffset? at = null) {

View File

@ -3,86 +3,86 @@
namespace Tourist {
public static class Weathers {
public static readonly IReadOnlyDictionary<uint, uint[]> All = new Dictionary<uint, uint[]> {
[2162688] = new uint[] {2, 1},
[2162689] = new uint[] {1, 2},
[2162690] = new uint[] {7, 8},
[2162691] = new uint[] {2, 1},
[2162692] = new uint[] {3},
[2162693] = new uint[] {2, 1},
[2162694] = new uint[] {4},
[2162695] = new uint[] {2, 1},
[2162696] = new uint[] {3},
[2162697] = new uint[] {1, 2},
[2162698] = new uint[] {2, 1},
[2162699] = new uint[] {2, 1},
[2162700] = new uint[] {1, 2},
[2162701] = new uint[] {2, 1},
[2162702] = new uint[] {3},
[2162703] = new uint[] {2, 1},
[2162704] = new uint[] {4},
[2162705] = new uint[] {7, 8},
[2162706] = new uint[] {3},
[2162707] = new uint[] {2, 1},
[2162708] = new uint[] {2, 1},
[2162709] = new uint[] {1, 2},
[2162710] = new uint[] {7, 8},
[2162711] = new uint[] {1, 2},
[2162712] = new uint[] {7, 8},
[2162713] = new uint[] {1, 2},
[2162714] = new uint[] {6},
[2162715] = new uint[] {2, 1},
[2162716] = new uint[] {1, 2},
[2162717] = new uint[] {2, 1},
[2162718] = new uint[] {1, 2},
[2162719] = new uint[] {10},
[2162720] = new uint[] {2, 1},
[2162721] = new uint[] {3},
[2162722] = new uint[] {1, 2},
[2162723] = new uint[] {7, 8},
[2162724] = new uint[] {2, 1},
[2162725] = new uint[] {7, 8},
[2162726] = new uint[] {7, 8},
[2162727] = new uint[] {1, 2},
[2162728] = new uint[] {2, 1},
[2162729] = new uint[] {1, 2},
[2162730] = new uint[] {9},
[2162731] = new uint[] {10},
[2162732] = new uint[] {1, 2},
[2162733] = new uint[] {4},
[2162734] = new uint[] {2, 1},
[2162735] = new uint[] {2, 1},
[2162736] = new uint[] {1, 2},
[2162737] = new uint[] {3},
[2162738] = new uint[] {1, 2},
[2162739] = new uint[] {2, 1},
[2162740] = new uint[] {11},
[2162741] = new uint[] {1, 2},
[2162742] = new uint[] {1, 2},
[2162743] = new uint[] {2, 1},
[2162744] = new uint[] {8},
[2162745] = new uint[] {4},
[2162746] = new uint[] {2, 1},
[2162747] = new uint[] {14},
[2162748] = new uint[] {2, 1},
[2162749] = new uint[] {14},
[2162750] = new uint[] {1, 2},
[2162751] = new uint[] {2, 1},
[2162752] = new uint[] {2, 1},
[2162753] = new uint[] {3},
[2162754] = new uint[] {4},
[2162755] = new uint[] {1, 2},
[2162756] = new uint[] {4},
[2162757] = new uint[] {16},
[2162758] = new uint[] {2, 1},
[2162759] = new uint[] {1, 2},
[2162760] = new uint[] {16, 15},
[2162761] = new uint[] {2, 1},
[2162762] = new uint[] {2, 1},
[2162763] = new uint[] {1, 2},
[2162764] = new uint[] {17},
[2162765] = new uint[] {2, 1},
[2162766] = new uint[] {1, 2},
[2162767] = new uint[] {2, 1},
[2162688] = new uint[] { 2, 1 },
[2162689] = new uint[] { 1, 2 },
[2162690] = new uint[] { 7, 8 },
[2162691] = new uint[] { 2, 1 },
[2162692] = new uint[] { 3 },
[2162693] = new uint[] { 2, 1 },
[2162694] = new uint[] { 4 },
[2162695] = new uint[] { 2, 1 },
[2162696] = new uint[] { 3 },
[2162697] = new uint[] { 1, 2 },
[2162698] = new uint[] { 2, 1 },
[2162699] = new uint[] { 2, 1 },
[2162700] = new uint[] { 1, 2 },
[2162701] = new uint[] { 2, 1 },
[2162702] = new uint[] { 3 },
[2162703] = new uint[] { 2, 1 },
[2162704] = new uint[] { 4 },
[2162705] = new uint[] { 7, 8 },
[2162706] = new uint[] { 3 },
[2162707] = new uint[] { 2, 1 },
[2162708] = new uint[] { 2, 1 },
[2162709] = new uint[] { 1, 2 },
[2162710] = new uint[] { 7, 8 },
[2162711] = new uint[] { 1, 2 },
[2162712] = new uint[] { 7, 8 },
[2162713] = new uint[] { 1, 2 },
[2162714] = new uint[] { 6 },
[2162715] = new uint[] { 2, 1 },
[2162716] = new uint[] { 1, 2 },
[2162717] = new uint[] { 2, 1 },
[2162718] = new uint[] { 1, 2 },
[2162719] = new uint[] { 10 },
[2162720] = new uint[] { 2, 1 },
[2162721] = new uint[] { 3 },
[2162722] = new uint[] { 1, 2 },
[2162723] = new uint[] { 7, 8 },
[2162724] = new uint[] { 2, 1 },
[2162725] = new uint[] { 7, 8 },
[2162726] = new uint[] { 7, 8 },
[2162727] = new uint[] { 1, 2 },
[2162728] = new uint[] { 2, 1 },
[2162729] = new uint[] { 1, 2 },
[2162730] = new uint[] { 9 },
[2162731] = new uint[] { 10 },
[2162732] = new uint[] { 1, 2 },
[2162733] = new uint[] { 4 },
[2162734] = new uint[] { 2, 1 },
[2162735] = new uint[] { 2, 1 },
[2162736] = new uint[] { 1, 2 },
[2162737] = new uint[] { 3 },
[2162738] = new uint[] { 1, 2 },
[2162739] = new uint[] { 2, 1 },
[2162740] = new uint[] { 11 },
[2162741] = new uint[] { 1, 2 },
[2162742] = new uint[] { 1, 2 },
[2162743] = new uint[] { 2, 1 },
[2162744] = new uint[] { 8 },
[2162745] = new uint[] { 4 },
[2162746] = new uint[] { 2, 1 },
[2162747] = new uint[] { 14 },
[2162748] = new uint[] { 2, 1 },
[2162749] = new uint[] { 14 },
[2162750] = new uint[] { 1, 2 },
[2162751] = new uint[] { 2, 1 },
[2162752] = new uint[] { 2, 1 },
[2162753] = new uint[] { 3 },
[2162754] = new uint[] { 4 },
[2162755] = new uint[] { 1, 2 },
[2162756] = new uint[] { 4 },
[2162757] = new uint[] { 16 },
[2162758] = new uint[] { 2, 1 },
[2162759] = new uint[] { 1, 2 },
[2162760] = new uint[] { 16, 15 },
[2162761] = new uint[] { 2, 1 },
[2162762] = new uint[] { 2, 1 },
[2162763] = new uint[] { 1, 2 },
[2162764] = new uint[] { 17 },
[2162765] = new uint[] { 2, 1 },
[2162766] = new uint[] { 1, 2 },
[2162767] = new uint[] { 2, 1 },
};
}
}

112
icon.svg Executable file
View File

@ -0,0 +1,112 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
viewBox="0 0 27.99657 27.996571"
x="0px"
y="0px"
version="1.1"
id="svg22"
sodipodi:docname="icon.svg"
width="27.996571"
height="27.996571"
inkscape:version="1.1 (c68e22c387, 2021-05-23)"
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/">
<defs
id="defs26" />
<sodipodi:namedview
id="namedview24"
pagecolor="#505050"
bordercolor="#ffffff"
borderopacity="1"
inkscape:pageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="1"
showgrid="false"
width="27.99657px"
inkscape:zoom="14.707821"
inkscape:cx="14.584077"
inkscape:cy="10.300642"
inkscape:window-width="1920"
inkscape:window-height="1017"
inkscape:window-x="1592"
inkscape:window-y="32"
inkscape:window-maximized="1"
inkscape:current-layer="layer2" />
<title
id="title2">Sightseeing</title>
<metadata
id="metadata843">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:title>Sightseeing</dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="Layer 2"
transform="translate(-2.0017142,-2.01)">
<path
style="fill:#552200;stroke:none;stroke-width:0.0135982;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 15.969792,2.4279296 c -0.774083,-0.00125 -1.510254,0.6769157 -1.429213,1.4797759 -0.09091,4.9471004 -0.02873,9.8961755 -0.04831,14.8440485 0.01327,3.471208 -0.0268,6.950417 0.01974,10.416632 0.125357,0.634088 0.902377,0.388302 1.363902,0.434977 0.485097,-0.05553 1.055716,0.131326 1.479144,-0.139201 0.348141,-0.411293 0.10334,-1.020295 0.176677,-1.51662 -0.0153,-7.827633 0.03324,-15.655677 -0.03108,-23.4830463 0.015,-0.6386617 -0.03247,-1.3929433 -0.628916,-1.7746944 -0.260429,-0.185667 -0.583911,-0.2713335 -0.901944,-0.2618717 z"
id="path2093" />
<path
style="fill:#803300;stroke:none;stroke-width:0.0135982;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 17.635971,13.730908 c -0.409991,0.409644 -0.144734,1.053347 -0.220307,1.570301 0.02601,1.06129 -0.05241,2.13825 0.03991,3.189591 0.192166,0.586482 0.947461,0.303934 1.41194,0.369979 2.239805,-0.0133 4.487593,0.0266 6.722408,-0.01995 0.513886,-0.153434 0.724755,-0.750774 1.104618,-1.096198 0.337751,-0.451313 0.784272,-0.843191 1.021768,-1.358483 0.0394,-0.5607 -0.532243,-0.901713 -0.804633,-1.332592 -0.426431,-0.421138 -0.70643,-1.046942 -1.261199,-1.298875 -2.573366,-0.16218 -5.156325,-0.07519 -7.733642,-0.109289 -0.09362,0.02851 -0.187241,0.05701 -0.280861,0.08552 z"
id="path3084" />
<path
style="fill:#803300;stroke:none;stroke-width:0.0135982;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 4.5204739,13.731572 c -0.6478711,0.72126 -1.2818157,1.472008 -1.8784125,2.232714 -0.2877621,0.557488 0.4201337,0.941261 0.6715227,1.364583 0.4434784,0.470386 0.7638264,1.077668 1.3011742,1.443734 3.1615759,0.04717 6.3294047,0.0067 9.4933807,0.02019 0.634756,-0.06314 0.494504,-0.796206 0.499974,-1.247875 -0.02674,-1.174499 0.0534,-2.365035 -0.03991,-3.529545 -0.192166,-0.586482 -0.94746,-0.303934 -1.411939,-0.36998 -2.805678,0.01337 -5.6193691,-0.02666 -8.4200595,0.01995 -0.071911,0.02208 -0.1438211,0.04415 -0.2157316,0.06623 z"
id="path3123" />
<path
style="fill:#803300;stroke:none;stroke-width:0.0135982;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 17.634909,5.2326926 c -0.40847,0.4102026 -0.14376,1.0528879 -0.219245,1.5696369 0.02601,1.06129 -0.05241,2.1382496 0.03991,3.1895906 0.192166,0.5864819 0.947461,0.3039339 1.41194,0.3699789 2.801382,-0.01338 5.610783,0.02667 8.407178,-0.01995 C 27.79152,10.187637 27.993706,9.5801553 28.370387,9.2289519 28.714631,8.7387635 29.229579,8.3151631 29.379032,7.7178182 29.325488,7.1824631 28.778899,6.8631738 28.511539,6.4275523 28.099233,6.0168195 27.837135,5.3957671 27.29444,5.1570515 c -3.124764,-0.024619 -6.252788,-0.00348 -9.378803,-0.010543 -0.09358,0.028728 -0.187152,0.057456 -0.280728,0.086184 z"
id="path3162" />
<path
style="fill:#803300;stroke:none;stroke-width:0.0135982;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 10.249249,5.1499614 C 8.965104,5.1645004 7.6728932,5.1256132 6.3937698,5.1734244 5.8805609,5.3280854 5.6713335,5.9242456 5.2947979,6.2734053 4.9510235,6.7517277 4.4583156,7.1395796 4.2303168,7.6879393 4.3248988,8.2805582 4.913499,8.6336089 5.2261465,9.1190709 5.633006,9.5148267 5.8866364,10.127097 6.4220903,10.35178 c 2.5585815,0.01027 5.1282697,0.02996 7.6830547,-0.0098 0.634088,-0.125357 0.388301,-0.9023774 0.434977,-1.3639024 -0.0261,-1.1519316 0.05253,-2.3195767 -0.03991,-3.4615548 -0.192253,-0.5867517 -0.947755,-0.3035361 -1.412337,-0.3691121 -0.946209,8.619e-4 -1.892418,0.00172 -2.838627,0.00259 z"
id="path3201" />
</g>
<g
inkscape:groupmode="layer"
id="layer1"
inkscape:label="Layer 1"
transform="translate(-2.0017142,-2.01)">
<g
id="g16"
style="stroke:none;stroke-width:0.2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
transform="translate(0,0.00322577)">
<path
d="m 27.45,10.71 a 0.42,0.42 0 0 0 0.33,-0.16 L 29.9,8 a 0.42,0.42 0 0 0 0,-0.54 L 27.78,4.93 A 0.41,0.41 0 0 0 27.45,4.78 H 17.91 V 3.92 a 1.91,1.91 0 1 0 -3.82,0 V 4.78 H 6.25 A 0.41,0.41 0 0 0 5.92,4.93 L 3.8,7.47 A 0.42,0.42 0 0 0 3.8,8 l 2.12,2.54 a 0.42,0.42 0 0 0 0.33,0.16 h 7.84 v 2.54 H 4.55 A 0.42,0.42 0 0 0 4.22,13.4 L 2.1,16 a 0.42,0.42 0 0 0 0,0.54 L 4.22,19 a 0.41,0.41 0 0 0 0.33,0.15 h 9.54 v 10 h -3.18 a 0.43,0.43 0 0 0 -0.43,0.43 0.42,0.42 0 0 0 0.43,0.42 h 10.18 a 0.42,0.42 0 0 0 0.43,-0.42 0.43,0.43 0 0 0 -0.43,-0.43 h -3.18 v -10 h 7.85 A 0.44,0.44 0 0 0 26.09,19 l 2.12,-2.54 a 0.45,0.45 0 0 0 0,-0.54 l -2.12,-2.55 a 0.45,0.45 0 0 0 -0.33,-0.16 h -7.85 v -2.5 z M 27.26,5.62 29,7.73 27.26,9.86 H 17.91 V 5.62 Z M 6.44,9.86 4.67,7.73 6.44,5.62 h 7.65 V 9.86 Z M 4.75,18.35 3,16.22 4.77,14.11 h 9.34 v 4.24 z m 10.19,10.8 V 3.92 a 1.06,1.06 0 1 1 2.12,0 v 25.23 z m 10.62,-15 1.77,2.11 -1.77,2.13 h -7.65 v -4.28 z"
id="path4"
style="stroke:none;stroke-width:0.2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
d="m 19.78,8.16 h 1.7 a 0.42,0.42 0 1 0 0,-0.84 h -1.7 a 0.42,0.42 0 1 0 0,0.84 z"
id="path6"
style="stroke:none;stroke-width:0.2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
d="m 23.18,8.16 h 3.44 a 0.42,0.42 0 1 0 0,-0.84 h -3.44 a 0.41,0.41 0 0 0 -0.42,0.41 0.42,0.42 0 0 0 0.42,0.43 z"
id="path8"
style="stroke:none;stroke-width:0.2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
d="M 11.78,7.32 H 7.85 a 0.42,0.42 0 1 0 0,0.84 h 3.93 A 0.42,0.42 0 0 0 12.2,7.73 0.41,0.41 0 0 0 11.78,7.32 Z"
id="path10"
style="stroke:none;stroke-width:0.2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
d="M 8.17,15.81 H 5.63 A 0.42,0.42 0 0 0 5.2,16.22 0.43,0.43 0 0 0 5.63,16.65 H 8.17 A 0.43,0.43 0 0 0 8.6,16.22 0.42,0.42 0 0 0 8.17,15.81 Z"
id="path12"
style="stroke:none;stroke-width:0.2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
d="M 12.41,15.81 H 9.87 a 0.41,0.41 0 0 0 -0.42,0.41 0.42,0.42 0 0 0 0.42,0.43 h 2.54 a 0.43,0.43 0 0 0 0.43,-0.43 0.42,0.42 0 0 0 -0.43,-0.41 z"
id="path14"
style="stroke:none;stroke-width:0.2;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.8 KiB