]> www.infradead.org Git - users/mchehab/andors-trail.git/commitdiff
WIP on displaying an actual worldmap in-game.
authorOskar Wiksten <oskar.wiksten@gmail.com>
Fri, 20 Jul 2012 14:36:17 +0000 (14:36 +0000)
committerOskar Wiksten <oskar.wiksten@gmail.com>
Sun, 7 Oct 2012 14:40:43 +0000 (16:40 +0200)
14 files changed:
AndorsTrail/AndroidManifest.xml
AndorsTrail/res/layout/displayworldmap.xml [new file with mode: 0644]
AndorsTrail/res/values/strings.xml
AndorsTrail/res/values/worldmap_template.xml [new file with mode: 0644]
AndorsTrail/res/xml/worldmap.xml [new file with mode: 0644]
AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/DisplayWorldMapActivity.java [new file with mode: 0644]
AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/MainActivity.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/MovementController.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/controller/WorldMapController.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/map/PredefinedMap.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/map/TMXMapFileParser.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/model/map/TMXMapTranslator.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/ResourceLoader.java
AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/parsers/WorldMapParser.java [new file with mode: 0644]

index 6887dbfd94b14734032e546479ff1b4d79c6be27..dc3f10d7798b0422dd805df69833b6ddef9f6fce 100644 (file)
@@ -62,6 +62,7 @@
                <activity android:name=".activity.HeroinfoActivity_Stats" />
                <activity android:name=".activity.HeroinfoActivity_Skills" />
                <activity android:name=".activity.HeroinfoActivity_Inventory" />
+               <activity android:name=".activity.DisplayWorldMapActivity" />
        </application>
        
 </manifest>
diff --git a/AndorsTrail/res/layout/displayworldmap.xml b/AndorsTrail/res/layout/displayworldmap.xml
new file mode 100644 (file)
index 0000000..f796009
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<WebView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent" 
+    android:id="@+id/displayworldmap_webview"
+    >
+
+</WebView>
index 1fcb53d3c6fd8e8e6c98b0de299e290fc0c10864..4d0a2ade7fea81e2b2eeed6513aa84f44a36e785 100644 (file)
     <string name="skill_longdescription_concussion">When making an attack on a target whose block chance (BC) is at least %1$d lower than your attack chance (AC), there is a %2$d %% chance that the hit will cause a concussion on the target. A concussion will severely lower the target\'s offensive combat abilities, making the target less able to land successful attacks.</string>
 
     <string name="about_button4">About</string>
+    <string name="menu_button_worldmap">Map</string>
+    <string name="menu_button_worldmap_failed">Map cannot be displayed.</string>
     
 </resources>
