/* -*- LPC -*- */ /* * $Locker: $ * $Id: water_outside_base.c,v 1.9 2003/07/14 21:56:10 pinkfish Exp $ * */ /** * @main * Base inherit for an outside water room using the terrain map system. * <p> * This file should be inherited by any outside room within a terrain mapped * virtual area, and by any file with an exit to one of said areas. * <p> * When inheriting from this file, it is essential that the function * query_handler_path() be overriden to return the full pathname of * the handler associated with this area. * <p> * To inherit from this file, use the following lines: * <ul> * <li>#include <terrain_map.h> * <li> * <li>inherit TERRAIN_MAP_OUTSIDE_BASE * </ul> * * @index terrain_map_outside * @see terrain_map_handler * @see terrain_map_intro * @see terrain_map_example * @author Dek * @started Thurs April 12 2001 Too Damn Early BST **/ #include <room.h> #include <login_handler.h> #include <terrain_map.h> inherit "/std/room/water_outside"; inherit TERRAIN_MAP_ROOM_BASE; void create() { set_not_replaceable(1); terrain_room::create(); water_outside::create(); } void init() { terrain_room::init(); water_outside::init(); } /* init() */ /* @ignore yes */ varargs mixed* query_dest_other(string exit) { mixed* data; data = water_outside::query_dest_other(exit); return terrain_room::query_dest_other(exit, data); } /* @ignore yes */ mixed* query_dest_dir(object thing) { mixed* data; data = water_outside::query_dest_dir(thing); return terrain_room::query_dest_dir(data); } /** @ignore yes */ mixed stats() { return water_outside::stats() + terrain_room::stats(); } /** @ignore yes */ string query_terrain_map_walk_exit() { return "swim "; } /** @ignore yes */ object query_surface_room() { string dest_path; object destination; if (query_surface()) { return this_object(); } dest_path = file_name(this_object()); dest_path = implode(explode(dest_path, ":")[0..<2], ":")+":0"; destination = load_object(dest_path); if (destination && destination->query_water()) { return destination->query_surface_room(); } return ::query_surface_room(); } /** @ignore yes */ int get_water_surface_light() { float their_light, their_clarity, our_depth; string above_path = file_name(this_object()); object above; above_path = implode(explode(above_path, ":")[0..<2], ":")+":0"; above = load_object(above_path); if (!above) { return 0; } if (function_exists("query_water_surface_light", above)) { their_light = to_float(above->query_water_surface_light()); } else { their_light = to_float(above->query_my_light()); } their_clarity = to_float(above->query_clarity())/100.0; our_depth = to_float(-query_terrain_coords()[2]); return to_int(their_light * pow(their_clarity, our_depth)); } /** * Make it so that anyone attempting to enter a water room from a non-water * room has to specifically wade into it. * @ignore yes */ string query_enter_exit_direction(string key, string key_here, string direct, object room, string base_path) { if (!room->query_water()) { return "wade " + direct; } return 0; } /** @ignore yes */ int can_move_between(string my_type, string direc, string first_type, string second_type, string new_base_path) { return first_type->query_water() && second_type->query_water() && new_base_path->query_water() || (!new_base_path->query_water() && (!first_type->query_water() || !second_type->query_water())); }