00001
00002
00003
00004
00005 #ifndef __OPSCHOOL_H
00006 #define __OPSCHOOL_H
00007
00008 #ifndef __GAMEDEF_H
00009 #include <GAMEDEF.H>
00010 #endif
00011
00012 #ifndef __OCOURSE_H
00013 #include <OCOURSE.H>
00014 #endif
00015
00016 #ifndef __OSTUDENT_H
00017 #include <OSTUDENT.H>
00018 #endif
00019
00020 #ifndef __ODEPTRES_H
00021 #include <ODEPTRES.H>
00022 #endif
00023
00024
00025 #define MIN_DEPARTMENT MAX_DEPARTMENT-4 //### fred 1005 ###//
00026
00027 enum {
00028 LOCAL, REGIONAL, NATIONAL
00029 };
00030
00031 enum {
00032 NORTH_EAST, MID_ATLANTIC, SOUTH_EAST, SOUTH_CENTRAL, MID_WEST, PACIFIC
00033 };
00034
00035 enum {
00036 WEALTH_RICH, WEALTH_IN_BETWEEN, WEALTH_STRUGGLING
00037 };
00038
00039 enum {
00040 PRIVATE, PUBLIC
00041 };
00042
00043 enum {
00044 URBAN, SUBURBAN, RURAL,
00045 ENVIRONMENT_COUNT
00046 };
00047
00048
00049
00050 enum {
00051 SCN_NONE = 0,
00052 SCN_RAISE_SALARY = 1,
00053 SCN_INVEST_ACADEMIC = 2,
00054 SCN_TEACHING_QUALITY = 3,
00055 SCN_RESEARCH_QUALITY = 4,
00056 SCN_WINNING_ATHLETICS = 5,
00057 SCN_LIMIT_TUITION_GROWTH = 6,
00058 SCN_COMPENSATE_FOR_ENROLLMENT_SHIFTS = 7,
00059 SCN_STUDENT_DIVERSITY = 8,
00060 SCN_FACULTY_DIVERSITY = 9,
00061 SCN_BALANCE_BUDGET = 10,
00062
00063 SCENARIO_COUNT = 10,
00064 };
00065
00066 enum { PLAQUE_GOLD=0, PLAQUE_SILVER, PLAQUE_BRONZE, TOTAL_PLAQUE_COUNT=3 };
00067
00068
00069
00070 enum {
00071
00072
00073 S_DEGREES_GRANTED = 0,
00074 S_SPONSORED_RESEARCH_ACTIVITY,
00075
00076
00077 S_PRESTIGE,
00078 S_EDUCATIONAL_QUALITY,
00079 S_SCHOLARSHIP_BROADLY_DEFINED,
00080 S_STUDENT_DIVERSITY,
00081 S_FACULTY_DIVERSITY,
00082 S_PERCENT_ALUMNI_GIVEN,
00083
00084
00085 S_FACULTY_MORALE,
00086 S_STUDENT_MORALE,
00087 S_STAFF_MORALE,
00088
00089
00090 S_CURRENT_SURPLUS_DEFICIT_PERCENT,
00091 S_SMOOTHED_SURPLUS_DEFICIT_PERCENT,
00092 S_ENDOWMENT_PAYOUT_RATE_RELATIVE,
00093 S_DEFERRED_MAINTENANCE_BACKLOG_PERCENT,
00094
00095 SCORE_VAR_COUNT = 15,
00096
00097 SCORE_SUBGROUP_COUNT = 4,
00098 GROUP1_BEGIN_ID = S_DEGREES_GRANTED,
00099 GROUP2_BEGIN_ID = S_PRESTIGE,
00100 GROUP3_BEGIN_ID = S_FACULTY_MORALE,
00101 GROUP4_BEGIN_ID = S_CURRENT_SURPLUS_DEFICIT_PERCENT,
00102 };
00103
00104 #if(GAME_VERSION>=200)
00105
00106 enum { COMMENT_NONE=0, COMMENT_R1, COMMENT_R2, COMMENT_R3, COMMENT_R4, COMMENT_R5, COMMENT_R6, COMMENT_TERMINATE };
00107 #define MAX_PROTAGONIST_ID 34
00108
00109 struct ProtagonistInfo {
00110 char protagonist_id;
00111 char departmental_level;
00112 char exist_departmental_level;
00113 char cause_termination_flag;
00114 enum ProtagonistFrequency event_freq;
00115 short event_month;
00116 short event_day;
00117 enum ProtagonistMsgSource msg_source;
00118 float relative_trend_threshold;
00119 float normalizing_factor;
00120 float r1_bonus_inst, r4_penalty_inst;
00121 float r1_bonus_dept, r4_penalty_dept;
00122 char *insert_text;
00123
00124 int is_event_date();
00125 char *source_str(int departmentRecno, int srcPara1, short srcPara2, short srcPara3, short srcPara4 );
00126
00127 char *rating_str(int rating, int departmentRecno );
00128 char *target_str(int departmentRecno);
00129 };
00130 #endif
00131
00132
00133
00136 struct Trimester {
00137 char start_month;
00138 char start_day;
00139
00140 char end_month;
00141 char end_day;
00142
00143 char total_days;
00144
00145 void calc_total_days();
00146 };
00147
00148
00149
00154 class PlayerSchool {
00155 public:
00156
00157
00158
00159 enum { SCHOOL_NAME_LEN=60, FIRST_NAME_LEN=15, LAST_NAME_LEN=30 };
00160
00161
00162 float spinner_var1,spinner_var2;
00163
00164 int mascot;
00165 char school_name[SCHOOL_NAME_LEN+1];
00166 char player_first_name[FIRST_NAME_LEN+1];
00167 char player_last_name[LAST_NAME_LEN+1];
00168
00169
00170 int tmp_department_pool_flag[DEPARTMENT_TYPE_COUNT];
00171 int right_bws_pool[DEPARTMENT_TYPE_COUNT];
00172 int left_bws_pool[DEPARTMENT_TYPE_COUNT];
00173 int right_bws_pool_size;
00174 int left_bws_pool_size;
00175 int pool_selected_size;
00176 int just_add,just_remove;
00177
00178
00179
00180 int student_market;
00181 int location;
00182
00183 int prestige;
00184 int student_count;
00185 int sl5_student_percent;
00186 int get_player_expected_student_count();
00187 #if(GAME_VERSION>=200)
00188 int get_player_expected_sponsored_research();
00189 #endif
00190
00191 int parttime_undergrad_percent;
00192 int ug_get_degree_in_5year_percent;
00193
00194 int fulltime_ug_in_housing_percent;
00195 int athletic_program_intensity;
00196
00197 int graduate_student_percent;
00198 int nondegree_student_percent;
00199
00200 int doctoral_program_intensity;
00201 int sponsored_research_intensity;
00202
00203 int relative_wealth;
00204 int control;
00205 int campus_environment;
00206 bool is_public() { return control == PUBLIC; };
00207 float initializationValueAC_ADMINISTRATION_N_OTHER_OPERATING_EXPENSE;
00208 int school_type;
00209
00210 #if(GAME_VERSION>=200)
00211 char is_unacceptable_at_year_end;
00212 #endif
00213
00214
00215
00216 int scenario_id;
00217
00218 int scenario_base;
00219 int scenario_base_at_start;
00220
00221 int scenario_target[3];
00222
00223 int scenario_base1;
00224 int scenario_base2;
00225 float scenario_float_base;
00226
00227 float scenario_faculty_salary_increase;
00228 float scenario_endowment_increase;
00229
00230 int scenario_review_game_year;
00231 int scenario_max_game_years;
00232 int scenario_start_score;
00233 int scen_quit_game_flag;
00234
00235 char scen_dept_selected_array[MAX_DEPARTMENT];
00236
00237 char plaque_granted[TOTAL_PLAQUE_COUNT];
00238 char goal_deadline[TOTAL_PLAQUE_COUNT];
00239 char plaque_last;
00240
00241 void scenario_check_target();
00242 int scenario_invest_academic_get_cur();
00243
00244 void init_scen_dept_selected(int selectPercent);
00245 float scen_balance_budget_score();
00246
00247
00248
00249
00250 int selected_department_list[DEPARTMENT_TYPE_COUNT];
00251
00252
00253 int chance_event_frequency;
00254 int chance_objective_frequency;
00255 #if(GAME_VERSION>=200)
00256 int chance_perturbations;
00257 int behavioral_response_speed;
00258 int threshold_event_flag;
00259 #endif
00260 float difficulty_multiplier;
00261
00262 Trimester trimester_array[TRIMESTER_PER_YEAR];
00263
00264
00265
00266 char percent_student_in_state;
00267 char relative_wealth_value;
00268
00269
00270
00271 char cur_trimester;
00272 int cur_trimester_start_date;
00273
00274 char is_trimester_off;
00275 char trimester_off_day;
00276
00277 char* trimester_str();
00278
00279
00280
00281 char teaching_method_pref[MAX_TEACHING_METHOD];
00282 char course_match_order[MAX_STUDENT_LEVEL];
00283
00284 short cur_select_course_student_level_order;
00285 short cur_select_course_student_level;
00286
00287
00288 char faculty_promotion_difficulity;
00289
00290 char faculty_degree_to_which_priorities_reflected_in_promotion;
00291
00292 char summer_emphasis, summer_emphasis_last;
00293 char percent_summer_teaching_load;
00294
00295
00296
00297 float student_level_pct[MAX_STUDENT_LEVEL];
00298 float year_in_program_pct[MASTER_ARRAY_SIZE][MAX_GRADUATE_YEARS+1];
00299 float student_gender_pct[MAX_STUDENT_LEVEL][GENDER_ETHNIC_TYPE_COUNT];
00300 float dropout_trans_prob[MASTER_ARRAY_SIZE][MAX_GRADUATE_YEARS];
00301 float adjusted_student_major_pref[MAX_STUDENT_LEVEL_INI][MAX_DEPARTMENT];
00302 float major_pref_multiplier[MAX_DEPARTMENT];
00303
00304 float grad_trans_prob[MASTER_ARRAY_SIZE][MAX_GRADUATE_YEARS];
00305
00306 float delay_rate[MAX_STUDENT_LEVEL];
00307
00308
00309 public:
00310 int get_random_major(char sl);
00311 char generate_student_random_get_group_index(float *arr, int size);
00312
00313
00314 public:
00315 void init();
00316 void deinit();
00317
00318 void init_setting_scenario(int scenId);
00319 void init_setting_non_scenario();
00320 void init_scenario();
00321
00322 int write_file(File* filePtr);
00323 int read_file(File* filePtr);
00324 #if(GAME_VERSION>=200)
00325 int write_log_header(File *);
00326 int write_log(File *);
00327 #endif
00328
00329
00330 char current_report_type;
00331 char current_report_mode;
00332
00333
00334 void student_report(int refreshFlag);
00335 int student_report_detect();
00336
00337 void summary_student_report(int refreshFlag);
00338 void summary_student_report_1(int refreshFlag);
00339 void summary_student_report_2(int refreshFlag);
00340 void summary_student_report_3(int refreshFlag);
00341 void summary_student_report_4(int refreshFlag);
00342 void summary_student_report_5(int refreshFlag);
00343 void summary_student_report_6(int refreshFlag);
00344 #if(GAME_VERSION>=200)
00345 void summary_student_report_7(int refreshFlag);
00346 #endif
00347 void summary_student_report_call_residence();
00348 int summary_student_report_detect();
00349 void summary_student_report_deinit();
00350 void summary_student_report_printing(int printOption);
00351
00352 char current_score_report_type;
00353 void score_report(int refreshFlag);
00354 void score_report_printing(int printOption);
00355 void score_report_detect();
00356 void score_report_deinit();
00357
00358 void next_day();
00359
00360 void next_trimester();
00361
00362
00363 void generate_student();
00364
00365 void new_trimester(int trimesterId);
00366
00367
00368 void generate_student_adjust_pct_array(float *arr, int size);
00369
00370 void generate_student_readjust_pct_array(float *arr, int size);
00371
00372 void update_stu_sum();
00373 void update_gender();
00374 void calc_setting_vars();
00375
00376
00377 float latency_func(float latencyPara, float curValue, float inputValue);
00378
00379 private:
00380 void init_config();
00381 void default_setting();
00382
00383
00384
00385 void generate_student_level_pct();
00386 void generate_student_transition_prob_n_year_in_program();
00387 void generate_student_gender_ethnic();
00388 void generate_student_major_preference();
00389 void generate_student_adjust_pct_arrays();
00390
00391
00392
00393 void generate_student_init_course(int progressIndex);
00394
00395
00396
00397
00398
00399
00400
00401
00402 public:
00403
00404
00405 char staff_morale;
00406 char media_attitudes;
00407 char administrative_performance;
00408 char scholarship_broadly_defined;
00409
00410 float sub_score[SCORE_VAR_COUNT][HISTORY_MONTH_COUNT];
00411 float sub_score_change[SCORE_VAR_COUNT];
00412 float sub_score_start[SCORE_VAR_COUNT];
00413 float game_score_history[HISTORY_MONTH_COUNT];
00414 int ultimate_game_score_history[HISTORY_MONTH_COUNT];
00415
00416
00417 float score_sub_total[SCORE_SUBGROUP_COUNT][HISTORY_MONTH_COUNT];
00418 float score_group_change[SCORE_SUBGROUP_COUNT];
00419 float score_group_weight[SCORE_SUBGROUP_COUNT];
00420
00421 float sub_score_weight[SCORE_VAR_COUNT];
00422 float init_game_score;
00423 float cur_game_score;
00424 int ultimate_game_score;
00425 int bonus_point;
00426 #if(GAME_VERSION>=200)
00427 float threshold_event_bonus;
00428 #endif
00429
00430
00431 float time_to_degree[DEGREE_TYPE_COUNT][HISTORY_YEAR_COUNT];
00432 float dropout_rate[DEGREE_TYPE_COUNT][HISTORY_YEAR_COUNT];
00433
00434
00435 float fake_disp_time_to_degree[DEGREE_TYPE_COUNT][HISTORY_YEAR_COUNT];
00436
00437
00438 int bachelor_degree[HISTORY_YEAR_COUNT];
00439 #if(GAME_VERSION>=200)
00440 int non_ug_bachelor_degree[HISTORY_YEAR_COUNT];
00441 #endif
00442 int master_degree[HISTORY_YEAR_COUNT];
00443 int doctor_degree[HISTORY_YEAR_COUNT];
00444
00445
00446
00447
00448
00449 char talent_academic_all[DEGREE_TYPE_COUNT][HISTORY_MONTH_COUNT];
00450 char performance_academic_ug[HISTORY_MONTH_COUNT];
00451
00452
00453
00454 char talent_academic[HISTORY_MONTH_COUNT];
00455 char talent_extracurricular[HISTORY_MONTH_COUNT];
00456 char talent_athletics[HISTORY_MONTH_COUNT];
00457
00458 char satisfaction_academic[HISTORY_MONTH_COUNT];
00459 char satisfaction_student_life[HISTORY_MONTH_COUNT];
00460 char satisfaction_athletics[HISTORY_MONTH_COUNT];
00461 char satisfaction_overall[HISTORY_MONTH_COUNT];
00462
00463
00464 int ins_student_level_no[MAX_STUDENT_LEVEL_N_TOTAL];
00465 int ins_student_level_history[MAX_STUDENT_LEVEL_N_TOTAL][HISTORY_TRIMESTER_COUNT];
00466
00467
00468 int ins_gender_student_level_no[GENDER_ETHNIC_TYPE_COUNT_N_TOTAL];
00469 int ins_gender_student_level_history[GENDER_ETHNIC_TYPE_COUNT_N_TOTAL][HISTORY_TRIMESTER_COUNT];
00470
00471 float old_pre;
00472
00473 #if(GAME_VERSION>=200)
00474 char is_year_end_report;
00475 #endif
00476
00477
00478 #if(GAME_VERSION>=200)
00479
00480
00481 int initial_ins_student_level_history[MAX_STUDENT_LEVEL_N_TOTAL];
00482
00483
00484 int initial_ins_gender_student_level_history[GENDER_ETHNIC_TYPE_COUNT_N_TOTAL];
00485 char initial_talent_academic_all[DEGREE_TYPE_COUNT][HISTORY_MONTH_COUNT];
00486 char initial_performance_academic_ug[HISTORY_MONTH_COUNT];
00487
00488 char initial_talent_academic[HISTORY_MONTH_COUNT];
00489 char initial_talent_extracurricular[HISTORY_MONTH_COUNT];
00490 char initial_talent_athletics[HISTORY_MONTH_COUNT];
00491
00492 char initial_satisfaction_academic[HISTORY_MONTH_COUNT];
00493 char initial_satisfaction_student_life[HISTORY_MONTH_COUNT];
00494 char initial_satisfaction_athletics[HISTORY_MONTH_COUNT];
00495 char initial_satisfaction_overall[HISTORY_MONTH_COUNT];
00496
00497 int initial_bachelor_degree[HISTORY_YEAR_COUNT];
00498 int initial_master_degree[HISTORY_YEAR_COUNT];
00499 int initial_doctor_degree[HISTORY_YEAR_COUNT];
00500
00501 float initial_time_to_degree[DEGREE_TYPE_COUNT][HISTORY_YEAR_COUNT];
00502 float initial_dropout_rate[DEGREE_TYPE_COUNT][HISTORY_YEAR_COUNT];
00503
00504
00505 float initial_fake_disp_time_to_degree[HISTORY_YEAR_COUNT];
00506
00507
00508 int last_protagonist_event_date[MAX_PROTAGONIST_ID][MAX_DEPARTMENT+1];
00509 #endif
00510
00511
00512
00513 private:
00514
00515 float degree_granted_ratio_init;
00516 float degree_granted_weight[MAX_STUDENT_LEVEL];
00517 int init_research_dollar;
00518
00519 public:
00520 void init_pi();
00521 void init_score();
00522 #if(GAME_VERSION>=200)
00523
00524 void init_sub_score_weight(int subScoreGroup=-1);
00525 void normalize_sub_score_weight();
00526 float get_default_sub_score_weight(int);
00527 #endif
00528 void add_bonus(int value);
00529 void update_history(char flag=UPDATE_ALL);
00530 void calc_ultimate_score();
00531 void calc_staff_morale();
00532 void calc_media_attitudes();
00533
00534 #if(GAME_VERSION>=200)
00535 void save_initial_data();
00536 int is_hidden_mascot(int mascotId);
00537 void think_protagonist();
00538 int think_protagonist_event(float curValue, float lastYearValue, float initialValue, struct ProtagonistInfo *protagonistInfo, int departmentRecno, int testResign=0 );
00539 #ifdef DEBUG
00540 void set_cks( int index, float change );
00541 void get_cks( float &ck1, float &ck2, float &ck3 );
00542 #endif
00543 ProtagonistInfo* get_protagonist_info(int recno);
00544 void calc_strength_consistency_k1(float curValue, float lastYearValue, float initialValue, struct ProtagonistInfo *protagonistInfo, float &strength, float &consistency, float &k1);
00545 int is_protagonist_event_date( int protagonistId, int departmentRecno );
00546 int mark_protagonist_event_date( int protagonistId, int departmentRecno );
00547 #endif
00548
00549 private:
00550 void calc_performance_yearly();
00551 void calc_performance_monthly();
00552 void calc_prestige();
00553 void calc_administrative_performance_etc();
00554
00555 void calc_student_performance();
00556 };
00557
00558 extern PlayerSchool player_school;
00559
00560
00561 #if(GAME_VERSION>=200)
00562 inline float PSCH_SD(float sd) { return player_school.chance_perturbations==INPUT_LOW ? 0.0f : (sd); }
00563 #else
00564 #define PSCH_SD(sd) (sd)
00565 #endif
00566
00567
00568 #endif