diff --git a/AndorsTrail/res/values/worldmap_template.xml b/AndorsTrail/res/values/worldmap_template.xml
new file mode 100644 (file)
index 0000000..d4bdbd7
--- /dev/null
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<resources><string name="worldmap_template">"<![CDATA[<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">
+<html xmlns=\"http://www.w3.org/1999/xhtml\">
+<head>
+       <meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\" />
+       <title></title>
+       <style type=\"text/css\">
+#playerPosition { position: absolute; z-index: 2; font-size: 19pt; color: red; text-shadow: rgba(0, 0, 0, 1) 2px 2px 2px; }
+       </style>
+</head>
+<body>
+
+<div id=\"maps\">
+       
+{{maps}}
+       
+       <div id=\"playerPosition\">x</div>
+</div>
+
+<script type=\"text/javascript\">
+var player = document.getElementById(\"playerPosition\");
+var params = window.location.search.substring(1);
+if (params) {
+       var pos = params.split(\",\");
+       var x = parseInt(pos[0])-{{offsetx}};
+       var y = parseInt(pos[1])-{{offsety}};
+       player.style.top = y + \"px\";
+       player.style.left = x + \"px\"; 
+       window.scrollTo(x-100, y-100);
+} else {
+       player.style.display = \"none\";
+}
+</script>
+
+</body>
+</html>
+
+]]></string></resources>
diff --git a/AndorsTrail/res/xml/worldmap.xml b/AndorsTrail/res/xml/worldmap.xml
new file mode 100644 (file)
index 0000000..bd6bb9f
--- /dev/null
@@ -0,0 +1,378 @@
+<?xml version="1.0" encoding="utf-8"?>
+<worldmap>
+<div id="pwcave4" x-posx="327" x-posy="89" x-width="30" x-height="30" x-outside="0">pwcave4</div>
+<div id="waytobrimhaven2" x-posx="342" x-posy="235" x-width="30" x-height="30" x-outside="1">waytobrimhaven2</div>
+<div id="waytobrimhaven3" x-posx="373" x-posy="237" x-width="30" x-height="30" x-outside="1">waytobrimhaven3</div>
+<div id="waytobrimhaven0" x-posx="277" x-posy="249" x-width="33" x-height="16" x-outside="1">waytobrimhaven0</div>
+<div id="waytobrimhaven1" x-posx="311" x-posy="245" x-width="30" x-height="20" x-outside="1">waytobrimhaven1</div>
+<div id="roadtocarntower1" x-posx="125" x-posy="298" x-width="30" x-height="20" x-outside="1">roadtocarntower1</div>
+<div id="roadtocarntower0" x-posx="156" x-posy="298" x-width="30" x-height="20" x-outside="1">roadtocarntower0</div>
+<div id="woodsettlement0" x-posx="210" x-posy="365" x-width="29" x-height="14" x-outside="1">woodsettlement0</div>
+<div id="fallhaven_arcir_basement" x-posx="228" x-posy="397" x-width="12" x-height="9" x-outside="0">fallhaven_arcir_basement</div>
+<div id="roadtocarntower2" x-posx="94" x-posy="298" x-width="30" x-height="26" x-outside="1">roadtocarntower2</div>
+<div id="lodarcave7" x-posx="381" x-posy="410" x-width="15" x-height="20" x-outside="0">lodarcave7</div>
+<div id="lodarcave5" x-posx="356" x-posy="377" x-width="25" x-height="20" x-outside="0">lodarcave5</div>
+<div id="lodarcave6" x-posx="360" x-posy="398" x-width="20" x-height="23" x-outside="0">lodarcave6</div>
+<div id="lodarcave3" x-posx="331" x-posy="325" x-width="30" x-height="30" x-outside="0">lodarcave3</div>
+<div id="lodarcave4" x-posx="343" x-posy="356" x-width="25" x-height="20" x-outside="0">lodarcave4</div>
+<div id="lodarcave1" x-posx="317" x-posy="273" x-width="18" x-height="30" x-outside="0">lodarcave1</div>
+<div id="lodarcave2" x-posx="327" x-posy="304" x-width="15" x-height="20" x-outside="0">lodarcave2</div>
+<div id="fields9" x-posx="125" x-posy="282" x-width="30" x-height="15" x-outside="1">fields9</div>
+<div id="lodarcave0" x-posx="313" x-posy="272" x-width="20" x-height="15" x-outside="0">lodarcave0</div>
+<div id="waterway9" x-posx="559" x-posy="218" x-width="30" x-height="30" x-outside="1">waterway9</div>
+<div id="fields6" x-posx="187" x-posy="222" x-width="30" x-height="28" x-outside="1">fields6</div>
+<div id="waterway8" x-posx="528" x-posy="218" x-width="30" x-height="30" x-outside="1">waterway8</div>
+<div id="fields5" x-posx="156" x-posy="220" x-width="30" x-height="30" x-outside="1">fields5</div>
+<div id="fields8" x-posx="156" x-posy="282" x-width="30" x-height="15" x-outside="1">fields8</div>
+<div id="crossglen_cave" x-posx="172" x-posy="335" x-width="20" x-height="20" x-outside="0">crossglen_cave</div>
+<div id="fields7" x-posx="218" x-posy="226" x-width="27" x-height="24" x-outside="1">fields7</div>
+<div id="fields2" x-posx="156" x-posy="251" x-width="30" x-height="30" x-outside="1">fields2</div>
+<div id="fields1" x-posx="187" x-posy="251" x-width="30" x-height="30" x-outside="1">fields1</div>
+<div id="fields4" x-posx="218" x-posy="251" x-width="27" x-height="24" x-outside="1">fields4</div>
+<div id="fields3" x-posx="135" x-posy="261" x-width="20" x-height="20" x-outside="1">fields3</div>
+<div id="fields0" x-posx="187" x-posy="282" x-width="30" x-height="15" x-outside="1">fields0</div>
+<div id="wild14_clearing" x-posx="326" x-posy="423" x-width="15" x-height="15" x-outside="1">wild14_clearing</div>
+<div id="blackwater_mountain7" x-posx="34" x-posy="368" x-width="30" x-height="30" x-outside="0">blackwater_mountain7</div>
+<div id="lodarhouse1" x-posx="395" x-posy="403" x-width="20" x-height="16" x-outside="0">lodarhouse1</div>
+<div id="blackwater_mountain6" x-posx="31" x-posy="384" x-width="10" x-height="10" x-outside="0">blackwater_mountain6</div>
+<div id="lodarhouse0" x-posx="387" x-posy="412" x-width="26" x-height="20" x-outside="0">lodarhouse0</div>
+<div id="blackwater_mountain5" x-posx="22" x-posy="389" x-width="15" x-height="15" x-outside="0">blackwater_mountain5</div>
+<div id="mountainlake10a" x-posx="703" x-posy="31" x-width="25" x-height="20" x-outside="1">mountainlake10a</div>
+<div id="blackwater_mountain4" x-posx="22" x-posy="401" x-width="15" x-height="15" x-outside="1">blackwater_mountain4</div>
+<div id="blackwater_mountain9" x-posx="42" x-posy="350" x-width="17" x-height="23" x-outside="0">blackwater_mountain9</div>
+<div id="blackwater_mountain8" x-posx="47" x-posy="378" x-width="20" x-height="20" x-outside="0">blackwater_mountain8</div>
+<div id="crossglen_farmhouse" x-posx="160" x-posy="364" x-width="10" x-height="8" x-outside="0">crossglen_farmhouse</div>
+<div id="fallhaven_storage" x-posx="248" x-posy="407" x-width="15" x-height="10" x-outside="0">fallhaven_storage</div>
+<div id="pwcave2" x-posx="296" x-posy="58" x-width="30" x-height="30" x-outside="0">pwcave2</div>
+<div id="pwcave3" x-posx="327" x-posy="58" x-width="30" x-height="30" x-outside="0">pwcave3</div>
+<div id="pwcave0" x-posx="316" x-posy="120" x-width="11" x-height="30" x-outside="0">pwcave0</div>
+<div id="pwcave1" x-posx="296" x-posy="89" x-width="30" x-height="30" x-outside="0">pwcave1</div>
+<div id="wild16_cave" x-posx="92" x-posy="454" x-width="20" x-height="15" x-outside="0">wild16_cave</div>
+<div id="lodarcave4a" x-posx="369" x-posy="358" x-width="20" x-height="20" x-outside="0">lodarcave4a</div>
+<div id="wild3" x-posx="181" x-posy="384" x-width="20" x-height="20" x-outside="1">wild3</div>
+<div id="wild2" x-posx="160" x-posy="384" x-width="20" x-height="20" x-outside="1">wild2</div>
+<div id="wild5" x-posx="167" x-posy="405" x-width="20" x-height="20" x-outside="1">wild5</div>
+<div id="wild4" x-posx="209" x-posy="349" x-width="20" x-height="15" x-outside="1">wild4</div>
+<div id="wild7" x-posx="155" x-posy="457" x-width="20" x-height="20" x-outside="1">wild7</div>
+<div id="wild6" x-posx="163" x-posy="426" x-width="30" x-height="30" x-outside="1">wild6</div>
+<div id="remgard_weapon" x-posx="621" x-posy="92" x-width="12" x-height="8" x-outside="0">remgard_weapon</div>
+<div id="wild9" x-posx="194" x-posy="440" x-width="30" x-height="15" x-outside="1">wild9</div>
+<div id="clearing_level2" x-posx="251" x-posy="463" x-width="15" x-height="15" x-outside="0">clearing_level2</div>
+<div id="wild8" x-posx="134" x-posy="466" x-width="20" x-height="15" x-outside="1">wild8</div>
+<div id="clearing_level1" x-posx="244" x-posy="461" x-width="20" x-height="16" x-outside="0">clearing_level1</div>
+<div id="blackwater_mountain0" x-posx="61" x-posy="467" x-width="20" x-height="15" x-outside="1">blackwater_mountain0</div>
+<div id="blackwater_mountain1" x-posx="19" x-posy="439" x-width="20" x-height="20" x-outside="1">blackwater_mountain1</div>
+<div id="blackwater_mountain2" x-posx="19" x-posy="428" x-width="20" x-height="10" x-outside="1">blackwater_mountain2</div>
+<div id="blackwater_mountain3" x-posx="22" x-posy="417" x-width="15" x-height="10" x-outside="1">blackwater_mountain3</div>
+<div id="vilegard_erttu" x-posx="368" x-posy="470" x-width="10" x-height="8" x-outside="0">vilegard_erttu</div>
+<div id="flagstone_upper" x-posx="111" x-posy="480" x-width="20" x-height="12" x-outside="0">flagstone_upper</div>
+<div id="wild1" x-posx="187" x-posy="351" x-width="21" x-height="21" x-outside="1">wild1</div>
+<div id="wild0" x-posx="187" x-posy="329" x-width="21" x-height="21" x-outside="1">wild0</div>
+<div id="wild17" x-posx="40" x-posy="453" x-width="20" x-height="20" x-outside="1">wild17</div>
+<div id="wild15" x-posx="343" x-posy="446" x-width="20" x-height="15" x-outside="1">wild15</div>
+<div id="mountainlake13a" x-posx="627" x-posy="50" x-width="15" x-height="25" x-outside="1">mountainlake13a</div>
+<div id="wild16" x-posx="82" x-posy="467" x-width="20" x-height="15" x-outside="1">wild16</div>
+<div id="wild13" x-posx="301" x-posy="434" x-width="20" x-height="15" x-outside="1">wild13</div>
+<div id="flagstone0" x-posx="103" x-posy="467" x-width="30" x-height="30" x-outside="1">flagstone0</div>
+<div id="wild14" x-posx="322" x-posy="439" x-width="20" x-height="16" x-outside="1">wild14</div>
+<div id="wild11" x-posx="246" x-posy="432" x-width="20" x-height="20" x-outside="1">wild11</div>
+<div id="wild12" x-posx="280" x-posy="424" x-width="20" x-height="20" x-outside="1">wild12</div>
+<div id="wild10" x-posx="225" x-posy="432" x-width="20" x-height="20" x-outside="1">wild10</div>
+<div id="waterway6" x-posx="404" x-posy="218" x-width="30" x-height="30" x-outside="1">waterway6</div>
+<div id="waterway7" x-posx="435" x-posy="218" x-width="30" x-height="30" x-outside="1">waterway7</div>
+<div id="waterway4" x-posx="381" x-posy="156" x-width="30" x-height="30" x-outside="1">waterway4</div>
+<div id="waterway5" x-posx="389" x-posy="187" x-width="30" x-height="30" x-outside="1">waterway5</div>
+<div id="flagstone1" x-posx="120" x-posy="486" x-width="20" x-height="11" x-outside="0">flagstone1</div>
+<div id="waterway2" x-posx="350" x-posy="148" x-width="30" x-height="30" x-outside="1">waterway2</div>
+<div id="flagstone2" x-posx="132" x-posy="481" x-width="11" x-height="30" x-outside="0">flagstone2</div>
+<div id="loneford10" x-posx="250" x-posy="245" x-width="11" x-height="11" x-outside="0">loneford10</div>
+<div id="waterway3" x-posx="319" x-posy="148" x-width="30" x-height="20" x-outside="1">waterway3</div>
+<div id="woodhouse3" x-posx="221" x-posy="362" x-width="16" x-height="8" x-outside="0">woodhouse3</div>
+<div id="waterway0" x-posx="288" x-posy="190" x-width="30" x-height="30" x-outside="1">waterway0</div>
+<div id="lodar8cave0" x-posx="308" x-posy="319" x-width="25" x-height="17" x-outside="0">lodar8cave0</div>
+<div id="flagstone3" x-posx="138" x-posy="512" x-width="20" x-height="13" x-outside="0">flagstone3</div>
+<div id="waterway1" x-posx="319" x-posy="169" x-width="30" x-height="30" x-outside="1">waterway1</div>
+<div id="flagstone4" x-posx="159" x-posy="508" x-width="25" x-height="13" x-outside="0">flagstone4</div>
+<div id="road4_gargoylecave" x-posx="433" x-posy="436" x-width="15" x-height="15" x-outside="1">road4_gargoylecave</div>
+<div id="fallhaven_prison" x-posx="226" x-posy="395" x-width="15" x-height="10" x-outside="0">fallhaven_prison</div>
+<div id="lonelyhouse1" x-posx="706" x-posy="37" x-width="15" x-height="10" x-outside="0">lonelyhouse1</div>
+<div id="lonelyhouse0" x-posx="700" x-posy="35" x-width="15" x-height="10" x-outside="0">lonelyhouse0</div>
+<div id="minerhouse0" x-posx="404" x-posy="328" x-width="20" x-height="8" x-outside="0">minerhouse0</div>
+<div id="waytobrimhavencave3b" x-posx="462" x-posy="277" x-width="14" x-height="7" x-outside="0">waytobrimhavencave3b</div>
+<div id="remgard_villager4" x-posx="639" x-posy="116" x-width="12" x-height="8" x-outside="0">remgard_villager4</div>
+<div id="minerhouse4" x-posx="435" x-posy="299" x-width="26" x-height="8" x-outside="0">minerhouse4</div>
+<div id="remgard_villager3" x-posx="669" x-posy="120" x-width="13" x-height="8" x-outside="0">remgard_villager3</div>
+<div id="minerhouse3" x-posx="416" x-posy="317" x-width="16" x-height="8" x-outside="0">minerhouse3</div>
+<div id="minerhouse2" x-posx="407" x-posy="315" x-width="20" x-height="8" x-outside="0">minerhouse2</div>
+<div id="minerhouse1" x-posx="405" x-posy="320" x-width="20" x-height="8" x-outside="0">minerhouse1</div>
+<div id="remgard_villager5" x-posx="619" x-posy="114" x-width="12" x-height="8" x-outside="0">remgard_villager5</div>
+<div id="minerhouse8" x-posx="438" x-posy="336" x-width="16" x-height="8" x-outside="0">minerhouse8</div>
+<div id="fallhaven_nocmar" x-posx="216" x-posy="394" x-width="12" x-height="8" x-outside="0">fallhaven_nocmar</div>
+<div id="minerhouse7" x-posx="446" x-posy="331" x-width="16" x-height="8" x-outside="0">minerhouse7</div>
+<div id="remgard_villager2" x-posx="670" x-posy="112" x-width="10" x-height="8" x-outside="0">remgard_villager2</div>
+<div id="minerhouse6" x-posx="438" x-posy="330" x-width="12" x-height="8" x-outside="0">minerhouse6</div>
+<div id="remgard_villager1" x-posx="665" x-posy="83" x-width="11" x-height="8" x-outside="0">remgard_villager1</div>
+<div id="minerhouse5" x-posx="447" x-posy="311" x-width="16" x-height="8" x-outside="0">minerhouse5</div>
+<div id="waytobrimhavencave3a" x-posx="468" x-posy="264" x-width="20" x-height="22" x-outside="0">waytobrimhavencave3a</div>
+<div id="lodar12cave0" x-posx="378" x-posy="294" x-width="15" x-height="15" x-outside="0">lodar12cave0</div>
+<div id="crossglen_hall" x-posx="170" x-posy="358" x-width="20" x-height="15" x-outside="0">crossglen_hall</div>
+<div id="lodar12cave1" x-posx="386" x-posy="278" x-width="20" x-height="25" x-outside="0">lodar12cave1</div>
+<div id="vilegard_ogam" x-posx="356" x-posy="500" x-width="8" x-height="7" x-outside="0">vilegard_ogam</div>
+<div id="minerhouse9" x-posx="449" x-posy="338" x-width="12" x-height="8" x-outside="0">minerhouse9</div>
+<div id="fallhaven_church" x-posx="243" x-posy="377" x-width="20" x-height="15" x-outside="0">fallhaven_church</div>
+<div id="vilegard_chapel" x-posx="371" x-posy="481" x-width="18" x-height="14" x-outside="0">vilegard_chapel</div>
+<div id="remgard_clothes" x-posx="653" x-posy="91" x-width="18" x-height="8" x-outside="0">remgard_clothes</div>
+<div id="foaming_flask" x-posx="374" x-posy="437" x-width="20" x-height="13" x-outside="0">foaming_flask</div>
+<div id="remgard_tavern1" x-posx="643" x-posy="91" x-width="25" x-height="20" x-outside="0">remgard_tavern1</div>
+<div id="roadcave0" x-posx="232" x-posy="325" x-width="20" x-height="20" x-outside="0">roadcave0</div>
+<div id="roadcave1" x-posx="246" x-posy="330" x-width="25" x-height="25" x-outside="0">roadcave1</div>
+<div id="vilegard_sw" x-posx="357" x-posy="503" x-width="10" x-height="10" x-outside="1">vilegard_sw</div>
+<div id="lostmine3" x-posx="457" x-posy="286" x-width="19" x-height="30" x-outside="0">lostmine3</div>
+<div id="lostmine4" x-posx="460" x-posy="297" x-width="15" x-height="17" x-outside="0">lostmine4</div>
+<div id="lostmine5" x-posx="460" x-posy="305" x-width="12" x-height="29" x-outside="0">lostmine5</div>
+<div id="lostmine6" x-posx="462" x-posy="335" x-width="12" x-height="19" x-outside="0">lostmine6</div>
+<div id="gapfiller1" x-posx="267" x-posy="432" x-width="12" x-height="12" x-outside="1">gapfiller1</div>
+<div id="gapfiller3" x-posx="187" x-posy="373" x-width="11" x-height="10" x-outside="1">gapfiller3</div>
+<div id="lostmine0" x-posx="434" x-posy="359" x-width="20" x-height="20" x-outside="1">lostmine0</div>
+<div id="lostmine1" x-posx="421" x-posy="337" x-width="29" x-height="30" x-outside="0">lostmine1</div>
+<div id="gapfiller4" x-posx="202" x-posy="380" x-width="15" x-height="15" x-outside="1">gapfiller4</div>
+<div id="lostmine2" x-posx="444" x-posy="317" x-width="30" x-height="30" x-outside="0">lostmine2</div>
+<div id="waytolake0" x-posx="628" x-posy="266" x-width="20" x-height="30" x-outside="1">waytolake0</div>
+<div id="lostmine9" x-posx="448" x-posy="349" x-width="28" x-height="28" x-outside="0">lostmine9</div>
+<div id="fallhaven_farmer" x-posx="264" x-posy="409" x-width="12" x-height="8" x-outside="0">fallhaven_farmer</div>
+<div id="vilegard_n" x-posx="368" x-posy="469" x-width="20" x-height="20" x-outside="1">vilegard_n</div>
+<div id="lostmine8" x-posx="470" x-posy="359" x-width="13" x-height="19" x-outside="0">lostmine8</div>
+<div id="lostmine7" x-posx="461" x-posy="349" x-width="29" x-height="30" x-outside="0">lostmine7</div>
+<div id="waytolostmine0" x-posx="403" x-posy="345" x-width="30" x-height="30" x-outside="1">waytolostmine0</div>
+<div id="waytolake5" x-posx="666" x-posy="179" x-width="23" x-height="18" x-outside="0">waytolake5</div>
+<div id="waytolake3" x-posx="651" x-posy="208" x-width="20" x-height="20" x-outside="1">waytolake3</div>
+<div id="waytolake4" x-posx="650" x-posy="190" x-width="20" x-height="25" x-outside="0">waytolake4</div>
+<div id="vilegard_s" x-posx="368" x-posy="490" x-width="20" x-height="20" x-outside="1">vilegard_s</div>
+<div id="waytolake1" x-posx="649" x-posy="255" x-width="20" x-height="20" x-outside="1">waytolake1</div>
+<div id="waytolake2" x-posx="649" x-posy="229" x-width="20" x-height="25" x-outside="1">waytolake2</div>
+<div id="road5_house" x-posx="469" x-posy="457" x-width="11" x-height="8" x-outside="0">road5_house</div>
+<div id="waytolostmine2" x-posx="434" x-posy="299" x-width="29" x-height="28" x-outside="1">waytolostmine2</div>
+<div id="waytolostmine1" x-posx="403" x-posy="317" x-width="30" x-height="27" x-outside="1">waytolostmine1</div>
+<div id="waytolostmine3" x-posx="434" x-posy="328" x-width="29" x-height="30" x-outside="1">waytolostmine3</div>
+<div id="waytobrimhavencave1a" x-posx="358" x-posy="289" x-width="30" x-height="15" x-outside="0">waytobrimhavencave1a</div>
+<div id="lostmine10" x-posx="468" x-posy="332" x-width="14" x-height="20" x-outside="0">lostmine10</div>
+<div id="lostmine11" x-posx="471" x-posy="311" x-width="17" x-height="20" x-outside="0">lostmine11</div>
+<div id="fallhaven_potions" x-posx="263" x-posy="391" x-width="10" x-height="8" x-outside="0">fallhaven_potions</div>
+<div id="remgard_armour" x-posx="622" x-posy="81" x-width="15" x-height="10" x-outside="0">remgard_armour</div>
+<div id="mountainlake13" x-posx="619" x-posy="20" x-width="30" x-height="29" x-outside="1">mountainlake13</div>
+<div id="mountainlake12" x-posx="650" x-posy="8" x-width="29" x-height="19" x-outside="1">mountainlake12</div>
+<div id="mountainlake11" x-posx="680" x-posy="4" x-width="30" x-height="25" x-outside="1">mountainlake11</div>
+<div id="loneford4" x-posx="260" x-posy="246" x-width="13" x-height="10" x-outside="0">loneford4</div>
+<div id="mountainlake10" x-posx="711" x-posy="0" x-width="30" x-height="30" x-outside="1">mountainlake10</div>
+<div id="loneford3" x-posx="250" x-posy="245" x-width="21" x-height="11" x-outside="0">loneford3</div>
+<div id="loneford2" x-posx="246" x-posy="249" x-width="30" x-height="26" x-outside="1">loneford2</div>
+<div id="loneford1" x-posx="218" x-posy="276" x-width="30" x-height="30" x-outside="1">loneford1</div>
+<div id="mountaincave3" x-posx="608" x-posy="235" x-width="20" x-height="20" x-outside="0">mountaincave3</div>
+<div id="mountaincave2" x-posx="611" x-posy="256" x-width="25" x-height="30" x-outside="0">mountaincave2</div>
+<div id="crossglen_farmhouse_basement" x-posx="161" x-posy="364" x-width="10" x-height="8" x-outside="0">crossglen_farmhouse_basement</div>
+<div id="mountaincave1" x-posx="623" x-posy="287" x-width="20" x-height="20" x-outside="0">mountaincave1</div>
+<div id="mountaincave0" x-posx="644" x-posy="287" x-width="20" x-height="20" x-outside="0">mountaincave0</div>
+<div id="crossglen" x-posx="156" x-posy="353" x-width="30" x-height="30" x-outside="1">crossglen</div>
+<div id="fallhaven_clothes" x-posx="265" x-posy="392" x-width="20" x-height="12" x-outside="0">fallhaven_clothes</div>
+<div id="loneford5" x-posx="249" x-posy="254" x-width="9" x-height="8" x-outside="0">loneford5</div>
+<div id="hauntedhouse2" x-posx="212" x-posy="349" x-width="15" x-height="10" x-outside="0">hauntedhouse2</div>
+<div id="loneford6" x-posx="256" x-posy="251" x-width="13" x-height="10" x-outside="0">loneford6</div>
+<div id="hauntedhouse1" x-posx="218" x-posy="349" x-width="10" x-height="8" x-outside="0">hauntedhouse1</div>
+<div id="loneford7" x-posx="264" x-posy="257" x-width="9" x-height="8" x-outside="0">loneford7</div>
+<div id="loneford8" x-posx="246" x-posy="263" x-width="12" x-height="8" x-outside="0">loneford8</div>
+<div id="loneford9" x-posx="254" x-posy="261" x-width="20" x-height="9" x-outside="0">loneford9</div>
+<div id="fallhaven_tavern" x-posx="221" x-posy="383" x-width="20" x-height="19" x-outside="0">fallhaven_tavern</div>
+<div id="hauntedhouse4" x-posx="234" x-posy="350" x-width="10" x-height="8" x-outside="0">hauntedhouse4</div>
+<div id="hauntedhouse3" x-posx="214" x-posy="353" x-width="25" x-height="20" x-outside="0">hauntedhouse3</div>
+<div id="road1" x-posx="364" x-posy="443" x-width="25" x-height="25" x-outside="1">road1</div>
+<div id="road3" x-posx="411" x-posy="457" x-width="25" x-height="15" x-outside="1">road3</div>
+<div id="road2" x-posx="390" x-posy="453" x-width="20" x-height="19" x-outside="1">road2</div>
+<div id="road5" x-posx="463" x-posy="460" x-width="20" x-height="15" x-outside="1">road5</div>
+<div id="road4" x-posx="437" x-posy="452" x-width="25" x-height="20" x-outside="1">road4</div>
+<div id="jan_pitcave1" x-posx="185" x-posy="399" x-width="10" x-height="10" x-outside="0">jan_pitcave1</div>
+<div id="lodar5cave1" x-posx="313" x-posy="342" x-width="20" x-height="30" x-outside="0">lodar5cave1</div>
+<div id="lodar5cave0" x-posx="305" x-posy="312" x-width="30" x-height="29" x-outside="0">lodar5cave0</div>
+<div id="lodar21" x-posx="382" x-posy="363" x-width="20" x-height="20" x-outside="1">lodar21</div>
+<div id="jan_pitcave3" x-posx="189" x-posy="428" x-width="10" x-height="10" x-outside="0">jan_pitcave3</div>
+<div id="lodar5cave2" x-posx="298" x-posy="366" x-width="20" x-height="20" x-outside="0">lodar5cave2</div>
+<div id="jan_pitcave2" x-posx="166" x-posy="404" x-width="30" x-height="30" x-outside="0">jan_pitcave2</div>
+<div id="fallhaven_gravedigger" x-posx="269" x-posy="376" x-width="10" x-height="8" x-outside="0">fallhaven_gravedigger</div>
+<div id="lodar20" x-posx="382" x-posy="332" x-width="20" x-height="30" x-outside="1">lodar20</div>
+<div id="waterwayhouse" x-posx="352" x-posy="160" x-width="19" x-height="15" x-outside="0">waterwayhouse</div>
+<div id="fallhaven_rigmor" x-posx="227" x-posy="376" x-width="15" x-height="10" x-outside="0">fallhaven_rigmor</div>
+<div id="waytominingtown1a" x-posx="383" x-posy="405" x-width="19" x-height="12" x-outside="1">waytominingtown1a</div>
+<div id="lostmine2a" x-posx="475" x-posy="329" x-width="19" x-height="21" x-outside="0">lostmine2a</div>
+<div id="wild6_house" x-posx="179" x-posy="441" x-width="9" x-height="7" x-outside="0">wild6_house</div>
+<div id="lodar8" x-posx="320" x-posy="320" x-width="30" x-height="30" x-outside="1">lodar8</div>
+<div id="lodar9" x-posx="351" x-posy="275" x-width="30" x-height="25" x-outside="1">lodar9</div>
+<div id="lodar6" x-posx="270" x-posy="320" x-width="18" x-height="30" x-outside="1">lodar6</div>
+<div id="lodar7" x-posx="289" x-posy="320" x-width="30" x-height="30" x-outside="1">lodar7</div>
+<div id="lodar4" x-posx="320" x-posy="294" x-width="30" x-height="25" x-outside="1">lodar4</div>
+<div id="lodar5" x-posx="289" x-posy="304" x-width="30" x-height="15" x-outside="1">lodar5</div>
+<div id="lodar2" x-posx="289" x-posy="273" x-width="30" x-height="30" x-outside="1">lodar2</div>
+<div id="lodar3" x-posx="320" x-posy="273" x-width="30" x-height="20" x-outside="1">lodar3</div>
+<div id="lodar10" x-posx="382" x-posy="275" x-width="20" x-height="25" x-outside="1">lodar10</div>
+<div id="lodar12" x-posx="382" x-posy="301" x-width="20" x-height="30" x-outside="1">lodar12</div>
+<div id="lodar11" x-posx="351" x-posy="301" x-width="30" x-height="30" x-outside="1">lodar11</div>
+<div id="lodar14" x-posx="301" x-posy="351" x-width="19" x-height="30" x-outside="1">lodar14</div>
+<div id="lodar13" x-posx="270" x-posy="351" x-width="30" x-height="12" x-outside="1">lodar13</div>
+<div id="lodar16" x-posx="321" x-posy="351" x-width="29" x-height="30" x-outside="1">lodar16</div>
+<div id="lodar15" x-posx="301" x-posy="382" x-width="19" x-height="19" x-outside="1">lodar15</div>
+<div id="lodar18" x-posx="351" x-posy="332" x-width="30" x-height="30" x-outside="1">lodar18</div>
+<div id="woodcave1" x-posx="198" x-posy="335" x-width="10" x-height="10" x-outside="0">woodcave1</div>
+<div id="lodar17" x-posx="321" x-posy="382" x-width="29" x-height="19" x-outside="1">lodar17</div>
+<div id="woodcave0" x-posx="202" x-posy="332" x-width="15" x-height="10" x-outside="0">woodcave0</div>
+<div id="lostmine1a" x-posx="397" x-posy="332" x-width="23" x-height="17" x-outside="0">lostmine1a</div>
+<div id="lodar19" x-posx="351" x-posy="363" x-width="30" x-height="20" x-outside="1">lodar19</div>
+<div id="fallhaven_nw" x-posx="218" x-posy="380" x-width="30" x-height="30" x-outside="1">fallhaven_nw</div>
+<div id="waterway12" x-posx="466" x-posy="218" x-width="30" x-height="30" x-outside="1">waterway12</div>
+<div id="waterway11" x-posx="590" x-posy="218" x-width="30" x-height="30" x-outside="1">waterway11</div>
+<div id="waterway14" x-posx="412" x-posy="156" x-width="30" x-height="30" x-outside="1">waterway14</div>
+<div id="waterway13" x-posx="497" x-posy="218" x-width="30" x-height="30" x-outside="1">waterway13</div>
+<div id="waterway15" x-posx="420" x-posy="187" x-width="22" x-height="30" x-outside="1">waterway15</div>
+<div id="fallhaven_derelict" x-posx="215" x-posy="399" x-width="12" x-height="8" x-outside="0">fallhaven_derelict</div>
+<div id="vilegard_armorer" x-posx="382" x-posy="494" x-width="12" x-height="8" x-outside="0">vilegard_armorer</div>
+<div id="remgard_school" x-posx="647" x-posy="114" x-width="16" x-height="8" x-outside="0">remgard_school</div>
+<div id="remgard_farmer2" x-posx="668" x-posy="98" x-width="11" x-height="8" x-outside="0">remgard_farmer2</div>
+<div id="remgard_farmer3" x-posx="603" x-posy="118" x-width="12" x-height="8" x-outside="0">remgard_farmer3</div>
+<div id="waterway11_east" x-posx="621" x-posy="219" x-width="30" x-height="25" x-outside="1">waterway11_east</div>
+<div id="fallhaven_ne" x-posx="249" x-posy="380" x-width="30" x-height="30" x-outside="1">fallhaven_ne</div>
+<div id="remgard_farmer1" x-posx="640" x-posy="82" x-width="10" x-height="8" x-outside="0">remgard_farmer1</div>
+<div id="waterway10" x-posx="559" x-posy="249" x-width="30" x-height="18" x-outside="1">waterway10</div>
+<div id="oldcave0" x-posx="366" x-posy="420" x-width="20" x-height="20" x-outside="0">oldcave0</div>
+<div id="oldcave1" x-posx="380" x-posy="431" x-width="20" x-height="25" x-outside="0">oldcave1</div>
+<div id="home" x-posx="158" x-posy="349" x-width="10" x-height="10" x-outside="0">home</div>
+<div id="roadbeforecrossroads" x-posx="218" x-posy="316" x-width="21" x-height="20" x-outside="1">roadbeforecrossroads</div>
+<div id="roadbeforecrossroads8" x-posx="343" x-posy="418" x-width="20" x-height="27" x-outside="1">roadbeforecrossroads8</div>
+<div id="roadbeforecrossroads9" x-posx="364" x-posy="418" x-width="25" x-height="24" x-outside="1">roadbeforecrossroads9</div>
+<div id="roadbeforecrossroads6" x-posx="301" x-posy="403" x-width="20" x-height="30" x-outside="1">roadbeforecrossroads6</div>
+<div id="roadbeforecrossroads7" x-posx="322" x-posy="418" x-width="20" x-height="20" x-outside="1">roadbeforecrossroads7</div>
+<div id="roadbeforecrossroads4" x-posx="280" x-posy="380" x-width="20" x-height="20" x-outside="1">roadbeforecrossroads4</div>
+<div id="roadbeforecrossroads5" x-posx="280" x-posy="401" x-width="20" x-height="22" x-outside="1">roadbeforecrossroads5</div>
+<div id="roadbeforecrossroads2" x-posx="240" x-posy="346" x-width="29" x-height="30" x-outside="1">roadbeforecrossroads2</div>
+<div id="roadbeforecrossroads3" x-posx="270" x-posy="364" x-width="30" x-height="15" x-outside="1">roadbeforecrossroads3</div>
+<div id="lodar1cave0" x-posx="238" x-posy="311" x-width="20" x-height="19" x-outside="0">lodar1cave0</div>
+<div id="fallhaven_alaun" x-posx="236" x-posy="409" x-width="10" x-height="8" x-outside="0">fallhaven_alaun</div>
+<div id="remgard_barn" x-posx="629" x-posy="114" x-width="12" x-height="8" x-outside="0">remgard_barn</div>
+<div id="lodar1" x-posx="240" x-posy="308" x-width="17" x-height="11" x-outside="1">lodar1</div>
+<div id="lodar0" x-posx="258" x-posy="289" x-width="30" x-height="30" x-outside="1">lodar0</div>
+<div id="remgard_tavern0" x-posx="643" x-posy="91" x-width="25" x-height="20" x-outside="0">remgard_tavern0</div>
+<div id="vilegard_wrye" x-posx="371" x-posy="476" x-width="13" x-height="8" x-outside="0">vilegard_wrye</div>
+<div id="waytomountaincave1" x-posx="630" x-posy="275" x-width="15" x-height="19" x-outside="1">waytomountaincave1</div>
+<div id="waytomountaincave0" x-posx="636" x-posy="245" x-width="15" x-height="29" x-outside="1">waytomountaincave0</div>
+<div id="waytomountaincave2" x-posx="631" x-posy="295" x-width="30" x-height="20" x-outside="1">waytomountaincave2</div>
+<div id="remgard_church" x-posx="633" x-posy="90" x-width="20" x-height="12" x-outside="0">remgard_church</div>
+<div id="houseatcrossroads2" x-posx="199" x-posy="310" x-width="6" x-height="6" x-outside="0">houseatcrossroads2</div>
+<div id="blackwater_mountain39" x-posx="101" x-posy="239" x-width="20" x-height="20" x-outside="0">blackwater_mountain39</div>
+<div id="houseatcrossroads3" x-posx="199" x-posy="309" x-width="6" x-height="6" x-outside="0">houseatcrossroads3</div>
+<div id="wild11_clearing" x-posx="249" x-posy="453" x-width="15" x-height="15" x-outside="1">wild11_clearing</div>
+<div id="fallhaven_sw" x-posx="218" x-posy="411" x-width="30" x-height="20" x-outside="1">fallhaven_sw</div>
+<div id="blackwater_mountain37" x-posx="119" x-posy="216" x-width="15" x-height="15" x-outside="0">blackwater_mountain37</div>
+<div id="houseatcrossroads4" x-posx="199" x-posy="308" x-width="6" x-height="6" x-outside="0">houseatcrossroads4</div>
+<div id="waytobrimhavencave0" x-posx="358" x-posy="260" x-width="30" x-height="24" x-outside="0">waytobrimhavencave0</div>
+<div id="houseatcrossroads5" x-posx="202" x-posy="291" x-width="11" x-height="9" x-outside="0">houseatcrossroads5</div>
+<div id="waterwayextention" x-posx="351" x-posy="179" x-width="14" x-height="14" x-outside="1">waterwayextention</div>
+<div id="blackwater_mountain38" x-posx="92" x-posy="222" x-width="30" x-height="18" x-outside="0">blackwater_mountain38</div>
+<div id="waytominingtown0" x-posx="322" x-posy="402" x-width="29" x-height="15" x-outside="1">waytominingtown0</div>
+<div id="mountainlake3" x-posx="735" x-posy="128" x-width="25" x-height="28" x-outside="1">mountainlake3</div>
+<div id="waytobrimhavencave1" x-posx="389" x-posy="268" x-width="30" x-height="30" x-outside="0">waytobrimhavencave1</div>
+<div id="mountainlake2" x-posx="714" x-posy="141" x-width="20" x-height="17" x-outside="1">mountainlake2</div>
+<div id="waytominingtown1" x-posx="352" x-posy="387" x-width="30" x-height="30" x-outside="1">waytominingtown1</div>
+<div id="waytobrimhavencave2" x-posx="420" x-posy="268" x-width="30" x-height="30" x-outside="0">waytobrimhavencave2</div>
+<div id="mountainlake1" x-posx="683" x-posy="128" x-width="30" x-height="30" x-outside="1">mountainlake1</div>
+<div id="houseatcrossroads0" x-posx="197" x-posy="297" x-width="16" x-height="12" x-outside="0">houseatcrossroads0</div>
+<div id="waytobrimhavencave3" x-posx="451" x-posy="268" x-width="30" x-height="30" x-outside="0">waytobrimhavencave3</div>
+<div id="waytominingtown2" x-posx="383" x-posy="384" x-width="19" x-height="20" x-outside="1">waytominingtown2</div>
+<div id="mountainlake0" x-posx="681" x-posy="159" x-width="20" x-height="30" x-outside="1">mountainlake0</div>
+<div id="houseatcrossroads1" x-posx="197" x-posy="297" x-width="16" x-height="12" x-outside="0">houseatcrossroads1</div>
+<div id="waytominingtown3" x-posx="403" x-posy="376" x-width="30" x-height="30" x-outside="1">waytominingtown3</div>
+<div id="waytobrimhavencave4" x-posx="327" x-posy="268" x-width="30" x-height="30" x-outside="0">waytobrimhavencave4</div>
+<div id="blackwater_mountain31" x-posx="119" x-posy="251" x-width="11" x-height="8" x-outside="0">blackwater_mountain31</div>
+<div id="mountainlake7" x-posx="779" x-posy="53" x-width="16" x-height="20" x-outside="1">mountainlake7</div>
+<div id="blackwater_mountain51" x-posx="121" x-posy="249" x-width="10" x-height="10" x-outside="0">blackwater_mountain51</div>
+<div id="blackwater_mountain32" x-posx="111" x-posy="220" x-width="30" x-height="30" x-outside="1">blackwater_mountain32</div>
+<div id="blackwater_mountain52" x-posx="121" x-posy="218" x-width="9" x-height="30" x-outside="0">blackwater_mountain52</div>
+<div id="mountainlake6" x-posx="774" x-posy="74" x-width="19" x-height="29" x-outside="1">mountainlake6</div>
+<div id="mountainlake5" x-posx="766" x-posy="104" x-width="29" x-height="20" x-outside="1">mountainlake5</div>
+<div id="mountainlake4" x-posx="740" x-posy="111" x-width="25" x-height="16" x-outside="1">mountainlake4</div>
+<div id="blackwater_mountain30" x-posx="113" x-posy="251" x-width="30" x-height="20" x-outside="1">blackwater_mountain30</div>
+<div id="fallhaven_lumberjack" x-posx="224" x-posy="410" x-width="12" x-height="8" x-outside="0">fallhaven_lumberjack</div>
+<div id="blackwater_mountain35" x-posx="8" x-posy="379" x-width="10" x-height="10" x-outside="0">blackwater_mountain35</div>
+<div id="blackwater_mountain36" x-posx="117" x-posy="214" x-width="11" x-height="10" x-outside="0">blackwater_mountain36</div>
+<div id="mountainlake9" x-posx="742" x-posy="0" x-width="30" x-height="30" x-outside="1">mountainlake9</div>
+<div id="blackwater_mountain33" x-posx="20" x-posy="343" x-width="20" x-height="20" x-outside="0">blackwater_mountain33</div>
+<div id="blackwater_mountain34" x-posx="14" x-posy="356" x-width="15" x-height="30" x-outside="0">blackwater_mountain34</div>
+<div id="mountainlake8" x-posx="758" x-posy="31" x-width="20" x-height="30" x-outside="1">mountainlake8</div>
+<div id="blackwater_mountain50" x-posx="102" x-posy="182" x-width="15" x-height="20" x-outside="0">blackwater_mountain50</div>
+<div id="woodhouse0" x-posx="215" x-posy="366" x-width="12" x-height="8" x-outside="0">woodhouse0</div>
+<div id="woodhouse2" x-posx="221" x-posy="362" x-width="16" x-height="8" x-outside="0">woodhouse2</div>
+<div id="woodhouse1" x-posx="220" x-posy="367" x-width="12" x-height="8" x-outside="0">woodhouse1</div>
+<div id="fallhaven_se" x-posx="249" x-posy="411" x-width="30" x-height="20" x-outside="1">fallhaven_se</div>
+<div id="fields10" x-posx="104" x-posy="282" x-width="20" x-height="15" x-outside="1">fields10</div>
+<div id="blackwater_mountain48" x-posx="103" x-posy="199" x-width="9" x-height="7" x-outside="0">blackwater_mountain48</div>
+<div id="blackwater_mountain49" x-posx="103" x-posy="197" x-width="9" x-height="7" x-outside="0">blackwater_mountain49</div>
+<div id="fields11" x-posx="246" x-posy="216" x-width="20" x-height="20" x-outside="1">fields11</div>
+<div id="fallhaven_barn" x-posx="244" x-posy="392" x-width="17" x-height="10" x-outside="0">fallhaven_barn</div>
+<div id="fields12" x-posx="267" x-posy="212" x-width="20" x-height="20" x-outside="1">fields12</div>
+<div id="vilegard_tavern" x-posx="370" x-posy="493" x-width="17" x-height="10" x-outside="0">vilegard_tavern</div>
+<div id="roadbeforecrossroads1" x-posx="240" x-posy="320" x-width="29" x-height="25" x-outside="1">roadbeforecrossroads1</div>
+<div id="fallhaven_athamyr" x-posx="237" x-posy="390" x-width="10" x-height="8" x-outside="0">fallhaven_athamyr</div>
+<div id="blackwater_mountain40" x-posx="77" x-posy="354" x-width="11" x-height="11" x-outside="1">blackwater_mountain40</div>
+<div id="blackwater_mountain41" x-posx="59" x-posy="360" x-width="30" x-height="30" x-outside="0">blackwater_mountain41</div>
+<div id="blackwater_mountain42" x-posx="34" x-posy="372" x-width="30" x-height="30" x-outside="0">blackwater_mountain42</div>
+<div id="blackwater_mountain43" x-posx="129" x-posy="172" x-width="30" x-height="30" x-outside="0">blackwater_mountain43</div>
+<div id="blackwater_mountain44" x-posx="112" x-posy="197" x-width="20" x-height="20" x-outside="0">blackwater_mountain44</div>
+<div id="blackwater_mountain45" x-posx="100" x-posy="211" x-width="15" x-height="15" x-outside="0">blackwater_mountain45</div>
+<div id="blackwater_mountain46" x-posx="103" x-posy="203" x-width="9" x-height="7" x-outside="0">blackwater_mountain46</div>
+<div id="blackwater_mountain47" x-posx="101" x-posy="201" x-width="9" x-height="7" x-outside="0">blackwater_mountain47</div>
+<div id="crossglen_smith" x-posx="154" x-posy="372" x-width="10" x-height="8" x-outside="0">crossglen_smith</div>
+<div id="pwcave2a" x-posx="300" x-posy="36" x-width="20" x-height="25" x-outside="0">pwcave2a</div>
+<div id="blackwater_mountain19" x-posx="81" x-posy="246" x-width="10" x-height="10" x-outside="0">blackwater_mountain19</div>
+<div id="blackwater_mountain17" x-posx="69" x-posy="264" x-width="20" x-height="10" x-outside="0">blackwater_mountain17</div>
+<div id="snakecave2" x-posx="131" x-posy="374" x-width="20" x-height="20" x-outside="0">snakecave2</div>
+<div id="snakecave1" x-posx="152" x-posy="374" x-width="20" x-height="20" x-outside="0">snakecave1</div>
+<div id="blackwater_mountain18" x-posx="70" x-posy="247" x-width="15" x-height="22" x-outside="0">blackwater_mountain18</div>
+<div id="blackwater_mountain15" x-posx="81" x-posy="302" x-width="15" x-height="30" x-outside="1">blackwater_mountain15</div>
+<div id="snakecave3" x-posx="123" x-posy="343" x-width="15" x-height="30" x-outside="0">snakecave3</div>
+<div id="blackwater_mountain16" x-posx="83" x-posy="271" x-width="15" x-height="30" x-outside="1">blackwater_mountain16</div>
+<div id="blackwater_mountain13" x-posx="0" x-posy="311" x-width="20" x-height="20" x-outside="0">blackwater_mountain13</div>
+<div id="blackwater_mountain14" x-posx="60" x-posy="333" x-width="30" x-height="20" x-outside="1">blackwater_mountain14</div>
+<div id="blackwater_mountain11" x-posx="39" x-posy="302" x-width="30" x-height="30" x-outside="1">blackwater_mountain11</div>
+<div id="blackwater_mountain12" x-posx="10" x-posy="323" x-width="28" x-height="27" x-outside="1">blackwater_mountain12</div>
+<div id="blackwater_mountain10" x-posx="39" x-posy="333" x-width="20" x-height="20" x-outside="1">blackwater_mountain10</div>
+<div id="flagstone_inner" x-posx="111" x-posy="480" x-width="20" x-height="17" x-outside="0">flagstone_inner</div>
+<div id="fallhaven_derelict2" x-posx="214" x-posy="402" x-width="25" x-height="19" x-outside="0">fallhaven_derelict2</div>
+<div id="vilegard_kaori" x-posx="378" x-posy="471" x-width="10" x-height="8" x-outside="0">vilegard_kaori</div>
+<div id="fallhaven_arcir" x-posx="232" x-posy="396" x-width="15" x-height="10" x-outside="0">fallhaven_arcir</div>
+<div id="remgard_prison" x-posx="601" x-posy="109" x-width="19" x-height="10" x-outside="0">remgard_prison</div>
+<div id="catacombs1" x-posx="243" x-posy="375" x-width="19" x-height="10" x-outside="0">catacombs1</div>
+<div id="catacombs2" x-posx="244" x-posy="365" x-width="20" x-height="20" x-outside="0">catacombs2</div>
+<div id="vilegard_smith" x-posx="380" x-posy="500" x-width="10" x-height="8" x-outside="0">vilegard_smith</div>
+<div id="waterwaycave" x-posx="435" x-posy="209" x-width="15" x-height="15" x-outside="0">waterwaycave</div>
+<div id="blackwater_mountain26" x-posx="46" x-posy="302" x-width="9" x-height="8" x-outside="0">blackwater_mountain26</div>
+<div id="blackwater_mountain27" x-posx="50" x-posy="301" x-width="9" x-height="8" x-outside="0">blackwater_mountain27</div>
+<div id="blackwater_mountain28" x-posx="58" x-posy="302" x-width="10" x-height="8" x-outside="0">blackwater_mountain28</div>
+<div id="wild15_house" x-posx="349" x-posy="451" x-width="9" x-height="7" x-outside="0">wild15_house</div>
+<div id="catacombs3" x-posx="259" x-posy="379" x-width="20" x-height="20" x-outside="0">catacombs3</div>
+<div id="catacombs4" x-posx="267" x-posy="367" x-width="20" x-height="15" x-outside="0">catacombs4</div>
+<div id="blackwater_mountain29" x-posx="50" x-posy="306" x-width="22" x-height="16" x-outside="0">blackwater_mountain29</div>
+<div id="blackwater_mountain22" x-posx="44" x-posy="315" x-width="13" x-height="11" x-outside="0">blackwater_mountain22</div>
+<div id="blackwater_mountain23" x-posx="40" x-posy="317" x-width="7" x-height="8" x-outside="0">blackwater_mountain23</div>
+<div id="gargoylecave3" x-posx="403" x-posy="401" x-width="11" x-height="20" x-outside="0">gargoylecave3</div>
+<div id="remgard1" x-posx="652" x-posy="83" x-width="30" x-height="30" x-outside="1">remgard1</div>
+<div id="blackwater_mountain24" x-posx="40" x-posy="311" x-width="7" x-height="8" x-outside="0">blackwater_mountain24</div>
+<div id="remgard0" x-posx="621" x-posy="76" x-width="30" x-height="30" x-outside="1">remgard0</div>
+<div id="gargoylecave4" x-posx="419" x-posy="413" x-width="12" x-height="8" x-outside="0">gargoylecave4</div>
+<div id="blackwater_mountain25" x-posx="40" x-posy="289" x-width="11" x-height="24" x-outside="0">blackwater_mountain25</div>
+<div id="remgard3" x-posx="631" x-posy="107" x-width="20" x-height="25" x-outside="1">remgard3</div>
+<div id="gargoylecave1" x-posx="428" x-posy="422" x-width="20" x-height="20" x-outside="0">gargoylecave1</div>
+<div id="remgard2" x-posx="652" x-posy="114" x-width="29" x-height="20" x-outside="1">remgard2</div>
+<div id="gargoylecave2" x-posx="407" x-posy="422" x-width="20" x-height="20" x-outside="0">gargoylecave2</div>
+<div id="blackwater_mountain20" x-posx="87" x-posy="245" x-width="20" x-height="10" x-outside="0">blackwater_mountain20</div>
+<div id="remgard4" x-posx="600" x-posy="107" x-width="30" x-height="30" x-outside="1">remgard4</div>
+<div id="blackwater_mountain21" x-posx="54" x-posy="315" x-width="20" x-height="12" x-outside="0">blackwater_mountain21</div>
+<div id="wild14_cave" x-posx="335" x-posy="432" x-width="15" x-height="15" x-outside="0">wild14_cave</div>
+<div id="tradehouse0" x-posx="384" x-posy="385" x-width="18" x-height="12" x-outside="0">tradehouse0</div>
+<div id="tradehouse1" x-posx="348" x-posy="419" x-width="18" x-height="8" x-outside="0">tradehouse1</div>
+<div id="crossroads" x-posx="187" x-posy="298" x-width="30" x-height="30" x-outside="1">crossroads</div>
+</worldmap>
\ No newline at end of file
diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/DisplayWorldMapActivity.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/activity/DisplayWorldMapActivity.java
new file mode 100644 (file)
index 0000000..b94f4e1
--- /dev/null
@@ -0,0 +1,65 @@
+package com.gpl.rpg.AndorsTrail.activity;
+
+import java.io.File;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.webkit.WebView;
+import android.widget.Toast;
+
+import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
+import com.gpl.rpg.AndorsTrail.R;
+import com.gpl.rpg.AndorsTrail.context.WorldContext;
+import com.gpl.rpg.AndorsTrail.controller.WorldMapController;
+import com.gpl.rpg.AndorsTrail.util.Coord;
+import com.gpl.rpg.AndorsTrail.util.L;
+
+public class DisplayWorldMapActivity extends Activity {
+       private WorldContext world;
+       
+       private WebView displayworldmap_webview;
+       
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        
+        AndorsTrailApplication app = AndorsTrailApplication.getApplicationFromActivity(this);
+        if (!app.isInitialized()) { finish(); return; }
+        this.world = app.world;
+        
+        AndorsTrailApplication.setWindowParameters(this, app.preferences);
+        
+        setContentView(R.layout.displayworldmap);
+        
+        displayworldmap_webview = (WebView) findViewById(R.id.displayworldmap_webview);
+        displayworldmap_webview.setBackgroundColor(getResources().getColor(android.R.color.black));
+        displayworldmap_webview.getSettings().setBuiltInZoomControls(true);
+        displayworldmap_webview.getSettings().setJavaScriptEnabled(true);
+    }
+    
+    @Override
+    public void onResume() {
+        super.onResume();
+        update();
+    }
+       
+       private void update() {
+               File worldmap = WorldMapController.getCombinedWorldMapFile();
+               
+               if (!worldmap.exists()) {
+                       Toast.makeText(this, getResources().getString(R.string.menu_button_worldmap_failed), Toast.LENGTH_LONG).show();
+                       this.finish();
+               }
+
+               String url = "file://" + worldmap.getAbsolutePath();
+               Coord playerWorldPosition = WorldMapController.getPlayerWorldPosition(world);
+               if (playerWorldPosition != null) {
+                       url += "?" 
+                               + playerWorldPosition.x * WorldMapController.WORLDMAP_DISPLAY_TILESIZE 
+                               + "," 
+                               + (playerWorldPosition.y-1) * WorldMapController.WORLDMAP_DISPLAY_TILESIZE;
+               }
+               L.log("Showing " + url);
+               displayworldmap_webview.loadUrl(url);
+       }
+}
index badc06f6a2f1ec0a1e606cec311c55488cbebed2..18d7d00ee7b87f184dd5146a66e995389997b1d5 100644 (file)
@@ -210,6 +210,15 @@ public final class MainActivity extends Activity {
                                return true;
                        }
                });
