SirVer has proposed merging lp:~widelands-dev/widelands/simplify_coords into 
lp:widelands with lp:~widelands-dev/widelands/flatten_map_object_descr as a 
prerequisite.

Commit message:
Simplify widelands_geometry.h

- Document TCoords and remove inheritance - a triangle index is not a node 
index, though it contains one.
- Simplify FCoords.
- Remove TriangleIndex::None.


Requested reviews:
  Widelands Developers (widelands-dev)

For more details, see:
https://code.launchpad.net/~widelands-dev/widelands/simplify_coords/+merge/330066
-- 
Your team Widelands Developers is requested to review the proposed merge of 
lp:~widelands-dev/widelands/simplify_coords into lp:widelands.
=== modified file 'data/i18n/locales.lua'
--- data/i18n/locales.lua	2017-08-31 15:22:21 +0000
+++ data/i18n/locales.lua	2017-09-01 09:00:15 +0000
@@ -2,375 +2,375 @@
 -- The locale data is managed in Transifex.
 
 return {
-   -- Locales are identified by their ISO code.
-   en = {
-      -- Used to display the locale in the Options menu.
-      name = "English",
-
-      -- Defines the language's position on the list in the Options menu.
-      sort_name = "English",
-
-      -- The font set used, including the script's direction. See i18n/fonts.lua
-      font = "default"
-   },
-
-   ar = {
-      name = "العربية",
-      sort_name = "Al-ʿArabiyyah",
-      font = "arabic"
-   },
-
-   ast = {
-      name = "Asturianu",
-      sort_name = "Asturianu",
-      font = "default"
-   },
-
-   bg = {
-      name = "Български",
-      sort_name = "Balgarski",
-      font = "default"
-   },
-
-   br = {
-      name = "Brezhoneg",
-      sort_name = "Brezhoneg",
-      font = "default"
-   },
-
-   ca = {
-      name = "Català",
-      sort_name = "Catala",
-      font = "default"
-   },
-
-   cs = {
-      name = "Čeština",
-      sort_name = "Cestina",
-      font = "default"
-   },
-
-   da = {
-      name = "Dansk",
-      sort_name = "Dansk",
-      font = "default"
-   },
-
-   de = {
-      name = "Deutsch",
-      sort_name = "Deutsch",
-      font = "default"
-   },
-
-   el = {
-      name = "Ελληνικά",
-      sort_name = "Ellinika",
-      font = "default"
-   },
-
-   en_CA = {
-      name = "Canadian English",
-      sort_name = "English (Canada)",
-      font = "default"
-   },
-
-   en_GB = {
-      name = "British English",
-      sort_name = "English (Great Britain)",
-      font = "default"
-   },
-
-   en_US = {
-      name = "US American English",
-      sort_name = "English (USA)",
-      font = "default"
-   },
-
-   eo = {
-      name = "Esperanto",
-      sort_name = "Esperanto",
-      font = "default"
-   },
-
-   es = {
-      name = "Español",
-      sort_name = "Espanol",
-      font = "default"
-   },
-
-   et = {
-      name = "Eesti keel",
-      sort_name = "Eesti keel",
-      font = "default"
-   },
-
-   eu = {
-      name = "Euskara",
-      sort_name = "Euskara",
-      font = "default"
-   },
-
-   fa = {
-      name = "فارسی",
-      sort_name = "Farsi",
-      font = "arabic"
-   },
-
-   fi = {
-      name = "Suomi",
-      sort_name = "Suomi",
-      font = "default"
-   },
-
-   fr = {
-      name = "Français",
-      sort_name = "Francais",
-      font = "default"
-   },
-
-   ga = {
-      name = "Gaeilge",
-      sort_name = "Gaeilge",
-      font = "default"
-   },
-
-   gd = {
-      name = "Gàidhlig",
-      sort_name = "Gaidhlig",
-      font = "default"
-   },
-
-   gl = {
-      name = "Galego",
-      sort_name = "Galego",
-      font = "default"
-   },
-
-   he = {
-      name = "עברית",
-      sort_name = "Ivrit",
-      font = "hebrew"
-   },
-
-   hi = {
-      name = "हिन्दी",
-      sort_name = "Hindi",
-      font = "devanagari"
-   },
-
-   hr = {
-      name = "Hrvatski",
-      sort_name = "Hrvatski",
-      font = "default"
-   },
-
-   hu = {
-      name = "Magyar",
-      sort_name = "Magyar",
-      font = "default"
-   },
-
-   ia = {
-      name = "Interlingua",
-      sort_name = "Interlingua",
-      font = "default"
-   },
-
-   id = {
-      name = "Bahasa Indonesia",
-      sort_name = "Indonesia",
-      font = "default"
-   },
-
-   it = {
-      name = "Italiano",
-      sort_name = "Italiano",
-      font = "default"
-   },
-
-   ja = {
-      name = "日本語",
-      sort_name = "Nihongo",
-      font = "cjk"
-   },
-
-   jv = {
-      name = "Basa jawa",
-      sort_name = "Jawa",
-      font = "default"
-   },
-
-   ka = {
-      name = "ქართული",
-      sort_name = "Kartuli",
-      font = "default"
-   },
-
-   ko = {
-      name = "한국어",
-      sort_name = "Hangug-eo",
-      font = "cjk"
-   },
-
-   krl = {
-      name = "Karjala",
-      sort_name = "Karjala",
-      font = "default"
-   },
-
-   la = {
-      name = "Lingua latīna",
-      sort_name = "Latina",
-      font = "default"
-   },
-
-   lt = {
-      name = "Lietuvių",
-      sort_name = "Lietuviu",
-      font = "default"
-   },
-
-   mr = {
-      name = "मराठी",
-      sort_name = "Marathi",
-      font = "devanagari"
-   },
-
-   ms = {
-      name = "بهاس ملايو",
-      sort_name = "Melayu",
-      font = "arabic"
-   },
-
-   my = {
-      name = "မြန်မာစ",
-      sort_name = "Myanma",
-      font = "myanmar"
-   },
-
-   nb = {
-      name = "Norsk (Bokmål)",
-      sort_name = "Norsk (Bokmal)",
-      font = "default"
-   },
-
-   nds = {
-      name = "Plattdütsch",
-      sort_name = "Plattdutsch",
-      font = "default"
-   },
-
-   nl = {
-      name = "Nederlands",
-      sort_name = "Nederlands",
-      font = "default"
-   },
-
-   nn = {
-      name = "Nynorsk",
-      sort_name = "Norsk (Nynorsk)",
-      font = "default"
-   },
-
-   oc = {
-      name = "Occitan",
-      sort_name = "Occitan",
-      font = "default"
-   },
-
-   pl = {
-      name = "Polski",
-      sort_name = "Polski",
-      font = "default"
-   },
-
-   pt = {
-      name = "Português",
-      sort_name = "Portugues",
-      font = "default"
-   },
-
-   pt_BR = {
-      name = "Português do Brasil",
-      sort_name = "Portugues (Brasil)",
-      font = "default"
-   },
-
-   ro = {
-      name = "Română",
-      sort_name = "Romana",
-      font = "default"
-   },
-
-   ru = {
-      name = "Русский",
-      sort_name = "Russky",
-      font = "default"
-   },
-
-   rw = {
-      name = "Kinyarwanda",
-      sort_name = "Kinyarwanda",
-      font = "default"
-   },
-
-   si = {
-      name = "සිංහල",
-      sort_name = "Simhala",
-      font = "sinhala"
-   },
-
-   sk = {
-      name = "Slovenčina",
-      sort_name = "Slovencina",
-      font = "default"
-   },
-
-   sl = {
-      name = "Slovenski jezik",
-      sort_name = "Slovenski",
-      font = "default"
-   },
-
-   sr = {
-      name = "српски",
-      sort_name = "Srpski",
-      font = "default"
-   },
-
-   sv = {
-      name = "Svenska",
-      sort_name = "Svenska",
-      font = "default"
-   },
-
-   tr = {
-      name = "Türkçe",
-      sort_name = "Turkce",
-      font = "default"
-   },
-
-   uk = {
-      name = "українська мова",
-      sort_name = "Ukrayinska",
-      font = "default"
-   },
-
-   vi = {
-      name = "Tiếng Việt",
-      sort_name = "Viet",
-      font = "default"
-   },
-
-   zh_CN = {
-      name = "简体中文",
-      sort_name = "Jianti Zhongwen",
-      font = "cjk"
-   },
-
-   zh_TW = {
-      name = "繁體中文",
-      sort_name = "Fanti Zhongwen",
-      font = "cjk"
-   },
+	-- Locales are identified by their ISO code.
+ 	en = {
+		-- Used to display the locale in the Options menu.
+		name = "English",
+
+		-- Defines the language's position on the list in the Options menu.
+		sort_name = "English",
+
+		-- The font set used, including the script's direction. See i18n/fonts.lua
+		font = "default"
+	},
+
+	ar = {
+		name = "العربية",
+		sort_name = "Al-ʿArabiyyah",
+		font = "arabic"
+	},
+
+	ast = {
+		name = "Asturianu",
+		sort_name = "Asturianu",
+		font = "default"
+	},
+
+	bg = {
+		name = "Български",
+		sort_name = "Balgarski",
+		font = "default"
+	},
+
+	br = {
+		name = "Brezhoneg",
+		sort_name = "Brezhoneg",
+		font = "default"
+	},
+
+	ca = {
+		name = "Català",
+		sort_name = "Catala",
+		font = "default"
+	},
+
+	cs = {
+		name = "Čeština",
+		sort_name = "Cestina",
+		font = "default"
+	},
+
+	da = {
+		name = "Dansk",
+		sort_name = "Dansk",
+		font = "default"
+	},
+
+	de = {
+		name = "Deutsch",
+		sort_name = "Deutsch",
+		font = "default"
+	},
+
+	el = {
+		name = "Ελληνικά",
+		sort_name = "Ellinika",
+		font = "default"
+	},
+
+	en_CA = {
+		name = "Canadian English",
+		sort_name = "English (Canada)",
+		font = "default"
+	},
+
+	en_GB = {
+		name = "British English",
+		sort_name = "English (Great Britain)",
+		font = "default"
+	},
+
+	en_US = {
+		name = "US American English",
+		sort_name = "English (USA)",
+		font = "default"
+	},
+
+	eo = {
+		name = "Esperanto",
+		sort_name = "Esperanto",
+		font = "default"
+	},
+
+	es = {
+		name = "Español",
+		sort_name = "Espanol",
+		font = "default"
+	},
+
+	et = {
+		name = "Eesti keel",
+		sort_name = "Eesti keel",
+		font = "default"
+	},
+
+	eu = {
+		name = "Euskara",
+		sort_name = "Euskara",
+		font = "default"
+	},
+
+	fa = {
+		name = "فارسی",
+		sort_name = "Farsi",
+		font = "arabic"
+	},
+
+	fi = {
+		name = "Suomi",
+		sort_name = "Suomi",
+		font = "default"
+	},
+
+	fr = {
+		name = "Français",
+		sort_name = "Francais",
+		font = "default"
+	},
+
+	ga = {
+		name = "Gaeilge",
+		sort_name = "Gaeilge",
+		font = "default"
+	},
+
+	gd = {
+		name = "Gàidhlig",
+		sort_name = "Gaidhlig",
+		font = "default"
+	},
+
+	gl = {
+		name = "Galego",
+		sort_name = "Galego",
+		font = "default"
+	},
+
+	he = {
+		name = "עברית",
+		sort_name = "Ivrit",
+		font = "hebrew"
+	},
+
+	hi = {
+		name = "हिन्दी",
+		sort_name = "Hindi",
+		font = "devanagari"
+	},
+
+	hr = {
+		name = "Hrvatski",
+		sort_name = "Hrvatski",
+		font = "default"
+	},
+
+	hu = {
+		name = "Magyar",
+		sort_name = "Magyar",
+		font = "default"
+	},
+
+	ia = {
+		name = "Interlingua",
+		sort_name = "Interlingua",
+		font = "default"
+	},
+
+	id = {
+		name = "Bahasa Indonesia",
+		sort_name = "Indonesia",
+		font = "default"
+	},
+
+	it = {
+		name = "Italiano",
+		sort_name = "Italiano",
+		font = "default"
+	},
+
+	ja = {
+		name = "日本語",
+		sort_name = "Nihongo",
+		font = "cjk"
+	},
+
+	jv = {
+		name = "Basa jawa",
+		sort_name = "Jawa",
+		font = "default"
+	},
+
+	ka = {
+		name = "ქართული",
+		sort_name = "Kartuli",
+		font = "default"
+	},
+
+	ko = {
+		name = "한국어",
+		sort_name = "Hangug-eo",
+		font = "cjk"
+	},
+
+	krl = {
+		name = "Karjala",
+		sort_name = "Karjala",
+		font = "default"
+	},
+
+	la = {
+		name = "Lingua latīna",
+		sort_name = "Latina",
+		font = "default"
+	},
+
+	lt = {
+		name = "Lietuvių",
+		sort_name = "Lietuviu",
+		font = "default"
+	},
+
+	mr = {
+		name = "मराठी",
+		sort_name = "Marathi",
+		font = "devanagari"
+	},
+
+	ms = {
+		name = "بهاس ملايو",
+		sort_name = "Melayu",
+		font = "arabic"
+	},
+
+	my = {
+		name = "မြန်မာစ",
+		sort_name = "Myanma",
+		font = "myanmar"
+	},
+
+	nb = {
+		name = "Norsk (Bokmål)",
+		sort_name = "Norsk (Bokmal)",
+		font = "default"
+	},
+
+	nds = {
+		name = "Plattdütsch",
+		sort_name = "Plattdutsch",
+		font = "default"
+	},
+
+	nl = {
+		name = "Nederlands",
+		sort_name = "Nederlands",
+		font = "default"
+	},
+
+	nn = {
+		name = "Nynorsk",
+		sort_name = "Norsk (Nynorsk)",
+		font = "default"
+	},
+
+	oc = {
+		name = "Occitan",
+		sort_name = "Occitan",
+		font = "default"
+	},
+
+	pl = {
+		name = "Polski",
+		sort_name = "Polski",
+		font = "default"
+	},
+
+	pt = {
+		name = "Português",
+		sort_name = "Portugues",
+		font = "default"
+	},
+
+	pt_BR = {
+		name = "Português do Brasil",
+		sort_name = "Portugues (Brasil)",
+		font = "default"
+	},
+
+	ro = {
+		name = "Română",
+		sort_name = "Romana",
+		font = "default"
+	},
+
+	ru = {
+		name = "Русский",
+		sort_name = "Russky",
+		font = "default"
+	},
+
+	rw = {
+		name = "Kinyarwanda",
+		sort_name = "Kinyarwanda",
+		font = "default"
+	},
+
+	si = {
+		name = "සිංහල",
+		sort_name = "Simhala",
+		font = "sinhala"
+	},
+
+	sk = {
+		name = "Slovenčina",
+		sort_name = "Slovencina",
+		font = "default"
+	},
+
+	sl = {
+		name = "Slovenski jezik",
+		sort_name = "Slovenski",
+		font = "default"
+	},
+
+	sr = {
+		name = "српски",
+		sort_name = "Srpski",
+		font = "default"
+	},
+
+	sv = {
+		name = "Svenska",
+		sort_name = "Svenska",
+		font = "default"
+	},
+
+	tr = {
+		name = "Türkçe",
+		sort_name = "Turkce",
+		font = "default"
+	},
+
+	uk = {
+		name = "українська мова",
+		sort_name = "Ukrayinska",
+		font = "default"
+	},
+
+	vi = {
+		name = "Tiếng Việt",
+		sort_name = "Viet",
+		font = "default"
+	},
+
+	zh_CN = {
+		name = "简体中文",
+		sort_name = "Jianti Zhongwen",
+		font = "cjk"
+	},
+
+	zh_TW = {
+		name = "繁體中文",
+		sort_name = "Fanti Zhongwen",
+		font = "cjk"
+	},
 }

