1
0
mirror of https://git.zap.org.au/git/trader.git synced 2024-12-04 14:46:45 -05:00

Add the function adjust_values()

This commit is contained in:
John Zaitseff 2011-07-18 14:05:22 +10:00
parent 4ecb40fe27
commit 5fca151b60
2 changed files with 173 additions and 7 deletions

View File

@ -60,11 +60,15 @@
#define SHARE_PRICE_INC_EXTRA (0.50) /* Extra factor when incr. share price */ #define SHARE_PRICE_INC_EXTRA (0.50) /* Extra factor when incr. share price */
#define INC_SHARE_PRICE (0.30) /* 30% chance for increasing share price */ #define INC_SHARE_PRICE (0.30) /* 30% chance for increasing share price */
#define DEC_SHARE_PRICE (0.65) /* 65% x 30% chance of decrementing same */ #define DEC_SHARE_PRICE (0.65) /* 65% x 30% chance of decrementing same */
#define PRICE_CHANGE_RATE (0.25) /* Up to 25% of share price is used to incr./decr. */
#define INITIAL_RETURN (0.05) /* Initial return per share: 5% */ #define INITIAL_RETURN (0.05) /* Initial return per share: 5% */
#define PROB_INC_RETURN (0.25) /* Chance of incr. return when company grows */ #define PROB_CHANGE_RETURN (0.25) /* Chance of changing return when company grows */
#define PROB_INC_RETURN_INC (0.60) /* 60% chance such incr. will increase return */ #define CHANGE_RETURN_INC (0.60) /* 60% chance such change will increase return */
#define INC_COMPANY_RETURN (0.40) /* Chance of randomly incrementing return */ #define CHANGE_COMPANY_RETURN (0.40) /* Chance of randomly changing return */
#define COMPANY_RETURN_INC (0.75) /* 75% chance such change will increase return */
#define MAX_COMPANY_RETURN (0.40) /* Maximum return per share */ #define MAX_COMPANY_RETURN (0.40) /* Maximum return per share */
#define RETURN_DIVIDER (1.5) /* Min. amount by which to divide if return is too large */
#define OWNERSHIP_BONUS (2.0) /* Bonus amount based on percentage ownership */
#define INITIAL_STOCK_ISSUED (5) /* Initial number of shares issued out */ #define INITIAL_STOCK_ISSUED (5) /* Initial number of shares issued out */
#define INITIAL_MAX_STOCK (50) /* Initial max. number of shares available */ #define INITIAL_MAX_STOCK (50) /* Initial max. number of shares available */
#define MERGE_STOCK_RATIO (0.50) /* 50% of old shares are credited to new company */ #define MERGE_STOCK_RATIO (0.50) /* 50% of old shares are credited to new company */
@ -74,8 +78,10 @@
#define MAX_SHARES_BIDDED (200) /* Max. number of shares issued */ #define MAX_SHARES_BIDDED (200) /* Max. number of shares issued */
#define INITIAL_INTEREST_RATE (0.10) /* Initial bank interest rate: 10% */ #define INITIAL_INTEREST_RATE (0.10) /* Initial bank interest rate: 10% */
#define INC_INTEREST_RATE (0.30) /* 30% chance of incr./decr. interest rate */ #define CHANGE_INTEREST_RATE (0.30) /* 30% chance of changing interest rate */
#define INTEREST_RATE_INC (0.65) /* 65% chance of above being an increment */
#define MAX_INTEREST_RATE (0.30) /* Maximum interest rate */ #define MAX_INTEREST_RATE (0.30) /* Maximum interest rate */
#define INTEREST_RATE_DIVIDER (1.5) /* Min. amount by which to divide if interest is too high */
#define ROUNDING_AMOUNT (0.01) /* Round off smaller amounts to zero */ #define ROUNDING_AMOUNT (0.01) /* Round off smaller amounts to zero */

View File

