
/* 'reise' handling
 *
 * Ueberarbeitete und 
 * erweiterte Version: Tilly@MorgenGrauen, 10.01.02
 * Basierend auf     : base.c@SilberLand,
 *                     Revision 3.55, Woody@SilberLand, 11.05.99
 */   
#pragma strong_types
#pragma save_types
#pragma range_check
#pragma no_clone

#define NEED_PROTOTYPES
#include <player.h>
#include <living/moving.h>
#include <thing/properties.h>
#undef NEED_PROTOTYPES

#include <properties.h>
#include <config.h>
#include <wizlevels.h>
#include <moving.h>
#include <living.h>
#include <attributes.h>
#include <defines.h>
#include <new_skills.h>
#include <combat.h>
#include <transport.h>

void create(){}

private string _traveller(string *s)
{
  switch (sizeof(s))
  {
    case 1 : return s[0];
    case 2 : return s[0]+" oder "+s[1];
  }
  return efun::implode(s[0..<2],", ")+" oder "+s[<1];
}

static int reise(string str)
{
  mixed  t, ship, dstr;
  string mit, nach, s1, s2;
  int    i;

  _notify_fail("Syntax: reise mit <transportmittel> nach <zielort>\n\n"
               "Weitere Syntaxen moeglich, bitte 'hilfe reise' lesen.\n");

  t = QueryProp(P_TRAVEL_INFO);
  
  if (!pointerp(t) || (sizeof(t) < 4) || !objectp(t[0]) || !objectp(t[1]))
  {
    SetProp(P_TRAVEL_INFO, t = 0);
  }
/* * * * 
 * REISE
 * * * */
  if (!str)
  {
    if (!t)
    {
      write("Du hast keine Reiseroute festgelegt.\n");
    }
    else if (t[0] == environment())
    {
      if (environment()->id("Transporter"))
      {
        write(sprintf("Du reist mit %s%s.\n",environment()->name(WEM,1), 
                                             t[2]?" "+t[3]:""));
      }
      else
      {
        write(sprintf("Du wirst mit %s%s reisen.\n",t[1]->name(WEM,1), 
                                                   t[2]?" "+t[3]:""));
      }
    }
    else
    {
       write(sprintf("Deine letzte Route (mit %s%s) ist hier nicht wirksam.\n",
                     t[1]->name(WEM,1),
                     t[2]?" "+t[3]:""));
    }
    return 1;
  }

  str = lower_case( _unparsed_args() );
/* * * * * * * 
 * REISE ROUTE
 * * * * * * */
  if (str == "route")
  {
    string *harbours;
    
    if (environment()->id("Transporter"))
    {
      if (environment()->QueryProp(P_NO_TRAVELING))
      {
        write(break_string(
         capitalize(environment()->name(WER,1))+" hat gar keine "
         "Reiseroute. Wo Dich das wohl hinfuehrt?",78));
        return 1;
      }

      harbours = environment()->QueryHarbours(1);
      
      if (!sizeof(harbours) || !stringp(harbours[0]))
      {
        write("Die Reiseroute "+environment()->name(WESSEN,1)+" ist "
             +"leider nicht bekannt.\n");
      }
      else
      {
        write(break_string(capitalize(efun::implode(harbours," - "))+".",78,
         "Reiseroute "+environment()->name(WESSEN,1)+": ",BS_INDENT_ONCE));
      }
      return 1;
    }
    if (environment()->QueryProp(P_NO_TRAVELING))
    {
      write(break_string("Hier kannst Du leider keine Reiseroute waehlen. "
                         "Was nicht heisst, dass hier kein Transportmittel "
                         "verkehrt.",78));
      return 1;
    }
    if (!pointerp(ship = TRAVELD->HasTransporter(environment())))
    {
      _notify_fail("Hier verkehrt kein Transportmittel.\n");
      return 0;
    }

    write("Hier verkehren folgende Transportmittel \n"
          "--------------------------------------- \n");
         
    for (i = 0; i < sizeof(ship); i++)
    {    
      if (!ship[i]->Query(P_SHORT)) continue;
      
      harbours = ship[i]->QueryHarbours(1);

      if (sizeof(harbours) && stringp(harbours[0]))
      {
        write(break_string(efun::implode(harbours," - ")+".",78,
                           ship[i]->Query(P_SHORT)+": ",BS_INDENT_ONCE));
      }
      else
      {
        write(ship[i]->Query(P_SHORT)+": Route unbekannt.\n");
      }
    }
    return 1;
  }
/* * * * * * * 
 * REISE AUS
 * REISE NICHT
 * * * * * * */
  if (member((["aus","nicht"]),str))
  {
    if (!t)
    {
      write("Du hattest keine Reiseroute eingestellt.\n");
    }
    else
    {
      write("Du loeschst Deine Reiseroute.\n");
    }
    SetProp(P_TRAVEL_INFO, 0);
    return 1;
  }

  str = regreplace(str,"\\<(zu|zum|zur|ins|ans)\\>","nach",0);
/* * * * * * * * *
 * REISE MIT NACH
 * REISE NACH MIT
 * * * * * * * * */
  if ((sscanf(str, "mit %s nach %s", mit, nach) == 2) ||
      (sscanf(str, "nach %s mit %s", nach, mit) == 2))
  {
    _notify_fail("Hier kannst Du leider keine Reiseroute waehlen.\n");

    if (environment()->QueryProp(P_NO_TRAVELING))
    {
      return 0;
    }
    if (!sizeof(nach))
    {
      _notify_fail("Syntax: reise mit <transportmittel> nach <zielort>\n"
                   "        reise nach <zielort> mit <transportmittel>\n");
      return 0;
    }
    if (environment()->id("Transporter"))
    {
      if (environment()->id(mit))
      {
        command("reise nach "+nach);
        return 1;
      }
      else
      {
        _notify_fail("Beende erstmal Deine aktuelle Reise mit "+
                      environment()->name(WEM,1)+".\n");
        return 0;
      }
    }
    if (!pointerp(ship = TRAVELD->HasTransporter(environment(), mit)))
    {
      _notify_fail("So ein Transportmittel verkehrt hier nicht.\n");
      return 0;
    }
    for (i = sizeof(ship) -1 ; i >= 0; i--)
      if (!ship[i]->HasRoute(nach))
      {
        ship[i] = 0;
      }

    ship -= ({0});

    if (pointerp(t) && objectp(t[1]) && (member(ship,t[1]) != -1))
    {
      ship = ({ t[1] });
    }
    if (sizeof(ship) > 1)
    {
      if (object_name(environment()) == ship[0]->HasRoute(nach)[0])
      {
        _notify_fail("Aber da bist Du doch bereits.\n");
        return 0;
      }
     write("Dorthin kannst Du mit "+CountUp(map_objects(ship,"name",WEM))
           +"reisen.\n");
 

      dstr = filter(ship, function int (object x) {
                return (environment(x) == environment() &&
                        stringp(x->short()));
              });

      if (sizeof(dstr))
      {
        ship = dstr[0];
      }
      else
      {
        ship = ship[0];
      }

      dstr = ship->HasRoute(nach);

      write(sprintf("Du entscheidest Dich fuer %s und reist %s.\n",
            ship->name(WEN,1),dstr[1]));
    }
    else if (sizeof(ship) < 1)
    {
      _notify_fail("Nach '"+capitalize(nach)+"' kann Dich das angegebene "
                  +"Transportmittel leider nicht bringen.\n");
      return 0;
    }
    else
    {
      ship = ship[0];
      dstr = ship->HasRoute(nach);

      if (object_name(environment()) == dstr[0])
      {
        _notify_fail("Aber da bist Du doch bereits.\n");
        return 0;
      }
      if (t && stringp(t[2]))
      {
        if (t[2] == dstr[0])
        {
          _notify_fail("Aber das tust Du doch bereits.\n");
          return 0;
        }
      }
      write(sprintf("Ok, Du reist nun mit %s %s.\n",
                     ship->name(WEM,1),dstr[1]));
    }
    if (environment(ship)==environment() && ship->short())
    {
      ship->Enter(this_object());
    }
    SetProp(P_TRAVEL_INFO, ({ environment(), ship, dstr[0], dstr[1] }) );
    return 1;
  }
/* * * * * * *
 * REISE NACH
 * * * * * * */
  if (sscanf(str,"nach %s",nach))
  {
    _notify_fail("Hier kannst Du leider keine Reiseroute waehlen.\n");

    if (environment()->QueryProp(P_NO_TRAVELING))
    {
      return 0;
    }
    if (environment()->id("Transporter"))
    {
      if (!dstr = environment()->HasRoute(nach))
      {
        _notify_fail("Dorthin kann Dich "+environment()->name(WER,1)+
                     " leider nicht bringen.\n");
        return 0;
      }
      if (t && stringp(t[2]))
      {
        if (t[2] == dstr[0])
        {
          _notify_fail("Aber das tust Du doch bereits.\n");
          return 0;
        }
      }
      write(sprintf("Ok, Du reist jetzt mit %s %s.\n",
                    environment()->name(WEM,1),dstr[1]));
      
      if (IS_WIZARD(this_object()))
      {
        write("Als Magier nimmst Du natuerlich die Abkuerzung.\n");
        move(dstr[0],M_NOCHECK);
        return 1;
      }
      SetProp(P_TRAVEL_INFO,({ environment(), 
                               environment(), 
                               dstr[0], 
                               dstr[1] }) );

      if (object_name(environment(ship = environment())) == dstr[0] && 
          ship->short())
      {
        environment()->Leave(this_object());

        if (environment() != ship)
        {
          SetProp(P_TRAVEL_INFO, 0);
        }
      }
      return 1;
    }
    if (!pointerp(ship = TRAVELD->HasTransporter(environment())))
    {
      _notify_fail("Von hier aus kannst Du nicht reisen.\n");
      return 0;
    }
    for (i = sizeof(ship) - 1; i >= 0; i--)
      if (!ship[i]->HasRoute(nach))
      {
        ship[i] = 0;
      }

    ship -= ({ 0 });
 
    if (pointerp(t) && objectp(t[1]) && (member(ship,t[1]) != -1))
    {
      ship = ({ t[1] });
    }
    if (sizeof(ship) > 1)
    {
      if (object_name(environment()) == ship[0]->HasRoute(nach)[0])
      {
        _notify_fail("Aber da bist Du doch bereits.\n");
        return 0;
      }

      write(break_string("Dahin kannst Du mit "
           +_traveller(map_objects(ship, "name", WEM))+" gelangen.",78));

      dstr = filter(ship, function int (object x) {
                return (environment(x) == environment() &&
                        stringp(x->short()));
              });

      if (sizeof(dstr))
      {
        ship = dstr[0];
      }
      else
      {
        ship = ship[0];
      }

      dstr = ship->HasRoute(nach);

      write(sprintf("Du waehlst %s und reist %s.\n",ship->name(WEN,1),
                                                    dstr[1]));
    }
    else if (sizeof(ship) < 1)
    {
      _notify_fail("Nach '"+capitalize(nach)+"' kann Dich leider keines der "
                  +"hier verkehrenden Transportmittel bringen.\n");
      return 0;
    }
    else
    {
      ship = ship[0];
      dstr = ship->HasRoute(nach);

      if (object_name(environment()) == dstr[0])
      {
        _notify_fail("Aber da bist Du ja bereits.\n");
        return 0;
      }
      else if (t && stringp(t[2]))
      {
        if (t[2] == dstr[0])
        {
          _notify_fail("Aber das tust Du doch bereits.\n");
          return 0;
        }
      }
      write(sprintf("Ok, Du reist nun mit %s %s.\n",ship->name(WEM),
                                                    dstr[1]));
    }
    if (IS_WIZARD(this_object()))
    {
      write("Als Magier nimmst Du natuerlich die Abkuerzung.\n");
      move(dstr[0],M_NOCHECK);
      return 1;
    }
    if (environment(ship)==environment() && ship->short())
    {
      ship->Enter(this_object());
    }
    SetProp(P_TRAVEL_INFO, ({ environment(), ship, dstr[0], dstr[1] }) );
    return 1;
  }
/* * * * * *
 * REISE MIT
 * * * * * */
  if (sscanf(str, "mit %s", mit))
  {
    _notify_fail("Hier kannst Du leider keine Reiseroute waehlen.\n");

    if (environment()->QueryProp(P_NO_TRAVELING))
    {
      return 0;
    }
    if (environment()->id("Transporter"))
    {
      if (environment()->id(mit))
      {
        _notify_fail("Aber das tust Du doch bereits.\n");
        return 0;
      }
      else
      {
        _notify_fail("Beende erstmal Deine aktuelle Reise mit "+
                      environment()->name(WEM,1)+".\n");
        return 0;
      }
    }
    if (t && objectp(t[1]) && t[1]->id(mit) && t[0] == environment())
    {
      _notify_fail("Aber das tust Du doch bereits.\n");
      return 0;
    }
    if (!pointerp(ship = TRAVELD->HasTransporter(environment(),mit)))
    {
      _notify_fail("So ein Transportmittel verkehrt hier nicht.\n");
      return 0;
    }
    if (sizeof(ship) > 1)
    {
      write("'"+capitalize(mit)+"' koennte "
               +_traveller(map_objects(ship,"name",WER))+" sein.\n");

      dstr = filter(ship, function int (object x) {
                return (environment(x) == environment() &&
                        stringp(x->short()));
              });

      if (sizeof(dstr))
      {
        ship = dstr[0];
      }
      else
      {
        ship = ship[0];
      }
      write(sprintf("Du waehlst %s.\n", ship->name(WEN,1)));
    }
    else if (sizeof(ship) < 1)
    {
      notify_fail("So ein Transportmittel verkehrt hier nicht.\n");
      return 0;
    }
    else
    {
      ship = ship[0];
      write(sprintf("Du reist nun mit %s.\n",ship->name(WEM,1)));
    }
    if (environment(ship)==environment() && ship->short())
    {
      ship->Enter(this_object());
    }
    if (pointerp(t) && stringp(t[2]) && stringp(t[3]) &&
        member(ship->QueryHarbours(),t[2]) != -1)
    {
      write("Du behaeltst Dein bisheriges Reiseziel ("+t[3]+") bei.\n");
      SetProp(P_TRAVEL_INFO, ({ environment(), ship, t[2], t[3] }) );
    }
    else
    {
      SetProp(P_TRAVEL_INFO, ({ environment(), ship, 0, 0 }) );
    }
    return 1;
  }
  return 0;
}