=== modified file 'data/txts/translators_data.lua'
--- data/txts/translators_data.lua	2017-08-31 15:22:21 +0000
+++ data/txts/translators_data.lua	2017-09-01 09:00:15 +0000
@@ -1,1 +1,1 @@
-function translators() return {{heading = "العربية (Arabic)",entries = {{members = {"abdXelrhman","m-abudrais"," Omar Anwar","someone",},},},},{heading = "Asturianu (Asturian)",entries = {{members = {"Xuacu Saturio",},},},},{heading = "Български (Bulgarian)",entries = {{members = {"А. Ташев","Любомир Василев",},},},},{heading = "Brezhoneg (Breton)",entries = {{members = {"Pierre Morvan (Iriep)",},},},},{heading = "Català (Catalan)",entries = {{members = {"Francesc Famadas (kiski97)","Guybrush88","Joan Josep","Juanjo (juanjo_n)","Marc Dabad Castellà (marc.dabad)","Oriol",},},},},{heading = "Čeština (Czech)",entries = {{members = {"Adam Matoušek","David Spanel","Jakub Šebek (Jack_Honeypuffs)","Jens Beyer","Jezevec","Jiří Locker","Konki","Marek (d3rklord)","Marek Donar (Markus7cz)","Martin Volf","Martin Vecera (Marvec)","MaSo_CZ","Matej Svrcek (prom)","Milan Fašina (Matrix17)","Vit Hrachovy","Zbyněk Schwarz",},},},},{heading = "Dansk (Danish)",entries = {{members = {"Ask Hjorth Larsen","beer","Daniel Ejsing-Duun","David Lamhauge","Erik Soe Sorensen","Esben Aaberg","hulagutten","Joe Hansen (joedalton)","larsch","Nikolaj Sejergaard","Ole Laursen (olau)","silentStatic","Simon Stubben","Ville Witt",},},},},{heading = "Deutsch (German)",entries = {{members = {"Andreas Breitschopp","Astuur","Bamstam","Benedikt Tröster","Bob Johns","Borim","Clemens Dinkel","Daniel Kutrowatz","Daniel Winzen","Das MC","David Allwicher","DelphiMarkus","Dirk Stöcker","Elisabeth Jäger","Felix Gruber","Fenris Wolf","Ferdinand T.","FetteNase","Flames_in_Paradise","fraang","Frank Kubitschek","Gabriel Margiani","gamag","Hagen","Hanna Podewski (kristin)","herbert","HybridDog","hurz","Johannes (nuefke)","Johannes Haupt","Jonas Jonas","Jürgen Eberlein (Cherub)","Kaste","Klappstuhl","Klaus Halfmann (Hasi50)","Koneu","kraileth","LAZA","LennStar","Macedon","Marc Rodrigues (ExUndHop)","Marc Wischnowsky","Markus Pfitzner (janus)","Martin","Martin Schaerer","Matthias Krüger","Max","Max_Bento","meru","millimarg","Mirian Margiani","MirkoWodtke","Mister Pi","Mr. Anderson","Ole","Peter Schwanemann (Nasenbaer)","Philipp Niemann (Azagtoth)","Provetin","Ralf-J. Block","Raymond Vetter","ronny","SevyRide","Shevonar","SirVer","Sonnrain","Thomas","Tim O.","Timowi","Tino Miegel (TinoM)","Tobias Margiani","Venatrix","wl-zocker","Wolfgang Kurz","Wolfs","Wuzzy","Xaver (xtother90)",},},},},{heading = "Ελληνικά (Greek)",entries = {{members = {"Elias Delakovias","Lifeboy","Marinus Savoritias","ptr","Γιάννης Ανθυμίδης",},},},},{heading = "Canadian English",entries = {{members = {"Ne-1",},},},},{heading = "British English",entries = {{members = {"_aD","Alex Denvir","Andi Chandler (AndiBing)","Anthony Harrington","Biffaboy","Heber","Jackson Doak","James Thorrold","Jon Senior","LiSrt","Luis Miguel D.P.","M Crosby (classicsnoot)","mrx5682","Terry Jones","Tinker","UndiFineD","Vladimir Oka",},},},},{heading = "US American English",entries = {{members = {"DragonAtma",},},},},{heading = "Esperanto",entries = {{members = {"alms21","Fenris Wolf","Ivan Camilo Quintero Santacruz","Jens Beyer","Kristjan SCHMIDT","LaPingvino","Manuel Berkemeier","Michael Moroni (Airon90)",},},},},{heading = "Español (Spanish)",entries = {{members = {"Adolfo Jayme","Adrián Magro (senhorroar)","Agustín Vela","Alberto D.V.","Alejandro Pérez","Antonio Trueba (Fasser)","David Mitos","David Pérez","Diego Alberto Pereyra (Dishitooo)","DiegoJ","Eduardo Alberto Calvo","G BR (gastbr)","Gerardb","ironfisher","Ivan","Ivan Radzik (Sugsaggu)","Ivan Camilo Quintero Santacruz","Javi Sol","Javier Mora (morehash)","Jonay","Joseph Molina","JoseRoberto","Juan Eduardo Riva","Kiba Gasteiz (Kiibakun)","Lucía Pradillos","Luis Miguel D.P.","Madkat Here (madkat)","Martín V.","Miguel adre","Miguel de Dios Matias (tres.14159)","Monkey","Pablo Frigerio","Paco Molinero","Paulomorales","pescamillam","Rafael Augusto Maguiña Yrivarren","Rafael Medina","Raul Ferriz","Roberto López","schimmm","simon","Siz","Thadah D. Denyse","WalterCool","zer berros",},},},},{heading = "Eesti keel (Estonian)",entries = {{members = {"gert7","rm87",},},},},{heading = "Euskara (Basque)",entries = {{members = {"Mikel Alzibar",},},},},{heading = "فارسی (Persian)",entries = {{members = {"katy Zahedi","Hossien H (hossien2020)",},},},},{heading = "Suomi (Finnish)",entries = {{members = {"C C (ciucoi)","Jari Hautio","Joonas Tamminen (owava44)","Juhani Numminen","Jukka Pakarinen (flegmaatikko)","Markus Hällfors (Mad_Mac)","Max Ihalempia (xdvii7)","Pekka Järvinen (raspi)","Ropertto4","Sampo Harjula (Sahtor)","Sini Ruohomaa (Byakushin)","Teppo Mäenpää (teppq)","Tommi Nirha","Vazde",},},},},{heading = "Français (French)",entries = {{members = {"Remerçiements aux traducteurs:","","Adrien Vigneron (VRad)","AGuechoum","AnubiS","Audiger Jeremy","Aurelien Pavel","Benjamin Subtil","Bertram","Bruno Veilleux","clark17","crep4ever","David .","Denis Chenu (Shnoulle)","Didier M (didli)","El Pensador","Eliovir","Emmanuel Andry (Eandry)","fk","François Rousselet","Gilles Aubert (Hellsprings)","Guillaume Brant","Guybrush88","Gwendal D","hu bu (finkiki)","Immunoman","Jaypad","Jean-Pierre Gemble","Hanna Podewski (kristin)","londumas","Michael Colignon","Michael DOUBEZ","Mohamed SEDKI","Nicolas Auvray (Itms)","NonoSan","Pierre Rudloff","Renaud Bouchard (neurofr)","Sébastien Duthil","Sevy Ride","Tarou","Thomas Jungers","tomtom","Tubuntu","Ubuntu1988","verdy_p","wl-zocker","YS1","Yves MATHIEU","zezinho",},},},},{heading = "Gàidhlig (Scottish Gaelic)",entries = {{members = {"GunChleoc",},},},},{heading = "Galego (Galician)",entries = {{members = {"Adrián Chaves Fernández","Adrián Magro (senhorroar)","Antonio Trueba (Fasser)","Xosé",},},},},{heading = "עברית (Hebrew)",entries = {{members = {"Danny Albocher","Liel Fridman","Maor Reuben (maor309)","Michael DOUBEZ","Solomon Gruber (Piql7)","Yaron",},},},},{heading = "हिन्दी (Hindi)",entries = {{members = {"girdhari rao",},},},},{heading = "Hrvatski (Croatian)",entries = {{members = {"Ivan Bižaca (biza)","Mario Dautović",},},},},{heading = "Magyar (Hungarian)",entries = {{members = {"Agnes Dabi","Balázs Meskó (meskobalazs)","Bangó Máté","cn4ij","Dániel Varga (vargad88)","Ferenc Nagy","Gyönki Bendegúz","Herczeg Attila (hNczy)","HUNStree","István Kiss","jzombi","Kiscsirke","litoll","Major Gabesz","Muszela Balázs","Papp Bence","Peter Garami (garpe)","Richard Somlói","Robert Roth","SanskritFritz","Szűcs Kornél Géza (thewanderer)","zone",},},},},{heading = "Interlingua",entries = {{members = {"alms21",},},},},{heading = "Bahasa Indonesia (Indonesian)",entries = {{members = {"dadanhrn",},},},},{heading = "Italiano (Italian)",entries = {{members = {"Angelo Locritani","Bananasoft (Betacentury)","Cristiano Magro (xno)","Colin Gibson","DarkSaivor","Davide Nicolini (Davidus)","Dom De Felice","Doukas7","Eulogy","Gabriel Rota","Guybrush88","ido","Luigi Lain (king_of_nowhere)","Loris Turchetti","MarcoTrevisiol","Matteo Viarengo (enthusedquill6)","Oibaf","Pierpaolo Pierozzi","pierusch","Pietro Battiston","Roberto Sciascia","Riccardo Di Maio (yogotosleepnow)","SecondCloud500","Sergio Spinatelli","sgargel","simone.sandri","Tommaso Amici",},},},},{heading = "日本語 (Japanese)",entries = {{members = {"alms21","Dios","Gonta Ultra (Ulgon)","guess880","Midori","SevyRide","Scorpio","tubame",},},},},{heading = "Basa jawa (Javanese)",entries = {{members = {"zaenal arifin",},},},},{heading = "ქართული (Georgian)",entries = {{members = {"Gabriel Margiani","gamag","Meyer Konrad",},},},},{heading = "한국어 (Korean)",entries = {{members = {"ddfddf2k",},},},},{heading = "Karjala (Karelian)",entries = {{members = {"C C (ciucoi)",},},},},{heading = "Lingua latīna (Latin)",entries = {{members = {"alms21","Leonard Noack (Aleno)","lopho","Sonnrain","Stephan Lenk","Thorsten",},},},},{heading = "Lietuvių (Lithuanian)",entries = {{members = {"Mantas Kriaučiūnas",},},},},{heading = "मराठी (Marathi)",entries = {{members = {"Amod Ajit Karmarkar",},},},},{heading = "بهاس ملايو (Malay)",entries = {{members = {"abuyop",},},},},{heading = "မြန်မာစ (Burmese)",entries = {{members = {"pyaehtetaung",},},},},{heading = "Norsk (Bokmål) (Norwegian Bokmål)",entries = {{members = {"Alexander Jansen (Bornxlo)","Bjørnar Moen Marthinsen (Bramlorn)","Fredrik Sudmann","Hans Joachim Desserud","Harald H. (haarek)","Magnus Meyer Hustveit","Martin Dahl Moe","mr.x","Thorbjørn Bruarøy (2rB)",},},},},{heading = "Plattdütsch (Low German)",entries = {{members = {"Mister Pi ","Nasenbaer ","Ole ","tando",},},},},{heading = "Nederlands (Dutch)",entries = {{members = {"ben2s","BenW","Christian Groenendijk","Dirk Schut","fireprog","fk","Foppe Benedictus","Johan Jonkman (Dikjuh)","Maasieboy","Marcel","megabyte","Patrick van der Leer","Pieter Ouwerkerk (Pietertje)","Pietertje","PliniusNeo","REAL NAME","Rick van der Zwet","Rob Snelders (Ertai)","Steven De Herdt (stdh)","Teun Spaans","Victor Pelt","Wim Champagne",},},},},{heading = "Nynorsk (Norwegian Nynorsk)",entries = {{members = {"Alexander Mackinnon Jansen","Hans Joachim Desserud","Odin Hørthe Omdal","Thorbjørn Bruarøy (2rB)",},},},},{heading = "Occitan",entries = {{members = {"Cédric VALMARY (Tot en òc)",},},},},{heading = "Polski (Polish)",entries = {{members = {"Andrzej Krentosz (Endrju)","Asahi Koishi","BartekChom","Bartosz Wiśniewski","Gabriel Fortin","Hubert Pluta","Jakub Rak (einstein13)","Januzi (januzi)","Jacek Wolszczak (Shutdownrunner)","Jens Beyer","Karol Sobolewski","Łukasz Chełmicki","Mateusz Micał","Michal Maslanko","Michał Rzepiński","MikeNow","miragae","orzeh","Patryk Sawicki","Pawel PErz","Sebastian Janus (kreys)","Stanisław Gackowski (Soeb)","Szymon Fornal","Szymon Gackowski","Szymon Nieznański","tim","Tomasz Pudło (tombox)","Tomasz Sterna","Wesmania","Wojtek","XeonBloomfield",},},},},{heading = "Português (Portuguese)",entries = {{members = {"Almufadado","daniel reis","David Rodrigues","Flávio J. Saraiva","Gnu Rreia","GunChleoc","Luis Neves (ljay79)","Marcelo do Pagode","Miguel de Freitas Fonseca","Patrick de Castro (Rayback)","Tiago Silva","trewe","zecas (zezinho)",},},},},{heading = "Português do Brasil (Brazilian Portuguese)",entries = {{members = {"Alexandre","alms21","Almufadado","Cleverton","daniel reis","Fabio Garz","Flaviano Angeli","Henrique Terto de Souza","HicHic","Hriostat","Israel","JoãoPedro BrasãoToledo","Juarez S.","Júlio Cezar Santos Pires","Juno","Luiz N","Maraschin","Marcelo do Pagode","Monstro Socialista","Murilo Poso (MetrO)","Nicolas Abril","Patrick de Castro (Rayback)","Pedro Pisandelli","Proezas","Rafael Dotti","Rafael Neri","Renata Campos","Rubens Bueno","Salatiel Ewerton","Samer Ghosnlas.2932","Tomas Abril","Vitor",},},},},{heading = "Română (Romanian)",entries = {{members = {"Tarta Vasile-Florin (phlo)","Ursachi Alexandru",},},},},{heading = "Русский (Russian)",entries = {{members = {"Александр (Kvark)","Александр Бикмеев (Romiresz)","Александр Глухов","Алексей Кабанов","Андрей Кулаков ","Андрей Олыкайнен ","Антон Хабаров (a.khabarov)","Виктор Биркманис","Владимир Коваленко","Владимир Куряев (Istercul)","Глеб Синковский","Глория Хрусталёва","Денис Дерябин","Егор Панфилов","Константин Щукин","Никита Шехов","Руслан Ковтун","Сергей Фуканчик ","Федор (Lunar_energy)","Юрий Соколов (Urra)","Arex","dr&mx","Georgiy","gerich","Gregory Lominoga (gromodar)","Iaroslav Boiarshinov (foxmulder32)","Ivan (CupIvan)","Izon","KroArtem","Lex","Massol","Papazu","SashaQR","Simple88","telema","TroubleMakerDV","Vampire Hunter D","Vlad",},},},},{heading = "Kinyarwanda",entries = {{members = {"Nasenbaer",},},},},{heading = "සිංහල (Sinhala)",entries = {{members = {"Samith Sandanayake",},},},},{heading = "Slovenčina (Slovak)",entries = {{members = {"Kefir111","Marek Hám","Miroslav Remák","Vladimir","Vladímir Tóth (Ike)",},},},},{heading = "Slovenski jezik (Slovenian)",entries = {{members = {"Andrej Znidarsic","Boštjan Miklavčič","Jure Repinc","kleb","Klemen Košir","Matevž Jekovec","Matic Gradišer","mrt",},},},},{heading = "српски (Serbian)",entries = {{members = {"Никола Павловић","Zlatko Savić (zlajonja)",},},},},{heading = "Svenska (Swedish)",entries = {{members = {"avdpos","Arve Eriksson","Christian Widell","Daniel Nylander (yeager)","Frederik Pettersson (luno)","Hilding Kåstad (HildingWK)","ivh","Joakim Lundborg","karlrune","Marcus E","Michael Rydén","Patrick H.","Phoenix","Rasmus Olstedt","RasmusBackman","Sigra","Treecko","Tumaini","Ulite",},},},},{heading = "Türkçe (Turkish)",entries = {{members = {"Aathonaeax","Asiye","Ekrem Kocadere","Ercin Senturk","Erdy","Recep Hasanbaş (swarf)","ScriptMonster","Volkan Gezer","yakup","Yusuf boy",},},},},{heading = "українська мова (Ukranian)",entries = {{members = {"Вячеслав Фияло (Slaventius)","Сергій Дубик","Fedik","Shemet Yevhene","Vladislav Trotsky (flyboooy17)",},},},},{heading = "Tiếng Việt (Vietnamese)",entries = {{members = {"Nguyen Quang Chien",},},},},{heading = "简体中文 (Simplified Chinese)",entries = {{members = {"Frank Tang (roadt)","luojie-dune","Susie Shi","XIA",},},},},{heading = "繁體中文 (Traditional Chinese)",entries = {{members = {"AJ","Arm Coon","poormusic","sonny",},},},},} end
+function translators() return {{heading = "العربية (Arabic)",entries = {{members = {"abdXelrhman","m-abudrais"," Omar Anwar","someone",},},},},{heading = "Asturianu (Asturian)",entries = {{members = {"Xuacu Saturio",},},},},{heading = "Български (Bulgarian)",entries = {{members = {"А. Ташев","Любомир Василев",},},},},{heading = "Brezhoneg (Breton)",entries = {{members = {"Pierre Morvan (Iriep)",},},},},{heading = "Català (Catalan)",entries = {{members = {"Francesc Famadas (kiski97)","Guybrush88","Joan Josep","Juanjo (juanjo_n)","Marc Dabad Castellà (marc.dabad)","Oriol",},},},},{heading = "Čeština (Czech)",entries = {{members = {"Adam Matoušek","David Spanel","Jakub Šebek (Jack_Honeypuffs)","Jens Beyer","Jezevec","Jiří Locker","Konki","Marek (d3rklord)","Marek Donar (Markus7cz)","Martin Volf","Martin Vecera (Marvec)","MaSo_CZ","Matej Svrcek (prom)","Milan Fašina (Matrix17)","Vit Hrachovy","Zbyněk Schwarz",},},},},{heading = "Dansk (Danish)",entries = {{members = {"Ask Hjorth Larsen","beer","Daniel Ejsing-Duun","David Lamhauge","Erik Soe Sorensen","Esben Aaberg","hulagutten","Joe Hansen (joedalton)","larsch","Nikolaj Sejergaard","Ole Laursen (olau)","silentStatic","Simon Stubben","Ville Witt",},},},},{heading = "Deutsch (German)",entries = {{members = {"Andreas Breitschopp","Astuur","Bamstam","Benedikt Tröster","Bob Johns","Borim","Clemens Dinkel","Daniel Kutrowatz","Daniel Winzen","Das MC","David Allwicher","DelphiMarkus","Dirk Stöcker","Elisabeth Jäger","Felix Gruber","Fenris Wolf","Ferdinand T.","FetteNase","Flames_in_Paradise","fraang","Frank Kubitschek","Gabriel Margiani","gamag","Hagen","Hanna Podewski (kristin)","herbert","HybridDog","hurz","Johannes (nuefke)","Johannes Haupt","Jonas Jonas","Jürgen Eberlein (Cherub)","Kaste","Klappstuhl","Klaus Halfmann (Hasi50)","Koneu","kraileth","LAZA","LennStar","Macedon","Marc Rodrigues (ExUndHop)","Marc Wischnowsky","Markus Pfitzner (janus)","Martin","Martin Schaerer","Matthias Krüger","Max","Max_Bento","meru","millimarg","Mirian Margiani","MirkoWodtke","Mister Pi","Mr. Anderson","Ole","Peter Schwanemann (Nasenbaer)","Philipp Niemann (Azagtoth)","Provetin","Ralf-J. Block","Raymond Vetter","ronny","SevyRide","Shevonar","SirVer","Sonnrain","Thomas","Tim O.","Timowi","Tino Miegel (TinoM)","Tobias Margiani","Venatrix","wl-zocker","Wolfgang Kurz","Wolfs","Wuzzy","Xaver (xtother90)",},},},},{heading = "Ελληνικά (Greek)",entries = {{members = {"Elias Delakovias","Lifeboy","Marinus Savoritias","ptr","Γιάννης Ανθυμίδης",},},},},{heading = "Canadian English",entries = {{members = {"Ne-1",},},},},{heading = "British English",entries = {{members = {"_aD","Alex Denvir","Andi Chandler (AndiBing)","Anthony Harrington","Biffaboy","Heber","Jackson Doak","James Thorrold","Jon Senior","LiSrt","Luis Miguel D.P.","M Crosby (classicsnoot)","mrx5682","Terry Jones","Tinker","UndiFineD","Vladimir Oka",},},},},{heading = "US American English",entries = {{members = {"DragonAtma",},},},},{heading = "Esperanto",entries = {{members = {"alms21","Fenris Wolf","Ivan Camilo Quintero Santacruz","Jens Beyer","Kristjan SCHMIDT","LaPingvino","Manuel Berkemeier","Michael Moroni (Airon90)",},},},},{heading = "Español (Spanish)",entries = {{members = {"Adolfo Jayme","Adrián Magro (senhorroar)","Agustín Vela","Alberto D.V.","Alejandro Pérez","Antonio Trueba (Fasser)","David Mitos","David Pérez","Diego Alberto Pereyra (Dishitooo)","DiegoJ","Eduardo Alberto Calvo","G BR (gastbr)","Gerardb","ironfisher","Ivan","Ivan Radzik (Sugsaggu)","Ivan Camilo Quintero Santacruz","Javi Sol","Javier Mora (morehash)","Jonay","Joseph Molina","JoseRoberto","Juan Eduardo Riva","Kiba Gasteiz (Kiibakun)","Lucía Pradillos","Luis Miguel D.P.","Madkat Here (madkat)","Martín V.","Miguel adre","Miguel de Dios Matias (tres.14159)","Monkey","Pablo Frigerio","Paco Molinero","Paulomorales","pescamillam","Rafael Augusto Maguiña Yrivarren","Rafael Medina","Raul Ferriz","Roberto López","schimmm","simon","Siz","Thadah D. Denyse","WalterCool","zer berros",},},},},{heading = "Eesti keel (Estonian)",entries = {{members = {"gert7","rm87",},},},},{heading = "Euskara (Basque)",entries = {{members = {"Mikel Alzibar",},},},},{heading = "فارسی (Persian)",entries = {{members = {"katy Zahedi","Hossien H (hossien2020)",},},},},{heading = "Suomi (Finnish)",entries = {{members = {"C C (ciucoi)","Jari Hautio","Joonas Tamminen (owava44)","Juhani Numminen","Jukka Pakarinen (flegmaatikko)","Markus Hällfors (Mad_Mac)","Max Ihalempia (xdvii7)","Pekka Järvinen (raspi)","Ropertto4","Sampo Harjula (Sahtor)","Sini Ruohomaa (Byakushin)","Teppo Mäenpää (teppq)","Tommi Nirha","Vazde",},},},},{heading = "Français (French)",entries = {{members = {"Remerçiements aux traducteurs:","","Adrien Vigneron (VRad)","AGuechoum","AnubiS","Audiger Jeremy","Aurelien Pavel","Benjamin Subtil","Bertram","Bruno Veilleux","clark17","crep4ever","David .","Denis Chenu (Shnoulle)","Didier M (didli)","El Pensador","Eliovir","Emmanuel Andry (Eandry)","fk","François Rousselet","Gilles Aubert (Hellsprings)","Guillaume Brant","Guybrush88","Gwendal D","hu bu (finkiki)","Immunoman","Jaypad","Jean-Pierre Gemble","Hanna Podewski (kristin)","londumas","Michael Colignon","Michael DOUBEZ","Mohamed SEDKI","Nicolas Auvray (Itms)","NonoSan","Pierre Rudloff","Renaud Bouchard (neurofr)","Sébastien Duthil","Sevy Ride","Tarou","Thomas Jungers","tomtom","Tubuntu","Ubuntu1988","verdy_p","wl-zocker","YS1","Yves MATHIEU","zezinho",},},},},{heading = "Gàidhlig (Scottish Gaelic)",entries = {{members = {"GunChleoc",},},},},{heading = "Galego (Galician)",entries = {{members = {"Adrián Chaves Fernández","Adrián Magro (senhorroar)","Antonio Trueba (Fasser)","Xosé",},},},},{heading = "עברית (Hebrew)",entries = {{members = {"Danny Albocher","Liel Fridman","Maor Reuben (maor309)","Michael DOUBEZ","Solomon Gruber (Piql7)","Yaron",},},},},{heading = "हिन्दी (Hindi)",entries = {{members = {"girdhari rao",},},},},{heading = "Hrvatski (Croatian)",entries = {{members = {"Ivan Bižaca (biza)","Mario Dautović",},},},},{heading = "Magyar (Hungarian)",entries = {{members = {"Agnes Dabi","Balázs Meskó (meskobalazs)","Bangó Máté","cn4ij","Dániel Varga (vargad88)","Ferenc Nagy","Gyönki Bendegúz","Herczeg Attila (hNczy)","HUNStree","István Kiss","jzombi","Kiscsirke","litoll","Major Gabesz","Muszela Balázs","Papp Bence","Peter Garami (garpe)","Richard Somlói","Robert Roth","SanskritFritz","Szűcs Kornél Géza (thewanderer)","zone",},},},},{heading = "Interlingua",entries = {{members = {"alms21",},},},},{heading = "Bahasa Indonesia (Indonesian)",entries = {{members = {"dadanhrn",},},},},{heading = "Italiano (Italian)",entries = {{members = {"Angelo Locritani","Bananasoft (Betacentury)","Cristiano Magro (xno)","Colin Gibson","DarkSaivor","Davide Nicolini (Davidus)","Dom De Felice","Doukas7","Eulogy","Gabriel Rota","Guybrush88","ido","Luigi Lain (king_of_nowhere)","Loris Turchetti","MarcoTrevisiol","Matteo Viarengo (enthusedquill6)","Oibaf","Pierpaolo Pierozzi","pierusch","Pietro Battiston","Roberto Sciascia","Riccardo Di Maio (yogotosleepnow)","SecondCloud500","Sergio Spinatelli","sgargel","simone.sandri","Tommaso Amici",},},},},{heading = "日本語 (Japanese)",entries = {{members = {"alms21","Dios","Gonta Ultra (Ulgon)","guess880","Midori","SevyRide","Scorpio","tubame",},},},},{heading = "Basa jawa (Javanese)",entries = {{members = {"zaenal arifin",},},},},{heading = "ქართული (Georgian)",entries = {{members = {"Gabriel Margiani","gamag","Meyer Konrad",},},},},{heading = "한국어 (Korean)",entries = {{members = {"ddfddf2k",},},},},{heading = "Karjala (Karelian)",entries = {{members = {"C C (ciucoi)",},},},},{heading = "Lingua latīna (Latin)",entries = {{members = {"alms21","Leonard Noack (Aleno)","lopho","Sonnrain","Stephan Lenk","Thorsten",},},},},{heading = "Lietuvių (Lithuanian)",entries = {{members = {"Mantas Kriaučiūnas",},},},},{heading = "मराठी (Marathi)",entries = {{members = {"Amod Ajit Karmarkar",},},},},{heading = "بهاس ملايو (Malay)",entries = {{members = {"abuyop",},},},},{heading = "မြန်မာစ (Burmese)",entries = {{members = {"pyaehtetaung",},},},},{heading = "Norsk (Bokmål) (Norwegian Bokmål)",entries = {{members = {"Alexander Jansen (Bornxlo)","Bjørnar Moen Marthinsen (Bramlorn)","Fredrik Sudmann","Hans Joachim Desserud","Harald H. (haarek)","Magnus Meyer Hustveit","Martin Dahl Moe","mr.x","Thorbjørn Bruarøy (2rB)",},},},},{heading = "Plattdütsch (Low German)",entries = {{members = {"Mister Pi ","Nasenbaer ","Ole ","tando",},},},},{heading = "Nederlands (Dutch)",entries = {{members = {"ben2s","BenW","Christian Groenendijk","Dirk Schut","fireprog","fk","Foppe Benedictus","Johan Jonkman (Dikjuh)","Maasieboy","Marcel","megabyte","Patrick van der Leer","Pieter Ouwerkerk (Pietertje)","Pietertje","PliniusNeo","REAL NAME","Rick van der Zwet","Rob Snelders (Ertai)","Steven De Herdt (stdh)","Teun Spaans","Victor Pelt","Wim Champagne",},},},},{heading = "Nynorsk (Norwegian Nynorsk)",entries = {{members = {"Alexander Mackinnon Jansen","Hans Joachim Desserud","Odin Hørthe Omdal","Thorbjørn Bruarøy (2rB)",},},},},{heading = "Occitan",entries = {{members = {"Cédric VALMARY (Tot en òc)",},},},},{heading = "Polski (Polish)",entries = {{members = {"Andrzej Krentosz (Endrju)","Asahi Koishi","BartekChom","Bartosz Wiśniewski","Gabriel Fortin","Hubert Pluta","Jakub Rak (einstein13)","Januzi (januzi)","Jacek Wolszczak (Shutdownrunner)","Jens Beyer","Karol Sobolewski","Łukasz Chełmicki","Mateusz Micał","Michal Maslanko","Michał Rzepiński","MikeNow","miragae","orzeh","Patryk Sawicki","Pawel PErz","Sebastian Janus (kreys)","Stanisław Gackowski (Soeb)","Szymon Fornal","Szymon Gackowski","Szymon Nieznański","tim","Tomasz Pudło (tombox)","Tomasz Sterna","Wesmania","Wojtek","XeonBloomfield",},},},},{heading = "Português (Portuguese)",entries = {{members = {"Almufadado","daniel reis","David Rodrigues","Flávio J. Saraiva","Gnu Rreia","GunChleoc","Luis Neves (ljay79)","Marcelo do Pagode","Miguel de Freitas Fonseca","Patrick de Castro (Rayback)","Tiago Silva","trewe","zecas (zezinho)",},},},},{heading = "Português do Brasil (Brazilian Portuguese)",entries = {{members = {"Alexandre","alms21","Almufadado","Cleverton","daniel reis","Fabio Garz","Flaviano Angeli","Henrique Terto de Souza","HicHic","Hriostat","Israel","JoãoPedro BrasãoToledo","Juarez S.","Júlio Cezar Santos Pires","Juno","Luiz N","Maraschin","Marcelo do Pagode","Monstro Socialista","Murilo Poso (MetrO)","Nicolas Abril","Patrick de Castro (Rayback)","Pedro Pisandelli","Proezas","Rafael Dotti","Rafael Neri","Renata Campos","Rubens Bueno","Salatiel Ewerton","Samer Ghosnlas.2932","Tomas Abril","Vitor",},},},},{heading = "Română (Romanian)",entries = {{members = {"Tarta Vasile-Florin (phlo)","Ursachi Alexandru",},},},},{heading = "Русский (Russian)",entries = {{members = {"Александр (Kvark)","Александр Бикмеев (Romiresz)","Александр Глухов","Алексей Кабанов","Андрей Кулаков ","Андрей Олыкайнен ","Антон Хабаров (a.khabarov)","Виктор Биркманис","Владимир Коваленко","Владимир Куряев (Istercul)","Глеб Синковский","Глория Хрусталёва","Денис Дерябин","Егор Панфилов","Константин Щукин","Никита Шехов","Руслан Ковтун","Сергей Фуканчик ","Федор (Lunar_energy)","Юрий Соколов (Urra)","Arex","dr&mx","Georgiy","gerich","Gregory Lominoga (gromodar)","Iaroslav Boiarshinov (foxmulder32)","Ivan (CupIvan)","Izon","KroArtem","Lex","Massol","Papazu","SashaQR","Simple88","telema","TroubleMakerDV","Vampire Hunter D","Vlad",},},},},{heading = "Kinyarwanda",entries = {{members = {"Nasenbaer",},},},},{heading = "සිංහල (Sinhala)",entries = {{members = {"Samith Sandanayake",},},},},{heading = "Slovenčina (Slovak)",entries = {{members = {"Kefir111","Marek Hám","Miroslav Remák","Vladimir","Vladímir Tóth (Ike)",},},},},{heading = "Slovenski jezik (Slovenian)",entries = {{members = {"Andrej Znidarsic","Boštjan Miklavčič","Jure Repinc","kleb","Klemen Košir","Matevž Jekovec","Matic Gradišer","mrt",},},},},{heading = "српски (Serbian)",entries = {{members = {"Никола Павловић","Zlatko Savić (zlajonja)",},},},},{heading = "Svenska (Swedish)",entries = {{members = {"avdpos","Arve Eriksson","Christian Widell","Daniel Nylander (yeager)","Frederik Pettersson (luno)","Hilding Kåstad (HildingWK)","ivh","Joakim Lundborg","karlrune","Marcus E","Michael Rydén","Patrick H.","Phoenix","Rasmus Olstedt","RasmusBackman","Sigra","Treecko","Tumaini","Ulite",},},},},{heading = "Türkçe (Turkish)",entries = {{members = {"Aathonaeax","Asiye","Ekrem Kocadere","Ercin Senturk","Erdy","Recep Hasanbaş (swarf)","ScriptMonster","Volkan Gezer","yakup","Yusuf boy",},},},},{heading = "українська мова (Ukranian)",entries = {{members = {"Вячеслав Фияло (Slaventius)","Сергій Дубик","Fedik","Shemet Yevhene","Vladislav Trotsky (flyboooy17)",},},},},{heading = "Tiếng Việt (Vietnamese)",entries = {{members = {"Nguyen Quang Chien",},},},},{heading = "简体中文 (Simplified Chinese)",entries = {{members = {"Frank Tang (roadt)","luojie-dune","Susie Shi","XIA",},},},},{heading = "繁體中文 (Traditional Chinese)",entries = {{members = {"AJ","Arm Coon","poormusic","sonny",},},},},} end
\ No newline at end of file

