#
# A variant of fastbike with a slightly different treatment
# of trunks and motorway-bike-access. This seems to be more
# suitable for some countries like Japan or Australia
#
# In standard fastbike (tested for Europe), trunks are
# strongly avoided even if there's no bike restriction
# (assuming implicit bicycle=no), and motorways are not allowed
# even with bicycle=yes).
#
# This version here has more formal access rules.

---context:global   # following code refers to global config

# Use the following switches to change behaviour
# (1=yes, 0=no):

assign   consider_elevation   1   # set to 0 to ignore elevation in routing
assign   allow_steps          1   # set to 0 to disallow steps
assign   allow_ferries        1   # set to 0 to disallow ferries
assign   ignore_cycleroutes   0   # set to 1 for better elevation results
assign   stick_to_cycleroutes 0   # set to 1 to just follow cycleroutes
assign   avoid_unsafe         0   # set to 1 to avoid standard highways
assign   turnInstructionMode  1   # 0=none, 1=auto-choose, 2=locus-style, 3=osmand-style

assign   validForBikes        1

# the elevation parameters

assign downhillcost switch consider_elevation 60 0
assign downhillcutoff 1.5
assign uphillcost 0
assign uphillcutoff 1.5

---context:way   # following code refers to way-tags

assign any_cycleroute or route_bicycle_icn=yes or route_bicycle_ncn=yes or route_bicycle_rcn=yes route_bicycle_lcn=yes
assign nodeaccessgranted or any_cycleroute lcn=yes

assign ispaved or surface=paved or surface=asphalt or surface=concrete surface=paving_stones
assign isunpaved not or surface= or ispaved or surface=fine_gravel surface=cobblestone

assign turncost 90

assign initialcost switch route=ferry 10000 0

#
# implicit access here just from the motorroad tag
# (implicit access rules from highway tag handled elsewhere)
#
assign defaultaccess =
       if access= then
       (
         if motorroad=yes then false
         else if highway=motorway|motorway_link then false
         else true
       )
       else if access=private|no then false
       else true
#
# calculate logical bike access
#
assign bikeaccess
       or any_cycleroute
          switch bicycle=
                 switch bicycle_road=yes
                    1
                    switch vehicle=
                           defaultaccess
                           switch or vehicle=private vehicle=no
                                  0
                                  1
                 not or bicycle=private or bicycle=no bicycle=dismount

#
# calculate logical foot access
#
assign footaccess
       or bikeaccess
          or bicycle=dismount
             switch foot=
                    defaultaccess
                    not or foot=private foot=no

#
# if not bike-, but foot-acess, just a moderate penalty,
# otherwise access is forbidden
#
assign accesspenalty
       switch bikeaccess
              0
              switch footaccess
                     6
                     100000

#
# handle one-ways. On primary roads, wrong-oneways should
# be close to forbidden, while on other ways we just add
# 6 to the costfactor (making it at least 7 - you are allowed
# to push your bike)
#
assign badoneway =
       if reversedirection=yes then
         if oneway:bicycle=yes then true
         else if oneway= then junction=roundabout
         else oneway=yes|true|1
       else oneway=-1

assign onewaypenalty =
       if ( badoneway ) then
       (
         if ( cycleway=opposite|opposite_lane|opposite_track ) then 0
         else if ( oneway:bicycle=no                         ) then 0
         else if ( highway=primary|primary_link              ) then 50
         else if ( highway=secondary|secondary_link          ) then 30
         else if ( highway=tertiary|tertiary_link            ) then 20
         else 6.0
       )
       else 0.0

assign isresidentialorliving = or highway=residential|living_street living_street=yes

assign costfactor

  switch and highway= not route=ferry  10000
  switch or highway=proposed highway=abandoned 10000

  min 9999
  add max onewaypenalty accesspenalty

  switch or highway=motorway highway=motorway_link    1.5
  switch or highway=trunk highway=trunk_link          1.5
  switch or highway=primary highway=primary_link      1.2
  switch or highway=secondary highway=secondary_link  1.1
  switch or highway=tertiary highway=tertiary_link    1.0
  switch    highway=unclassified                      1.1
  switch    highway=pedestrian                        10
  switch    highway=steps                             1000
  switch    route=ferry                               5.67
  switch    highway=bridleway                         5
  switch    highway=cycleway                          1.3
  switch    isresidentialorliving switch isunpaved 10 1.2
  switch    highway=service                           switch isunpaved 10 1.2
  switch or highway=track or highway=road or highway=path highway=footway
   switch tracktype=grade1 switch isunpaved 3 1.2
   switch tracktype=grade2 switch isunpaved 10 3
   switch tracktype=grade3 10.0
   switch tracktype=grade4 20.0
   switch tracktype=grade5 30.0
   switch or bicycle=designated bicycle_road=yes 2.0
   switch ispaved 2.0 100.0
   10.0

# way priorities used for voice hint generation

assign priorityclassifier =

  if      ( highway=motorway                       ) then  30
  else if ( highway=motorway_link                  ) then  29
  else if ( highway=trunk                          ) then  28
  else if ( highway=trunk_link                     ) then  27
  else if ( highway=primary                        ) then  26
  else if ( highway=primary_link                   ) then  25
  else if ( highway=secondary                      ) then  24
  else if ( highway=secondary_link                 ) then  23
  else if ( highway=tertiary                       ) then  22
  else if ( highway=tertiary_link                  ) then  21
  else if ( highway=unclassified                   ) then  20
  else if ( isresidentialorliving                  ) then  6
  else if ( highway=service                        ) then  6
  else if ( highway=cycleway                       ) then  6
  else if ( or bicycle=designated bicycle_road=yes ) then  6
  else if ( highway=track                          ) then if tracktype=grade1 then 6 else 4
  else if ( highway=bridleway|road|path|footway    ) then  4
  else if ( highway=steps                          ) then  2
  else if ( highway=pedestrian                     ) then  2
  else 0


# some more classifying bits used for voice hint generation...

assign isbadoneway = not equal onewaypenalty 0
assign isgoodoneway = if reversedirection=yes then oneway=-1
                      else if oneway= then junction=roundabout else oneway=yes|true|1
assign isroundabout = junction=roundabout
assign islinktype = highway=motorway_link|trunk_link|primary_link|secondary_link|tertiary_link
assign isgoodforcars = if greater priorityclassifier 6 then true
                  else if ( or isresidentialorliving highway=service ) then true
                  else if ( and highway=track tracktype=grade1 ) then true
                  else false

---context:node  # following code refers to node tags

assign defaultaccess
       switch access=
              1 # add default barrier restrictions here!
              switch or access=private access=no
                     0
                     1

assign bikeaccess
       or nodeaccessgranted=yes
          switch bicycle=
                 switch vehicle=
                        defaultaccess
                        switch or vehicle=private vehicle=no
                               0
                               1
                 switch or bicycle=private or bicycle=no bicycle=dismount
                        0
                        1

assign footaccess
       or bicycle=dismount
          switch foot=
                 defaultaccess
                 switch or foot=private foot=no
                        0
                        1

assign initialcost
       switch bikeaccess
              0
              switch footaccess
                     300
                     1000000
