/** Inherit for one-armed bandits.
* Refined from the original object by Jobe.
* Wirble, June 4th 2002
*/
#include <money.h>
int do_slot();
int do_pull_lever();
int do_read_dial();
int set_coin_type( string coin );
int set_chances( int c1, int c2, int c3, int c4, int c5 );
int set_prizes( int p1, int p2, int p3, int p4, int p5, int jackpot );
int* query_prizes();
int* query_chances();
string query_coin_type();
void rollem( object player );
string my_short();
private string *animal = ({"albatross", "frog", "hippo", "turtle", "cabbage"});
private string *adject = ({"A crazy", "A dancing", "A sad", "A floopy", "A bemused",
"A sarcastic", "A quizzical", "A startled", "A friendly", "A mindless"});
private string _coin = "Ankh-Morpork pence", _coin_short = "pence",
_coin_pl = "Ankh-Morpork pence";
private int _busy = 0;
private int* _chances = ({1,1,1,1,1});
private int* _prizes = ({2,2,2,2,2,3});
/** @ignore */
void init(){
this_player()->add_command( "slot", this_object(),
_coin_short + " into <direct:object>", (: do_slot() :) );
this_player()->add_command( "pull", this_object(),
"lever on <direct:object>", (: do_pull_lever() :) );
this_player()->add_command( "read", this_object(),
"dial on <direct:object>", (: do_read_dial() :) );
} /*void init() */
/** This sets the type of coin the bandit accepts. It has to be of valid
* type as registed in the money handler.
* @param coin the name of the coin
* @return 1 on success, otherwise 0
*/
int set_coin_type( string coin ) {
if( member_array( coin, MONEY_HAND->query_valid_types() ) == -1 )
return 0;
_coin = coin;
_coin_short = MONEY_HAND->query_aliases_for( coin )[0];
_coin_pl = MONEY_HAND->query_main_plural_for( coin );
return 1;
} /* int set_coin_type() */
/** Sets the chances for winning. Each value represents the chance for one
* type of picture to show up.
*
* 5, 4, 3, 2, 1 would mean: 33.3% chance for pic 1, 26.6% for pic 2,
* 20% for pic 3, 13.3% for pic 4 and 6.6% for pic 5.
* To win, all three images must be the same pic. To win the jackpot, there has
* to be another match of 10% per image.
* @param c1 Chance for albatross
* @param c2 Chance for frog
* @param c3 Chance for hippo
* @param c4 Chance for turtle
* @param c5 Chance for cabbage
* @return 1 on success, otherwise 0
*/
int set_chances( int c1, int c2, int c3, int c4, int c5 ) {
if( !( c1 > 0 && c2 > 0 && c3 > 0 && c4 > 0 && c5 > 0 ) )
return 0;
_chances = ({ c1, ( c1 + c2 ), ( c1 + c2 + c3 ), ( c1 + c2 + c3 + c4 ),
( c1 + c2 + c3 + c4 + c5 ) });
return 1;
} /* int set_chances() */
/** Number of coins (as per defined type) won by scoring a triple or the
* jackpot. Minimum 2.
* @param p1 Number of coins for 3x albatross
* @param p2 Number of coins for 3x frog
* @param p3 Number of coins for 3x hippo
* @param p4 Number of coins for 3x turtle
* @param p5 Number of coins for 3x cabbage
* @param jackpot Number of coins for jackpot (higher than any of the others)
* @return 1 on success, otherwise 0
*/
int set_prizes( int p1, int p2, int p3, int p4, int p5, int jackpot ) {
if( !( p1 > 1 && p2 > 1 && p3 > 1 && p4 > 1 && p5 > 1 && jackpot > 1 ) ||
( jackpot <= p1 || jackpot <= p2 || jackpot <= p3 ||
jackpot <= p4 || jackpot <= p5 ) )
return 0;
_prizes = ({p1, p2, p3, p4, p5, jackpot});
return 1;
} /* int set_prizes() */
/** @ignore */
int do_slot() {
if( member_array( _coin, this_player()->query_money_array() ) == -1 ) {
this_player()->add_failed_mess( this_object(),
"You need " + add_a( _coin ) + " to play.\n", ({ }) );
return 0;
}
if( _busy == 1 ) {
this_player()->add_failed_mess( this_object(),
"There is already a coin inserted.\n", ({ }) );
return 0;
}
if( _busy == 2 ) {
this_player()->add_failed_mess( this_object(),
"The wheels of $D are still spinning.\n", ({ }) );
return 0;
}
this_player()->adjust_money( -1, _coin );
this_object()->adjust_money( 1 );
_busy = 1;
this_player()->add_succeeded_mess( this_object(),
"$N insert$s " + add_a( _coin_short ) + " into $D.\n", ({ }) );
return 1;
} /* int do_slot() */
/** @ignore */
int do_pull_lever() {
if( _busy == 0 ) {
this_player()->add_failed_mess( this_object(),
"You must put a coin in the slot before you can play.\n", ({ }) );
return 0;
}
if( _busy == 2 ) {
this_player()->add_failed_mess( this_object(),
"The wheels of $D are already spinning.\n", ({ }) );
return 0;
}
this_player()->add_succeeded_mess( this_object(),
({"You pull the lever. The pictures behind the windows blur... one by "
"one they are replaced by a new picture that appears with a sharp "
"click.\n",
"$N pull$s the lever on $D and the machine whirs softly. The sound is "
"cut short by three sharp clicks.\n"
}), ({ }) );
call_out( "rollem", 0, this_player() );
_busy = 2;
return 1;
} /* int do_pull_lever() */
/** @ignore */
void rollem( object player ) {
int a1, a2, a3, c;
int adj1 = random( 10 ),
adj2 = random( 10 ),
adj3 = random( 10 );
c = random( _chances[4] );
if( c < _chances[0] )
a1 = 0;
else if( c < _chances[1] )
a1 = 1;
else if( c < _chances[2] )
a1 = 2;
else if( c < _chances[3] )
a1 = 3;
else
a1 = 4;
c = random( _chances[4] );
if( c < _chances[0] )
a2 = 0;
else if( c < _chances[1] )
a2 = 1;
else if( c < _chances[2] )
a2 = 2;
else if( c < _chances[3] )
a2 = 3;
else
a2 = 4;
c = random( _chances[4] );
if( c < _chances[0] )
a3 = 0;
else if( c < _chances[1] )
a3 = 1;
else if( c < _chances[2] )
a3 = 2;
else if( c < _chances[3] )
a3 = 3;
else
a3 = 4;
tell_object( player,
"The windows now show these pictures :\n\n"
" " + adject[ adj1 ] + " " + animal[ a1 ] +
" " + adject[ adj2 ] + " " + animal[ a2 ] +
" " + adject[ adj3 ] + " "+animal[ a3 ] + "\n\n" );
if( a1 == a2 && a1 == a3 ) {
if( adj1 == adj2 && adj1 == adj3 ) {
tell_object( player,
"WOW!! A triple " + adject[ adj1 ] + " " + animal[ a1 ] +
"!! You really hit the jackpot this time!\n\n"
"Whistles and bells start sounding like crazy, the whole " +
this_object()->short() + " glows with flashing lights. There "
"is a loud tingling as " + _prizes[5] + " " +
MONEY_HAND->query_plural_for( _coin ) + " drop into the tray "
"of " + my_short() + ". Slightly stunned you quickly scoop "
"it up and cackle with delight.\n" );
tell_room( environment( this_object() ),
"Whistles and bells start sounding and " + my_short() +
" starts to flash with coloured lights. Someone must have "
"won the jackpot...lucky buggers. As you watch some coins "
"drop into the tray at the bottom of " + my_short() + ", " +
player->one_short() + " snatches it up and cackles with "
"delight.\n", ({player}) );
player->adjust_money( _prizes[5] ,_coin );
this_object()->adjust_money( -(_prizes[ 5 ]) );
_busy = 0;
return;
}
tell_object( player,
"Congratulations! You scored a triple " + animal[ a1 ] + "!\n" );
player->adjust_money( _prizes[ a1 ], _coin );
tell_object( player,
_prizes[ a1 ]+ " " + MONEY_HAND->query_plural_for( _coin ) +
" fall into the tray at the bottom of " + my_short() + ". You "
"quickly scoop them up before anyone else can snaffle them.\n" );
tell_room( environment( this_object() ),
player->one_short() + " deftly scoops some coins from the tray at "
"the bottom of " + my_short() + ".\n", ({player}) );
this_object()->adjust_money( -(_prizes[ a1 ]) );
_busy = 0;
return;
}
tell_object( player,
"You didn't win. Why not have another go and attempt to recoup your "
"losses?\n" );
_busy = 0;
}/*void rollem() */
/** Returns the chances for each image in the order: albatross, frog, hippo,
* turtle, cabbage.
* @return an array with the chances
*/
int* query_chances() {
int* tmp = ({ });
tmp += ({ _chances[0] });
tmp += ({ _chances[1] - _chances[0] });
tmp += ({ _chances[2] - _chances[1] });
tmp += ({ _chances[3] - _chances[2] });
tmp += ({ _chances[4] - _chances[3] });
return tmp;
} /* int* query_chances() */
/** This function returns the number of coins for each image. The elements are
* in the order: albatross, frog, hippo, turtle, cabbage, jackpot.
* @return the array of numbers
*/
int* query_prizes() {
return _prizes;
} /* int* query_prizes() */
/** Returns the coin-type for use with the bandit.
* @return the name of the coin
*/
string query_coin_type() {
return _coin;
} /* string query_coin_type() */
/** @ignore */
string my_short() {
return this_object()->the_short();
} /* string my_short() */
/** @ignore */
int do_read_dial() {
string tmp =
"Stake : 1 " + _coin_pl + "\n"
"3x Albatross : " + _prizes[0] + " " + _coin_pl + "\n"
"3x Frog : " + _prizes[1] + " " + _coin_pl + "\n"
"3x Hippo : " + _prizes[2] + " " + _coin_pl + "\n"
"3x Turtle : " + _prizes[3] + " " + _coin_pl + "\n"
"3x Cabbage : " + _prizes[4] + " " + _coin_pl + "\n"
"JACKPOT : " + _prizes[5] + " " + _coin_pl + "\n";
this_player()->add_succeeded_mess( this_object(),
({tmp, "$N read$s the dial on $D.\n"}), ({ }) );
return 1;
} /* int do_read_dial() */