mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2026-01-06 06:32:56 +01:00
Merge branch 'lnz-scenario_stuff'
This commit is contained in:
@@ -23,6 +23,7 @@
|
||||
#include "sprite.h"
|
||||
#include "park.h"
|
||||
#include "peep.h"
|
||||
#include "ride.h"
|
||||
#include "window.h"
|
||||
|
||||
// monthly cost
|
||||
@@ -102,6 +103,35 @@ void finance_pay_interest()
|
||||
finance_payment((sint32)tempcost, RCT_EXPENDITURE_TYPE_INTEREST);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x006AC885
|
||||
*/
|
||||
void finance_pay_ride_upkeep()
|
||||
{
|
||||
rct_ride* ride;
|
||||
for (int i = 0; i < MAX_RIDES; i++) {
|
||||
ride = &(RCT2_ADDRESS(RCT2_ADDRESS_RIDE_LIST, rct_ride)[i]);
|
||||
if (ride->type == RIDE_TYPE_NULL)
|
||||
continue;
|
||||
|
||||
if (!(ride->var_1D0 & 0x1000)) {
|
||||
ride->build_date = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16);
|
||||
ride->var_196 = 25855; // durability?
|
||||
|
||||
}
|
||||
if (ride->status != RIDE_STATUS_CLOSED && !(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & 0x800)) {
|
||||
sint16 upkeep = ride->upkeep_cost;
|
||||
if (upkeep != -1) {
|
||||
ride->var_158 -= upkeep;
|
||||
ride->var_14D |= 2;
|
||||
finance_payment(upkeep, RCT2_EXPENDITURE_TYPE_RIDE_UPKEEP);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x0069DEFB
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
typedef int rct_expenditure_type;
|
||||
|
||||
enum {
|
||||
RCT2_EXPENDITURE_TYPE_RIDE_UPKEEP = 1,
|
||||
RCT_EXPENDITURE_TYPE_WAGES = 10,
|
||||
RCT_EXPENDITURE_TYPE_RESEARCH = 12,
|
||||
RCT_EXPENDITURE_TYPE_INTEREST = 13
|
||||
@@ -38,6 +39,7 @@ void finance_payment(int amount, rct_expenditure_type type);
|
||||
void finance_pay_wages();
|
||||
void finance_pay_research();
|
||||
void finance_pay_interest();
|
||||
void finance_pay_ride_upkeep();
|
||||
void finance_init();
|
||||
|
||||
#endif
|
||||
35
src/ride.c
35
src/ride.c
@@ -20,6 +20,9 @@
|
||||
|
||||
#include "addresses.h"
|
||||
#include "ride.h"
|
||||
#include "sprite.h"
|
||||
#include "peep.h"
|
||||
#include "window.h"
|
||||
|
||||
#define GET_RIDE(x) (&(RCT2_ADDRESS(RCT2_ADDRESS_RIDE_LIST, rct_ride)[x]))
|
||||
#define GET_RIDE_MEASUREMENT(x) (&(RCT2_ADDRESS(RCT2_ADDRESS_RIDE_MEASUREMENTS, rct_ride_measurement)[x]))
|
||||
@@ -166,4 +169,34 @@ void reset_all_ride_build_dates() {
|
||||
ride->build_date -= RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_YEAR, uint16);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* rct2: 0x006AC916
|
||||
*/
|
||||
void ride_update_favourited_stat()
|
||||
{
|
||||
rct_ride *ride;
|
||||
rct_peep* peep;
|
||||
|
||||
for (int i = 0; i < MAX_RIDES; i++) {
|
||||
ride = GET_RIDE(i);
|
||||
if (ride->type != RIDE_TYPE_NULL)
|
||||
ride->guests_favourite = 0;
|
||||
|
||||
}
|
||||
for (int sprite_idx = RCT2_GLOBAL(RCT2_ADDRESS_SPRITES_START_PEEP, uint16); sprite_idx != SPRITE_INDEX_NULL; sprite_idx = peep->next) {
|
||||
peep = &(RCT2_ADDRESS(RCT2_ADDRESS_SPRITE_LIST, rct_sprite)[sprite_idx].peep);
|
||||
if (peep->var_08 != 4)
|
||||
return;
|
||||
if (peep->favourite_ride != 0xff) {
|
||||
ride = GET_RIDE(peep->favourite_ride);
|
||||
ride->guests_favourite++;
|
||||
ride->var_14D |= 1;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
window_invalidate_by_id(WC_RIDE_LIST, 0);
|
||||
}
|
||||
|
||||
|
||||
@@ -74,7 +74,8 @@ typedef struct {
|
||||
uint16 var_158;
|
||||
uint8 pad_15A[0x26];
|
||||
uint16 build_date;
|
||||
uint8 pad_182[0x14];
|
||||
sint16 upkeep_cost; // 0x182
|
||||
uint8 pad_184[0x12];
|
||||
uint16 var_196;
|
||||
uint8 pad_198;
|
||||
uint8 var_199;
|
||||
@@ -260,5 +261,6 @@ int ride_get_total_queue_length(rct_ride *ride);
|
||||
int ride_get_max_queue_time(rct_ride *ride);
|
||||
void ride_init_all();
|
||||
void reset_all_ride_build_dates();
|
||||
void ride_update_favourited_stat();
|
||||
|
||||
#endif
|
||||
|
||||
@@ -604,7 +604,7 @@ void scenario_objective5_check()
|
||||
|
||||
memset(type_already_counted, 0, 256);
|
||||
|
||||
for (int i = 0; i < 255; i++) {
|
||||
for (int i = 0; i < MAX_RIDES; i++) {
|
||||
uint8 subtype_id;
|
||||
uint32 subtype_p;
|
||||
ride = &(RCT2_ADDRESS(RCT2_ADDRESS_RIDE_LIST, rct_ride)[i]);
|
||||
@@ -640,7 +640,7 @@ void scenario_objective8_check()
|
||||
|
||||
memset(type_already_counted, 0, 256);
|
||||
|
||||
for (int i = 0; i < 255; i++) {
|
||||
for (int i = 0; i < MAX_RIDES; i++) {
|
||||
uint8 subtype_id;
|
||||
uint32 subtype_p;
|
||||
ride = &(RCT2_ADDRESS(RCT2_ADDRESS_RIDE_LIST, rct_ride)[i]);
|
||||
@@ -741,7 +741,7 @@ void scenario_objectives_check()
|
||||
{
|
||||
rct_ride* ride;
|
||||
int rcs = 0;
|
||||
for (int i = 0; i < 255; i++) {
|
||||
for (int i = 0; i < MAX_RIDES; i++) {
|
||||
ride = &(RCT2_ADDRESS(RCT2_ADDRESS_RIDE_LIST, rct_ride)[i]);
|
||||
if (ride->status && ride->excitement > objective_currency)
|
||||
rcs++;
|
||||
@@ -875,7 +875,7 @@ void scenario_update()
|
||||
scenario_marketing_update();
|
||||
peep_problem_warnings_update();
|
||||
RCT2_CALLPROC_EBPSAFE(0x006B7A5E); // check ride reachability
|
||||
RCT2_CALLPROC_EBPSAFE(0x006AC916); // ride update favourited
|
||||
ride_update_favourited_stat();
|
||||
|
||||
if (month <= 1 && RCT2_GLOBAL(0x009ADAE0, sint32) != -1 && RCT2_GLOBAL(0x009ADAE0 + 14, uint16) & 1) {
|
||||
for (int i = 0; i < 100; ++i) {
|
||||
@@ -893,8 +893,8 @@ void scenario_update()
|
||||
|
||||
//if ( (unsigned int)((2 * current_day) & 0xFFFF) >= 0xFFF8) {
|
||||
if (next_month_tick % 0x8000 == 0) {
|
||||
// biweekly checks
|
||||
RCT2_CALLPROC_EBPSAFE(0x006AC885);
|
||||
// fortnightly
|
||||
finance_pay_ride_upkeep();
|
||||
}
|
||||
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_MONTH_TICKS, uint16) = next_month_tick;
|
||||
|
||||
Reference in New Issue
Block a user