/* -*- LPC -*- */
/*
* $Locker: $
* $Id: wetness.c,v 1.14 2002/09/24 02:30:10 presto Exp $
* $Log: wetness.c,v $
* Revision 1.14 2002/09/24 02:30:10 presto
* No squelching underwater!
*
* Revision 1.13 2002/02/24 04:27:15 ceres
* Stopped you drying out in waer
*
* Revision 1.12 2001/11/04 05:33:32 presto
* Added another parameter to wet_string so I can get both 'wet' and 'look' to work
* correctly.
*
* Revision 1.11 2001/10/02 02:30:33 presto
* Fixed wet_string to work right. Um, I hope.
*
* Revision 1.10 2001/08/20 03:06:28 presto
* Changed the range for "slightly wet" to be 0 .. 5 rather than 1 .. 5
*
* Revision 1.9 2001/08/19 02:11:03 presto
* Misspelled "extra_look" and "exta_look". Surprisingly, it didn't work. Also changed
* how it decides which string to build
*
* Revision 1.8 2001/08/15 04:10:02 presto
* added wet_string function to help out with the 'wet' command
*
* Revision 1.7 2001/06/01 21:18:17 ceres
* Can't recall
*
* Revision 1.6 2000/03/03 07:11:44 ceres
* Can't remember
*
* Revision 1.5 2000/01/12 00:29:31 ceres
* Tweaked drying out.
*
* Revision 1.4 1999/12/31 03:19:34 pinkfish
* Hopefully fix up a runtime in the wetness effect.
*
* Revision 1.3 1999/07/30 17:55:41 tannah
* Added an initial "Squelch" in beginning() so that players never
* get the "dry off" message without being told they were wet.
*
* Revision 1.2 1998/06/07 00:42:35 gruper
* Gruper added extra_look in restart().
*
* Revision 1.1 1998/01/06 04:20:30 ceres
* Initial revision
*
*/
/**
* This is the effect skelton docs. This effect
* has a classification of "body.wetness".
* <p>
* Describe the arguments in here.
* @classification body.wetness
* @see help::effects
*/
#include "path.h"
#include <effect.h>
#include <weather.h>
#define MAX_EFFECT 200
#define MAX_DURATION 120
#define MAX_STRENGTH 240
#define MIN_STRENGTH 20
/** @ignore yes */
string query_classification() { return "body.wetness"; }
/** @ignore yes */
int beginning( object player, int wetness, int id ) {
int dryness;
tell_object( player, "Squelch.\n" );
player->submit_ee( "squelch", ({ 20, 20 }), EE_CONTINUOUS );
player->add_extra_look( this_object() );
// check for magical (or other) protection from the rain.
if(dryness = (int)player->check_dryness())
wetness -= dryness;
if ( wetness > (int)player->query_weight() )
wetness = (int)player->query_weight();
return wetness;
}
/** @ignore yes */
void restart( object player ) {
player->add_extra_look( this_object() );
}
/** @ignore yes */
int merge_effect( object player, int new_wetness, int old_wetness, int id ) {
int wetness, dryness;
wetness = new_wetness + old_wetness;
// check for magical (or other) protection from the rain.
if(dryness = (int)player->check_dryness())
wetness -= dryness;
if ( wetness > (int)player->query_weight() )
wetness = (int)player->query_weight();
if ( wetness <= 0 )
player->submit_ee(0, 0, EE_REMOVE );
return wetness;
}
// End the effect
/** @ignore yes */
void end( object player, int strength, int id ) {
tell_object(player, "You feel dry now.\n");
player->remove_extra_look( this_object() );
}
void squelch(object player, int wetness, int id) {
string loc;
object env;
int bingle;
env = environment(player);
if(!env)
return;
loc = (string)env->query_property("location");
if(loc == "outside" && (int)WEATHER->query_temperature(env) > 0) {
bingle = (int)WEATHER->query_temperature(env) / 2 +
env->query_property("warmth");
} else if(loc == "inside")
bingle = (20 / 2) + env->query_property( "warmth" );
if(player->query_personal_temp() / 3 > bingle)
bingle -= (player->query_personal_temp() / 3);
if(!env->query_water() && bingle > 0)
wetness -= bingle;
if(player->query_property("dead"))
wetness = 0;
if(wetness <= 0)
player->submit_ee(0, 0, EE_REMOVE );
if (wetness > 10 && !random(3) && !env->query_water() ) {
tell_object(player, "Squelch.\n" );
}
/*
if ( ( ( 100 * wetness ) > ( 80 * (int)player->query_weight() ) ) &&
!random( 1440 ) && !( player->query_creator() ) )
player->add_effect( "/std/effects/disease/common_cold", wetness);
*/
player->set_arg_of(player->sid_to_enum(id), wetness);
}
string wet_string( object player, int self ) {
int wetness;
int *enums;
enums = (int *)player->effects_matching( "body.wetness" );
if ( !sizeof( enums ) )
return "";
wetness = (int)player->arg_of(enums[0]);
if (!intp(wetness)) {
wetness = 0;
player->submit_ee(0, 0, EE_REMOVE );
}
switch ( ( wetness * 100 ) / ( 1 +
(int)player->query_weight() ) ) {
case 0 .. 5 :
if (self)
return "look slightly wet";
else
return "looks slightly wet";
case 6 .. 10 :
if (self)
return "look rather wet";
else
return "looks rather wet";
case 11 .. 30 :
if (self)
return "look wet and bedraggled";
else
return "looks wet and bedraggled";
case 31 .. 80 :
if (self)
return "are soaked and don't look that well at all";
else
return "is soaked and doesn't look that well at all";
case 81 .. 100 :
if (self)
return "look like you have just been dunked in a lake";
else
return "looks like "+ player->query_pronoun() +
" has just been dunked in a lake";
break;
default :
return "";
}
} /* extra_look() */
/** ignore yes */
string extra_look(object player) {
return capitalize(player->query_pronoun()) + " " + wet_string(player, 0) +
".\n";
}