
/* '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;
  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;
}