+               menu.add(R.string.menu_button_worldmap)
+               .setIcon(android.R.drawable.ic_menu_mapmode)
+               .setOnMenuItemClickListener(new OnMenuItemClickListener() {
+                       @Override
+                       public boolean onMenuItemClick(MenuItem arg0) {
+                               startActivity(new Intent(MainActivity.this, DisplayWorldMapActivity.class));
+                               return true;
+                       }
+               });
                return true;
        }
        
index bd6dee19527183eab485077a1fe32974826513a8..dce246db34a4e19153c1b47e820fd2acfbd2d863 100644 (file)
@@ -277,7 +277,7 @@ public final class MovementController implements TimedMessageTask.Callback {
                world.tileManager.currentMapTiles = cachedTiles;
                world.tileManager.cacheAdjacentMaps(res, world, nextMap);
 
-               WorldMapController.updateWorldMap(world, nextMap, mapTiles, cachedTiles);
+               WorldMapController.updateWorldMap(world, nextMap, mapTiles, cachedTiles, res);
        }
        
        
index 58f65170bdf32f40addc0d23dae97c93e1518e53..eeeecf6c43c2f7b820c491c85e8513210cbbdbc1 100644 (file)
@@ -3,7 +3,9 @@ package com.gpl.rpg.AndorsTrail.controller;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.io.PrintWriter;
 