=== modified file 'src/editor/editorinteractive.cc'
--- src/editor/editorinteractive.cc	2017-09-01 00:16:04 +0000
+++ src/editor/editorinteractive.cc	2017-09-01 09:00:15 +0000
@@ -621,9 +621,13 @@
 
 		// Make sure that we will start at coordinates (0,0).
 		map_view()->set_view(MapView::View{Vector2f::zero(), 1.f}, MapView::Transition::Jump);
-		set_sel_pos(Widelands::NodeAndTriangle<>(
+		set_sel_pos(Widelands::NodeAndTriangle<>{
 		   Widelands::Coords(0, 0),
+<<<<<<< TREE
 		   Widelands::TCoords<>(Widelands::Coords(0, 0), Widelands::TriangleIndex::D)));
+=======
+		   Widelands::TCoords<>(Widelands::Coords(0, 0), Widelands::TriangleIndex::D)});
+>>>>>>> MERGE-SOURCE
 		break;
 
 	case MapWas::kGloballyMutated:

=== modified file 'src/editor/editorinteractive.h'
--- src/editor/editorinteractive.h	2017-08-30 20:05:00 +0000
+++ src/editor/editorinteractive.h	2017-09-01 09:00:15 +0000
@@ -141,6 +141,14 @@
 private:
 	friend struct EditorToolMenu;
 
