/* -*- LPC -*- */ /* * $Locker: $ * $Id: leatherwork.c,v 1.16 2002/12/02 23:26:43 ceres Exp $ * $Log: leatherwork.c,v $ * Revision 1.16 2002/12/02 23:26:43 ceres * Modified for new skills tree * * Revision 1.15 2002/06/05 14:36:52 ohdamn * Fixed typo * * Revision 1.14 1999/10/24 12:01:58 taffyd * Fixes! * * Revision 1.13 1999/10/03 17:31:25 taffyd * Fixed typo. * * Revision 1.12 1999/04/05 18:57:06 ceres * Modified to use perform_task * * Revision 1.11 1998/09/22 06:05:00 ceres * Missed one. * * Revision 1.10 1998/09/22 05:53:08 ceres * Fixed bug with TM reporting * * Revision 1.9 1998/08/22 01:42:56 pinkfish * Change to the second bersion fo the command base. * * Revision 1.8 1998/08/19 10:51:00 pinkfish * Fix up to work withj the new base object. * * Revision 1.7 1998/03/14 18:26:49 pinkfish * Chnaged to a help file. * * Revision 1.6 1998/02/06 05:27:05 macchirton * board commonroom * * Revision 1.3 1998/02/02 01:08:19 macchirton * Fixed the teaching * * Revision 1.2 1998/01/24 17:53:16 macchirton * Fixed minimum cost problem * * Revision 1.1 1998/01/06 05:26:23 ceres * Initial revision * */ #include <money.h> #include <tasks.h> #define TEACH_LEVEL 10 #define LEARN_LEVEL 10 #define SKILL "crafts.materials.leatherwork" #define SKILLS ({ "crafts.materials.leatherwork", \ "crafts.materials.needlework" }) /*weaving is closest skill to sewing.*/ #define A_MAX 5 #define C_MAX 100 #define A_COND 5 #define C_COND 25 #define SCALE 50 inherit "/cmds/guild_base"; void create() { ::create(); set_nroff_file("leatherwork"); add_teach_skill(SKILL, 20, 10); set_command_name("leatherwork"); } /* create() */ int cmd( object *things, int costing ) { int bonus, cond, low, max, diff, cost, per, val, award; string place; if ( !environment( this_player() )->query_property( "leatherwork" )&& member_array(1, (all_inventory(environment(this_player()))-> query_property("leatherwork"))) == -1 ) return notify_fail( "You are not in a leatherworking shop, " "so you cannot repair anything.\n" ); place = (string)environment( this_player() )->query_property( "place" ); if ( !place || ( place == "" ) ){ /* THIS IS WHERE ANY PLACE CHECKING SHOULD GO */ place = "default"; } if ( sizeof( things ) > 1 ) return notify_fail( "You can only repair one thing at a time.\n" ); /* if (member_array("leather", things[0]->query_material()) != -1) */ if (things[0]->query_material() != "leather") return notify_fail( (string)things[ 0 ]->the_short() + " is not made of leather! Wrong shop!\n" ); if ( things[ 0 ]->query_worn_by() ) return notify_fail( "You should probably remove "+ (string)things[ 0 ]->the_short() + " before you jab yourself with a needle " "while trying to patch it up.\n" ); per = 100 - (int)environment( this_player() )->query_discount( this_player() ); if ( per < 0 ) per = 0; val = (int)this_player()->query_value_in( place ); if ( place != "default" ) val += (int)this_player()->query_value_in( "default" ); low = (int)things[ 0 ]->query_lowest_cond(); if ( !low ) low = 1; cond = (int)things[ 0 ]->query_cond(); max = (int)things[ 0 ]->query_max_cond(); if ( !max ) max = 1; if ( 100 * cond > 98 * max ) return notify_fail( (string)things[ 0 ]->the_short() + " is already in top condition.\n" ); diff = max - cond; /* ********** Type 1. not very damaged. simple sewing wil do. */ if ((100 * diff)/max > 70){ bonus = (int)this_player()->query_skill_bonus( SKILLS[ 1 ] ); cost = (( diff * sqrt( (int)things[ 0 ]->query_full_value() ) ) / (max * 50) + 13); if ( ( diff > bonus ) && !costing ) { diff = ( 150 * diff ) / max; switch ( (int)TASKER->perform_task(this_player(), SKILLS[1], diff, TM_COMMAND ) ) { case AWARD : award = 1; case SUCCEED : diff = max - cond; break; default : diff = 0; } } if ( ( val < cost ) && !costing ) return notify_fail( "You cannot afford the thread to repair "+ (string)things[ 0 ]->the_short() +".\n" ); if ( costing ) { write( "To attempt to repair "+ (string)things[ 0 ]->the_short() + ", it would probably cost you about "+ (string)MONEY_HAND->money_value_string( cost, place ) +".\n" ); return 1; } things[ 0 ]->adjust_cond( diff ); this_player()->pay_money( (mixed *)MONEY_HAND->create_money_array( cost, place ), place ); if ( award) { write( "%^YELLOW%^"+ replace( ({ "As you begin to fix $I, you realise " "how to make better use of the materials.", "As you work on $I, " "you find that you're able to fix it completely.", "You discover " "that you can fix $I more effectively." })[ random( 3 ) ], "$I", (string)things[ 0 ]->the_short() ) +"%^RESET%^\n" ); } if ( 100 * (int)things[ 0 ]->query_cond() > 98 * max ) write( "You sew up all the holes in "+ (string)things[ 0 ]->the_short() + ", bringing it to top condition.\n" ); else write( "You manage to sew up some of the holes in "+ (string)things[ 0 ]->the_short() + " but a few pop back open due to poor stitching.\n" ); write( "The thread and sinew costs you "+ (string)MONEY_HAND->money_value_string( cost, place ) +".\n" ); say( (string)this_player()->one_short() +" fixes up "+ (string)things[ 0 ]->a_short() +".\n" ); return 1; }else{ /* ************************************************ */ bonus = (int)this_player()->query_skill_bonus( SKILLS[ 0 ] ); cost = ( diff * sqrt( (int)things[ 0 ]->query_full_value() ) ) / (max * 3) +123; /* if it's too damaged, a patch is needed*/ if ( !cond ) { write( "You begin to work on "+ (string)things[ 0 ]->the_short() + " when it falls apart! It must have been too damaged to fix.\n" ); say( (string)this_player()->one_short() +" begins to work on "+ (string)things[ 0 ]->the_short() +" when it falls to scraps!\n" ); things[ 0 ]->break_me(); return 1; } if ( ( diff > bonus ) && !costing ) { diff = ( 150 * diff ) / max; switch ( (int)TASKER->perform_task(this_player(), SKILLS[0], diff, TM_COMMAND) ) { case AWARD : award = 1; case SUCCEED : diff = max - cond; break; default : diff = 0; } } if ( ( val < cost ) && !costing ) return notify_fail( "You cannot afford the leather to repair "+ (string)things[ 0 ]->the_short() +".\n" ); if ( costing ) { write( "To attempt to repair "+ (string)things[ 0 ]->the_short() + ", it would probably cost you about "+ (string)MONEY_HAND->money_value_string( cost, place ) +".\n" ); return 1; } things[ 0 ]->adjust_cond( diff ); this_player()->pay_money( (mixed *)MONEY_HAND->create_money_array( cost, place ), place ); if ( award) { write("%^YELLOW%^"+ replace( ({ "As you begin to cut and sew the " "leather patches for $I, you realise how to make better use of " "the leather.", "As you work on $I, you find that you're able " "to repair it completely.", "You discover that you can repair " "$I more effectively." })[ random( 3 ) ], "$I", (string)things[ 0 ]->the_short() ) +"%^RESET%^\n" ); } if ( 100 * (int)things[ 0 ]->query_cond() > 98 * max ) write( "Your patching of "+ (string)things[ 0 ]->the_short() + " goes quite well, and you bring it to top condition.\n" ); else write( "You manage to create reasonably good patches for "+ (string)things[ 0 ]->the_short() + ", but the size wasn't quite right, and the stitching doesn't " "look like it will hold very well.\n" ); write( "The repair materials cost you "+ (string)MONEY_HAND->money_value_string( cost, place ) +".\n" ); say( (string)this_player()->one_short() +" fixes up "+ (string)things[ 0 ]->a_short() +".\n" ); return 1; }/*endtype of repairs if */ } /* cmd() */ int teach( object thing ) { if ( (int)this_player()->query_skill( SKILL ) < TEACH_LEVEL ) return -1; if ( (int)thing->query_skill( SKILL ) < LEARN_LEVEL ) return -2; thing->add_known_command( "leatherwork" ); return 1; } /* teach() */ mixed *query_patterns() { return ({ "<indirect:object:me>", (: cmd($1, 0) :), "cost <indirect:object:me>", (: cmd($1, 1) :) }); }