From b09973efd06ec245fb799662b6ded570a34260e1 Mon Sep 17 00:00:00 2001 From: mcliquid Date: Tue, 10 Feb 2026 20:58:50 +0100 Subject: [PATCH 1/4] Add quest to specify whether a ferry requires payment --- .../streetcomplete/quests/QuestsModule.kt | 2 + .../quests/ferry/AddFerryToll.kt | 64 +++++++++++++++++++ app/src/androidMain/res/values/strings.xml | 1 + 3 files changed, 67 insertions(+) create mode 100644 app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/ferry/AddFerryToll.kt diff --git a/app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/QuestsModule.kt b/app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/QuestsModule.kt index 7f812c6600d..1be5568fda1 100644 --- a/app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/QuestsModule.kt +++ b/app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/QuestsModule.kt @@ -89,6 +89,7 @@ import de.westnordost.streetcomplete.quests.drinking_water_type.AddDrinkingWater import de.westnordost.streetcomplete.quests.existence.CheckExistence import de.westnordost.streetcomplete.quests.ferry.AddFerryAccessMotorVehicle import de.westnordost.streetcomplete.quests.ferry.AddFerryAccessPedestrian +import de.westnordost.streetcomplete.quests.ferry.AddFerryToll import de.westnordost.streetcomplete.quests.fire_hydrant.AddFireHydrantType import de.westnordost.streetcomplete.quests.fire_hydrant_diameter.AddFireHydrantDiameter import de.westnordost.streetcomplete.quests.fire_hydrant_position.AddFireHydrantPosition @@ -455,6 +456,7 @@ fun questTypeRegistry( // ferry: usually visible from looking at the boat, but not always... 101 to AddFerryAccessPedestrian(), 102 to AddFerryAccessMotorVehicle(), + 195 to AddFerryToll(), // aerial way: usually visible from looking at the aerial way, but not always... 184 to AddAerialwayBicycleAccess(), diff --git a/app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/ferry/AddFerryToll.kt b/app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/ferry/AddFerryToll.kt new file mode 100644 index 00000000000..1ae3f484ec5 --- /dev/null +++ b/app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/ferry/AddFerryToll.kt @@ -0,0 +1,64 @@ +package de.westnordost.streetcomplete.quests.ferry + +import de.westnordost.streetcomplete.R +import de.westnordost.streetcomplete.data.elementfilter.toElementFilterExpression +import de.westnordost.streetcomplete.data.osm.geometry.ElementGeometry +import de.westnordost.streetcomplete.data.osm.mapdata.Element +import de.westnordost.streetcomplete.data.osm.mapdata.MapDataWithGeometry +import de.westnordost.streetcomplete.data.osm.mapdata.Way +import de.westnordost.streetcomplete.data.osm.mapdata.filter +import de.westnordost.streetcomplete.data.osm.osmquests.OsmElementQuestType +import de.westnordost.streetcomplete.data.quest.AndroidQuest +import de.westnordost.streetcomplete.data.user.achievements.EditTypeAchievement.RARE +import de.westnordost.streetcomplete.osm.Tags +import de.westnordost.streetcomplete.quests.YesNoQuestForm +import de.westnordost.streetcomplete.util.ktx.toYesNo + +class AddFerryToll : OsmElementQuestType, AndroidQuest { + + private val filter by lazy { + """ + ways, relations with + route = ferry + and !toll + and !fee + and toll !~ ".+" + and fee !~ ".+" + """.toElementFilterExpression() + } + + override val changesetComment = "Specify whether a ferry requires payment" + override val wikiLink = "Key:toll" + override val icon = R.drawable.quest_ferry + override val hasMarkersAtEnds = true + override val achievements = listOf(RARE) + + override fun getTitle(tags: Map) = + R.string.quest_ferry_toll_title + + override fun createForm() = YesNoQuestForm() + + override fun applyAnswerTo( + answer: Boolean, + tags: Tags, + geometry: ElementGeometry, + timestampEdited: Long + ) { + tags["toll"] = answer.toYesNo() + } + + override fun getApplicableElements(mapData: MapDataWithGeometry): Iterable { + // same logic as other ferry access quests + val wayIdsInFerryRoutes = wayIdsInFerryRoutes(mapData.relations) + return mapData + .filter(filter) + .filter { it !is Way || it.id !in wayIdsInFerryRoutes } + .asIterable() + } + + override fun isApplicableTo(element: Element): Boolean? { + if (!filter.matches(element)) return false + if (element is Way) return null + return true + } +} diff --git a/app/src/androidMain/res/values/strings.xml b/app/src/androidMain/res/values/strings.xml index 7faad547e69..179bcb27ad4 100644 --- a/app/src/androidMain/res/values/strings.xml +++ b/app/src/androidMain/res/values/strings.xml @@ -1143,6 +1143,7 @@ A level counts as a roof level when its windows are in the roof. Subsequently, r Does this ferry route transport pedestrians? Does this ferry route transport motor vehicles? + Do you generally have to pay to use this ferry? What diameter is specified on the sign for this fire hydrant? This diameter looks implausible, it is usually between %1$d and %2$d. From dbf060c75365cc9c8dded5a742f2893ae05976da Mon Sep 17 00:00:00 2001 From: mcliquid Date: Tue, 10 Feb 2026 21:06:07 +0100 Subject: [PATCH 2/4] Adding icon --- .../quests/ferry/AddFerryToll.kt | 2 +- .../main/res/drawable/ic_quest_ferry_fee.xml | 50 +++++++++++++++++++ res/graphics/quest/ferry_fee.svg | 18 +++++++ 3 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 app/src/main/res/drawable/ic_quest_ferry_fee.xml create mode 100644 res/graphics/quest/ferry_fee.svg diff --git a/app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/ferry/AddFerryToll.kt b/app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/ferry/AddFerryToll.kt index 1ae3f484ec5..e48adfb1e96 100644 --- a/app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/ferry/AddFerryToll.kt +++ b/app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/ferry/AddFerryToll.kt @@ -29,7 +29,7 @@ class AddFerryToll : OsmElementQuestType, AndroidQuest { override val changesetComment = "Specify whether a ferry requires payment" override val wikiLink = "Key:toll" - override val icon = R.drawable.quest_ferry + override val icon = R.drawable.ic_quest_ferry_fee override val hasMarkersAtEnds = true override val achievements = listOf(RARE) diff --git a/app/src/main/res/drawable/ic_quest_ferry_fee.xml b/app/src/main/res/drawable/ic_quest_ferry_fee.xml new file mode 100644 index 00000000000..3317e1c0a15 --- /dev/null +++ b/app/src/main/res/drawable/ic_quest_ferry_fee.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + diff --git a/res/graphics/quest/ferry_fee.svg b/res/graphics/quest/ferry_fee.svg new file mode 100644 index 00000000000..a356ecd8484 --- /dev/null +++ b/res/graphics/quest/ferry_fee.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + From 81bb033b094eb074fbae4bd5317d7875e84b584f Mon Sep 17 00:00:00 2001 From: mcliquid Date: Wed, 11 Feb 2026 21:15:14 +0100 Subject: [PATCH 3/4] remove filter for sub keys --- .../de/westnordost/streetcomplete/quests/ferry/AddFerryToll.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/ferry/AddFerryToll.kt b/app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/ferry/AddFerryToll.kt index e48adfb1e96..7e752d2ec79 100644 --- a/app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/ferry/AddFerryToll.kt +++ b/app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/ferry/AddFerryToll.kt @@ -22,8 +22,6 @@ class AddFerryToll : OsmElementQuestType, AndroidQuest { route = ferry and !toll and !fee - and toll !~ ".+" - and fee !~ ".+" """.toElementFilterExpression() } From 06c60204be63cdcd10133534ee4a45dc943bff26 Mon Sep 17 00:00:00 2001 From: mcliquid Date: Thu, 12 Feb 2026 20:02:50 +0100 Subject: [PATCH 4/4] Update wiki link for ferry toll quest --- .../de/westnordost/streetcomplete/quests/ferry/AddFerryToll.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/ferry/AddFerryToll.kt b/app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/ferry/AddFerryToll.kt index 7e752d2ec79..7d5acc3b5c6 100644 --- a/app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/ferry/AddFerryToll.kt +++ b/app/src/androidMain/kotlin/de/westnordost/streetcomplete/quests/ferry/AddFerryToll.kt @@ -26,7 +26,7 @@ class AddFerryToll : OsmElementQuestType, AndroidQuest { } override val changesetComment = "Specify whether a ferry requires payment" - override val wikiLink = "Key:toll" + override val wikiLink = "Tag:route=ferry" override val icon = R.drawable.ic_quest_ferry_fee override val hasMarkersAtEnds = true override val achievements = listOf(RARE)