/*
* Copyright (C) 1995-1997 Christopher D. Granz
*
* This header may not be removed.
*
* Refer to the file "License" included in this package for further
* information and before using any of the following.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <time.h>
#include "sapphire.h"
/*
* Globals
*/
static int rgiState[2 + 55];
/*
* Functions
*/
void init_random( void )
{
int *piState;
int iState;
piState = &rgiState[2];
piState[-2] = 55 - 55;
piState[-1] = 55 - 24;
piState[0] = ( (int) tCurrentTime ) & ( ( 1 << 30 ) - 1 );
piState[1] = 1;
for ( iState = 2; iState < 55; iState++ )
{
piState[iState] = ( piState[iState-1] + piState[iState-2] )
& ( ( 1 << 30 ) - 1 );
}
}
int random_number( void )
{
int *piState;
int iState1;
int iState2;
int iRand;
piState = &rgiState[2];
iState1 = piState[-2];
iState2 = piState[-1];
iRand = ( piState[iState1] + piState[iState2] )
& ( ( 1 << 30 ) - 1 );
piState[iState1] = iRand;
if ( ++iState1 == 55 )
iState1 = 0;
if ( ++iState2 == 55 )
iState2 = 0;
piState[-2] = iState1;
piState[-1] = iState2;
return ( iRand >> 6 );
}
/*
* Create a rondom number.
*/
int random_range( int iFrom, int iTo )
{
int iPower;
int iNumber;
if ( iFrom == 0 && iTo == 0 )
return ( 0 );
if ( ( iTo = ( iTo - iFrom + 1 ) ) <= 1 )
return ( iFrom );
for ( iPower = 2; iPower < iTo; iPower <<= 1 );
while ( ( iNumber = random_number( ) & ( iPower - 1 ) ) >= iTo );
return ( iFrom + iNumber );
}
/*
* Create a random percent.
*/
int random_percent( void )
{
int iPercent;
while ( ( iPercent = random_number( ) & 127 ) > 99 );
return ( iPercent + 1 );
}
int random_bits( int iWidth )
{
return ( random_number( ) & ( ( 1 << iWidth ) - 1 ) );
}
/*
* Generate a random door.
*/
int random_door( void )
{
int iDoor;
while ( ( iDoor = random_number( ) & 7 ) > 9 );
return ( iDoor );
}
/*
* Roll some dice.
*/
int roll_dice( int iNumber, int iSize )
{
int iDice;
int iSum;
switch ( iSize )
{
case 0: return ( 0 );
case 1: return ( iNumber );
}
for ( iDice = 0, iSum = 0; iDice < iNumber; iDice++ )
iSum += random_range( 1, iSize );
return ( iSum );
}
/*
* Round off a number.
*
* Fusion's (Developer of MUD++) version.
*/
long round( register long rlNumber, register int riRoundBy )
{
register int riRemainder = ( rlNumber % riRoundBy );
if ( riRemainder > ( riRoundBy >> 1 ) )
return ( rlNumber + ( riRoundBy - riRemainder ) );
return ( rlNumber - riRemainder );
}
#if 0
/*
* My version.
*/
long round( register long rlNumber, register int riRoundBy )
{
register long rlNewNumber = 0;
register int riDiff;
if ( rlNumber <= 0 || riRoundBy <= 1 )
return ( rlNumber );
while ( rlNewNumber < rlNumber )
rlNewNumber += riRoundBy;
if ( ( riDiff = ( rlNewNumber - rlNumber ) ) == 0 )
return ( rlNumber );
if ( riDiff >= ( riRoundBy >> 1 ) )
return ( rlNewNumber - riRoundBy );
return ( rlNewNumber );
}
#endif
/*
* End of random.c
*/