+<<<<<<< TREE
+=======
+	struct PlayerReferences {
+		int32_t player;
+		void const* object;
+	};
+
+>>>>>>> MERGE-SOURCE
 	void on_buildhelp_changed(const bool value) override;
 
 	void toggle_resources();

=== modified file 'src/editor/tools/info_tool.cc'
--- src/editor/tools/info_tool.cc	2017-08-30 13:35:37 +0000
+++ src/editor/tools/info_tool.cc	2017-09-01 09:00:15 +0000
@@ -113,7 +113,7 @@
 	// *** Terrain info
 	buf += std::string("\n") + _("Terrain:") + "\n";
 
-	const Widelands::Field& tf = (*map)[center.triangle];
+	const Widelands::Field& tf = (*map)[center.triangle.node];
 	const Widelands::TerrainDescription& ter = world.terrain_descr(
 	   center.triangle.t == Widelands::TriangleIndex::D ? tf.terrain_d() : tf.terrain_r());
 

=== modified file 'src/editor/tools/set_terrain_tool.cc'
--- src/editor/tools/set_terrain_tool.cc	2017-08-31 15:22:21 +0000
+++ src/editor/tools/set_terrain_tool.cc	2017-09-01 09:00:15 +0000
@@ -29,8 +29,12 @@
                                                 EditorInteractive& /* parent */,
                                                 EditorActionArgs* args,
                                                 Widelands::Map* map) {
+<<<<<<< TREE
 	assert(center.triangle.t == Widelands::TriangleIndex::D ||
 	       center.triangle.t == Widelands::TriangleIndex::R);
+=======
+	assert(center.triangle.t == Widelands::TriangleIndex::D || center.triangle.t == Widelands::TriangleIndex::R);
+>>>>>>> MERGE-SOURCE
 	uint16_t const radius = args->sel_radius;
 	int32_t max = 0;
 
@@ -38,12 +42,22 @@
 		Widelands::MapTriangleRegion<TCoords<Widelands::FCoords>> mr(
 		   *map, Widelands::Area<TCoords<Widelands::FCoords>>(
 		            TCoords<Widelands::FCoords>(
+<<<<<<< TREE
 		               Widelands::FCoords(map->get_fcoords(center.triangle)), center.triangle.t),
+=======
+		               Widelands::FCoords(map->get_fcoords(center.triangle.node)), center.triangle.t),
+>>>>>>> MERGE-SOURCE
 		            radius));
 		do {
+<<<<<<< TREE
 			args->original_terrain_type.push_back((mr.location().t == Widelands::TriangleIndex::D) ?
 			                                         mr.location().field->terrain_d() :
 			                                         mr.location().field->terrain_r());
+=======
+			args->original_terrain_type.push_back((mr.location().t == Widelands::TriangleIndex::D) ?
+			                                         mr.location().node.field->terrain_d() :
+			                                         mr.location().node.field->terrain_r());
+>>>>>>> MERGE-SOURCE
 			args->terrain_type.push_back(get_random_enabled());
 		} while (mr.advance(*map));
 	}