+import android.content.res.Resources;
 import android.graphics.Bitmap;
 import android.graphics.Bitmap.Config;
 import android.graphics.Canvas;
@@ -11,44 +13,79 @@ import android.graphics.Paint;
 import android.os.AsyncTask;
 import android.os.Environment;
 
+import com.gpl.rpg.AndorsTrail.AndorsTrailApplication;
+import com.gpl.rpg.AndorsTrail.R;
 import com.gpl.rpg.AndorsTrail.context.WorldContext;
 import com.gpl.rpg.AndorsTrail.model.map.LayeredTileMap;
 import com.gpl.rpg.AndorsTrail.model.map.MapLayer;
 import com.gpl.rpg.AndorsTrail.model.map.PredefinedMap;
 import com.gpl.rpg.AndorsTrail.resource.tiles.TileCollection;
+import com.gpl.rpg.AndorsTrail.util.Coord;
 import com.gpl.rpg.AndorsTrail.util.L;
 
 public final class WorldMapController {
-       public static void updateWorldMap(final WorldContext world, final PredefinedMap map, final LayeredTileMap mapTiles, final TileCollection cachedTiles) {
+
+       public static int WORLDMAP_SCREENSHOT_TILESIZE = 12;
+    public static int WORLDMAP_DISPLAY_TILESIZE = WORLDMAP_SCREENSHOT_TILESIZE;
+    
+       public static void updateWorldMap(final WorldContext world, final PredefinedMap map, final LayeredTileMap mapTiles, final TileCollection cachedTiles, final Resources res) {
+               
+               if (!shouldUpdateWorldMap(map)) return;
+               
                (new AsyncTask<Void, Void, Void>()  {
                        @Override
                        protected Void doInBackground(Void... arg0) {
-                               
-                               File file = getFileForMap(map);
-                       if (file.exists()) return null;
-                               
-                       try {
-                               Bitmap image = new MapRenderer(world, map, mapTiles, cachedTiles).drawMap();
-                               ensureWorldmapDirectoryExists();
-                               FileOutputStream fos = new FileOutputStream(file);
-                               image.compress(Bitmap.CompressFormat.PNG, 70, fos);
-                    fos.flush();
-                    fos.close();
-                    image.recycle();
-                       } catch (IOException e) {
-                               L.log("Error creating worldmap file for map " + map.name + " : " + e.toString());
-                       }
+                               final MapRenderer renderer = new MapRenderer(world, map, mapTiles, cachedTiles);
+                               updateCachedBitmap(map, renderer);
+                               try {
+                                       updateCombinedWorldMap(res, world);
+                               } catch (IOException e) {}
                        return null;
                        }
                }).execute();
        }
+       
+       private static boolean isVisibleOnWorldMap(PredefinedMap map) {
+               return map.isOutdoors;
+       }
+
+       private static boolean shouldUpdateWorldMap(PredefinedMap map) {
+               if (!isVisibleOnWorldMap(map)) return false;
+       if (!map.visited) return true;
+               File file = getFileForMap(map);
+               if (!file.exists()) return true;
+               
+               if (map.lastVisitVersion < AndorsTrailApplication.CURRENT_VERSION) return true;
+               
+               file = getCombinedWorldMapFile();
+               if (!file.exists()) return true;
+               
+               return false;
+       }
+
+       private static void updateCachedBitmap(PredefinedMap map, MapRenderer renderer) {
+
+               File file = getFileForMap(map);
+       if (file.exists()) return;
+               
+       try {
+               Bitmap image = renderer.drawMap();
+               ensureWorldmapDirectoryExists();
+               FileOutputStream fos = new FileOutputStream(file);
+               image.compress(Bitmap.CompressFormat.PNG, 70, fos);
+            fos.flush();
+            fos.close();
+            image.recycle();
+       } catch (IOException e) {
+               L.log("Error creating worldmap file for map " + map.name + " : " + e.toString());
+       }
+       }
 
        private static final class MapRenderer {
                private final PredefinedMap map;
                private final LayeredTileMap mapTiles;
                private final TileCollection cachedTiles;
                private final int tileSize;
-               private static final int outputTileSize = 16;
                private final float scale;
                private final Paint mPaint = new Paint();
                
@@ -57,12 +94,11 @@ public final class WorldMapController {
                        this.mapTiles = mapTiles;
                        this.cachedTiles = cachedTiles;
                        this.tileSize = world.tileManager.tileSize;
-                       this.scale = (float) outputTileSize / world.tileManager.tileSize;
-                       L.log("outputTileSize=" + outputTileSize + ", tileSize=" + tileSize + ", scale=" + scale);
+                       this.scale = (float) WORLDMAP_SCREENSHOT_TILESIZE / world.tileManager.tileSize;
                }
                
                public Bitmap drawMap() {
-                       Bitmap image = Bitmap.createBitmap(map.size.width * outputTileSize, map.size.height * outputTileSize, Config.RGB_565);
+                       Bitmap image = Bitmap.createBitmap(map.size.width * WORLDMAP_SCREENSHOT_TILESIZE, map.size.height * WORLDMAP_SCREENSHOT_TILESIZE, Config.RGB_565);
                        image.setDensity(Bitmap.DENSITY_NONE);
                        Canvas canvas = new Canvas(image);
                        canvas.scale(scale, scale);
@@ -99,13 +135,72 @@ public final class WorldMapController {
                dir = new File(dir, Constants.FILENAME_WORLDMAP_DIRECTORY);
                if (!dir.exists()) dir.mkdir();
     }
-    private static File getFileForMap(PredefinedMap map) {
+    public static File getFileForMap(PredefinedMap map) {
        File root = getWorldmapDirectory();
                return new File(root, map.name + ".png");
     }
-    private static File getWorldmapDirectory() {
+    public static File getWorldmapDirectory() {
        File dir = Environment.getExternalStorageDirectory();
        dir = new File(dir, Constants.FILENAME_SAVEGAME_DIRECTORY);
        return new File(dir, Constants.FILENAME_WORLDMAP_DIRECTORY);
     }
+    public static File getCombinedWorldMapFile() {
+       return new File(getWorldmapDirectory(), Constants.FILENAME_WORLDMAP_HTMLFILE);
+    }
+       
+       private static String getCombinedWorldMapAsHtml(Resources res, WorldContext world) throws IOException {
+               StringBuffer sb = new StringBuffer();
+               
+               Coord offsetWorldmapTo = new Coord(999999, 999999);
+               for (PredefinedMap map : world.maps.predefinedMaps) {
+                       File f = WorldMapController.getFileForMap(map);
+                       if (!f.exists()) continue;
+                       
+                       offsetWorldmapTo.x = Math.min(offsetWorldmapTo.x, map.worldMapPosition.x);
+                       offsetWorldmapTo.y = Math.min(offsetWorldmapTo.y, map.worldMapPosition.y);
+               }
+               
+               for (PredefinedMap map : world.maps.predefinedMaps) {
+                       File f = WorldMapController.getFileForMap(map);
+                       if (!f.exists()) continue;
+                       
+                       sb
+                               .append("<img src=\"")
+                               .append(f.getName())
+                               .append("\" id=\"")
+                               .append(map.name)
+                               .append("\" style=\"width: ")
+                               .append(map.size.width * WorldMapController.WORLDMAP_DISPLAY_TILESIZE)
+                               .append("px; height: ")
+                               .append(map.size.height * WorldMapController.WORLDMAP_DISPLAY_TILESIZE)
+                               .append("px; position: absolute; left: ")
+                               .append((map.worldMapPosition.x - offsetWorldmapTo.x) * WorldMapController.WORLDMAP_DISPLAY_TILESIZE)
+                               .append("px; top: ")
+                               .append((map.worldMapPosition.y - offsetWorldmapTo.y) * WorldMapController.WORLDMAP_DISPLAY_TILESIZE)
+                               .append("px;\" />");
+               }
+               
+               return res.getString(R.string.worldmap_template)
+                               .replace("{{maps}}", sb.toString())
+                               .replace("{{offsetx}}", Integer.toString(offsetWorldmapTo.x * WorldMapController.WORLDMAP_DISPLAY_TILESIZE))
+                               .replace("{{offsety}}", Integer.toString(offsetWorldmapTo.y * WorldMapController.WORLDMAP_DISPLAY_TILESIZE));
+       }
+       
+       private static void updateCombinedWorldMap(Resources res, WorldContext world) throws IOException {
+               String mapAsHtml = getCombinedWorldMapAsHtml(res, world);
+               File outputFile = new File(WorldMapController.getWorldmapDirectory(), Constants.FILENAME_WORLDMAP_HTMLFILE);
+               PrintWriter pw = new PrintWriter(outputFile);
+               pw.write(mapAsHtml);
+               pw.close();
+       }
+
+       public static Coord getPlayerWorldPosition(WorldContext world) {
+               PredefinedMap map = world.model.currentMap;
+               if (!isVisibleOnWorldMap(map)) return null;
+               
+               return new Coord(
+                               world.model.player.position.x + map.worldMapPosition.x,
+                               world.model.player.position.y + map.worldMapPosition.y
+                       );
+       }
 }
index 7190746bbf1d130370643a5248dc8b946ecccf36..eb2d0b67dc50fe368b3a651a9f473b193d5eb56e 100644 (file)
@@ -24,16 +24,19 @@ public final class PredefinedMap {
        public final int xmlResourceId;
        public final String name;
        public final Size size;
+       public final Coord worldMapPosition = new Coord();
        public final MapObject[] eventObjects;
        public final MonsterSpawnArea[] spawnAreas;
        public final ArrayList<Loot> groundBags = new ArrayList<Loot>();
        public boolean visited = false;
        public long lastVisitTime = VISIT_RESET;
+       public int lastVisitVersion = 0;
+       public final boolean isOutdoors;
 
        public final boolean[][] isWalkable;
        public final ArrayList<BloodSplatter> splatters = new ArrayList<BloodSplatter>();
        
-       public PredefinedMap(int xmlResourceId, String name, Size size, boolean[][] isWalkable, MapObject[] eventObjects, MonsterSpawnArea[] spawnAreas, boolean hasFOW) {
+       public PredefinedMap(int xmlResourceId, String name, Size size, boolean[][] isWalkable, MapObject[] eventObjects, MonsterSpawnArea[] spawnAreas, boolean hasFOW, boolean isOutdoors) {
                this.xmlResourceId = xmlResourceId;
                this.name = name;
                this.size = size;
@@ -44,6 +47,7 @@ public final class PredefinedMap {
                assert(isWalkable.length == size.width);
                assert(isWalkable[0].length == size.height);
                this.isWalkable = isWalkable;
+               this.isOutdoors = isOutdoors;
        }
        
        public final boolean isWalkable(final Coord p) { 
@@ -224,6 +228,7 @@ public final class PredefinedMap {
        }
        public void updateLastVisitTime() {
                lastVisitTime = System.currentTimeMillis();
+               lastVisitVersion = AndorsTrailApplication.CURRENT_VERSION;
        }
        public void resetTemporaryData() {
                for(MonsterSpawnArea a : spawnAreas) {
@@ -277,6 +282,11 @@ public final class PredefinedMap {
                }
                lastVisitTime = src.readLong();
                
+               if (visited) {
+                       if (fileversion <= 30) lastVisitVersion = 30;
+                       else lastVisitVersion = src.readInt();
+               }
+               
                for(int i = loadedSpawnAreas; i < spawnAreas.length; ++i) {
                        MonsterSpawnArea area = this.spawnAreas[i];
                        if (area.isUnique && visited) spawnAllInArea(world, area, true);
@@ -295,5 +305,6 @@ public final class PredefinedMap {
                }
                dest.writeBoolean(visited);
                dest.writeLong(lastVisitTime);
+               if (visited) dest.writeInt(lastVisitVersion);
        }
 }
index 2b309cc69b73ca71227b26ded5855eae925e74d2..763311942513edd4faf6ea06bd3b55a0eb211f1f 100644 (file)
@@ -49,6 +49,8 @@ public final class TMXMapFileParser {
                                                                        map.objectGroups.add(readTMXObjectGroup(xrp));
                                                                } else if (tagName.equals("layer")) {
                                                                        layers.add(readTMXMapLayer(xrp));
+                                                               } else if (tagName.equals("property")) {
+                                                                       map.properties.add(readTMXProperty(xrp));
                                                                }
                                                        }
                                                });
@@ -147,12 +149,9 @@ public final class TMXMapFileParser {
                object.width = xrp.getAttributeIntValue(null, "width", -1);
                object.height = xrp.getAttributeIntValue(null, "height", -1);
                readCurrentTagUntilEnd(xrp, new TagHandler() {
-                       public void handleTag(XmlResourceParser xrp, String tagName) {
+                       public void handleTag(XmlResourceParser xrp, String tagName) throws XmlPullParserException, IOException {
                                if (tagName.equals("property")) {
-                                       final TMXProperty property = new TMXProperty();
-                                       object.properties.add(property);
-                                       property.name = xrp.getAttributeValue(null, "name");
-                                       property.value = xrp.getAttributeValue(null, "value");
+                                       object.properties.add(readTMXProperty(xrp));
                                }
                        }
                });
@@ -209,6 +208,13 @@ public final class TMXMapFileParser {
                }
        }
        
+       private static TMXProperty readTMXProperty(XmlResourceParser xrp) throws XmlPullParserException, IOException {
+               final TMXProperty property = new TMXProperty();
+               property.name = xrp.getAttributeValue(null, "name");
+               property.value = xrp.getAttributeValue(null, "value");
+               return property;
+       }
+       
        private static void copyStreamToBuffer(InflaterInputStream zi, byte[] buffer, int len) throws IOException {
                int offset = 0;
                int bytesToRead = len;
@@ -270,6 +276,7 @@ public final class TMXMapFileParser {
                public int height;
                public TMXTileSet[] tileSets;
                public TMXLayer[] layers;
+               public final ArrayList<TMXProperty> properties = new ArrayList<TMXProperty>();
        }
        public static final class TMXTileSet {
                public int firstgid;
@@ -289,7 +296,7 @@ public final class TMXMapFileParser {
                public String name;
                public int width;
                public int height;
-               public ArrayList<TMXObject> objects = new ArrayList<TMXObject>();
+               public final ArrayList<TMXObject> objects = new ArrayList<TMXObject>();
        }
        public static final class TMXObject {
                public String name;
@@ -298,7 +305,7 @@ public final class TMXMapFileParser {
                public int y;
                public int width;
                public int height;
-               public ArrayList<TMXProperty> properties = new ArrayList<TMXProperty>();
+               public final ArrayList<TMXProperty> properties = new ArrayList<TMXProperty>();
        }
        public static final class TMXProperty {
                public String name;
index 62c82dbdd416307565d7b164e327c390757be8b3..e965157683935eafce69b3c8f27f56d7c1180595 100644 (file)
@@ -52,6 +52,12 @@ public final class TMXMapTranslator {
                        assert(m.width > 0);
                        assert(m.height > 0);
                        
+                       boolean isOutdoors = false;
+                       for (TMXProperty p : m.properties) {
+                               if(p.name.equalsIgnoreCase("outside")) isOutdoors = (Integer.parseInt(p.value) != 0);
+                               else if(AndorsTrailApplication.DEVELOPMENT_VALIDATEDATA) L.log("OPTIMIZE: Map " + m.name + " has unrecognized property \"" + p.name + "\".");
+                       }
+                       
                        boolean[][] isWalkable = new boolean[m.width][m.height];
                        for (int y = 0; y < m.height; ++y) {
                                for (int x = 0; x < m.width; ++x) {
@@ -186,7 +192,7 @@ public final class TMXMapTranslator {
                        MonsterSpawnArea[] _spawnAreas = new MonsterSpawnArea[spawnAreas.size()];
                        _spawnAreas = spawnAreas.toArray(_spawnAreas);
 
-                       result.add(new PredefinedMap(m.xmlResourceId, m.name, mapSize, isWalkable, _eventObjects, _spawnAreas, false));
+                       result.add(new PredefinedMap(m.xmlResourceId, m.name, mapSize, isWalkable, _eventObjects, _spawnAreas, false, isOutdoors));
                }
                
                return result;
index a96d825d53db475de04de8729b82f76f0fb1cf18..fb4dc670bca55595bdb6be389e8dac00d58d6824 100644 (file)
@@ -13,6 +13,7 @@ import com.gpl.rpg.AndorsTrail.resource.parsers.DropListParser;
 import com.gpl.rpg.AndorsTrail.resource.parsers.ItemTypeParser;
 import com.gpl.rpg.AndorsTrail.resource.parsers.MonsterTypeParser;
 import com.gpl.rpg.AndorsTrail.resource.parsers.QuestParser;
+import com.gpl.rpg.AndorsTrail.resource.parsers.WorldMapParser;
 import com.gpl.rpg.AndorsTrail.util.L;
 import com.gpl.rpg.AndorsTrail.util.Size;
 
@@ -163,6 +164,14 @@ public final class ResourceLoader {
         if (AndorsTrailApplication.DEVELOPMENT_DEBUGMESSAGES) timingCheckpoint("DynamicTileLoader");
         // ========================================================================
         
+        
+        // ========================================================================
+        // Load worldmap coordinates
+        WorldMapParser.read(r, R.xml.worldmap, world.maps);
+        if (AndorsTrailApplication.DEVELOPMENT_DEBUGMESSAGES) timingCheckpoint("WorldMapParser");
+        // ========================================================================
+        
+        
 
         if (AndorsTrailApplication.DEVELOPMENT_DEBUGMESSAGES) {
                long duration = System.currentTimeMillis() - start;
diff --git a/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/parsers/WorldMapParser.java b/AndorsTrail/src/com/gpl/rpg/AndorsTrail/resource/parsers/WorldMapParser.java
new file mode 100644 (file)
index 0000000..24ea1ec
--- /dev/null
@@ -0,0 +1,36 @@
+package com.gpl.rpg.AndorsTrail.resource.parsers;
+
+import android.content.res.Resources;
+import android.content.res.XmlResourceParser;
+
+import com.gpl.rpg.AndorsTrail.model.map.MapCollection;
+import com.gpl.rpg.AndorsTrail.model.map.PredefinedMap;
+import com.gpl.rpg.AndorsTrail.util.L;
+
+public final class WorldMapParser {
+       public static void read(Resources r, int xmlResourceId, final MapCollection maps) {
+               read(r.getXml(xmlResourceId), maps);
+       }
+       
+       private static void read(XmlResourceParser xrp, final MapCollection maps) {
+               try {
+                       int eventType;
+                       while ((eventType = xrp.next()) != XmlResourceParser.END_DOCUMENT) {
+                               if (eventType == XmlResourceParser.START_TAG) {
+                                       String s = xrp.getName();
+                                       if (s.equals("div")) {
+                                               String mapName = xrp.getAttributeValue(null, "id");
+                                               PredefinedMap map = maps.findPredefinedMap(mapName);
+                                               if (map == null) continue;
+                                               map.worldMapPosition.x = xrp.getAttributeIntValue(null, "x-posx", -1);
+                                               map.worldMapPosition.y = xrp.getAttributeIntValue(null, "x-posy", -1);
+                                       } 
+                               }
+            }
+            xrp.close();
+               } catch (Exception e) {
+                       L.log("Error reading worldmap: " + e.toString());
+               }
+       }
+
+}