00001
00002
00003
00004 #include <OSYS.H>
00005 #include <OGAMESET.H>
00006 #include <OFACURES.H>
00007
00008
00009
00010 #define FACULTY_TEMPLATE_DB "FAC_TMPL"
00011
00012
00013 #if(GAME_VERSION>=200)
00014 enum {
00015 REPORT_TYPE_DEPARTMENT_PROFILE1,
00016 REPORT_TYPE_DEPARTMENT_PROFILE2,
00017 REPORT_TYPE_DEPARTMENT_ACTIVITIES,
00018 REPORT_TYPE_DEPARTMENT_RESEARCH,
00019 REPORT_TYPE_DEPARTMENT_HIRING,
00020 REPORT_TYPE_DEPARTMENT_DIRECTORY,
00021 REPORT_TYPE_DEPARTMENT_TURNOVER,
00022 REPORT_TYPE_INSTITUTION_PROFILE1,
00023 REPORT_TYPE_INSTITUTION_PROFILE2,
00024 REPORT_TYPE_INSTITUTION_ACTIVITIES,
00025 REPORT_TYPE_INSTITUTION_RESEARCH,
00026 REPORT_TYPE_INSTITUTION_SALARY,
00027 REPORT_TYPE_INSTITUTION_PROMOTION,
00028 REPORT_TYPE_INSTITUTION_TURNOVER,
00029 };
00030 #else
00031 enum {
00032 REPORT_TYPE_DEPARTMENT_PROFILE1,
00033 REPORT_TYPE_DEPARTMENT_PROFILE2,
00034 REPORT_TYPE_DEPARTMENT_ACTIVITIES,
00035 REPORT_TYPE_DEPARTMENT_RESEARCH,
00036 REPORT_TYPE_DEPARTMENT_DIRECTORY,
00037 REPORT_TYPE_DEPARTMENT_HIRING,
00038 REPORT_TYPE_INSTITUTION_PROFILE1,
00039 REPORT_TYPE_INSTITUTION_PROFILE2,
00040 REPORT_TYPE_INSTITUTION_ACTIVITIES,
00041 REPORT_TYPE_INSTITUTION_RESEARCH,
00042 REPORT_TYPE_INSTITUTION_SALARY,
00043 REPORT_TYPE_INSTITUTION_PROMOTION,
00044 };
00045 #endif
00046
00047 FacultyRes::FacultyRes() {
00048 memset( this, 0, sizeof(FacultyRes) );
00049 }
00050
00051
00052
00053
00057
00058 deinit();
00059
00060
00061
00062 memset( this, 0, sizeof(FacultyRes) );
00063
00064 load_template();
00065
00066 init_flag=1;
00067 current_report_type=REPORT_TYPE_INSTITUTION_PROFILE1;
00068 }
00069
00070
00071
00072
00073
00074 void FacultyRes::deinit() {
00075 if( init_flag ) {
00076 if( faculty_template_count > 0 )
00077 free_template();
00078
00079
00080 summary_report_deinit();
00081
00082 init_flag=0;
00083 }
00084 }
00085
00086
00087
00088
00090
00091 err_when( faculty_template_count != 0 );
00092
00093 FacultyTemplateRec *templateRec;
00094 FacultyTemplate *templatePtr;
00095 Database *dbTemplate = game_set.open_db(FACULTY_TEMPLATE_DB);
00096
00097 faculty_template_count = (short) dbTemplate->rec_count();
00098
00099 err_when( faculty_template_array );
00100
00101 faculty_template_array = (FacultyTemplate*) mem_add( sizeof(FacultyTemplate)*faculty_template_count );
00102
00103
00104
00105 memset( faculty_template_array, 0, sizeof(FacultyTemplate) * faculty_template_count );
00106
00107 for( int i=0 ; i<faculty_template_count ; i++ ) {
00108 templateRec = (FacultyTemplateRec*) dbTemplate->read(i+1);
00109 templatePtr = faculty_template_array+i;
00110
00111
00112
00113 templatePtr->template_code = templateRec->template_code[0];
00114
00115 err_when( templatePtr->template_code < FIRST_TEMPLATE_CODE || templatePtr->template_code > 'E' );
00116
00117 templatePtr->rank_age_group_id = (char) (m.atoi( templateRec->rank_age_group_id, 9 ) - 1);
00118
00119 err_when( templatePtr->rank_age_group_id > LAST_RANK_AGE_GROUP || templatePtr->rank_age_group_id < FIRST_RANK_AGE_GROUP );
00120
00121
00122 templatePtr->rank_age_multiplier = (float) m.atof(templateRec->rank_age_multiplier, 9);
00123 templatePtr->female_multiplier= (float) m.atof(templateRec->female_multiplier, 9);
00124 templatePtr->minority_multiplier= (float) m.atof(templateRec->minority_multiplier, 9);
00125
00126 templatePtr->overall_salary_multiplier = (float) m.atof(templateRec->overall_salary_multiplier, 9);
00127 templatePtr->female_salary_multiplier = (float) m.atof(templateRec->female_salary_multiplier, 9);
00128 templatePtr->minority_salary_multiplier = (float) m.atof(templateRec->minority_salary_multiplier, 9);
00129
00130 templatePtr->talent_teaching_multiplier = (float) m.atof(templateRec->talent_teaching_multiplier, 9);
00131 templatePtr->talent_scholarship_multiplier = (float) m.atof(templateRec->talent_scholarship_multiplier, 9);
00132 templatePtr->talent_research_multiplier = (float) m.atof(templateRec->talent_research_multiplier, 9);
00133
00134 templatePtr->normal_teaching_load_multiplier = (float) m.atof(templateRec->normal_teaching_load_multiplier, 9);
00135
00136 for( int j=0 ; j<DISCRETIONARY_TYPE_COUNT ; j++ ) {
00137 templatePtr->discretionary_time_pref[j] = (char) (int) (m.atof(templateRec->discretionary_time_pref[j], 9) * 100);
00138
00139 err_when(templatePtr->discretionary_time_pref[j] < 0);
00140 }
00141 }
00142 }
00143
00144
00145
00146
00148
00149 err_when( faculty_template_count == 0 );
00150
00151 mem_del(faculty_template_array);
00152 faculty_template_count = 0;
00153 }
00154
00155
00156
00157
00167
00168 #ifdef READ_OLD_DB
00169 static FacultyTemplate resultTemplate;
00170
00171
00172
00173 if( templateCode[1] >= FIRST_TEMPLATE_CODE &&
00174 templateCode[1] < FIRST_TEMPLATE_CODE + MAX_RANK_AGE_GROUP ) {
00175 FacultyTemplate* facultyTemplate1 = faculty_template_array +
00176 (templateCode[0] - FIRST_TEMPLATE_CODE) * MAX_RANK_AGE_GROUP + rankAgeGroup;
00177
00178 FacultyTemplate* facultyTemplate2 = faculty_template_array +
00179 (templateCode[1] - FIRST_TEMPLATE_CODE) * MAX_RANK_AGE_GROUP + rankAgeGroup;
00180
00181
00182
00183 float r = (float) m.random(100) / (float) 100;
00184
00185 resultTemplate.rank_age_multiplier = (char) ( float(facultyTemplate1->rank_age_multiplier) * r / (float)1
00186 + float(facultyTemplate2->rank_age_multiplier) * ((float)1-r) / (float)1 );
00187
00188 resultTemplate.female_multiplier = facultyTemplate1->female_multiplier * r / (float)1
00189 + facultyTemplate2->female_multiplier * ((float)1-r) / (float)1;
00190
00191 resultTemplate.minority_multiplier = facultyTemplate1->minority_multiplier * r / (float)1
00192 + facultyTemplate2->minority_multiplier * ((float)1-r) / (float)1;
00193
00194 resultTemplate.overall_salary_multiplier = facultyTemplate1->overall_salary_multiplier * r / (float)1
00195 + facultyTemplate2->overall_salary_multiplier * ((float)1-r) / (float)1;
00196
00197 resultTemplate.female_salary_multiplier = facultyTemplate1->female_salary_multiplier * r / (float)1
00198 + facultyTemplate2->female_salary_multiplier * ((float)1-r) / (float)1;
00199
00200 resultTemplate.minority_salary_multiplier = facultyTemplate1->minority_salary_multiplier * r / (float)1
00201 + facultyTemplate2->minority_salary_multiplier * ((float)1-r) / (float)1;
00202
00203 resultTemplate.talent_teaching_multiplier = facultyTemplate1->talent_teaching_multiplier * r / (float)1
00204 + facultyTemplate2->talent_teaching_multiplier * ((float)1-r) / (float)1;
00205
00206 resultTemplate.talent_scholarship_multiplier = facultyTemplate1->talent_scholarship_multiplier * r / (float)1
00207 + facultyTemplate2->talent_scholarship_multiplier * ((float)1-r) / (float)1;
00208
00209 resultTemplate.talent_research_multiplier = facultyTemplate1->talent_research_multiplier * r / (float)1
00210 + facultyTemplate2->talent_research_multiplier * ((float)1-r) / (float)1;
00211
00212 resultTemplate.normal_teaching_load_multiplier= facultyTemplate1->normal_teaching_load_multiplier* r / (float)1
00213 + facultyTemplate2->normal_teaching_load * ((float)1-r) / (float)1;
00214
00215
00216
00217 for( int i=0 ; i<DISCRETIONARY_TYPE_COUNT ; i++ ) {
00218 resultTemplate.discretionary_time_pref[i] =
00219 char( (float)facultyTemplate1->discretionary_time_pref[i] * r / (float)1
00220 + (float)facultyTemplate2->discretionary_time_pref[i] * ((float)1-r) / (float)1 );
00221 }
00222
00223 return &resultTemplate;
00224 }
00225 else
00226 #endif
00227
00228 int offset = templateCode[0] - FIRST_TEMPLATE_CODE;
00229 err_when( offset < 0 || offset >= faculty_template_count );
00230 err_when( rankAgeGroup < 0 || rankAgeGroup >= MAX_RANK_AGE_GROUP );
00231
00232 return faculty_template_array + offset * MAX_RANK_AGE_GROUP + rankAgeGroup;
00233 }
00234
00235