00001
00002
00003
00004 #include <ALL.H>
00005 #include <OMATH.H>
00006 #include <OSYS.H>
00007 #include <OFIELD.H>
00008 #include <OGAMESET.H>
00009 #include <ODEPT.H>
00010 #include <ODEPTRES.H>
00011 #include <OSTUDENT.H>
00012 #include <OFIELD.H>
00013 #include <OCOURRES.H>
00014 #include <opschool.h>
00015
00016
00017
00018 #define DEPARTMENT_DB "DEPT"
00019 #define DEPARTMENT_DB2 "DEPT2"
00020 #define DEPARTMENT_DB3 "FACILITY"
00021
00022
00023 #define FACULTY_TRANSITION_PROBABILITY "FAC_TRAN"
00024 #define COURSE_UG_DB "COUR_B" // db from HE.GDB.init
00025 #define COURSE_MASTER_DB "COUR_M"
00026 #define COURSE_DOCTOR_DB "COUR_D"
00027 #define ELECTIVE_PREF_DB "ELECPREF"
00028
00029
00030
00031 void change_templ_code(char* code) {
00032 switch (code[0]) {
00033 case 'S':
00034 code[0] = 'A';
00035 break;
00036 case 'N':
00037 code[0] = 'B';
00038 break;
00039 case 'M':
00040 code[0] = 'C';
00041 break;
00042 case 'H':
00043 code[0] = 'D';
00044 break;
00045 case 'O':
00046 code[0] = 'E';
00047 break;
00048 default:
00049 err_here();
00050 break;
00051 }
00052 }
00053
00054
00055
00056
00057
00058 DepartmentRes::DepartmentRes() {
00059 init_flag=0;
00060 }
00061
00062
00063
00064
00065
00066 DepartmentRes::~DepartmentRes() {
00067 deinit();
00068 }
00069
00070
00071
00072
00076
00077 deinit();
00078
00079 general_dept.init();
00080 memset(&general_dept_info, 0, sizeof(DepartmentInfo));
00081
00082
00083
00084 load_info();
00085 load_faculty_info();
00086 load_course_info();
00087 load_elective_course_pref();
00088
00089 init_flag=1;
00090 }
00091
00092
00093
00094
00095
00096 void DepartmentRes::deinit() {
00097 if( init_flag ) {
00098 mem_del(info_array);
00099
00100 init_flag=0;
00101 }
00102
00103
00104
00105 for( int i=general_dept.student_array.size() ; i>0 ; i-- ) {
00106 if( !general_dept.student_array.is_deleted(i) )
00107 general_dept.student_array.del(i);
00108 }
00109
00110
00111
00112 }
00113
00114
00115
00116
00118
00119 DepartmentRec *deptRec;
00120 DepartmentInfo *deptInfo;
00121 Database *dbDepartment = game_set.open_db(DEPARTMENT_DB);
00122
00123 department_count = (short) dbDepartment->rec_count();
00124 info_array = (DepartmentInfo*) mem_add( sizeof(DepartmentInfo)*department_count );
00125
00126 err_when( department_count != DEPARTMENT_TYPE_COUNT );
00127
00128
00129
00130 memset( info_array, 0, sizeof(DepartmentInfo) * department_count );
00131
00132 for( int i=0 ; i<department_count ; i++ ) {
00133 deptRec = (DepartmentRec*) dbDepartment->read(i+1);
00134 deptInfo = info_array+i;
00135
00136 if (i+1==department_count)
00137 i=i;
00138
00139 m.rtrim_fld( deptInfo->name, deptRec->name, deptRec->NAME_LEN );
00140
00141
00142
00143
00144
00145 deptInfo->field_id = field_res.look_up_code( deptRec->field_code[0] );
00146
00147
00148
00149
00150
00151 deptInfo->max_dl_class_size = m.atoi( deptRec->max_dl_class_size, 9 );
00152
00153 deptInfo->salary_multiplier = (float) m.atof( deptRec->salary_multiplier, 9 );
00154 deptInfo->teaching_load_multiplier = (float) m.atof( deptRec->teaching_load_multiplier, 9 );
00155 deptInfo->research_per_faculty_multiplier = (float) m.atof( deptRec->research_per_faculty_multiplier, 9 );
00156 deptInfo->female_multiplier = (float) m.atof( deptRec->female_multiplier, 9 );
00157 deptInfo->minority_multiplier = (float) m.atof( deptRec->minority_multiplier, 9 );
00158
00159 deptInfo->talent_teaching = m.atoi( deptRec->talent_teaching, 9 );
00160 deptInfo->talent_scholarship = m.atoi( deptRec->talent_scholarship, 9 );
00161 deptInfo->talent_research = m.atoi( deptRec->talent_research, 9 );
00162
00163 deptInfo->percent_pi_faculty = char(100 * m.atof( deptRec->percent_faculty_pi, 9 ));
00164
00165
00166 deptInfo->normal_research_project_size =2 * m.atoi( deptRec->research_project_size, 9 );
00167
00168 deptInfo->doctoral_grad_rate_multiplier = (float) m.atof( deptRec->doctoral_graduation_rate_multiplier, 9 );
00169 deptInfo->doctoral_time_to_dropout_multiplier = (float) m.atof( deptRec->doctoral_time_to_dropout_multiplier, 9 );
00170 deptInfo->doctoral_time_to_degree_multiplier = (float) m.atof( deptRec->doctoral_time_to_degree_multiplier, 9 );
00171 deptInfo->graduate_tuition_rate_multiplier = (float) m.atof( deptRec->graduate_tuition_rate_multiplier, 9 );
00172
00173 memcpy( deptInfo->template_rank_and_age, deptRec->template_rank_and_age, 1 );
00174 memcpy( deptInfo->template_gender_ethnic, deptRec->template_gender_ethnic, 1 );
00175 memcpy( deptInfo->template_salary, deptRec->template_salary, 1 );
00176 memcpy( deptInfo->template_talent, deptRec->template_talent, 1 );
00177 memcpy( deptInfo->template_course_load, deptRec->template_course_load, 1 );
00178
00179 memcpy( deptInfo->template_discretionary_time, deptRec->faculty_discretionary_time, 1 );
00180 memcpy( deptInfo->template_course_type, deptRec->course_type, 2 );
00181
00182 memcpy( deptInfo->base_fac_discretionary_time, deptRec->base_fac_discretionary_time, 1);
00183
00184 change_templ_code(deptInfo->template_rank_and_age);
00185 change_templ_code(deptInfo->template_gender_ethnic);
00186 change_templ_code(deptInfo->template_salary);
00187 change_templ_code(deptInfo->template_talent);
00188 change_templ_code(deptInfo->template_course_load);
00189 change_templ_code(deptInfo->template_discretionary_time);
00190 change_templ_code(deptInfo->base_fac_discretionary_time);
00191
00192 course_res.change_course_templ_code(deptInfo->template_course_type);
00193 }
00194
00195
00196
00197 DepartmentRec2 *deptRec2;
00198 Database *dbDepartment2 = game_set.open_db(DEPARTMENT_DB2);
00199
00200 err_when( department_count != (short) dbDepartment2->rec_count());
00201
00202 for( i=0 ; i<department_count ; i++ ) {
00203 deptRec2 = (DepartmentRec2*) dbDepartment2->read(i+1);
00204 deptInfo = info_array+i;
00205
00206
00207
00208 deptInfo->iped_field = m.atoi( deptRec2->iped_field, 2) - 1;
00209 err_when( deptInfo->iped_field < 0 || deptInfo->iped_field >= IPED_FIELD_COUNT );
00210
00211 deptInfo->field_fraction_pct[SL_UG] = (float) m.atof( deptRec2->field_fraction_pct_sl1n2, 10);
00212 deptInfo->field_fraction_pct[SL_MASTER] = (float) m.atof( deptRec2->field_fraction_pct_sl3, 9);
00213 deptInfo->field_fraction_pct[SL_DOCTOR] = (float) m.atof( deptRec2->field_fraction_pct_sl4, 9);
00214 deptInfo->field_fraction_pct[DISTANCE_LEARN] = (float) m.atof( deptRec2->field_fraction_pct_sl5, 9);
00215 }
00216
00217
00218
00219 init_facility_info();
00220
00221 DepartmentInfo *gdeptInfo;
00222 DepartmentRec3 *deptRec3;
00223 Database *dbDepartment3 = game_set.open_db(DEPARTMENT_DB3);
00224
00225 err_when( department_count + 1 != (short) dbDepartment3->rec_count());
00226
00227 for( i=0 ; i<department_count+1 ; i++ ) {
00228 if ( i < department_count ) {
00229 deptRec3 = (DepartmentRec3*) dbDepartment3->read(i+1);
00230 gdeptInfo = info_array+i;
00231 }
00232 else
00233 gdeptInfo = &general_dept_info;
00234
00235
00236
00237 gdeptInfo->replacement_cost = m.atoi( deptRec3->replacement_cost, 9);
00238 gdeptInfo->normal_onm_cost = (float) m.atof( deptRec3->normal_onm_cost, 9);
00239 gdeptInfo->months_to_construct = (char) m.atoi( deptRec3->months_to_construct, 9);
00240
00241 gdeptInfo->sf_per_course_enrollment_in_seminars = (float) m.atof( deptRec3->sf_per_course_enrollment, 9);
00242 gdeptInfo->sf_per_course_enrollment_in_general_courses = (float) m.atof( deptRec3->sf_per_course_enrollment, 9);
00243 gdeptInfo->sf_per_course_enrollment_in_lecture_courses = (float) m.atof( deptRec3->sf_per_course_enrollment, 9);
00244
00245 gdeptInfo->sf_per_faculty = (float) m.atof( deptRec3->sf_per_faculty, 9);
00246 gdeptInfo->sf_per_research_dollar = (float) m.atof( deptRec3->sf_per_research_dollar, 9);
00247 gdeptInfo->sf_per_dollar_of_central_exp = (float) m.atof( deptRec3->sf_per_dollar_of_central_exp, 9);
00248 gdeptInfo->fixed_sf_per_dept = (float) m.atof( deptRec3->fixed_sf_per_dept, 9);
00249 }
00250
00251
00252 }
00253
00254
00255
00256
00257
00259
00260 DepartmentFacultyRec *deptRec;
00261 DepartmentInfo *deptInfo;
00262 Database *dbDeptFac = game_set.open_db(FACULTY_TRANSITION_PROBABILITY);
00263
00264 short dbCount = (short) dbDeptFac->rec_count();
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274 err_when( dbCount != department_count * 7 );
00275
00276 for( int i=0 ; i<dbCount; i++ ) {
00277 deptRec = (DepartmentFacultyRec*) dbDeptFac->read(i+1);
00278 deptInfo = info_array+i%department_count;
00279
00280 if ( i < department_count )
00281 load_faculty_info_sub((deptInfo->assistant_professor_promotion_probability), deptRec);
00282 else if ( i < department_count*2 )
00283 load_faculty_info_sub((deptInfo->faculty_departure_probability[ASST_PROF]), deptRec);
00284 else if ( i < department_count*3 )
00285 load_faculty_info_sub((deptInfo->associate_professor_promotion_probability), deptRec);
00286 else if ( i < department_count*4 )
00287 load_faculty_info_sub((deptInfo->faculty_departure_probability[ASSOC_PROF]), deptRec);
00288 else if ( i < department_count*5 )
00289 load_faculty_info_sub((deptInfo->faculty_departure_probability[FULL_PROF]), deptRec);
00290 else if ( i < department_count*6 )
00291 load_faculty_info_sub((deptInfo->faculty_departure_probability[LONG_TERM_ADJUNCT]), deptRec);
00292 else if ( i < department_count*7 )
00293 load_faculty_info_sub((deptInfo->faculty_departure_probability[SHORT_TERM_ADJUNCT]), deptRec);
00294 }
00295 }
00296
00297
00298
00299
00301
00302
00303
00304 trans_prob[NATIONAL] = (float) m.atof(deptRec->trans_prob[0], 9);
00305
00306 trans_prob[REGIONAL] = (float) m.atof(deptRec->trans_prob[1], 9);
00307
00308 trans_prob[LOCAL] = (float) m.atof(deptRec->trans_prob[2], 9);
00309 }
00310 }
00311
00312
00313
00314
00316
00317
00318
00319
00320
00321 DepartmentUGCourseRec *deptUGRec;
00322 DepartmentInfo *deptInfo;
00323 Database *dbDept = game_set.open_db(COURSE_UG_DB);
00324
00325 short dbCount = (short) dbDept->rec_count();
00326 char rowsPerDept = 4;
00327
00328
00329
00330
00331 err_when( dbCount != (department_count + 1) * rowsPerDept );
00332
00333
00334
00335 deptUGRec = (DepartmentUGCourseRec*) dbDept->read(1);
00336
00337 for ( int e=0; e<BACHELOR_YEAR_COUNT; e++ )
00338 general_dept_info.bachelor_elective_year_count[e] = (char) m.atoi(deptUGRec->elective[e], 9);
00339
00340 deptUGRec = (DepartmentUGCourseRec*) dbDept->read(2);
00341 load_course_info_sub(general_dept_info.bachelor_depth1, (DepartmentCourseRec *)deptUGRec);
00342
00343 deptUGRec = (DepartmentUGCourseRec*) dbDept->read(3);
00344 load_course_info_sub(general_dept_info.bachelor_depth2, (DepartmentCourseRec *)deptUGRec);
00345
00346 deptUGRec = (DepartmentUGCourseRec*) dbDept->read(4);
00347 load_course_info_sub(general_dept_info.bachelor_depth3, (DepartmentCourseRec *)deptUGRec);
00348
00349
00350
00351 for( int i=4 ; i<dbCount; i++ ) {
00352 deptUGRec = (DepartmentUGCourseRec*) dbDept->read(i+1);
00353 deptInfo = info_array + (i-4)/rowsPerDept;
00354
00355 switch ( i%rowsPerDept ) {
00356 case 0:
00357 for ( e=0; e<BACHELOR_YEAR_COUNT; e++ )
00358 deptInfo->bachelor_elective_year_count[e] = (char) m.atoi(deptUGRec->elective[e], 9);
00359
00360
00361
00362
00363 break;
00364 case 1:
00365 load_course_info_sub(deptInfo->bachelor_depth1, (DepartmentCourseRec *)deptUGRec);
00366 break;
00367 case 2:
00368 load_course_info_sub(deptInfo->bachelor_depth2, (DepartmentCourseRec *)deptUGRec);
00369 break;
00370 case 3:
00371 load_course_info_sub(deptInfo->bachelor_depth3, (DepartmentCourseRec *)deptUGRec);
00372 break;
00373 }
00374 }
00375
00376
00377
00378 DepartmentMasterCourseRec *deptMasterRec;
00379
00380 dbDept = game_set.open_db(COURSE_MASTER_DB);
00381 dbCount = (short) dbDept->rec_count();
00382 rowsPerDept = 3;
00383
00384 err_when( dbCount != department_count * rowsPerDept );
00385
00386 for( i=0 ; i<dbCount; i++ ) {
00387 deptMasterRec = (DepartmentMasterCourseRec*) dbDept->read(i+1);
00388 deptInfo = info_array + i/rowsPerDept;
00389
00390 switch ( i%rowsPerDept ) {
00391 case 0:
00392 deptInfo->master_elective_year_count = 0;
00393
00394
00395
00396 break;
00397 case 1:
00398 load_course_info_sub(deptInfo->master_depth3, deptMasterRec);
00399 break;
00400 case 2:
00401 load_course_info_sub(deptInfo->master_graduate, deptMasterRec);
00402 break;
00403 }
00404 }
00405
00406
00407
00408 DepartmentCourseRec *deptRec;
00409
00410 dbDept = game_set.open_db(COURSE_DOCTOR_DB);
00411 dbCount = (short) dbDept->rec_count();
00412 rowsPerDept = 2;
00413
00414 err_when( dbCount != department_count * rowsPerDept );
00415
00416 for( i=0 ; i<dbCount; i++ ) {
00417 deptRec = (DepartmentCourseRec*) dbDept->read(i+1);
00418 deptInfo = info_array + i/rowsPerDept;
00419
00420 switch ( i%rowsPerDept ) {
00421 case 0:
00422
00423 break;
00424 case 1:
00425 load_course_info_sub(deptInfo->doctor_graduate, deptRec);
00426 break;
00427 }
00428 }
00429 }
00430
00431
00432
00433
00435
00436 for (int s=0; s<COURSE_GAME_FIELD_COUNT; s++) {
00437 required[s] = (char) m.atoi(deptRec->required[s], 9);
00438 }
00439 }
00440
00441
00442
00443
00447
00448 DepartmentInfo *deptInfo;
00449
00450
00451
00452
00453
00454
00455
00456
00457 for( int i=0 ; i<department_count; i++ ) {
00458
00459
00460 deptInfo = info_array+i;
00461
00462
00463 deptInfo->replacement_cost = 200;
00464
00465 deptInfo->cost_growth = math.get_random_snd(0.030f, .01f);
00466 deptInfo->cost_growth_last2 = 0;
00467 deptInfo->normal_onm_cost = 4.0f;
00468 deptInfo->months_to_construct = 14;
00469
00470
00471 deptInfo->sf_per_course_enrollment_in_seminars = 6;
00472 deptInfo->sf_per_course_enrollment_in_general_courses = 5;
00473 deptInfo->sf_per_course_enrollment_in_lecture_courses = 4;
00474
00475 deptInfo->sf_per_faculty = 2000;
00476 deptInfo->sf_per_research_dollar = 100;
00477 deptInfo->sf_per_dollar_of_central_exp = 0;
00478 deptInfo->fixed_sf_per_dept = 5000;
00479
00480
00481 deptInfo->actual_sf = -1;
00482 }
00483
00484 general_dept_info.replacement_cost = 180;
00485 general_dept_info.cost_growth = 0;
00486 general_dept_info.cost_growth_last2 = 0;
00487 general_dept_info.normal_onm_cost = 3.5f;
00488 general_dept_info.months_to_construct = 13;
00489
00490
00491 general_dept_info.sf_per_course_enrollment_in_seminars = 0;
00492 general_dept_info.sf_per_course_enrollment_in_general_courses = 0;
00493 general_dept_info.sf_per_course_enrollment_in_lecture_courses = 0;
00494 general_dept_info.sf_per_faculty = 0;
00495 general_dept_info.sf_per_research_dollar = 0;
00496
00497 general_dept_info.sf_per_dollar_of_central_exp = 5;
00498 general_dept_info.fixed_sf_per_dept = 50000;
00499
00500
00501 general_dept_info.actual_sf = -1;
00502 }
00503
00504
00505
00506
00508
00509 ElecPrefRec *deptRec;
00510
00511 DepartmentInfo *deptInfo;
00512 Database *dbDept = game_set.open_db(ELECTIVE_PREF_DB);
00513 short dbCount = (short) dbDept->rec_count();
00514
00515 err_when(dbCount != department_count);
00516
00517 for( int i=1; i<=department_count ; i++ ) {
00518 float totalPref=0;
00519 deptInfo = department_res[i];
00520
00521 deptRec = (ElecPrefRec*) dbDept->read(i);
00522
00523 for( int j=0 ; j<department_count ; j++ ) {
00524 deptInfo->bachelor_elective_course_pref[j] = 100 * (float) m.atof( deptRec->pref[j], 9);
00525
00526
00527 deptInfo->master_elective_course_pref[j] = 100.0f / (department_count);
00528
00529
00530
00531 totalPref += deptInfo->bachelor_elective_course_pref[j];
00532 }
00533
00534
00535 err_when( totalPref <= 99 || totalPref >= 101 );
00536 }
00537
00538
00539
00540 for( int j=0 ; j<department_count ; j++ ) {
00541 general_dept_info.bachelor_elective_course_pref[j] = 100.0f / department_count;
00542 }
00543 }
00544
00545
00546
00547
00551
00552 for( int i=0; i<=department_count; i++ ) {
00553 DepartmentInfo* deptInfo = department_res[i];
00554
00555 deptInfo->total_bachelor_elective_course_pref = 0;
00556 deptInfo->total_master_elective_course_pref = 0;
00557
00558
00559
00560 for (int r=department_array.size(); r>0; r--) {
00561 if( department_array.is_deleted(r) )
00562 continue;
00563
00564 int deptId = department_array[r]->department_id;
00565
00566 deptInfo->total_bachelor_elective_course_pref +=
00567 deptInfo->bachelor_elective_course_pref[deptId-1];
00568
00569 deptInfo->total_master_elective_course_pref +=
00570 deptInfo->master_elective_course_pref[deptId-1];
00571
00572 err_when(department_array[r]->department_recno != r);
00573 }
00574
00575 }
00576 }
00577
00578
00579
00580
00582
00583 return player_school.student_market;
00584 }
00585
00586
00587
00588
00590
00591 if ( deptId==0 )
00592 return &general_dept_info;
00593
00594 err_when( deptId < 1 || deptId > department_count );
00595
00596 return info_array + deptId - 1;
00597 }
00598
00599