@@ -52,7 +66,11 @@
 		Widelands::MapTriangleRegion<TCoords<Widelands::FCoords>> mr(
 		   *map, Widelands::Area<TCoords<Widelands::FCoords>>(
 		            TCoords<Widelands::FCoords>(
+<<<<<<< TREE
 		               Widelands::FCoords(map->get_fcoords(center.triangle)), center.triangle.t),
+=======
+		               Widelands::FCoords(map->get_fcoords(center.triangle.node)), center.triangle.t),
+>>>>>>> MERGE-SOURCE
 		            radius));
 		std::list<Widelands::DescriptionIndex>::iterator i = args->terrain_type.begin();
 		do {
@@ -69,15 +87,23 @@
                                        EditorInteractive& /* parent */,
                                        EditorActionArgs* args,
                                        Widelands::Map* map) {
+<<<<<<< TREE
 	assert(center.triangle.t == Widelands::TriangleIndex::D ||
 	       center.triangle.t == Widelands::TriangleIndex::R);
+=======
+	assert(center.triangle.t == Widelands::TriangleIndex::D || center.triangle.t == Widelands::TriangleIndex::R);
+>>>>>>> MERGE-SOURCE
 	uint16_t const radius = args->sel_radius;
 	if (!args->terrain_type.empty()) {
 		int32_t max = 0;
 		Widelands::MapTriangleRegion<TCoords<Widelands::FCoords>> mr(
 		   *map, Widelands::Area<TCoords<Widelands::FCoords>>(
 		            TCoords<Widelands::FCoords>(
+<<<<<<< TREE
 		               Widelands::FCoords(map->get_fcoords(center.triangle)), center.triangle.t),
+=======
+		               Widelands::FCoords(map->get_fcoords(center.triangle.node)), center.triangle.t),
+>>>>>>> MERGE-SOURCE
 		            radius));
 
 		std::list<Widelands::DescriptionIndex>::iterator i = args->original_terrain_type.begin();

=== modified file 'src/graphic/minimap_renderer.cc'
--- src/graphic/minimap_renderer.cc	2017-08-19 22:22:20 +0000
+++ src/graphic/minimap_renderer.cc	2017-09-01 09:00:15 +0000
@@ -161,10 +161,10 @@
 	const int32_t mapwidth = map.get_width();
 
 	for (uint32_t y = 0; y < surface_h; ++y) {
-		Widelands::FCoords f(
+		Widelands::Coords coords(
 		   Widelands::Coords(top_left.x, top_left.y + ((layers & MiniMapLayer::Zoom2) ? y / 2 : y)));
-		map.normalize_coords(f);
-		f.field = &map[f];
+		map.normalize_coords(coords);
+		Widelands::FCoords f = map.get_fcoords(coords);
 		Widelands::MapIndex i = Widelands::Map::get_index(f, mapwidth);
 		for (uint32_t x = 0; x < surface_w; ++x) {
 			if (x % 2 || !(layers & MiniMapLayer::Zoom2)) {

=== modified file 'src/logic/editor_game_base.cc'
--- src/logic/editor_game_base.cc	2017-08-30 13:50:04 +0000
+++ src/logic/editor_game_base.cc	2017-09-01 09:00:15 +0000
@@ -180,7 +180,11 @@
 		iterate_players_existing_const(plnum, kMaxPlayers, *this, p) {
 			Player::Field& player_field = p->fields_[i];
 			if (1 < player_field.vision) {
+<<<<<<< TREE
 				player_field.map_object_descr[static_cast<int>(TriangleIndex::None)] = descr;
+=======
+				player_field.map_object_descr = descr;
+>>>>>>> MERGE-SOURCE
 			}
 		}
 }

=== modified file 'src/logic/map.cc'
--- src/logic/map.cc	2017-08-31 15:22:21 +0000
+++ src/logic/map.cc	2017-09-01 09:00:15 +0000
@@ -345,7 +345,7 @@
 	// NOTE because of the triangle design, we have to take special care about cases
 	// NOTE where y is changed by an odd number
 	bool yisodd = (new_origin.y % 2) != 0;
-	for (FCoords c(Coords(0, 0)); c.y < height_; ++c.y) {
+	for (Coords c(Coords(0, 0)); c.y < height_; ++c.y) {
 		bool cyisodd = (c.y % 2) != 0;
 		for (c.x = 0; c.x < width_; ++c.x) {
 			Coords temp;
@@ -1737,63 +1737,69 @@
 
 int32_t
 Map::change_terrain(const World& world, TCoords<FCoords> const c, DescriptionIndex const terrain) {
-	c.field->set_terrain(c.t, terrain);
+	c.node.field->set_terrain(c.t, terrain);
 
 	// remove invalid resources if necessary
 	// check vertex to which the triangle belongs
-	if (!is_resource_valid(world, c, c.field->get_resources())) {
-		clear_resources(c);
+	if (!is_resource_valid(world, c.node, c.node.field->get_resources())) {
+		clear_resources(c.node);
 	}
 
 	// always check south-east vertex
-	Widelands::FCoords f_se(c, c.field);
+	Widelands::FCoords f_se(c.node);
 	get_neighbour(f_se, Widelands::WALK_SE, &f_se);
 	if (!is_resource_valid(world, f_se, f_se.field->get_resources())) {
 		clear_resources(f_se);
 	}
 
 	// check south-west vertex if d-Triangle is changed, check east vertex if r-Triangle is changed
+<<<<<<< TREE
 	Widelands::FCoords f_sw_e(c, c.field);
 	get_neighbour(f_sw_e, c.t == TriangleIndex::D ? Widelands::WALK_SW : Widelands::WALK_E, &f_sw_e);
+=======
+	Widelands::FCoords f_sw_e(c.node);
+	get_neighbour(
+	   f_sw_e, c.t == TriangleIndex::D ? Widelands::WALK_SW : Widelands::WALK_E, &f_sw_e);
+>>>>>>> MERGE-SOURCE
 	if (!is_resource_valid(world, f_sw_e, f_sw_e.field->get_resources())) {
 		clear_resources(f_sw_e);
 	}
 
-	Notifications::publish(NoteFieldTerrainChanged{c, static_cast<MapIndex>(c.field - &fields_[0])});
+	Notifications::publish(
+	   NoteFieldTerrainChanged{c.node, static_cast<MapIndex>(c.node.field - &fields_[0])});
 
 	// Changing the terrain can affect ports, which can be up to 3 fields away.
 	constexpr int kPotentiallyAffectedNeighbors = 3;
-	recalc_for_field_area(world, Area<FCoords>(c, kPotentiallyAffectedNeighbors));
+	recalc_for_field_area(world, Area<FCoords>(c.node, kPotentiallyAffectedNeighbors));
 	return kPotentiallyAffectedNeighbors;
 }
 
 bool Map::is_resource_valid(const Widelands::World& world,
-                            const TCoords<Widelands::FCoords>& c,
+                            const Widelands::FCoords& c,
                             DescriptionIndex curres) {
 	if (curres == Widelands::kNoResource)
 		return true;
 
-	Widelands::FCoords f(c, c.field);
 	Widelands::FCoords f1;
 
 	int32_t count = 0;
 
 	//  this field
-	count += world.terrain_descr(f.field->terrain_r()).is_resource_valid(curres);
-	count += world.terrain_descr(f.field->terrain_d()).is_resource_valid(curres);
+	count += world.terrain_descr(c.field->terrain_r()).is_resource_valid(curres);
+	count += world.terrain_descr(c.field->terrain_d()).is_resource_valid(curres);
 
 	//  If one of the neighbours is impassable, count its resource stronger.
 	//  top left neigbour
-	get_neighbour(f, Widelands::WALK_NW, &f1);
+	get_neighbour(c, Widelands::WALK_NW, &f1);
 	count += world.terrain_descr(f1.field->terrain_r()).is_resource_valid(curres);
 	count += world.terrain_descr(f1.field->terrain_d()).is_resource_valid(curres);
 
 	//  top right neigbour
-	get_neighbour(f, Widelands::WALK_NE, &f1);
+	get_neighbour(c, Widelands::WALK_NE, &f1);
 	count += world.terrain_descr(f1.field->terrain_d()).is_resource_valid(curres);
 
 	//  left neighbour
-	get_neighbour(f, Widelands::WALK_W, &f1);
+	get_neighbour(c, Widelands::WALK_W, &f1);
 	count += world.terrain_descr(f1.field->terrain_r()).is_resource_valid(curres);
 
 	return count > 1;

=== modified file 'src/logic/map.h'
--- src/logic/map.h	2017-08-28 13:37:51 +0000
+++ src/logic/map.h	2017-09-01 09:00:15 +0000
@@ -427,7 +427,7 @@
 	 * To qualify as valid, resources need to be surrounded by at least two matching terrains.
 	 */
 	bool is_resource_valid(const Widelands::World& world,
-	                       const Widelands::TCoords<Widelands::FCoords>& c,
+	                       const Widelands::FCoords& c,
 	                       DescriptionIndex curres);
 
 	// The objectives that are defined in this map if it is a scenario.

=== modified file 'src/logic/maptriangleregion.cc'
--- src/logic/maptriangleregion.cc	2017-08-30 13:35:37 +0000
+++ src/logic/maptriangleregion.cc	2017-09-01 09:00:15 +0000
@@ -23,20 +23,30 @@
 
 template <>
 MapTriangleRegion<>::MapTriangleRegion(const Map& map, Area<TCoords<>> area)
+<<<<<<< TREE
    : radius_is_odd_(area.radius & 1) {
 	assert(area.t == TriangleIndex::R || area.t == TriangleIndex::D);
+=======
+   : radius_is_odd_(area.radius & 1), location_(area) {
+>>>>>>> MERGE-SOURCE
 	const uint16_t radius_plus_1 = area.radius + 1;
 	const uint16_t half_radius_rounded_down = area.radius / 2;
 	row_length_ = radius_plus_1;
 	for (uint32_t i = half_radius_rounded_down; i; --i)
+<<<<<<< TREE
 		map.get_tln(area, &area);
 	if (area.t == TriangleIndex::R) {
 		left_ = area;
+=======
+		map.get_tln(area.node, &area.node);
+	if (area.t == TriangleIndex::R) {
+		left_ = area.node;
+>>>>>>> MERGE-SOURCE
 		if (area.radius) {
 			remaining_rows_in_upper_phase_ = half_radius_rounded_down + 1;
 			remaining_rows_in_lower_phase_ = (area.radius - 1) / 2;
 			if (radius_is_odd_) {
-				map.get_trn(area, &area);
+				map.get_trn(area.node, &area.node);
 				phase_ = Top;
 				row_length_ = area.radius + 2;
 				remaining_in_row_ = radius_plus_1 / 2;
@@ -56,13 +66,13 @@
 		remaining_rows_in_upper_phase_ = radius_plus_1 / 2;
 		remaining_rows_in_lower_phase_ = half_radius_rounded_down;
 		if (radius_is_odd_) {
-			map.get_ln(area, &area);
-			left_ = area;
+			map.get_ln(area.node, &area.node);
+			left_ = area.node;
 			phase_ = Upper;
 			remaining_in_row_ = row_length_ = area.radius + 2;
 			area.t = TriangleIndex::R;
 		} else {
-			map.get_bln(area, &left_);
+			map.get_bln(area.node, &left_);
 			phase_ = Top;
 			row_length_ = area.radius + 3;
 			remaining_in_row_ = half_radius_rounded_down + (0 < area.radius);
@@ -80,7 +90,7 @@
 	switch (phase_) {
 	case Top:
 		if (remaining_in_row_)
-			map.get_rn(location_, &location_);
+			map.get_rn(location_.node, &location_.node);
 		else if (remaining_rows_in_upper_phase_) {
 			phase_ = Upper;
 			remaining_in_row_ = row_length_;
@@ -93,7 +103,11 @@
 			if (location_.t == TriangleIndex::D)
 				location_.t = TriangleIndex::R;
 			else
+<<<<<<< TREE
 				location_ = TCoords<>(map.r_n(location_), TriangleIndex::D);
+=======
+				location_ = TCoords<>(map.r_n(location_.node), TriangleIndex::D);
+>>>>>>> MERGE-SOURCE
 		} else {
 			if (--remaining_rows_in_upper_phase_) {
 				row_length_ += 2;
@@ -119,7 +133,11 @@
 			if (location_.t == TriangleIndex::D)
 				location_.t = TriangleIndex::R;
 			else
+<<<<<<< TREE
 				location_ = TCoords<>(map.r_n(location_), TriangleIndex::D);
+=======
+				location_ = TCoords<>(map.r_n(location_.node), TriangleIndex::D);
+>>>>>>> MERGE-SOURCE
 		} else {
 			if (--remaining_rows_in_lower_phase_) {
 				assert(row_length_ >= 2);
@@ -135,7 +153,7 @@
 		break;
 	case Bottom:
 		if (remaining_in_row_)
-			map.get_rn(location_, &location_);
+			map.get_rn(location_.node, &location_.node);
 		break;
 	}
 	assert(remaining_in_row_ < 10000);  //  Catch wrapping (integer underflow)
@@ -144,20 +162,31 @@
 
 template <>
 MapTriangleRegion<TCoords<FCoords>>::MapTriangleRegion(const Map& map, Area<TCoords<FCoords>> area)
+<<<<<<< TREE
    : radius_is_odd_(area.radius & 1) {
 	assert(area.t == TriangleIndex::R || area.t == TriangleIndex::D);
+=======
+   : radius_is_odd_(area.radius & 1), location_(area) {
+	assert(area.t == TriangleIndex::R || area.t == TriangleIndex::D);
+>>>>>>> MERGE-SOURCE
 	const uint16_t radius_plus_1 = area.radius + 1;
 	const uint16_t half_radius_rounded_down = area.radius / 2;
 	row_length_ = radius_plus_1;
 	for (uint32_t i = half_radius_rounded_down; i; --i)
+<<<<<<< TREE
 		map.get_tln(area, &area);
 	if (area.t == TriangleIndex::R) {
 		left_ = area;
+=======
+		map.get_tln(area.node, &area.node);
+	if (area.t == TriangleIndex::R) {
+		left_ = area.node;
+>>>>>>> MERGE-SOURCE
 		if (area.radius) {
 			remaining_rows_in_upper_phase_ = half_radius_rounded_down + 1;
 			remaining_rows_in_lower_phase_ = (area.radius - 1) / 2;
 			if (radius_is_odd_) {
-				map.get_trn(area, &area);
+				map.get_trn(area.node, &area.node);
 				phase_ = Top;
 				row_length_ = area.radius + 2;
 				remaining_in_row_ = radius_plus_1 / 2;
@@ -176,13 +205,13 @@
 		remaining_rows_in_upper_phase_ = radius_plus_1 / 2;
 		remaining_rows_in_lower_phase_ = half_radius_rounded_down;
 		if (radius_is_odd_) {
-			map.get_ln(area, &area);
-			left_ = area;
+			map.get_ln(area.node, &area.node);
+			left_ = area.node;
 			phase_ = Upper;
 			remaining_in_row_ = row_length_ = area.radius + 2;
 			area.t = TriangleIndex::R;
 		} else {
-			map.get_bln(area, &left_);
+			map.get_bln(area.node, &left_);
 			phase_ = Top;
 			row_length_ = area.radius + 3;
 			remaining_in_row_ = half_radius_rounded_down + (0 < area.radius);
@@ -201,7 +230,7 @@
 	switch (phase_) {
 	case Top:
 		if (remaining_in_row_)
-			map.get_rn(location_, &location_);
+			map.get_rn(location_.node, &location_.node);
 		else if (remaining_rows_in_upper_phase_) {
 			phase_ = Upper;
 			remaining_in_row_ = row_length_;
@@ -214,7 +243,11 @@
 			if (location_.t == TriangleIndex::D)
 				location_.t = TriangleIndex::R;
 			else
+<<<<<<< TREE
 				location_ = TCoords<FCoords>(map.r_n(location_), TriangleIndex::D);
+=======
+				location_ = TCoords<FCoords>(map.r_n(location_.node), TriangleIndex::D);
+>>>>>>> MERGE-SOURCE
 		} else {
 			if (--remaining_rows_in_upper_phase_) {
 				row_length_ += 2;
@@ -240,7 +273,11 @@
 			if (location_.t == TriangleIndex::D)
 				location_.t = TriangleIndex::R;
 			else
+<<<<<<< TREE
 				location_ = TCoords<FCoords>(map.r_n(location_), TriangleIndex::D);
+=======
+				location_ = TCoords<FCoords>(map.r_n(location_.node), TriangleIndex::D);
+>>>>>>> MERGE-SOURCE
 		} else {
 			if (--remaining_rows_in_lower_phase_) {
 				assert(row_length_ >= 2);
@@ -256,7 +293,7 @@
 		break;
 	case Bottom:
 		if (remaining_in_row_)
-			map.get_rn(location_, &location_);
+			map.get_rn(location_.node, &location_.node);
 		break;
 	}
 	assert(remaining_in_row_ < 10000);  //  Catch wrapping (integer underflow)

=== modified file 'src/logic/maptriangleregion.h'
--- src/logic/maptriangleregion.h	2017-08-30 13:35:37 +0000
+++ src/logic/maptriangleregion.h	2017-09-01 09:00:15 +0000
@@ -35,10 +35,13 @@
  * Note that the order in which locations are returned is not guarantueed. (But
  * in fact the triangles are returned row by row from top to bottom and from
  * left to right in each row and I see no reason why that would ever change.)
+<<<<<<< TREE
  *
  * The initial coordinates must refer to a triangle
  * (TriangleIndex::D or TriangleIndex::R). Use MapRegion instead for nodes
  * (TriangleIndex::None).
+=======
+>>>>>>> MERGE-SOURCE
  */
 template <typename CoordsType = TCoords<>, typename RadiusType = uint16_t>
 struct MapTriangleRegion {
@@ -69,8 +72,8 @@
 	     remaining_in_row_(rowwidth_),
 	     remaining_rows_(area_.radius * 2) {
 		for (uint8_t r = area_.radius; r; --r)
-			map.get_tln(area_, &area_);
-		left_ = area_;
+			map.get_tln(area_.node, &area_.node);
+		left_ = area_.node;
 	}
 
 	const TCoords<FCoords>& location() const {
@@ -82,18 +85,35 @@
 			if (area_.t == TriangleIndex::D)
 				area_.t = TriangleIndex::R;
 			else {
+<<<<<<< TREE
 				area_.t = TriangleIndex::D;
 				map.get_rn(area_, &area_);
+=======
+				area_.t = TriangleIndex::D;
+				map.get_rn(area_.node, &area_.node);
+>>>>>>> MERGE-SOURCE
 			}
 		} else if (area_.radius < --remaining_rows_) {
+<<<<<<< TREE
 			map.get_bln(left_, &area_);
 			left_ = area_;
 			area_.t = TriangleIndex::D;
+=======
+			map.get_bln(left_, &area_.node);
+			left_ = area_.node;
+			area_.t = TriangleIndex::D;
+>>>>>>> MERGE-SOURCE
 			remaining_in_row_ = rowwidth_ += 2;
 		} else if (remaining_rows_) {
+<<<<<<< TREE
 			map.get_brn(left_, &area_);
 			left_ = area_;
 			area_.t = TriangleIndex::D;
+=======
+			map.get_brn(left_, &area_.node);
+			left_ = area_.node;
+			area_.t = TriangleIndex::D;
+>>>>>>> MERGE-SOURCE
 			remaining_in_row_ = rowwidth_ -= 2;
 		} else
 			return false;

=== modified file 'src/logic/player.cc'
--- src/logic/player.cc	2017-08-30 13:50:04 +0000
+++ src/logic/player.cc	2017-09-01 09:00:15 +0000
@@ -942,8 +942,7 @@
 		field.border_bl = ((1 | br_vision) && (br_owner_number == field.owner) &&
 		                   ((r_owner_number == field.owner) ^ (bl_owner_number == field.owner)));
 
-		{  //  map_object_descr[TCoords::None]
-
+		{
 			const MapObjectDescr* map_object_descr;
 			field.constructionsite.becomes = nullptr;
 			if (const BaseImmovable* base_immovable = f.field->get_immovable()) {
@@ -963,7 +962,11 @@
 				}
 			} else
 				map_object_descr = nullptr;
+<<<<<<< TREE
 			field.map_object_descr[static_cast<int>(TriangleIndex::None)] = map_object_descr;
+=======
+			field.map_object_descr = map_object_descr;
+>>>>>>> MERGE-SOURCE
 		}
 	}
 	{  //  discover the D triangle and the SW edge of the top right neighbour

=== modified file 'src/logic/player.h'
--- src/logic/player.h	2017-08-16 13:23:15 +0000
+++ src/logic/player.h	2017-09-01 09:00:15 +0000
@@ -209,6 +209,7 @@
 		     roads(0),
 		     owner(0),
 		     time_node_last_unseen(0),
+		     map_object_descr(nullptr),
 		     border(0),
 		     border_r(0),
 		     border_br(0),
@@ -220,9 +221,6 @@
 
 			time_triangle_last_surveyed[0] = never();
 			time_triangle_last_surveyed[1] = never();
-
-			//  Initialized for debug purposes only.
-			map_object_descr[0] = map_object_descr[1] = map_object_descr[2] = nullptr;
 		}
 
 		/// Military influence is exerted by buildings with the help of soldiers.
@@ -377,7 +375,7 @@
 		 * Only valid when the player has seen this node (or maybe a nearby node
 		 * if the immovable is big?). (Roads are not stored here.)
 		 */
-		const MapObjectDescr* map_object_descr[3];
+		const MapObjectDescr* map_object_descr;
 
 		/// Information for constructionsite's animation.
 		/// only valid, if there is a constructionsite on this node
@@ -405,9 +403,7 @@
 		//  time_triangle_last_surveyed[0]  0x040  0x20   0x040  0x20
 		//  time_triangle_last_surveyed[1]  0x060  0x20   0x060  0x20
 		//  time_node_last_unseen           0x080  0x20   0x080  0x20
-		//  map_object_descr[0]             0x0a0  0x20   0x0a0  0x40
-		//  map_object_descr[1]             0x0c0  0x20   0x0e0  0x40
-		//  map_object_descr[2]             0x0e0  0x20   0x120  0x40
+		//  map_object_descr                0x0a0  0x20   0x0a0  0x40
 		//  ConstructionsiteInformation
 		//  border
 		//  border_r

=== modified file 'src/logic/widelands_geometry.h'
--- src/logic/widelands_geometry.h	2017-08-30 13:35:37 +0000
+++ src/logic/widelands_geometry.h	2017-09-01 09:00:15 +0000
@@ -109,19 +109,10 @@
 	}
 	FCoords(const Coords& nc, Field* const nf) : Coords(nc), field(nf) {
 	}
-
-	/**
-	 * Used in RenderTarget::rendermap where this is first called, then the
-	 * coordinates are normalized and after that field is set.
-	 *
-	 * \note You really want to use \ref Map::get_fcoords instead.
-	 */
-	explicit FCoords(const Coords& nc) : Coords(nc), field(nullptr) {
-	}
-
 	Field* field;
 };
 
+<<<<<<< TREE
 enum class TriangleIndex { D, R, None };
 
 // TODO(sirver): This should not derive from CoordsType. Replace with NodeAndTriangle.
@@ -129,34 +120,31 @@
 	TCoords() : t() {
 	}
 	TCoords(const CoordsType C, const TriangleIndex T = TriangleIndex::None) : CoordsType(C), t(T) {
+=======
+enum class TriangleIndex { D, R };
+
+// This uniquely indexes a single Triangle on the map. A Triangle is
+// indentified by its owning node and the triangle index (down or right).
+template <typename CoordsType = Coords> struct TCoords {
+	TCoords(const CoordsType C, const TriangleIndex T) : node(C), t(T) {
+>>>>>>> MERGE-SOURCE
 	}
 
 	bool operator==(const TCoords& other) const {
-		return CoordsType::operator==(other) && t == other.t;
+		return node == other.node && t == other.t;
 	}
 	bool operator!=(const TCoords& other) const {
-		return CoordsType::operator!=(other) || t != other.t;
+		return !(*this == other);
 	}
 
+	CoordsType node;
 	TriangleIndex t;
 };
 
+// A pair of a coord and a triangle, used to signify which field or triangle
+// the cursor is closest. The triangle might belong to another field.
 template <typename NodeCoordsType = Coords, typename TriangleCoordsType = Coords>
 struct NodeAndTriangle {
-	NodeAndTriangle() {
-	}
-	NodeAndTriangle(const NodeCoordsType Node, const TCoords<TriangleCoordsType>& Triangle)
-
-	   : node(Node), triangle(Triangle) {
-	}
-
-	bool operator==(const NodeAndTriangle<>& other) const {
-		return node == other.node && triangle == other.triangle;
-	}
-	bool operator!=(const NodeAndTriangle<>& other) const {
-		return !(*this == other);
-	}
-
 	NodeCoordsType node;
 	TCoords<TriangleCoordsType> triangle;
 };

=== modified file 'src/map_io/map_players_view_packet.cc'
--- src/map_io/map_players_view_packet.cc	2017-08-31 15:22:21 +0000
+++ src/map_io/map_players_view_packet.cc	2017-09-01 09:00:15 +0000
@@ -351,8 +351,12 @@
 									map_object_descr = nullptr;
 						} else
 							map_object_descr = nullptr;
+<<<<<<< TREE
 						f_player_field.map_object_descr[static_cast<int>(TriangleIndex::None)] =
 						   map_object_descr;
+=======
+						f_player_field.map_object_descr = map_object_descr;
+>>>>>>> MERGE-SOURCE
 					}
 
 					{  //  triangles
@@ -555,8 +559,12 @@
 					}
 					MapObjectData mod = read_unseen_immovable(
 					   egbase, imm_kind, node_immovables_file, node_immovables_file_version);
+<<<<<<< TREE
 					f_player_field.map_object_descr[static_cast<int>(TriangleIndex::None)] =
 					   mod.map_object_descr;
+=======
+					f_player_field.map_object_descr = mod.map_object_descr;
+>>>>>>> MERGE-SOURCE
 					f_player_field.constructionsite = mod.csi;
 
 					// Read in whether this field had a border the last time it was seen
@@ -595,8 +603,12 @@
 								map_object_descr = nullptr;
 					} else
 						map_object_descr = nullptr;
+<<<<<<< TREE
 					f_player_field.map_object_descr[static_cast<int>(TriangleIndex::None)] =
 					   map_object_descr;
+=======
+					f_player_field.map_object_descr = map_object_descr;
+>>>>>>> MERGE-SOURCE
 					break;
 				}
 
@@ -606,7 +618,10 @@
 					//  information about the triangle has not been saved. Fill in
 					//  the information from the game state.
 					f_player_field.terrains.d = f.field->terrain_d();
+<<<<<<< TREE
 					f_player_field.map_object_descr[static_cast<int>(TriangleIndex::D)] = nullptr;
+=======
+>>>>>>> MERGE-SOURCE
 				} else if (f_everseen | bl_everseen | br_everseen) {
 					//  The player has seen the D triangle but does not see it now.
 					//  Load his information about the triangle from file.
@@ -624,17 +639,27 @@
 						                            triangle_immovable_kinds_file_version,
 						                            kCurrentPacketVersionImmovableKinds);
 					}
-					MapObjectData mod = read_unseen_immovable(
+					// We read and ignore the immovable information on the D
+					// triangle. This was done because there were vague plans of
+					// suporting immovables on the triangles instead as on the
+					// nodes.
+					read_unseen_immovable(
 					   egbase, im_kind, triangle_immovables_file, triangle_immovables_file_version);
+<<<<<<< TREE
 					f_player_field.map_object_descr[static_cast<int>(TriangleIndex::D)] =
 					   mod.map_object_descr;
+=======
+>>>>>>> MERGE-SOURCE
 				}
 				if (f_seen | br_seen | r_seen) {
 					//  The player currently sees the R triangle. Therefore his
 					//  information about the triangle has not been saved. Fill in
 					//  the information from the game state.
 					f_player_field.terrains.r = f.field->terrain_r();
+<<<<<<< TREE
 					f_player_field.map_object_descr[static_cast<int>(TriangleIndex::R)] = nullptr;
+=======
+>>>>>>> MERGE-SOURCE
 				} else if (f_everseen | br_everseen | r_everseen) {
 					//  The player has seen the R triangle but does not see it now.
 					//  Load his information about the triangle from file.
@@ -652,10 +677,17 @@
 						                            triangle_immovable_kinds_file_version,
 						                            kCurrentPacketVersionImmovableKinds);
 					}
-					MapObjectData mod = read_unseen_immovable(
+					// We read and ignore the immovable information on the D
+					// triangle. This was done because there were vague plans of
+					// suporting immovables on the triangles instead as on the
+					// nodes.
+					read_unseen_immovable(
 					   egbase, im_kind, triangle_immovables_file, triangle_immovables_file_version);
+<<<<<<< TREE
 					f_player_field.map_object_descr[static_cast<int>(TriangleIndex::R)] =
 					   mod.map_object_descr;
+=======
+>>>>>>> MERGE-SOURCE
 				}
 
 				{  //  edges
@@ -902,8 +934,12 @@
 						assert(f_player_field.owner < 0x20);
 						owners_file.unsigned_8(f_player_field.owner);
 						MapObjectData mod;
+<<<<<<< TREE
 						mod.map_object_descr =
 						   f_player_field.map_object_descr[static_cast<int>(TriangleIndex::None)];
+=======
+						mod.map_object_descr = f_player_field.map_object_descr;
+>>>>>>> MERGE-SOURCE
 						mod.csi = f_player_field.constructionsite;
 						write_unseen_immovable(&mod, node_immovable_kinds_file, node_immovables_file);
 
@@ -923,8 +959,12 @@
 					   (!bl_seen & !br_seen & (f_everseen | bl_everseen | br_everseen)) {
 						terrains_file.unsigned_8(f_player_field.terrains.d);
 						MapObjectData mod;
+<<<<<<< TREE
 						mod.map_object_descr =
 						   f_player_field.map_object_descr[static_cast<int>(TriangleIndex::D)];
+=======
+						mod.map_object_descr = nullptr;
+>>>>>>> MERGE-SOURCE
 						write_unseen_immovable(
 						   &mod, triangle_immovable_kinds_file, triangle_immovables_file);
 					}
@@ -934,8 +974,12 @@
 					   (!br_seen & !r_seen & (f_everseen | br_everseen | r_everseen)) {
 						terrains_file.unsigned_8(f_player_field.terrains.r);
 						MapObjectData mod;
+<<<<<<< TREE
 						mod.map_object_descr =
 						   f_player_field.map_object_descr[static_cast<int>(TriangleIndex::R)];
+=======
+						mod.map_object_descr = nullptr;
+>>>>>>> MERGE-SOURCE
 						write_unseen_immovable(
 						   &mod, triangle_immovable_kinds_file, triangle_immovables_file);
 					}

=== modified file 'src/scripting/lua_map.cc'
--- src/scripting/lua_map.cc	2017-08-31 15:22:21 +0000
+++ src/scripting/lua_map.cc	2017-09-01 09:00:15 +0000
@@ -5972,7 +5972,12 @@
 	if (td == static_cast<DescriptionIndex>(-1))
 		report_error(L, "Unknown terrain '%s'", name);
 
+<<<<<<< TREE
 	egbase.mutable_map()->change_terrain(world, TCoords<FCoords>(fcoords(L), TriangleIndex::R), td);
+=======
+	egbase.mutable_map()->change_terrain(
+	   world, TCoords<FCoords>(fcoords(L), TriangleIndex::R), td);
+>>>>>>> MERGE-SOURCE
 
 	lua_pushstring(L, name);
 	return 1;
@@ -5991,7 +5996,12 @@
 	if (td == static_cast<DescriptionIndex>(INVALID_INDEX))
 		report_error(L, "Unknown terrain '%s'", name);
 
+<<<<<<< TREE
 	egbase.mutable_map()->change_terrain(world, TCoords<FCoords>(fcoords(L), TriangleIndex::D), td);
+=======
+	egbase.mutable_map()->change_terrain(
+	   world, TCoords<FCoords>(fcoords(L), TriangleIndex::D), td);
+>>>>>>> MERGE-SOURCE
 
 	lua_pushstring(L, name);
 	return 1;

=== modified file 'src/scripting/lua_ui.cc'
--- src/scripting/lua_ui.cc	2017-08-19 20:55:57 +0000
+++ src/scripting/lua_ui.cc	2017-09-01 09:00:15 +0000
@@ -578,8 +578,10 @@
 	const auto field = *get_user_class<LuaMaps::LuaField>(L, 2);
 	get()->map_view()->mouse_to_field(field->coords(), MapView::Transition::Jump);
 
-	Widelands::NodeAndTriangle<> node_and_triangle;
-	node_and_triangle.node = field->coords();
+	// We fake the triangle here, since we only support clicking on Nodes from
+	// Lua.
+	Widelands::NodeAndTriangle<> node_and_triangle{
+	   field->coords(), Widelands::TCoords<>(field->coords(), Widelands::TriangleIndex::D)};
 	get()->map_view()->field_clicked(node_and_triangle);
 	return 0;
 }

=== modified file 'src/wui/game_debug_ui.cc'
--- src/wui/game_debug_ui.cc	2017-08-30 13:50:04 +0000
+++ src/wui/game_debug_ui.cc	2017-09-01 09:00:15 +0000
@@ -310,10 +310,13 @@
 			break;
 		case 1: {
 			std::string animation_name = "(no animation)";
+<<<<<<< TREE
 			if (player_field.map_object_descr[static_cast<int>(Widelands::TriangleIndex::None)]) {
+=======
+			if (player_field.map_object_descr) {
+>>>>>>> MERGE-SOURCE
 				animation_name = "(seen an animation)";
 			}
-
 			str += (boost::format("  last seen at %u:\n"
 			                      "    owner: %u\n"
 			                      "    immovable animation:\n%s\n"

=== modified file 'src/wui/interactive_base.cc'
--- src/wui/interactive_base.cc	2017-08-31 15:22:21 +0000
+++ src/wui/interactive_base.cc	2017-09-01 09:00:15 +0000
@@ -162,12 +162,16 @@
 
 	//  register sel overlay position
 	if (sel_.triangles) {
+<<<<<<< TREE
 		assert(center.triangle.t == Widelands::TriangleIndex::D ||
 		       center.triangle.t == Widelands::TriangleIndex::R);
+=======
+		assert(center.triangle.t == Widelands::TriangleIndex::D || center.triangle.t == Widelands::TriangleIndex::R);
+>>>>>>> MERGE-SOURCE
 		Widelands::MapTriangleRegion<> mr(map, Area<TCoords<>>(center.triangle, sel_.radius));
 		do
 			field_overlay_manager_->register_overlay(
-			   mr.location(), sel_.pic, OverlayLevel::kSelection, Vector2i::invalid(), jobid);
+			   mr.location().node, sel_.pic, OverlayLevel::kSelection, Vector2i::invalid(), jobid);
 		while (mr.advance(map));
 	} else {
 		Widelands::MapRegion<> mr(map, Area<>(center.node, sel_.radius));

=== modified file 'src/wui/interactive_base.h'
--- src/wui/interactive_base.h	2017-09-01 00:16:04 +0000
+++ src/wui/interactive_base.h	2017-09-01 09:00:15 +0000
@@ -229,9 +229,16 @@
 	struct SelData {
 		SelData(const bool Freeze = false,
 		        const bool Triangles = false,
+<<<<<<< TREE
 		        const Widelands::NodeAndTriangle<>& Pos = Widelands::NodeAndTriangle<>(
 		           Widelands::Coords(0, 0),
 		           Widelands::TCoords<>(Widelands::Coords(0, 0), Widelands::TriangleIndex::D)),
+=======
+		        const Widelands::NodeAndTriangle<>& Pos =
+		           Widelands::NodeAndTriangle<>{
+		              Widelands::Coords(0, 0),
+		              Widelands::TCoords<>(Widelands::Coords(0, 0), Widelands::TriangleIndex::D)},
+>>>>>>> MERGE-SOURCE
 		        const uint32_t Radius = 0,
 		        const Image* Pic = nullptr,
 		        const FieldOverlayManager::OverlayId Jobid = 0)

=== modified file 'src/wui/interactive_player.cc'
--- src/wui/interactive_player.cc	2017-08-30 13:50:04 +0000
+++ src/wui/interactive_player.cc	2017-09-01 09:00:15 +0000
@@ -125,6 +125,7 @@
                                                 const Widelands::Player::Field& player_field,
                                                 const float scale,
                                                 RenderTarget* dst) {
+<<<<<<< TREE
 	if (const Widelands::MapObjectDescr* const map_object_descr =
 	       player_field.map_object_descr[static_cast<int>(Widelands::TriangleIndex::None)]) {
 		if (player_field.constructionsite.becomes) {
@@ -180,19 +181,74 @@
 			} catch (Widelands::MapObjectDescr::AnimationNonexistent&) {
 				pic = building->get_animation("idle");
 			}
+=======
+	if (player_field.map_object_descr == nullptr) {
+		return;
+	}
+	if (player_field.constructionsite.becomes) {
+		assert(field.owner != nullptr);
+		const Widelands::ConstructionsiteInformation& csinf = player_field.constructionsite;
+		// draw the partly finished constructionsite
+		uint32_t anim_idx;
+		try {
+			anim_idx = csinf.becomes->get_animation("build");
+		} catch (Widelands::MapObjectDescr::AnimationNonexistent&) {
+			try {
+				anim_idx = csinf.becomes->get_animation("unoccupied");
+			} catch (Widelands::MapObjectDescr::AnimationNonexistent) {
+				anim_idx = csinf.becomes->get_animation("idle");
+			}
+		}
+		const Animation& anim = g_gr->animations().get_animation(anim_idx);
+		const size_t nr_frames = anim.nr_frames();
+		uint32_t cur_frame = csinf.totaltime ? csinf.completedtime * nr_frames / csinf.totaltime : 0;
+		uint32_t tanim = cur_frame * FRAME_LENGTH;
+
+		uint32_t percent = 100 * csinf.completedtime * nr_frames;
+		if (csinf.totaltime) {
+			percent /= csinf.totaltime;
+		}
+		percent -= 100 * cur_frame;
+
+		if (cur_frame) {  // not the first frame
+			// Draw the prev frame
+			dst->blit_animation(field.rendertarget_pixel, scale, anim_idx, tanim - FRAME_LENGTH,
+			                    field.owner->get_playercolor());
+		} else if (csinf.was) {
+			// Is the first frame, but there was another building here before,
+			// get its last build picture and draw it instead.
+			uint32_t a;
+			try {
+				a = csinf.was->get_animation("unoccupied");
+			} catch (Widelands::MapObjectDescr::AnimationNonexistent&) {
+				a = csinf.was->get_animation("idle");
+			}
+			dst->blit_animation(field.rendertarget_pixel, scale, a, tanim - FRAME_LENGTH,
+			                    field.owner->get_playercolor());
+		}
+		dst->blit_animation(
+		   field.rendertarget_pixel, scale, anim_idx, tanim, field.owner->get_playercolor(), percent);
+	} else if (upcast(const Widelands::BuildingDescr, building, player_field.map_object_descr)) {
+		assert(field.owner != nullptr);
+		// this is a building therefore we either draw unoccupied or idle animation
+		uint32_t pic;
+		try {
+			pic = building->get_animation("unoccupied");
+		} catch (Widelands::MapObjectDescr::AnimationNonexistent&) {
+			pic = building->get_animation("idle");
+		}
+		dst->blit_animation(field.rendertarget_pixel, scale, pic, 0, field.owner->get_playercolor());
+	} else if (player_field.map_object_descr->type() == Widelands::MapObjectType::FLAG) {
+		assert(field.owner != nullptr);
+		dst->blit_animation(field.rendertarget_pixel, scale, field.owner->tribe().flag_animation(), 0,
+		                    field.owner->get_playercolor());
+	} else if (const uint32_t pic = player_field.map_object_descr->main_animation()) {
+		if (field.owner != nullptr) {
+>>>>>>> MERGE-SOURCE
 			dst->blit_animation(
 			   field.rendertarget_pixel, scale, pic, 0, field.owner->get_playercolor());
-		} else if (map_object_descr->type() == Widelands::MapObjectType::FLAG) {
-			assert(field.owner != nullptr);
-			dst->blit_animation(field.rendertarget_pixel, scale, field.owner->tribe().flag_animation(),
-			                    0, field.owner->get_playercolor());
-		} else if (const uint32_t pic = map_object_descr->main_animation()) {
-			if (field.owner != nullptr) {
-				dst->blit_animation(
-				   field.rendertarget_pixel, scale, pic, 0, field.owner->get_playercolor());
-			} else {
-				dst->blit_animation(field.rendertarget_pixel, scale, pic, 0);
-			}
+		} else {
+			dst->blit_animation(field.rendertarget_pixel, scale, pic, 0);
 		}
 	}
 }
@@ -284,9 +340,13 @@
 					//  fieldaction window before entering roadbuilding mode here.
 					fieldaction_.destroy();
 					map_view()->mouse_to_field(flag_to_connect_, MapView::Transition::Jump);
-					set_sel_pos(Widelands::NodeAndTriangle<>(
+					set_sel_pos(Widelands::NodeAndTriangle<>{
 					   flag_to_connect_,
+<<<<<<< TREE
 					   Widelands::TCoords<>(flag_to_connect_, Widelands::TriangleIndex::D)));
+=======
+					   Widelands::TCoords<>(flag_to_connect_, Widelands::TriangleIndex::D)});
+>>>>>>> MERGE-SOURCE
 					start_build_road(flag_to_connect_, field.get_owned_by());
 				}
 			flag_to_connect_ = Widelands::Coords::null();

=== modified file 'src/wui/mapviewpixelfunctions.cc'
--- src/wui/mapviewpixelfunctions.cc	2017-08-30 13:35:37 +0000
+++ src/wui/mapviewpixelfunctions.cc	2017-09-01 09:00:15 +0000
@@ -118,7 +118,7 @@
 		x -= map_end_screen_x;
 	while (y >= map_end_screen_y)
 		y -= map_end_screen_y;
-	NodeAndTriangle<> result;
+	Coords result_node;
 
 	const uint16_t col_number = x / (kTriangleWidth / 2);
 	uint16_t row_number = y / kTriangleHeight, next_row_number;
@@ -172,11 +172,14 @@
 		}
 		if (upper_screen_dx * upper_screen_dx + upper_screen_dy * upper_screen_dy <
 		    lower_screen_dx * lower_screen_dx + lower_screen_dy * lower_screen_dy)
-			result.node = Coords(upper_x, row_number);
+			result_node = Coords(upper_x, row_number);
 		else
-			result.node = Coords(lower_x, next_row_number);
+			result_node = Coords(lower_x, next_row_number);
 	}
 
+	// This will be overwritten in all cases below.
+	TCoords<> result_triangle(Coords::null(), TriangleIndex::D);
+
 	//  Find out which of the 4 possible triangles (x, y) is in.
 	if (slash) {
 		int32_t Y_a =
@@ -190,15 +193,25 @@
 		assert(pdx > 0);
 		if (pdy * kTriangleWidth > ldy * pdx) {
 			//  (x, y) is in the upper triangle.
+<<<<<<< TREE
 			result.triangle = TCoords<>(
 			   Coords(left_col, (row_number == 0 ? mapheight : row_number) - 1), TriangleIndex::D);
+=======
+			result_triangle = TCoords<>(
+			   Coords(left_col, (row_number == 0 ? mapheight : row_number) - 1), TriangleIndex::D);
+>>>>>>> MERGE-SOURCE
 		} else {
 			Y_a = screen_y_base - map[Coords(left_col, next_row_number)].get_height() * kHeightFactor;
 			ldy = Y_b - Y_a;
 			if (pdy * (kTriangleWidth / 2) > ldy * pdx) {
 				//  (x, y) is in the second triangle.
+<<<<<<< TREE
 				result.triangle = TCoords<>(
 				   Coords((right_col == 0 ? mapwidth : right_col) - 1, row_number), TriangleIndex::R);
+=======
+				result_triangle = TCoords<>(
+				   Coords((right_col == 0 ? mapwidth : right_col) - 1, row_number), TriangleIndex::R);
+>>>>>>> MERGE-SOURCE
 			} else {
 				Y_b = screen_y_base -
 				      map[Coords(left_col + 1 == mapwidth ? 0 : left_col + 1, next_row_number)]
@@ -209,10 +222,18 @@
 				pdx = (col_number + 2) * (kTriangleWidth / 2) - x;
 				if (pdy * kTriangleWidth > ldy * pdx) {
 					//  (x, y) is in the third triangle.
+<<<<<<< TREE
 					result.triangle = TCoords<>(Coords(right_col, row_number), TriangleIndex::D);
+=======
+					result_triangle = TCoords<>(Coords(right_col, row_number), TriangleIndex::D);
+>>>>>>> MERGE-SOURCE
 				} else {
 					//  (x, y) is in the lower triangle.
+<<<<<<< TREE
 					result.triangle = TCoords<>(Coords(left_col, next_row_number), TriangleIndex::R);
+=======
+					result_triangle = TCoords<>(Coords(left_col, next_row_number), TriangleIndex::R);
+>>>>>>> MERGE-SOURCE
 				}
 			}
 		}
@@ -228,8 +249,13 @@
 		assert(pdx > 0);
 		if (pdy * kTriangleWidth > ldy * pdx) {
 			//  (x, y) is in the upper triangle.
+<<<<<<< TREE
 			result.triangle = TCoords<>(
 			   Coords(right_col, (row_number == 0 ? mapheight : row_number) - 1), TriangleIndex::D);
+=======
+			result_triangle = TCoords<>(
+			   Coords(right_col, (row_number == 0 ? mapheight : row_number) - 1), TriangleIndex::D);
+>>>>>>> MERGE-SOURCE
 		} else {
 			Y_b = screen_y_base - map[Coords(right_col, next_row_number)].get_height() * kHeightFactor;
 			ldy = Y_b - Y_a;
@@ -237,7 +263,11 @@
 			pdx = (col_number + 1) * (kTriangleWidth / 2) - x;
 			if (pdy * (kTriangleWidth / 2) > ldy * pdx) {
 				//  (x, y) is in the second triangle.
+<<<<<<< TREE
 				result.triangle = TCoords<>(Coords(left_col, row_number), TriangleIndex::R);
+=======
+				result_triangle = TCoords<>(Coords(left_col, row_number), TriangleIndex::R);
+>>>>>>> MERGE-SOURCE
 			} else {
 				Y_a = screen_y_base -
 				      map[Coords((right_col == 0 ? mapwidth : right_col) - 1, next_row_number)]
@@ -246,18 +276,22 @@
 				ldy = Y_b - Y_a;
 				if (pdy * kTriangleWidth > ldy * pdx) {
 					//  (x, y) is in the third triangle.
+<<<<<<< TREE
 					result.triangle = TCoords<>(Coords(left_col, row_number), TriangleIndex::D);
+=======
+					result_triangle = TCoords<>(Coords(left_col, row_number), TriangleIndex::D);
+>>>>>>> MERGE-SOURCE
 				} else {
 					//  (x, y) is in the lower triangle.
-					result.triangle =
+					result_triangle =
 					   TCoords<>(Coords((right_col == 0 ? mapwidth : right_col) - 1, next_row_number),
 					             TriangleIndex::R);
 				}
 			}
 		}
 	}
-
-	return result;
+	assert(result_triangle.node != Coords::null());
+	return NodeAndTriangle<>{result_node, result_triangle};
 }
 
 /**

_______________________________________________
Mailing list: https://launchpad.net/~widelands-dev
Post to     : widelands-dev@lists.launchpad.net
Unsubscribe : https://launchpad.net/~widelands-dev
More help   : https://help.launchpad.net/ListHelp

Reply via email to