@ -58,6 +58,8 @@ void merge_companies (map_val_t a, map_val_t b);
void include_outpost (int num, int x, int y); void include_outpost (int num, int x, int y);
void inc_share_price (int num, double inc); void inc_share_price (int num, double inc);
void adjust_values (void);
int cmp_game_move (const void *a, const void *b); int cmp_game_move (const void *a, const void *b);
@ -575,6 +577,10 @@ void process_move (void)
} }
break; break;
} }
if (! quit_selected) {
adjust_values();
}
} }
deltxwin(); // "Select move" window deltxwin(); // "Select move" window
@ -663,7 +669,7 @@ void try_start_new_company (int x, int y)
} else { } else {
// Create the new company // Create the new company
newtxwin(8, 50, LINE_OFFSET + 8, COL_CENTER(50)); newtxwin(8, 50, LINE_OFFSET + 7, COL_CENTER(50));
wbkgd(curwin, ATTR_NORMAL_WINDOW); wbkgd(curwin, ATTR_NORMAL_WINDOW);
box(curwin, 0, 0); box(curwin, 0, 0);
@ -882,12 +888,166 @@ void inc_share_price (int num, double inc)
{ {
company[num].share_price += inc * (1.0 + randf() * SHARE_PRICE_INC_EXTRA); company[num].share_price += inc * (1.0 + randf() * SHARE_PRICE_INC_EXTRA);
company[num].max_stock += inc / (randf() * 10.0 + 5.0); company[num].max_stock += inc / (randf() * 10.0 + 5.0);
if (randf() < PROB_INC_RETURN) { if (randf() < PROB_CHANGE_RETURN) {
company[num].share_return *= randf() + PROB_INC_RETURN_INC; company[num].share_return *= randf() + CHANGE_RETURN_INC;
} }
} }
/*-----------------------------------------------------------------------
Function: adjust_values - Adjust various company-related values
Arguments: (none)
Returns: (nothing)
This function adjusts the cost of shares for companies on the galaxy
map, their return, the Bank interest rate, etc.
*/
void adjust_values (void)
{
int i, x, y;
int which;
// Declare a company bankrupt!
if (randf() < COMPANY_BANKRUPTCY) {
which = randi(MAX_COMPANIES);
if (company[which].on_map) {
if (randf() < ALL_ASSETS_TAKEN) {
newtxwin(10, 60, LINE_OFFSET + 6, COL_CENTER(60));
wbkgd(curwin, ATTR_ERROR_WINDOW);
box(curwin, 0, 0);
center(curwin, 1, ATTR_ERROR_TITLE, " Bankruptcy Court ");
center(curwin, 3, ATTR_ERROR_STR, "%s has been declared",
company[which].name);
center(curwin, 4, ATTR_ERROR_STR,
"bankrupt by the Interstellar Trading Bank.");
center(curwin, 6, ATTR_ERROR_WINDOW,
"All assets have been taken to repay outstanding loans.");
wait_for_key(curwin, 8, ATTR_WAITERROR_STR);
deltxwin();
txrefresh();
} else {
double rate = randf();
char *buf;
buf = malloc(BUFSIZE);
if (buf == NULL) {
err_exit("out of memory");
}
for (i = 0; i < number_players; i++) {
if (player[i].in_game) {
player[i].cash += player[i].stock_owned[which] * rate;
}
}
newtxwin(14, 60, LINE_OFFSET + 4, COL_CENTER(60));
wbkgd(curwin, ATTR_ERROR_WINDOW);
box(curwin, 0, 0);
center(curwin, 1, ATTR_ERROR_TITLE, " Bankruptcy Court ");
center(curwin, 3, ATTR_ERROR_STR, "%s has been declared",
company[which].name);
center(curwin, 4, ATTR_ERROR_STR,
"bankrupt by the Interstellar Trading Bank.");
center2(curwin, 6, ATTR_ERROR_WINDOW, ATTR_ERROR_STR,
"The Bank has agreed to pay stock holders ",
"%4.2f%%", rate * 100.0);
center(curwin, 7, ATTR_ERROR_WINDOW,
"of the share value on each share owned.");
strfmon(buf, BUFSIZE, "%12n", company[which].share_price);
center2(curwin, 9, ATTR_ERROR_WINDOW, ATTR_ERROR_STR,
"Old share value: ", "%s", buf);
strfmon(buf, BUFSIZE, "%12n", company[which].share_price * rate);
center2(curwin, 10, ATTR_ERROR_WINDOW, ATTR_ERROR_STR,
"Amount paid per share: ", "%s", buf);
wait_for_key(curwin, 12, ATTR_WAITERROR_STR);
deltxwin();
txrefresh();
free(buf);
}
for (i = 0; i < number_players; i++) {
player[i].stock_owned[which] = 0;
}
company[which].share_price = 0.0;
company[which].share_return = 0.0;
company[which].stock_issued = 0;
company[which].max_stock = 0;
company[which].on_map = false;
for (x = 0; x < MAX_X; x++) {
for (y = 0; y < MAX_Y; y++) {
if (galaxy_map[x][y] == COMPANY_TO_MAP(which)) {
galaxy_map[x][y] = MAP_EMPTY;
}
}
}
}
}
// Increase or decrease company return
if (randf() < CHANGE_COMPANY_RETURN) {
which = randi(MAX_COMPANIES);
if (company[which].on_map) {
company[which].share_return *= randf() + COMPANY_RETURN_INC;
}
}
// Make sure that a company's return is not too large
for (i = 0; i < MAX_COMPANIES; i++) {
if (company[i].on_map && company[i].share_return > MAX_COMPANY_RETURN) {
company[i].share_return /= randf() + RETURN_DIVIDER;
}
}
// Increase or decrease share price
if (randf() < INC_SHARE_PRICE) {
which = randi(MAX_COMPANIES);
if (company[which].on_map) {
double change = randf() * company[which].share_price * PRICE_CHANGE_RATE;
if (randf() < DEC_SHARE_PRICE) {
change = -change;
}
company[which].share_price += change;
}
}
// Give the current player the companies' dividends
for (i = 0; i < MAX_COMPANIES; i++) {
if (company[i].on_map && company[i].stock_issued != 0) {
player[current_player].cash += player[current_player].stock_owned[i] *
company[i].share_price * company[i].share_return +
((double) player[current_player].stock_owned[i] /
company[i].stock_issued) * company[i].share_price *
OWNERSHIP_BONUS;
}
}
// Change the interest rate
if (randf() < CHANGE_INTEREST_RATE) {
interest_rate *= randf() + INTEREST_RATE_INC;
}
if (interest_rate > MAX_INTEREST_RATE) {
interest_rate /= randf() + INTEREST_RATE_DIVIDER;
}
// Calculate current player's debt
player[current_player].debt *= interest_rate + 1.0;
}
/*----------------------------------------------------------------------- /*-----------------------------------------------------------------------
Function: cmp_game_move - Compare two game_move[] elements Function: cmp_game_move - Compare two game_move[] elements
Arguments: a, b - Elements to compare Arguments: a, b - Elements to compare