dotd-2.3.7/area/
dotd-2.3.7/clans/
dotd-2.3.7/classes/
dotd-2.3.7/councils/
dotd-2.3.7/deity/
dotd-2.3.7/dict/
dotd-2.3.7/doc/mudprogs/
dotd-2.3.7/player/a/
dotd-2.3.7/player/g/
/******************************************************
            Desolation of the Dragon MUD II
      (C) 1997-2002  Jesse DeFer
          http://www.dotd.com  dotd@dotd.com
 ******************************************************/

/*static char rcsid[] = "$Id: river.c,v 1.7 2003/09/09 19:43:23 dotd Exp $";*/

#include <stdio.h>
#include <string.h>

#include "mud.h"

#define ENABLE_RIVERS

char buf[MAX_STRING_LENGTH];

int lowest_exit(ROOM_INDEX_DATA *rp)
{
  EXIT_DATA *ex;
  int min = MAX_ELEVATION+1;

  for (ex = rp->first_exit; ex; ex = ex->next)
    min = UMIN(min, ROOM_ELEVATION(ex->to_room));

  if (min < 0 || min == MAX_ELEVATION+1)
    return(-1);

  return(min);
}

EXIT_DATA *find_best_exit(ROOM_INDEX_DATA *rp)
{
    EXIT_DATA *ex;
    int min = -1;

    if (!rp || !rp->first_exit || (min=lowest_exit(rp))==-1)
	return(NULL);

    for (ex = rp->first_exit; ex; ex = ex->next)
	if (ROOM_ELEVATION(ex->to_room) == min &&
	    !IS_RIVER(ex->to_room))
	    return(ex);

    return(NULL);
}

void calc_river_path(ROOM_INDEX_DATA *rp, sh_int liq)
{
    EXIT_DATA *ex;
    char buf2[MAX_INPUT_LENGTH];

    if (!rp)
    {
	log_string_plus("!rp in calc_river_path:river.c", LOG_BUG, LEVEL_LOG_CSET, SEV_ERR);
	return;
    }

    sprintf(buf2, "%d ", rp->vnum);
    strcat(buf, buf2);

    if (!rp->river)
      CREATE(rp->river, RIVER_DATA, 1);
    RIVER_SPEED(rp) = 1;
    RIVER_DEPTH(rp) = 1;
    RIVER_LIQUID(rp) = liq;

    if ((ex = find_best_exit(rp))!=NULL)
    {
	RIVER_TO(rp) = ex;
	calc_river_path(ex->to_room, liq);
    }
    else
    {
	RIVER_DEPTH(rp) = UMAX(1, lowest_exit(rp) - ROOM_ELEVATION(rp));
	RIVER_SPEED(rp) = 0;
    }
}

char *river_room_desc(ROOM_INDEX_DATA *rp)
{
  char buf2[MAX_STRING_LENGTH];

#ifndef ENABLE_RIVERS
return(NULL);
#endif

  if (!IS_RIVER(rp))
    return(NULL);

  if (RIVER_SPEED(rp) < 0) {
    log_string_plus("-RIVER_SPEED in river_room_desc:river.c", LOG_BUG, LEVEL_LOG_CSET, SEV_ERR);
    return(NULL);
  }

  if (RIVER_SPEED(rp) == 0 || !RIVER_TO(rp))
    sprintf(buf2, "The %s is calm.\n\r",
		liq_table[RIVER_LIQUID(rp)].liq_name);
  else if (RIVER_SPEED(rp) >= 150)
    sprintf(buf2, "The %s falls in torents to the %s.\n\r",
		liq_table[RIVER_LIQUID(rp)].liq_name,
		exit_name((RIVER_TO(rp))));
  else if (RIVER_SPEED(rp) >= 75)
    sprintf(buf2, "The %s foams and froths as it flows to the %s.\n\r",
		liq_table[RIVER_LIQUID(rp)].liq_name,
		exit_name((RIVER_TO(rp))));
  else if (RIVER_SPEED(rp) >= 50)
    sprintf(buf2, "The %s is rushes at great speed to the %s.\n\r",
		liq_table[RIVER_LIQUID(rp)].liq_name,
		exit_name((RIVER_TO(rp))));
  else if (RIVER_SPEED(rp) >= 20)
    sprintf(buf2, "The %s is flowing rapidly to the %s.\n\r",
		liq_table[RIVER_LIQUID(rp)].liq_name,
		exit_name((RIVER_TO(rp))));
  else if (RIVER_SPEED(rp) >= 10)
    sprintf(buf2, "The %s is flowing smoothly to the %s.\n\r",
		liq_table[RIVER_LIQUID(rp)].liq_name,
		exit_name((RIVER_TO(rp))));
  else if (RIVER_SPEED(rp) >= 5)
    sprintf(buf2, "The %s is gently flowing to the %s.\n\r",
		liq_table[RIVER_LIQUID(rp)].liq_name,
		exit_name((RIVER_TO(rp))));
  else
    sprintf(buf2, "The %s quietly flows to the %s.\n\r",
		liq_table[RIVER_LIQUID(rp)].liq_name,
		exit_name((RIVER_TO(rp))));

  return(str_dup(buf2));
}