Virtual U.org
Get Personal Training on VU Today
    
Top shadow
 
 register/help
User Name:

Password:

Oschlres.cpp Source File
Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members  

Oschlres.cpp

Go to the documentation of this file.
00001 //Filename    : OSCHLRES.CPP
00002 //Description : PeerSchool resource object
00003 //Owner       : Fred
00004 
00005 #include <OBOX.H>
00006 #include <OSYS.H>
00007 #include <OGAMESET.H>
00008 #include <ODYNARR.H>                              // for build_peer_school_array
00009 #include <OSCHLREC.H>
00010 #include <OSCHREC2.H>
00011 #include <OSCHLRES.H>
00012 #include <OPSCHOOL.H>
00013 #include <OPEERSCH.H>
00014 #include <OMATH.H>
00015 #include <OINFO.H>                                // 1027 for next_day
00016 #include <OFACURES.H>                             // 1027 for next_day
00017 #include <OFINANCE.H>                             // 1027 for next_day
00018 
00019 #include <OFIELD.H>                               //for IPED_FILED_COUNT
00020 
00021 #ifdef DEBUG
00022 #include <STDIO.H>
00023 #include <OLOG.H>
00024 #endif
00025 
00026 #include <MATH.H>                                 // sqrtf()
00027 #define EXPO2(x)      ((x)*(x))
00028 
00029 //---------- #define constant ------------//
00030 
00031 #define SCHOOL_DB1    DIR_RES"UMASTER1.RES"
00032 #define SCHOOL_DB2    DIR_RES"UMASTER2.RES"
00033 #define PEER_SCHOOL_DB  "PEERNAME"
00034 
00035 //--------- define static function --------//
00036 
00037 static int sort_school_distance_function( const void *a, const void *b );
00038 static int sort_peerschool_prestige_function( const void *a, const void *b );
00039 
00040 //------- Begin of function SchoolRes::init -------//
00042 void SchoolRes::init() {
00043 }
00044 
00045 //--------- End of function SchoolRes::init ---------//
00046 
00047 //------- Begin of function SchoolRes::deinit -------//
00049 void SchoolRes::deinit() {
00050     mem_del(peer_school_array);                     // which already includes player_peer_school
00051 #if(GAME_VERSION>=200)
00052     if ( desired_school_array != NULL ) {
00053         mem_del( desired_school_array );
00054         desired_school_array = NULL;
00055         desired_school_count = 0;
00056     }
00057 #endif
00058 }
00059 
00060 //--------- End of function SchoolRes::deinit ---------//
00061 
00062 //------- Begin of function SchoolRes::load_db_info -------//
00064 void SchoolRes::load_db_info() {
00065 
00066     load_db_1();
00067 
00068     load_db_2();
00069 
00070     load_db_peer();
00071 }
00072 
00073 //--------- End of function SchoolRes::load_db_info ---------//
00074 
00075 //------- Begin of function SchoolRes::free_db_info -------//
00077 void SchoolRes::free_db_info() {
00078     if ( !db_school_array || !peer_info_array )
00079         return;
00080 
00081     mem_del(db_school_array);
00082     mem_del(peer_info_array);
00083 
00084     peer_info_count = db_school_count = 0;
00085     db_school_array = NULL;
00086     peer_info_array = NULL;
00087 }
00088 
00089 //--------- End of function SchoolRes::free_db_info ---------//
00090 
00091 //------- Begin of function SchoolRes::load_db_1 -------//
00093 void SchoolRes::load_db_1() {
00094     SchoolRec1   *sRec;
00095     School      *sPtr;
00096     Database  dbSchool(SCHOOL_DB1, 1);              // 1-read the entire DB into buffer
00097 
00098     db_school_count = (short) dbSchool.rec_count();
00099     db_school_array = (School*) mem_add( sizeof(School) * db_school_count );
00100 
00101     //------ read in department information array -------//
00102 
00103     memset( db_school_array, 0, sizeof(School) * db_school_count );
00104 
00105     for( int i=0 ; i<db_school_count ; i++ ) {
00106         sRec = (SchoolRec1*) dbSchool.read(i+1);
00107         sPtr = db_school_array+i;
00108 
00109         m.rtrim_fld( sPtr->name, sRec->name, sRec->NAME_LEN );
00110         sPtr->fice = m.atoi( sRec->fice, 8 );
00111 
00112         if( sRec->control[1] == 'r')                  // 'r' in "Private"
00113             sPtr->control = PRIVATE;
00114         else
00115             sPtr->control = PUBLIC;
00116 
00117         switch( sRec->carnegie[0] ) {                 // BUGHERE0 - to be further defined
00118         case 'R':                                   // "R1"
00119             sPtr->carnegie = PRIVATE_SCHOOL;
00120             break;
00121 
00122         case 'L':                                   // LA1
00123             sPtr->carnegie = LIBERAL_ARTS_SCHOOL;
00124             break;
00125 
00126         default:
00127             sPtr->carnegie = COMPREHENSIVE_SCHOOL;
00128             break;
00129         }
00130 
00131         sPtr->cc_sort     = m.atoi( sRec->cc_sort, 5 );
00132         sPtr->market_score = m.atoi( sRec->market_score, 6 );
00133 
00134         m.rtrim_fld( sPtr->state, sRec->state, 8 );
00135 
00136         sPtr->usn_wr_ranking    = m.atoi( sRec->usn_wr_ranking, 6 );
00137         sPtr->ave_midpt_sat_act = m.atoi( sRec->ave_midpt_sat_act, 8 );
00138         sPtr->freshmen_top_10_class = char(m.atof( sRec->freshmen_top_10_class, 7 ) * 100);
00139 
00140         switch( sRec->campus_environment[0] ) {
00141         case 'U':
00142             sPtr->campus_environment = URBAN;
00143             break;
00144 
00145         case 'S':
00146             sPtr->campus_environment = SUBURBAN;
00147             break;
00148 
00149         case 'R':
00150             sPtr->campus_environment = RURAL;
00151             break;
00152         }
00153 
00154         //BUG ? m.rtrim!?
00155         m.rtrim_fld( sPtr->ncaa_football_division, sRec->ncaa_football_division, 8 );
00156         m.rtrim_fld( sPtr->ncaa_basketball_division, sRec->ncaa_basketball_division, 8 );
00157         sPtr->football_rating = m.atoi( sRec->football_rating, 6 );
00158         sPtr->basketball_rating = m.atoi( sRec->basketball_rating, 6 );
00159 
00160         sPtr->in_state_tuition = m.atoi( sRec->in_state_tuition, 7 );
00161         sPtr->out_state_tuition = m.atoi( sRec->out_state_tuition, 7 );
00162 
00163         sPtr->room_and_board_charges = m.atoi( sRec->room_and_board_charges, 8 );
00164         sPtr->ug_in_housing_percent = m.atoi( sRec->undergrad_in_housing_percent, 8 );
00165 
00166         //---------------------------------------//
00167 
00168         // PeerFacultyRec *pfRec = sRec->peer_faculty_rec_array;
00169         // PeerFaculty    *pfPtr = sPtr->peer_faculty_array;
00170         SchoolFacultyRec *pfRec = sRec->school_faculty_rec_array;
00171         SchoolFaculty    *pfPtr = sPtr->school_faculty_array;
00172 
00173         for( int j=0 ; j<FACULTY_RANK_LEVEL_COUNT-2 ; j++, pfRec++, pfPtr++ ) {
00174             pfPtr->faculty_count    = m.atoi( pfRec->faculty_count, 8 );
00175             pfPtr->salary           = m.atoi( pfRec->salary, 8 );
00176             pfPtr->female_percent   = (float)m.atof( pfRec->female_percent, 8 ) * 100;
00177             pfPtr->minority_percent = (float)m.atof( pfRec->minority_percent, 8 ) * 100;
00178         }
00179 
00180         SchoolFacultyRec2 *pfRec2 = sRec->school_faculty_rec_array2;
00181 
00182         for( j=0; j<2 ; j++, pfRec2++, pfPtr++ ) {
00183             pfPtr->faculty_count    = m.atoi( pfRec2->adjunct_count, 8 );
00184             pfPtr->salary        = 0;                   // dummy field
00185             pfPtr->female_percent   = (float) m.atof( pfRec2->female_percent, 8 ) * 100;
00186             pfPtr->minority_percent = (float) m.atof( pfRec2->minority_percent, 8 ) * 100; {
00187             }
00188 
00189             //##### begin fred 0523 #####//
00190             // swap the two 'struct' since we use the following order
00191             // in faculty.h which is no the same with the orderin database
00192             //enum { ASST_PROF, ASSOC_PROF, FULL_PROF, LONG_TERM_ADJUNCT, SHORT_TERM_ADJUNCT }; // 3 professers & 2 adjuncts
00193             SchoolFaculty tmpFac;
00194             memcpy(&tmpFac, &(sPtr->school_faculty_array[FULL_PROF]), sizeof(SchoolFaculty));
00195             memcpy(&(sPtr->school_faculty_array[FULL_PROF]), &(sPtr->school_faculty_array[ASST_PROF]), sizeof(SchoolFaculty));
00196             memcpy(&(sPtr->school_faculty_array[ASST_PROF]), &tmpFac, sizeof(SchoolFaculty));
00197         }
00198         //##### end fred 0523 #####//
00199 
00200         sPtr->parttime_faculty_percent = (float) m.atof( sRec->parttime_faculty_percent, 8 ) * 100;
00201 
00202         //--------------------------------------//
00203 
00204         //----------------------------------------//
00205         // fred 0501
00206         sPtr->student_applications = m.atoi( sRec->student_applications, 6 );
00207         sPtr->student_accepted = m.atoi( sRec->student_accepted, 6 );
00208         sPtr->student_enrolled = m.atoi( sRec->student_enrolled, 6 );
00209 
00210         //sPtr->student_get_bacc_in_5_year_percent = m.atoi( sRec->student_get_bacc_in_5_year_percent, 6 );
00211 
00212         //## chea 130899 try to lower the grads rate
00213         char getfromrec = m.atoi( sRec->student_get_bacc_in_5_year_percent, 6 );
00214         float final_adj_result = (float)getfromrec * (player_school.ug_get_degree_in_5year_percent /100.0f);
00215         sPtr->student_get_bacc_in_5_year_percent = (char)final_adj_result;
00216 
00217         sPtr->freshmen_applied_for_aid = m.atoi( sRec->freshmen_applied_for_aid, 7 );
00218         sPtr->percent_freshmen_applied_or_aid = (float) m.atof( sRec->percent_freshmen_applied_or_aid, 10 ) * 100;
00219         sPtr->freshmen_with_need = m.atoi( sRec->freshmen_with_need, 8 );
00220         sPtr->percent_freshmen_with_need = (float) m.atof( sRec->percent_freshmen_with_need, 9 ) * 100;
00221         sPtr->freshmen_offered_aid = m.atoi( sRec->freshmen_offered_aid, 8 );
00222         sPtr->percent_freshmen_offered_aid = (float) m.atof( sRec->percent_freshmen_offered_aid, 9 ) * 100;
00223 
00224         sPtr->freshmen_offered_full_aid = m.atoi( sRec->freshmen_offered_full_aid, 8 );
00225         sPtr->percent_freshmen_offered_full_aid = (float) m.atof( sRec->percent_freshmen_offered_full_aid, 8 ) * 100;
00226 
00227         sPtr->percent_freshmen_with_fin_aid = m.atoi( sRec->percent_freshmen_with_fin_aid, 8 );
00228         sPtr->percent_continuing_student_with_fin_aid = m.atoi( sRec->percent_continuing_student_with_fin_aid, 8 );
00229 
00230         sPtr->institutional_aid_per_fte = m.atoi( sRec->institutional_aid_per_fte, 9 );
00231 
00232         //----------- revenue data -------------//
00233         sPtr->total_gross_tuition_revenue = m.atoi( sRec->total_gross_tuition_revenue, 8 );
00234         sPtr->total_financial_aid = m.atoi( sRec->total_financial_aid, 8 );
00235         sPtr->total_sponsored_research = m.atoi( sRec->total_sponsored_research, 8 );
00236         sPtr->adjusted_total_sponsored_research = m.atoi( sRec->adjusted_total_sponsored_research, 8 );
00237         sPtr->raw_endowment_spending = m.atoi( sRec->raw_endowment_spending, 8 );
00238         sPtr->state_and_local_appropriations = m.atoi( sRec->state_and_local_appropriations, 8 );
00239         sPtr->total_gifts = m.atoi( sRec->total_gifts, 8 );
00240         sPtr->gifts_to_operations = m.atoi( sRec->gifts_to_operations, 8 );
00241         sPtr->athletics_revenue = m.atoi( sRec->athletics_revenue, 8 );
00242 
00243         sPtr->adjusted_other_operating_income = m.atoi( sRec->adjusted_other_operating_income, 8 );
00244         sPtr->raw_other_operating_income = m.atoi( sRec->raw_other_operating_income, 8 );
00245 
00246         //----------- expense data -------------//
00247         sPtr->academic_dept_total_salaries = m.atoi( sRec->academic_dept_total_salaries, 9 );
00248         sPtr->academic_dept_faculty_salaries = m.atoi( sRec->academic_dept_faculty_salaries, 9 );
00249         sPtr->academic_dept_other_expense = m.atoi( sRec->academic_dept_other_expense, 9 );
00250 
00251         sPtr->sponsored_research_total_salaries = m.atoi( sRec->sponsored_research_total_salaries, 9 );
00252         sPtr->sponsored_research_faculty_salaries = m.atoi( sRec->sponsored_research_faculty_salaries, 9 );
00253         sPtr->sponsored_research_other_expense = m.atoi( sRec->sponsored_research_other_expense, 9 );
00254 
00255         sPtr->library_salaries = m.atoi( sRec->library_salaries, 10 );
00256         sPtr->library_other_expense = m.atoi( sRec->library_other_expense, 10 );
00257 
00258         sPtr->student_life_salaries = m.atoi( sRec->student_life_salaries, 10 );
00259         sPtr->student_life_other_expense = m.atoi( sRec->student_life_other_expense, 10 );
00260 
00261         sPtr->inst_support_salaries = m.atoi( sRec->inst_support_salaries, 10 );
00262         sPtr->inst_support_other_expense = m.atoi( sRec->inst_support_other_expense, 10 );
00263 
00264         sPtr->inst_support_net_salaries = m.atoi( sRec->inst_support_net_salaries, 10 );
00265         sPtr->inst_support_net_other_expense = m.atoi( sRec->inst_support_net_other_expense, 10 );
00266         sPtr->inst_advancement_salaries = m.atoi( sRec->inst_advancement_salaries, 10 );
00267         sPtr->inst_advancement_other_expense = m.atoi( sRec->inst_advancement_other_expense, 10 );
00268         sPtr->o_and_m_salaries = m.atoi( sRec->o_and_m_salaries, 8 );
00269         sPtr->o_and_m_other_expense = m.atoi( sRec->o_and_m_other_expense, 8 );
00270         sPtr->athletics_salaries = m.atoi( sRec->athletics_salaries, 8 );
00271         sPtr->athletics_other_expense = m.atoi( sRec->athletics_other_expense, 8 );
00272 
00273         sPtr->academic_support_salaries = m.atoi( sRec->academic_support_salaries, 10 );
00274         sPtr->academic_support_other_expense = m.atoi( sRec->academic_support_other_expense, 10 );
00275 
00276         // field 87     // fred 0501
00277         sPtr->end_of_year_endowment_market_value = m.atoi( sRec->end_of_year_endowment_market_value, 8 );
00278         sPtr->current_funds_balance = m.atoi( sRec->current_funds_balance, 8 );
00279         sPtr->year_end_book_value_of_plant = m.atoi( sRec->year_end_book_value_of_plant, 8 );
00280         sPtr->year_end_market_value_of_plant = m.atoi( sRec->year_end_market_value_of_plant, 8 );
00281         sPtr->year_end_capital_reserve = m.atoi( sRec->year_end_capital_reserve, 8 );
00282         sPtr->year_end_general_plant_and_residence_hall_debt = m.atoi( sRec->year_end_general_plant_and_residence_hall_debt, 8 );
00283         sPtr->residence_hall_debt = m.atoi( sRec->residence_hall_debt, 8 );
00284 
00285         sPtr->raw_surplus = m.atoi( sRec->raw_surplus, 8 );
00286         sPtr->adjusted_surplus = m.atoi( sRec->adjusted_surplus, 8 );
00287         sPtr->transfer_to_plant = m.atoi( sRec->transfer_to_plant, 8 );
00288         sPtr->amount_added_to_other_operating_income = m.atoi( sRec->amount_added_to_other_operating_income, 8 );
00289 
00290         // field 98
00291         sPtr->full_time_undergrad = m.atoi( sRec->full_time_undergrad, 8 );
00292         sPtr->part_time_undergrad = m.atoi( sRec->part_time_undergrad, 8 );
00293         sPtr->master_and_professional = m.atoi( sRec->master_and_professional, 8 );
00294         sPtr->non_degree_seeking = m.atoi( sRec->non_degree_seeking, 8 );
00295         sPtr->female_undergrad_percent = char(100 * m.atof( sRec->female_undergrad_percent, 7 ));
00296         sPtr->female_grad_and_prof_percent = char(100 * m.atof( sRec->female_grad_and_prof_percent, 7 ));
00297 
00298         sPtr->minority_undergrad_percent = char(100 * m.atof( sRec->minority_undergrad_percent, 7 ));
00299         sPtr->minority_grad_and_prof_percent = char(100 * m.atof( sRec->minority_grad_and_prof_percent, 7 ));
00300         sPtr->non_resident_alien_grad_and_prof_percent = char(100 * m.atof( sRec->non_resident_alien_grad_and_prof_percent, 7 ));
00301         sPtr->full_time_freshmen = m.atoi( sRec->full_time_freshmen, 9 );
00302         sPtr->freshmen_from_within_the_state_percent = char(100 * m.atof( sRec->freshmen_from_within_the_state_percent, 9 ));
00303         sPtr->total_bach_degrees = m.atoi( sRec->total_bach_degrees, 9 );
00304         sPtr->total_masters_and_prof_degree = m.atoi( sRec->total_masters_and_prof_degree, 9 );
00305         sPtr->total_doctoral_degrees = m.atoi( sRec->total_doctoral_degrees, 9 );
00306         sPtr->total_certificates = m.atoi( sRec->total_certificates, 9 );
00307 
00308         // field 113
00309         sPtr->enrollment_fte = m.atoi( sRec->enrollment_fte, 7 );
00310         sPtr->ug_percent = char(100 * m.atof( sRec->undergrad_percent, 7 ));
00311         sPtr->part_time_ug_percent = char(100 * m.atof( sRec->part_time_undergrad_percent, 7 ));
00312         sPtr->non_degree_seeking_percent = char(100 * m.atof( sRec->non_degree_seeking_percent, 7 ));
00313 
00314         sPtr->applications_ratio = (float) m.atof( sRec->applications_ratio, 7 );
00315         sPtr->yield_rate = char(100 * m.atof( sRec->yield_rate, 7 ));
00316         sPtr->athletics_rating = m.atoi( sRec->athletics_rating, 9 );
00317 
00318         sPtr->total_e_and_g_expenditure = m.atoi( sRec->total_e_and_g_expenditure, 9 );
00319         sPtr->net_tutition_reenue_as_percent_of_e_and_g_expese = char(100 * m.atof( sRec->net_tutition_reenue_as_percent_of_e_and_g_expese, 9 ));
00320         sPtr->total_tenureline_faculty = m.atoi( sRec->total_tenureline_faculty, 9 );
00321         sPtr->sponsored_research_per_reg_faculty = (float) m.atof( sRec->sponsored_research_per_reg_faculty, 9 );
00322         sPtr->doctoral_degrees_per_reg_faculty = (float) m.atof( sRec->doctoral_degrees_per_reg_faculty, 9 );
00323 
00324         sPtr->overhead_rate = char(100 * m.atof( sRec->overhead_rate, 7 ));
00325         sPtr->endowment_spending_rate = 100 * (float) m.atof( sRec->endowment_spending_rate, 7 );
00326         sPtr->enrollment_masters = m.atoi( sRec->enrollment_masters, 8 );
00327         sPtr->enrollment_doctoral = m.atoi( sRec->enrollment_doctoral, 8 );
00328     }
00329 }
00330 
00331 //--------- End of function SchoolRes::load_db_1 ---------//
00332 
00333 //------- Begin of function SchoolRes::load_db_2 -------//
00335 void SchoolRes::load_db_2() {
00336     SchoolRec2   *sRec;
00337     School      *sPtr;
00338     Database  dbSchool(SCHOOL_DB2, 1);              // 1-read the entire DB into buffer
00339 
00340     for( int i=0 ; i<db_school_count ; i++ ) {
00341         sRec = (SchoolRec2*) dbSchool.read(i+1);
00342         sPtr = db_school_array+i;
00343 
00344         // ---------- umaster2 ------------- //
00345         sPtr->target_student_intake_sl[0] = m.atoi( sRec->target_student_intake_sl1, 7 );
00346         sPtr->target_student_intake_sl[1] = m.atoi( sRec->target_student_intake_sl2, 7 );
00347         sPtr->target_student_intake_sl[2] = m.atoi( sRec->target_student_intake_sl3, 7 );
00348         sPtr->target_student_intake_sl[3] = m.atoi( sRec->target_student_intake_sl4, 7 );
00349         sPtr->target_student_intake_sl[4] = m.atoi( sRec->target_student_intake_sl5, 7 );
00350 
00351         //BUG ? 9
00352         sPtr->dropout_rate_sl[0] = 100 * (float) m.atof( sRec->dropout_rate_sl1, 9 );
00353         sPtr->dropout_rate_sl[1] = 100 * (float) m.atof( sRec->dropout_rate_sl2, 6 );
00354         sPtr->dropout_rate_sl[2] = 100 * (float) m.atof( sRec->dropout_rate_sl3, 6 );
00355         sPtr->dropout_rate_sl[3] = 100 * (float) m.atof( sRec->dropout_rate_sl4, 6 );
00356         sPtr->dropout_rate_sl[4] = 100 * (float) m.atof( sRec->dropout_rate_sl5, 6 );
00357 
00358         sPtr->target_grad_rate_sl[0] = 100 * (float) m.atof( sRec->target_grad_rate_sl1, 6 );
00359         sPtr->target_grad_rate_sl[1] = 100 * (float) m.atof( sRec->target_grad_rate_sl2, 6 );
00360         sPtr->target_grad_rate_sl[2] = 100 * (float) m.atof( sRec->target_grad_rate_sl3, 6 );
00361         sPtr->target_grad_rate_sl[3] = 100 * (float) m.atof( sRec->target_grad_rate_sl4, 6 );
00362         sPtr->target_grad_rate_sl[4] = 100 * (float) m.atof( sRec->target_grad_rate_sl5, 6 );
00363 
00364         // field 16
00365         sPtr->percent_ug_students_on_aid = char(100 * m.atof( sRec->pct_ug_students_on_aid, 7 ));
00366         sPtr->endowment_per_student = (float) m.atof( sRec->endowment_per_student, 10 );
00367         sPtr->endowment_per_tenureline_faculty_member = (float) m.atof( sRec->endowment_per_tenureline_faculty_member, 11 );
00368         sPtr->ratio_of_current_funds_balance_to_total_operating_expenditure = (float) m.atof( sRec->ratio_of_current_funds_balance_to_total_operating_expenditure, 10 );
00369         sPtr->financial_condition = m.atoi( sRec->financial_condition, 10 );
00370         sPtr->number_of_incoming_ug_students = m.atoi( sRec->number_of_incoming_ug_students, 10 );
00371         sPtr->female_student_percent = char(100 * m.atof( sRec->female_student_percent, 9 ));
00372         sPtr->minority_student_percent = char(100 * m.atof( sRec->minority_student_percent, 9 ));
00373 
00374         //## chea 160799 begin sponsored_research
00375         //              if(player_school.sponsored_research_intensity==5)
00376         sPtr->sponsored_research_rating = m.atoi( sRec->sponsored_research_rating, 9 );
00377         //              if(player_school.sponsored_research_intensity==10)
00378         //                      sPtr->sponsored_research_rating = 10;
00379         //## chea 160799 end sponsored_research
00380 
00381         sPtr->doctoral_degres_per_faculty_rating = m.atoi( sRec->doctoral_degres_per_faculty_rating, 9 );
00382         sPtr->adj_freshmen_top_ten_percent_of_class = char(100 * m.atof( sRec->adj_freshmen_top_ten_percent_of_class, 9 ));
00383         sPtr->apps_ratio2 = (float) m.atof( sRec->apps_ratio2, 8 );
00384         sPtr->yield_rate2 = (float) m.atof( sRec->yield_rate2, 8 );
00385         sPtr->athletics_rating2 = m.atoi( sRec->athletics_rating2, 8 );
00386         sPtr->net_tuition_revenue_as_percent_of_e_and_g_expense = char(100 * m.atof( sRec->net_tuition_revenue_as_percent_of_e_and_g_expense, 8 ));
00387         sPtr->doc_time_to_degree = (float) m.atof( sRec->doc_time_to_degree, 11 );
00388     }
00389 }
00390 
00391 //--------- End of function SchoolRes::load_db_2 ---------//
00392 
00393 //------- Begin of function SchoolRes::load_db_peer -------//
00395 void SchoolRes::load_db_peer() {
00396     PeerRec   *pRec;
00397     PeerInfo    *pPtr;
00398     // dbSchool(PEER_SCHOOL_DB, 1);             // 1-read the entire DB into buffer
00399     Database    *dbSchool = game_set.open_db(PEER_SCHOOL_DB);
00400 
00401     peer_info_count = (short) dbSchool->rec_count();
00402     peer_info_array = (PeerInfo*) mem_add( sizeof(PeerInfo) * peer_info_count );
00403 
00404     //------ read in school array -------//
00405 
00406     memset( peer_info_array, 0, sizeof(PeerInfo) * peer_info_count );
00407 
00408     for( int i=0 ; i<peer_info_count; i++ ) {
00409         pRec = (PeerRec*) dbSchool->read(i+1);
00410         pPtr = peer_info_array+i;
00411 
00412         m.rtrim_fld( pPtr->name, pRec->name, pRec->NAME_LEN );
00413     }
00414 }
00415 
00416 //------- End of function SchoolRes::load_db_peer -------//
00417 
00418 //--------- Begin of function SchoolRes::init_game -----------//
00425 void SchoolRes::init_game() {
00426     //-----------------------------------------------------------------//
00427     // Read UMASTER1.DBF and UMASTER2.DBF to SchoolRes::db_school_array[]
00428     // using SchoolRec1 and SchoolRec2 as the header for reading.
00429     // Refer to the "Main" sheet in the "Master" Excel file.
00430     //-----------------------------------------------------------------//
00431 
00432     load_db_info();
00433 
00434 #if(GAME_VERSION>=200)
00435     // Item 7a)
00436 
00437     // --------------------------------------------------------------- //
00438     // Get the records in db_school_array[] with the desired type
00439     // Public or Private. And store it into
00440     // SchoolRes::desired_school_array[]
00441     // ---------------------------------------------------------------- //
00442 
00443     get_desired_school_array();
00444 
00445     // ---------------------------------------------------------------- //
00446     // Calculate a Distance value for all records in
00447     // SchoolRes::desired_school_array[],
00448     // The varaibles need to compare are just Number of on-campus students
00449     // and Sponsored research intensity.
00450     // ---------------------------------------------------------------- //
00451 
00452     for ( int i=0; i<desired_school_count; i++ )
00453         desired_school_array[i].calc_distance_first();
00454 
00455     // --------------------------------------------------------------- //
00456     // Get 50 records in desired_school_array[] with the smallest
00457     // distance value. And they will store into desired_school_array again
00458     // --------------------------------------------------------------- //
00459 
00460     get_50_school_array();
00461 #endif
00462 
00463     //-----------------------------------------------------------------//
00464     // Calculate a Distance value for all records in
00465     // SchoolRes::db_school_array[].
00466     // Refer to the "Indices" sheet in the "Initialization" Excel file.
00467     //-----------------------------------------------------------------//
00468 
00469     School::calc_distance_all_school();
00470 
00471     //-----------------------------------------------------------------//
00472     // Get 10 records in db_school_array[] with the smallest distance values
00473     // and store their record number in db_school_array[] in school_ex_array[].
00474     //-----------------------------------------------------------------//
00475 
00476     build_school_ex_array();
00477 
00478     //---- initialize player_school & player_school_ex ----//
00479 
00480     init_player_school_ex();
00481 
00482     //----- select and build peer schools in peer_school_array from db_school_array -----//
00483 
00484     build_peer_school_array();
00485 
00486     PeerSchool::calc_average_faculty_salary();
00487 
00488     //-----------------------------------//
00489 
00490     free_db_info();
00491 }
00492 
00493 //---------- End of function SchoolRes::init_game -----------//
00494 
00495 //-------- Begin of function SchoolRes::build_school_ex_array --------//
00499 void SchoolRes::build_school_ex_array() {
00500     //-------------------------------------------------//
00501 
00502 #if(GAME_VERSION>=200)
00503 #else
00504     // 0115
00505     for( int i=0 ; i<db_school_count ; i++ ) {
00506         School* sPtr = get_db_school(i+1);
00507         if ( sPtr->control != player_school.control )
00508             sPtr->distance_value = 10000;               // avoid this school to be added to the ex array
00509     }
00510 #endif
00511 
00512 #if(GAME_VERSION>=200)
00513     //---- create an array for sorting on distance ----//
00514     short* schoolSortArray = (short*) mem_add( desired_school_count * sizeof(short) );
00515     for( int i=0 ; i<desired_school_count ; i++ )
00516         schoolSortArray[i] = i;
00517 
00518     //---- sort School in db_school_array[] by distance ----//
00519 
00520     qsort( schoolSortArray, desired_school_count, sizeof(schoolSortArray[0]), sort_school_distance_function );
00521 
00522 #else
00523     //---- create an array for sorting on distance ----//
00524     short* schoolSortArray = (short*) mem_add( db_school_count * sizeof(short) );
00525     for( i=0 ; i<db_school_count ; i++ )
00526         schoolSortArray[i] = i+1;
00527 
00528     //---- sort School in db_school_array[] by distance ----//
00529 
00530     qsort( schoolSortArray, db_school_count, sizeof(schoolSortArray[0]), sort_school_distance_function );
00531 #endif
00532 
00533     //-----------------------------------------------------------------//
00534     // Get 10 records in db_school_array[] with the smallest distance values
00535     // and store their record number in db_school_array[] in school_ex_array[].
00536     //
00537     // Call SchoolEx::init() to calculate a set of new variables in
00538     // school_ex_array[] based on vars in db_school_array[]. Refer to
00539     // the "Init Cond" sheet in the "Initialization" Excel file.
00540     //-----------------------------------------------------------------//
00541 
00542     //##### begin 0825 fred #####//
00543     //BUGHERE for debug
00544     /*
00545       schoolSortArray[0]=(18);          //18
00546       schoolSortArray[1]=(132);         //132
00547       schoolSortArray[2]=(58);
00548       schoolSortArray[3]=(140);
00549       schoolSortArray[4]=(64);
00550 
00551       schoolSortArray[5]=(4);           // harvard
00552       schoolSortArray[6]=(130);
00553       schoolSortArray[7]=(53);
00554       schoolSortArray[8]=(6);
00555       schoolSortArray[9]=(50);
00556     */
00557     //##### end 0825 fred #####//
00558 
00559     //---- init school_ex_array -----//
00560 
00561     // read database for "degree_by_field" sheet of excel file "HE.Data_xfm.Master"
00562     //
00563     //Database  dbSchool(SCHOOL_DB3, 0);        // 1-read the entire DB into buffer
00564     //short db3Count = (short) dbSchool.rec_count();
00565     //err_when(db3Count != db_school_count);
00566 
00567     for( i=0 ; i<MAX_SCHOOL_EX_FOR_INIT_CONDITION ; i++ ) {
00568         //SchoolDegreeRec* sRec = (SchoolDegreeRec*) dbSchool.read(schoolSortArray[i]);
00569         school_ex_array[i].init( schoolSortArray[i] );
00570     }
00571 
00572     mem_del( schoolSortArray );
00573 }
00574 
00575 //--------- End of function SchoolRes::build_school_ex_array ---------//
00576 
00577 //-------- Begin of function SchoolRes::init_player_school_ex --------//
00581 void SchoolRes::init_player_school_ex() {
00582     player_peer_school = (PeerSchool *)mem_add(sizeof(PeerSchool));
00583     memset(player_peer_school, 0 ,sizeof(PeerSchool));
00584 
00585     strcpy(player_peer_school->name, player_school.school_name);
00586     // some members of SchoolEx have the same name as members of School
00587 
00588     //-------------------------------------//
00589 
00590 #define AVERAGE_SCHOOL_EX_VAR_FLOAT(varName) \
00591     player_peer_school->varName = math.average_float( (char*) school_ex_array, sizeof(SchoolEx), MAX_SCHOOL_EX_FOR_INIT_CONDITION, \
00592       (char*) &(school_ex_array[0].varName) - (char*) &(school_ex_array[0]) )
00593 
00594 #define AVERAGE_SCHOOL_EX_VAR_INT(varName) \
00595       player_peer_school->varName = math.average_int( (char*) school_ex_array, sizeof(SchoolEx), MAX_SCHOOL_EX_FOR_INIT_CONDITION, \
00596       (char*) &(school_ex_array[0].varName) - (char*) &(school_ex_array[0]) )
00597 
00598 #define AVERAGE_SCHOOL_EX_VAR_SHORT(varName) \
00599       player_peer_school->varName = math.average_short( (char*) school_ex_array, sizeof(SchoolEx), MAX_SCHOOL_EX_FOR_INIT_CONDITION, \
00600       (char*) &(school_ex_array[0].varName) - (char*) &(school_ex_array[0]) )
00601 
00602 #define AVERAGE_SCHOOL_EX_VAR_CHAR(varName) \
00603       player_peer_school->varName = math.average_char( (char*) school_ex_array, sizeof(SchoolEx), MAX_SCHOOL_EX_FOR_INIT_CONDITION, \
00604       (char*) &(school_ex_array[0].varName) - (char*) &(school_ex_array[0]) )
00605 
00606 #define AVERAGE_SCHOOL_EX_VAR_FLOAT_SKIP_ZERO(varName) \
00607       player_peer_school->varName = math.average_float( (char*) school_ex_array, sizeof(SchoolEx), MAX_SCHOOL_EX_FOR_INIT_CONDITION, \
00608       (char*) &(school_ex_array[0].varName) - (char*) &(school_ex_array[0]), true )
00609 
00610 #define AVERAGE_SCHOOL_EX_VAR_INT_SKIP_ZERO(varName) \
00611       player_peer_school->varName = math.average_int( (char*) school_ex_array, sizeof(SchoolEx), MAX_SCHOOL_EX_FOR_INIT_CONDITION, \
00612       (char*) &(school_ex_array[0].varName) - (char*) &(school_ex_array[0]), true )
00613 
00614 #define AVERAGE_SCHOOL_EX_VAR_SHORT_SKIP_ZERO(varName) \
00615       player_peer_school->varName = math.average_short( (char*) school_ex_array, sizeof(SchoolEx), MAX_SCHOOL_EX_FOR_INIT_CONDITION, \
00616       (char*) &(school_ex_array[0].varName) - (char*) &(school_ex_array[0]), true )
00617 
00618 #define AVERAGE_SCHOOL_EX_VAR_CHAR_SKIP_ZERO(varName) \
00619       player_peer_school->varName = math.average_char( (char*) school_ex_array, sizeof(SchoolEx), MAX_SCHOOL_EX_FOR_INIT_CONDITION, \
00620       (char*) &(school_ex_array[0].varName) - (char*) &(school_ex_array[0]), true )
00621 
00622     int i;
00623 
00624     //--------------------------------------//
00625     //-------- average vars in School ------//
00626     //--------------------------------------//
00627     // School
00628     AVERAGE_SCHOOL_EX_VAR_SHORT(fice);
00629     AVERAGE_SCHOOL_EX_VAR_CHAR(control);
00630     AVERAGE_SCHOOL_EX_VAR_CHAR(carnegie);
00631     AVERAGE_SCHOOL_EX_VAR_CHAR(cc_sort);
00632     AVERAGE_SCHOOL_EX_VAR_CHAR(market_score);
00633 
00634     //--------------------------------------//
00635 
00636     AVERAGE_SCHOOL_EX_VAR_SHORT(usn_wr_ranking);    // Raw USN&WR ranking
00637     AVERAGE_SCHOOL_EX_VAR_SHORT(ave_midpt_sat_act);
00638     AVERAGE_SCHOOL_EX_VAR_CHAR( freshmen_top_10_class);
00639 
00640     AVERAGE_SCHOOL_EX_VAR_CHAR(campus_environment); // = URBAN, SUBURBAN, or RURAL
00641 
00642     AVERAGE_SCHOOL_EX_VAR_CHAR(football_rating);
00643     AVERAGE_SCHOOL_EX_VAR_CHAR(basketball_rating);
00644 
00645     AVERAGE_SCHOOL_EX_VAR_SHORT(in_state_tuition);
00646     AVERAGE_SCHOOL_EX_VAR_SHORT(out_state_tuition);
00647     AVERAGE_SCHOOL_EX_VAR_SHORT(room_and_board_charges);
00648     AVERAGE_SCHOOL_EX_VAR_CHAR(ug_in_housing_percent);
00649 
00650     for (i=0; i<FACULTY_RANK_LEVEL_COUNT; i++) {
00651         AVERAGE_SCHOOL_EX_VAR_SHORT(school_faculty_array[i].faculty_count);
00652         AVERAGE_SCHOOL_EX_VAR_INT(school_faculty_array[i].salary);
00653         AVERAGE_SCHOOL_EX_VAR_FLOAT(school_faculty_array[i].female_percent);
00654         AVERAGE_SCHOOL_EX_VAR_FLOAT(school_faculty_array[i].minority_percent);
00655     }
00656     AVERAGE_SCHOOL_EX_VAR_FLOAT(parttime_faculty_percent);
00657 
00658     //----------------------------------------//
00659     // fred 0501
00660 
00661     AVERAGE_SCHOOL_EX_VAR_INT(student_applications);
00662     AVERAGE_SCHOOL_EX_VAR_SHORT(student_accepted);
00663     AVERAGE_SCHOOL_EX_VAR_SHORT(student_enrolled);
00664     AVERAGE_SCHOOL_EX_VAR_CHAR(student_get_bacc_in_5_year_percent);
00665 
00666     // field 43
00667     AVERAGE_SCHOOL_EX_VAR_SHORT(freshmen_applied_for_aid);
00668     AVERAGE_SCHOOL_EX_VAR_FLOAT(percent_freshmen_applied_or_aid);
00669 
00670     AVERAGE_SCHOOL_EX_VAR_SHORT(freshmen_with_need);
00671     AVERAGE_SCHOOL_EX_VAR_FLOAT_SKIP_ZERO(percent_freshmen_with_need);
00672 
00673     AVERAGE_SCHOOL_EX_VAR_SHORT_SKIP_ZERO(freshmen_offered_aid);
00674     AVERAGE_SCHOOL_EX_VAR_FLOAT(percent_freshmen_offered_aid);
00675 
00676     AVERAGE_SCHOOL_EX_VAR_SHORT(freshmen_offered_full_aid);
00677     AVERAGE_SCHOOL_EX_VAR_FLOAT_SKIP_ZERO(percent_freshmen_offered_full_aid);
00678 
00679     AVERAGE_SCHOOL_EX_VAR_CHAR( percent_freshmen_with_fin_aid);
00680     AVERAGE_SCHOOL_EX_VAR_CHAR( percent_continuing_student_with_fin_aid);
00681 
00682     AVERAGE_SCHOOL_EX_VAR_SHORT_SKIP_ZERO(institutional_aid_per_fte);
00683 
00684     //----------- revenue data -------------//
00685     // field 54
00686     AVERAGE_SCHOOL_EX_VAR_INT(total_gross_tuition_revenue);
00687     AVERAGE_SCHOOL_EX_VAR_INT(total_financial_aid);
00688     AVERAGE_SCHOOL_EX_VAR_INT(total_sponsored_research);
00689     AVERAGE_SCHOOL_EX_VAR_INT(adjusted_total_sponsored_research);
00690     AVERAGE_SCHOOL_EX_VAR_INT(raw_endowment_spending);
00691     AVERAGE_SCHOOL_EX_VAR_INT(state_and_local_appropriations);
00692     AVERAGE_SCHOOL_EX_VAR_INT(total_gifts);
00693     AVERAGE_SCHOOL_EX_VAR_INT(gifts_to_operations);
00694     AVERAGE_SCHOOL_EX_VAR_SHORT(athletics_revenue);
00695     AVERAGE_SCHOOL_EX_VAR_INT(adjusted_other_operating_income);
00696     AVERAGE_SCHOOL_EX_VAR_INT(raw_other_operating_income);
00697 
00698     //----------- field 65: expense data -------------//
00699 
00700     AVERAGE_SCHOOL_EX_VAR_INT(academic_dept_total_salaries);
00701     AVERAGE_SCHOOL_EX_VAR_INT(academic_dept_faculty_salaries);
00702     AVERAGE_SCHOOL_EX_VAR_INT(academic_dept_other_expense);
00703 
00704     AVERAGE_SCHOOL_EX_VAR_INT(sponsored_research_total_salaries);
00705     AVERAGE_SCHOOL_EX_VAR_INT(sponsored_research_faculty_salaries);
00706     AVERAGE_SCHOOL_EX_VAR_INT(sponsored_research_other_expense);
00707 
00708     AVERAGE_SCHOOL_EX_VAR_INT(library_salaries);
00709     AVERAGE_SCHOOL_EX_VAR_INT(library_other_expense);
00710 
00711     AVERAGE_SCHOOL_EX_VAR_INT(student_life_salaries);
00712     AVERAGE_SCHOOL_EX_VAR_INT(student_life_other_expense);
00713 
00714     AVERAGE_SCHOOL_EX_VAR_INT(inst_support_salaries);
00715     AVERAGE_SCHOOL_EX_VAR_INT(inst_support_other_expense);
00716 
00717     AVERAGE_SCHOOL_EX_VAR_INT(inst_support_net_salaries);
00718     AVERAGE_SCHOOL_EX_VAR_INT(inst_support_net_other_expense);
00719 
00720     AVERAGE_SCHOOL_EX_VAR_INT(inst_advancement_salaries);
00721     AVERAGE_SCHOOL_EX_VAR_INT(inst_advancement_other_expense);
00722 
00723     AVERAGE_SCHOOL_EX_VAR_INT(o_and_m_salaries);
00724     AVERAGE_SCHOOL_EX_VAR_INT(o_and_m_other_expense);
00725 
00726     AVERAGE_SCHOOL_EX_VAR_INT(athletics_salaries);
00727     AVERAGE_SCHOOL_EX_VAR_INT(athletics_other_expense);
00728 
00729     AVERAGE_SCHOOL_EX_VAR_INT(academic_support_salaries);
00730     AVERAGE_SCHOOL_EX_VAR_INT(academic_support_other_expense);
00731 
00732     // field 87 // fred 0501
00733     AVERAGE_SCHOOL_EX_VAR_INT(end_of_year_endowment_market_value);
00734     AVERAGE_SCHOOL_EX_VAR_INT(current_funds_balance);
00735     AVERAGE_SCHOOL_EX_VAR_INT(year_end_book_value_of_plant);
00736     AVERAGE_SCHOOL_EX_VAR_INT(year_end_market_value_of_plant);
00737     AVERAGE_SCHOOL_EX_VAR_INT(year_end_capital_reserve);
00738     AVERAGE_SCHOOL_EX_VAR_INT(year_end_general_plant_and_residence_hall_debt);
00739     AVERAGE_SCHOOL_EX_VAR_INT(residence_hall_debt);
00740 
00741     AVERAGE_SCHOOL_EX_VAR_INT(raw_surplus);
00742     AVERAGE_SCHOOL_EX_VAR_INT(adjusted_surplus);
00743     AVERAGE_SCHOOL_EX_VAR_INT(transfer_to_plant);
00744     AVERAGE_SCHOOL_EX_VAR_INT(amount_added_to_other_operating_income);
00745 
00746     // field 98
00747     AVERAGE_SCHOOL_EX_VAR_SHORT(full_time_undergrad);
00748     AVERAGE_SCHOOL_EX_VAR_SHORT(part_time_undergrad);
00749     AVERAGE_SCHOOL_EX_VAR_SHORT(master_and_professional);
00750     AVERAGE_SCHOOL_EX_VAR_SHORT(non_degree_seeking);
00751     AVERAGE_SCHOOL_EX_VAR_CHAR(female_undergrad_percent);
00752     AVERAGE_SCHOOL_EX_VAR_CHAR(female_grad_and_prof_percent);
00753     AVERAGE_SCHOOL_EX_VAR_CHAR(minority_undergrad_percent);
00754     AVERAGE_SCHOOL_EX_VAR_CHAR(minority_grad_and_prof_percent);
00755     AVERAGE_SCHOOL_EX_VAR_CHAR(non_resident_alien_grad_and_prof_percent);
00756 
00757     // field 107
00758     AVERAGE_SCHOOL_EX_VAR_SHORT(full_time_freshmen);
00759     AVERAGE_SCHOOL_EX_VAR_CHAR(freshmen_from_within_the_state_percent);
00760     AVERAGE_SCHOOL_EX_VAR_SHORT(total_bach_degrees);
00761     AVERAGE_SCHOOL_EX_VAR_SHORT(total_masters_and_prof_degree);
00762     AVERAGE_SCHOOL_EX_VAR_SHORT(total_doctoral_degrees);
00763     AVERAGE_SCHOOL_EX_VAR_SHORT(total_certificates);
00764 
00765     // field 113
00766     AVERAGE_SCHOOL_EX_VAR_INT(enrollment_fte);
00767     AVERAGE_SCHOOL_EX_VAR_CHAR(ug_percent);
00768     AVERAGE_SCHOOL_EX_VAR_CHAR(part_time_ug_percent);
00769     AVERAGE_SCHOOL_EX_VAR_CHAR(non_degree_seeking_percent);
00770 
00771     AVERAGE_SCHOOL_EX_VAR_FLOAT(applications_ratio);
00772     AVERAGE_SCHOOL_EX_VAR_CHAR(yield_rate);
00773     AVERAGE_SCHOOL_EX_VAR_CHAR(athletics_rating);
00774 
00775     AVERAGE_SCHOOL_EX_VAR_INT(total_e_and_g_expenditure);
00776     AVERAGE_SCHOOL_EX_VAR_CHAR(net_tutition_reenue_as_percent_of_e_and_g_expese);
00777 
00778     AVERAGE_SCHOOL_EX_VAR_SHORT(total_tenureline_faculty);
00779     AVERAGE_SCHOOL_EX_VAR_FLOAT(sponsored_research_per_reg_faculty);
00780     AVERAGE_SCHOOL_EX_VAR_FLOAT(doctoral_degrees_per_reg_faculty);
00781 
00782     AVERAGE_SCHOOL_EX_VAR_CHAR(overhead_rate);
00783     AVERAGE_SCHOOL_EX_VAR_FLOAT(endowment_spending_rate);
00784 
00785     AVERAGE_SCHOOL_EX_VAR_SHORT(enrollment_masters);
00786     AVERAGE_SCHOOL_EX_VAR_SHORT(enrollment_doctoral);
00787 
00788     // ---------- field 1 of umaster2 -------------
00789 
00790     for(i=0;i<5;i++) {
00791         AVERAGE_SCHOOL_EX_VAR_SHORT(target_student_intake_sl[i]);
00792         AVERAGE_SCHOOL_EX_VAR_FLOAT_SKIP_ZERO(dropout_rate_sl[i]);
00793         AVERAGE_SCHOOL_EX_VAR_FLOAT_SKIP_ZERO(target_grad_rate_sl[i]);
00794     }
00795 
00796     // field 16
00797     AVERAGE_SCHOOL_EX_VAR_CHAR_SKIP_ZERO(percent_ug_students_on_aid);
00798     AVERAGE_SCHOOL_EX_VAR_FLOAT(endowment_per_student);
00799     AVERAGE_SCHOOL_EX_VAR_FLOAT(endowment_per_tenureline_faculty_member);
00800     AVERAGE_SCHOOL_EX_VAR_FLOAT(ratio_of_current_funds_balance_to_total_operating_expenditure);
00801     AVERAGE_SCHOOL_EX_VAR_CHAR(financial_condition);
00802     AVERAGE_SCHOOL_EX_VAR_SHORT(number_of_incoming_ug_students);
00803     AVERAGE_SCHOOL_EX_VAR_CHAR(female_student_percent);
00804     AVERAGE_SCHOOL_EX_VAR_CHAR(minority_student_percent);
00805     AVERAGE_SCHOOL_EX_VAR_CHAR(sponsored_research_rating);
00806     AVERAGE_SCHOOL_EX_VAR_CHAR(doctoral_degres_per_faculty_rating);
00807     AVERAGE_SCHOOL_EX_VAR_CHAR(adj_freshmen_top_ten_percent_of_class);
00808 
00809     AVERAGE_SCHOOL_EX_VAR_FLOAT(apps_ratio2);
00810     AVERAGE_SCHOOL_EX_VAR_FLOAT(yield_rate2);
00811     AVERAGE_SCHOOL_EX_VAR_CHAR(athletics_rating2);
00812     AVERAGE_SCHOOL_EX_VAR_CHAR(net_tuition_revenue_as_percent_of_e_and_g_expense);
00813     // = 4.21 for debug
00814     AVERAGE_SCHOOL_EX_VAR_FLOAT_SKIP_ZERO(doc_time_to_degree);
00815 
00816     //---- vars for screening school records -----//
00817     AVERAGE_SCHOOL_EX_VAR_FLOAT(prestige);
00818     AVERAGE_SCHOOL_EX_VAR_FLOAT(distance_value);
00819 
00820     //--------------------------------------//
00821     //------ average vars in SchoolEx ------//
00822     //--------------------------------------//
00823     // field L-R
00824     AVERAGE_SCHOOL_EX_VAR_INT(operating_reserve);   // current_funds_balance
00825     AVERAGE_SCHOOL_EX_VAR_INT(endowment_market);    // end_of_year_endowment_market_value
00826     AVERAGE_SCHOOL_EX_VAR_INT(buildings);           // year_end_market_value_of_plant
00827     AVERAGE_SCHOOL_EX_VAR_INT(capital_reserve);     // year_end_capital_reserve
00828     AVERAGE_SCHOOL_EX_VAR_INT(general_plant_debt);  // year_end_general_plant_and_residence_hall_debt
00829     AVERAGE_SCHOOL_EX_VAR_INT(residence_hall_debt); // residence_hall_debt
00830     AVERAGE_SCHOOL_EX_VAR_INT(fund_balance);        // R=M1244+N1244+O1244-P1244-Q1244
00831 
00832     // field S
00833     // total_gross_tuition_revenue
00834     AVERAGE_SCHOOL_EX_VAR_INT(gross_tuition_revenue);
00835     AVERAGE_SCHOOL_EX_VAR_INT(financial_aid);       // total_financial_aid
00836     AVERAGE_SCHOOL_EX_VAR_INT(net_tuition_revenue); // =S-T
00837 
00838     AVERAGE_SCHOOL_EX_VAR_INT(state_appropriations);// state_and_local_appropriations
00839     AVERAGE_SCHOOL_EX_VAR_INT(sponsored_research);  // adjusted_total_sponsored_research
00840     AVERAGE_SCHOOL_EX_VAR_INT(gifts_to_operations); // gifts_to_operations
00841     AVERAGE_SCHOOL_EX_VAR_INT(endowment_spending);  //BUG in excel data!!! = M*B = endowment_market * fice
00842 
00843     // field Z
00844     AVERAGE_SCHOOL_EX_VAR_SHORT(athletics);         // athletics_revenue
00845     // adjusted_other_operating_income);
00846     AVERAGE_SCHOOL_EX_VAR_INT(other_operating_income);
00847     // = current_funds_balance * 0.08
00848     AVERAGE_SCHOOL_EX_VAR_INT(interest_on_operating_reserve);
00849     // =AC=SUM(U1244:AB1244)
00850     AVERAGE_SCHOOL_EX_VAR_INT(total_sources_of_funds);
00851 
00852     // field AD
00853     // academic_dept_faculty_salaries
00854     AVERAGE_SCHOOL_EX_VAR_INT(dept_expense_faculty_salaries);
00855     // = academic_dept_total_salaries - AD
00856     AVERAGE_SCHOOL_EX_VAR_INT(dept_expense_staff_salaries);
00857     AVERAGE_SCHOOL_EX_VAR_INT(dept_expense_other);  // academic_dept_other_expense
00858     // sponsored_research_faculty_salaries
00859     AVERAGE_SCHOOL_EX_VAR_INT(sponsored_research_faculty_salaries);
00860     // = sponsored_research_total_salaries - AG
00861     AVERAGE_SCHOOL_EX_VAR_INT(sponsored_research_staff_salaries);
00862     // sponsored_research_other
00863     AVERAGE_SCHOOL_EX_VAR_INT(sponsored_research_other);
00864 
00865     // field AJ
00866     // library_salaries
00867     AVERAGE_SCHOOL_EX_VAR_INT(library_staff_salaries);
00868     // library_other_expense
00869     AVERAGE_SCHOOL_EX_VAR_INT(library_other_expense);
00870 
00871     // = academic_support_salaries * 0.1
00872     AVERAGE_SCHOOL_EX_VAR_INT(academic_it_staff_salaries);
00873     // = academic_support_other_expense * 0.3
00874     AVERAGE_SCHOOL_EX_VAR_INT(academic_it_other_expense);
00875 
00876     // field AN
00877     // student_life_salaries
00878     AVERAGE_SCHOOL_EX_VAR_INT(student_life_staff_salaries);
00879     // student_life_other_expense
00880     AVERAGE_SCHOOL_EX_VAR_INT(student_life_other_expense);
00881 
00882     // fields already defined in base class School
00883     //AVERAGE_SCHOOL_EX_VAR_INT(athletics_salaries);                    // academic_support_salaries
00884     //AVERAGE_SCHOOL_EX_VAR_INT(athletics_other_expense);                               // academic_support_other_expense
00885 
00886     // field AR
00887     // inst_advancement_salaries
00888     AVERAGE_SCHOOL_EX_VAR_INT(inst_advancement_staff_salaries);
00889     // inst_advancement_other_expense
00890     AVERAGE_SCHOOL_EX_VAR_INT(inst_advancement_other_expense);
00891 
00892     // inst_support_net_salaries);
00893     AVERAGE_SCHOOL_EX_VAR_INT(administration_staff_salaries);
00894     // inst_support_net_other_expense);
00895     AVERAGE_SCHOOL_EX_VAR_INT(administration_other_expense);
00896 
00897     // o_and_m_salaries
00898     AVERAGE_SCHOOL_EX_VAR_INT(o_and_m_staff_salaries);
00899     // o_and_m_other_expense
00900     AVERAGE_SCHOOL_EX_VAR_INT(o_and_m_other_expense);
00901 
00902     // field AX
00903     // academic_support_salaries -AL
00904     AVERAGE_SCHOOL_EX_VAR_INT(other_operating_expense_staff_salaries);
00905     // academic_support_other_expense -AM
00906     AVERAGE_SCHOOL_EX_VAR_INT(other_operating_expense_other_expense);
00907 
00908     // = SUM(AD1244:AY1244)
00909     AVERAGE_SCHOOL_EX_VAR_INT(total_operating_expenditure);
00910 
00911     // field BA
00912     // (year_end_general_plant_and_residence_hall_debt
00913     AVERAGE_SCHOOL_EX_VAR_INT(service_on_general_plant_debt);
00914     // -residence_hall_debt)*0.065
00915     // transfer_to_plant
00916     AVERAGE_SCHOOL_EX_VAR_INT(transfer_to_capital_reserve);
00917     AVERAGE_SCHOOL_EX_VAR_INT(total_uses_of_funds); // = AZ1244+BA1244+BB1244
00918     AVERAGE_SCHOOL_EX_VAR_INT(surplus_or_deficit);  // = AC1244-BC1244
00919 
00920     // field BE
00921     // = freshmen_from_within_the_state_percent/100.0*in_state_tuition+(1-freshmen_from_within_the_state_percent/100.0)*out_state_tuition
00922     AVERAGE_SCHOOL_EX_VAR_INT_SKIP_ZERO(tuition_rate);
00923     // room_and_board_charges
00924     AVERAGE_SCHOOL_EX_VAR_SHORT_SKIP_ZERO(room_and_board_rate);
00925     // ug_in_housing_percent/1000.0
00926     AVERAGE_SCHOOL_EX_VAR_FLOAT(percent_traditional_ug_in_residence_halls);
00927     // student_get_bacc_in_5_year_percent/1000.0
00928     AVERAGE_SCHOOL_EX_VAR_FLOAT(percent_get_bacc_in_5_year);
00929     // overhead_rate
00930     AVERAGE_SCHOOL_EX_VAR_CHAR_SKIP_ZERO(overhead_rate_on_sponsored_research);
00931     // float    endowment_spending_rate);
00932     AVERAGE_SCHOOL_EX_VAR_FLOAT_SKIP_ZERO(endowment_spending_rate);
00933 
00934     // field BK
00935     for (i=0; i<FACULTY_RANK_LEVEL_COUNT; i++) {
00936         AVERAGE_SCHOOL_EX_VAR_SHORT(school_faculty_array_ex[i].faculty_count);
00937         AVERAGE_SCHOOL_EX_VAR_INT_SKIP_ZERO(school_faculty_array_ex[i].salary);
00938         AVERAGE_SCHOOL_EX_VAR_FLOAT_SKIP_ZERO(school_faculty_array_ex[i].female_percent);
00939         AVERAGE_SCHOOL_EX_VAR_FLOAT_SKIP_ZERO(school_faculty_array_ex[i].minority_percent);
00940         AVERAGE_SCHOOL_EX_VAR_INT(school_faculty_array_ex[i].active_research_dollars);
00941     }
00942 
00943     // Enroll ft,pt_ug,etc (Enroll SL1-5);// Enroll ft,pt_ug,etc (Enroll SL1-5);  will be "scaled" later in this function
00944     // = sPtr->full_time_undergrad);
00945     AVERAGE_SCHOOL_EX_VAR_SHORT(full_time_undergrad);
00946     // = sPtr->part_time_undergrad);
00947     AVERAGE_SCHOOL_EX_VAR_SHORT(part_time_undergrad);
00948     AVERAGE_SCHOOL_EX_VAR_SHORT(enrollment_masters);// = sPtr->enrollment_masters);
00949     // = sPtr->enrollment_doctoral);
00950     AVERAGE_SCHOOL_EX_VAR_SHORT(enrollment_doctoral);
00951     AVERAGE_SCHOOL_EX_VAR_SHORT(non_degree_seeking);// = sPtr->non_degree_seeking
00952 
00953     // field CM - Percent Female SL1-5
00954     // = female_undergrad_percent
00955     AVERAGE_SCHOOL_EX_VAR_CHAR_SKIP_ZERO(percent_female_sl[0]);
00956     // = female_undergrad_percent*1.1
00957     AVERAGE_SCHOOL_EX_VAR_CHAR_SKIP_ZERO(percent_female_sl[1]);
00958     // = female_grad_and_prof_percent*1.1
00959     AVERAGE_SCHOOL_EX_VAR_CHAR_SKIP_ZERO(percent_female_sl[2]);
00960     // = female_grad_and_prof_percent*0.75
00961     AVERAGE_SCHOOL_EX_VAR_CHAR_SKIP_ZERO(percent_female_sl[3]);
00962     // = female_undergrad_percent*0.85
00963     AVERAGE_SCHOOL_EX_VAR_CHAR_SKIP_ZERO(percent_female_sl[4]);
00964 
00965     // field CR - Percent Minority SL1-5
00966     // = minority_undergrad_percent*0.85);
00967     AVERAGE_SCHOOL_EX_VAR_CHAR_SKIP_ZERO(percent_minority_sl[0]);
00968     // = minority_undergrad_percent*1.2);
00969     AVERAGE_SCHOOL_EX_VAR_CHAR_SKIP_ZERO(percent_minority_sl[1]);
00970     // = minority_grad_and_prof_percent);
00971     AVERAGE_SCHOOL_EX_VAR_CHAR_SKIP_ZERO(percent_minority_sl[2]);
00972     // = minority_grad_and_prof_percent*0.6);
00973     AVERAGE_SCHOOL_EX_VAR_CHAR_SKIP_ZERO(percent_minority_sl[3]);
00974     // = minority_undergrad_percent*1.1);
00975     AVERAGE_SCHOOL_EX_VAR_CHAR_SKIP_ZERO(percent_minority_sl[4]);
00976 
00977     // = freshmen_from_within_the_state_percent
00978     AVERAGE_SCHOOL_EX_VAR_CHAR(percent_instate_freshmen);
00979     // = non_resident_alien_grad_and_prof_percent);
00980     AVERAGE_SCHOOL_EX_VAR_CHAR_SKIP_ZERO(percent_non_resident_alien_doctoral);
00981 
00982     //##### begin fred0514 #####
00983     // fields already defined in base class School
00984     // field CY
00985     //for(i=0;i<5;i++)
00986     //{
00987     //  AVERAGE_SCHOOL_EX_VAR_SHORT(target_student_intake_sl[i]);
00988     //  AVERAGE_SCHOOL_EX_VAR_FLOAT(dropout_rate_sl[i]);
00989     //  AVERAGE_SCHOOL_EX_VAR_FLOAT(target_grad_rate_sl[i]);
00990     //}
00991     //##### end fred0514 #####
00992 
00993     // field DN
00994     AVERAGE_SCHOOL_EX_VAR_INT(ug_applications);     // = student_applications);
00995     // = ug_applications/student_accepted);
00996     AVERAGE_SCHOOL_EX_VAR_FLOAT(ug_applications_rate);
00997     AVERAGE_SCHOOL_EX_VAR_CHAR(ug_yield_rate);      // = float(student_enrolled)/student_accepted*100);
00998 
00999     // fields already defined in base class School
01000     //AVERAGE_SCHOOL_EX_VAR_CHAR(percent_ug_students_on_aid);   // = percent_ug_students_on_aid);
01001     //AVERAGE_SCHOOL_EX_VAR_FLOAT(percent_freshmen_with_need);  // = percent_freshmen_with_need);
01002     //AVERAGE_SCHOOL_EX_VAR_FLOAT(freshmen_offered_aid);                        // = freshmen_offered_aid);
01003     //AVERAGE_SCHOOL_EX_VAR_FLOAT(percent_freshmen_offered_full_aid);   // = percent_freshmen_offered_full_aid);
01004     //AVERAGE_SCHOOL_EX_VAR_SHORT(institutional_aid_per_fte);
01005 
01006     // err_when(AGRICULTURE);
01007 
01008     for (short sl=0; sl<MAX_STUDENT_LEVEL_INI; sl++)
01009         for (short fd=0; fd < IPED_FIELD_COUNT; fd++) {
01010             // 1020 in latest initial_conds dated 980711, it is AVERAGE!
01011             AVERAGE_SCHOOL_EX_VAR_FLOAT(student_ifield_pct[sl][fd]);
01012         }
01013 
01014 #ifdef DEBUG_
01015     const short specialOrder[IPED_FIELD_COUNT] = {
01016         AGRICULTURE,INTER_DISCIPLINARY,BUSINESS,COMMUNICAIONS_LIBRARY_SCI,
01017         MATH_COMP_SCI,EDUCATION,ENGINEERING,FOREIGN_LANGUAGES,HEALTH_SOCIAL_SVCS,HUMANITIES,
01018         LIFE_PHYSICAL_SCI,SOCIAL_SCIENCES,VISUAL_PERFORMING_ARTS,BASIC_PERSONAL_PRACTICAL_SVCS
01019     };
01020     for (short fd=0; fd<IPED_FIELD_COUNT; fd++) {
01021         char s[300];
01022         sprintf(s, "schoolex: average: %f ", player_peer_school->student_ifield_pct[0][specialOrder[fd]]);
01023         debug_msg(s);
01024     }
01025 #endif
01026 
01027     // 0.0 4.7% 11.7%   9.6%    4.2%    2.9%    11.4%   2.4%    5.0%    10.4%   11.5%   33.4%   5.3%    4.0%
01028 }
01029 
01030 //--------- End of function SchoolRes::init_player_school_ex ---------//
01031 
01032 //------ Begin of function sort_school_distance_function ------//
01036 static int sort_school_distance_function( const void *a, const void *b ) {
01037 #if(GAME_VERSION>=200)
01038     float distanceA = school_res.desired_school_array[*((short*)a)].distance_value;
01039     float distanceB = school_res.desired_school_array[*((short*)b)].distance_value;
01040 #else
01041     float distanceA = school_res.get_db_school(*((short*)a))->distance_value;
01042     float distanceB = school_res.get_db_school(*((short*)b))->distance_value;
01043 #endif
01044 
01045     float rc = distanceA-distanceB;
01046 
01047     if( rc > 0 )
01048         return 1;
01049     else if( rc < 0 )
01050         return -1;
01051     else
01052         return 0;
01053 }
01054 
01055 //------- End of function sort_school_distance_function ------//
01056 
01057 //------ Begin of function sort_peerschool_prestige_function ------//
01061 static int sort_peerschool_prestige_function( const void *a, const void *b ) {
01062 #if(GAME_VERSION>=200)
01063     float prestigeA = school_res.desired_school_array[*((short*)a)].prestige;
01064     float prestigeB = school_res.desired_school_array[*((short*)b)].prestige;
01065 #else
01066     float prestigeA = school_res.get_db_school(*((short*)a))->prestige;
01067     float prestigeB = school_res.get_db_school(*((short*)b))->prestige;
01068 #endif
01069 
01070     float rc = prestigeA - prestigeB;
01071 
01072     if( rc > 0 )
01073         return 1;
01074     else if( rc < 0 )
01075         return -1;
01076     else
01077         return 0;
01078 }
01079 
01080 //------- End of function sort_peerschool_prestige_function ------//
01081 
01082 //------- Begin of function SchoolRes::get_db_school -------//
01084 #ifdef DEBUG
01085 School* SchoolRes::get_db_school(int recno) {
01086     err_when( recno < 1 || recno > db_school_count );
01087 
01088     return db_school_array+recno-1;
01089 }
01090 #endif
01091 //--------- End of function SchoolRes::get_db_school ---------//
01092 
01093 //-------- Begin of function SchoolRes::build_peer_school_array --------//
01097 void SchoolRes::build_peer_school_array() {
01098     int i, recno;
01099     float distanceDeviation = 0.0f;
01100     float distanceAverage = 0.0f;
01101 
01102 #if(GAME_VERSION>=200)
01103     School *sPtr = desired_school_array;
01104 
01105     //
01106     //--- calculate standard deviation of distance in db_school_array ---//
01107     //
01108     for( recno=1; recno<=desired_school_count; recno++ ) {
01109         distanceAverage += desired_school_array[recno-1].distance_value;
01110     }
01111     distanceAverage /= desired_school_count;
01112 
01113     for( recno=1; recno<=desired_school_count; recno++ )
01114         distanceDeviation += EXPO2(desired_school_array[recno-1].distance_value - distanceAverage);
01115     distanceDeviation /= desired_school_count;
01116     distanceDeviation = sqrtf(distanceDeviation);
01117 
01118     // distanceDeviation = 0.3f;        // 0.483f;
01119 #else
01120     School *sPtr = db_school_array;
01121 
01122     //
01123     //--- calculate standard deviation of distance in db_school_array ---//
01124     //
01125     for( recno=1; recno<=db_school_count; recno++ ) {
01126         distanceAverage += db_school_array[recno-1].distance_value;
01127     }
01128     distanceAverage /= db_school_count;
01129 
01130     for( recno=1; recno<=db_school_count; recno++ )
01131         distanceDeviation += EXPO2(db_school_array[recno-1].distance_value - distanceAverage);
01132     distanceDeviation /= db_school_count;
01133     distanceDeviation = sqrtf(distanceDeviation);
01134 
01135     // distanceDeviation = 0.3f;        // 0.483f;
01136 #endif
01137 
01138     //
01139     //--- select school in db_school_array ---//
01140     //
01141     DynArray    peerRecnoArr(sizeof(int), 20);
01142 
01143     // C = 0.1 is proposed by Bill in email on 0531
01144     const float C = 0.1f;                           // number of deviation in screening range
01145     const float screenRange = player_peer_school->distance_value + C * distanceDeviation;
01146     int count = 0;
01147 
01148 #if(GAME_VERSION>=200)
01149     sPtr = desired_school_array;
01150     for( recno=0; recno<desired_school_count ; recno++, sPtr++ ) {
01151         if ( sPtr->distance_value < screenRange ) {
01152             peerRecnoArr.linkin((void *) &recno);
01153 
01154             if( ++count == MAX_PEER_SCHOOL_COUNT )
01155                 break;
01156         }
01157     }
01158 #else
01159     sPtr = db_school_array;
01160     for( recno=1; recno<=db_school_count ; recno++, sPtr++ ) {
01161         if ( sPtr->distance_value < screenRange ) {
01162             peerRecnoArr.linkin((void *) &recno);
01163 
01164             if( ++count == MAX_PEER_SCHOOL_COUNT )
01165                 break;
01166         }
01167     }
01168 #endif
01169 
01170     peer_school_count = peerRecnoArr.size();
01171 
01172     //
01173     //---sort the peer_school_array---//
01174     //
01175 
01176     //---- create an array for sorting on prestige ----//
01177 
01178     short* schoolSortArray = (short*) mem_add( peer_school_count * sizeof(short) );
01179 
01180     for( i=1; i<=peer_school_count; i++ ) {
01181         schoolSortArray[i-1] = *((int *) peerRecnoArr.get(i));
01182 
01183 #ifdef DEBUG_PEER
01184         char s[100];
01185         recno = *((int *) peerRecnoArr.get(i));
01186 #if(GAME_VERSION>=200)
01187         sprintf(s, "b4 sort: recno/prestige/distance #%d = %d   %f   %f", i, recno, desired_school_array[recno-1].prestige, desired_school_array[recno-1].distance_value);
01188 #else
01189         sprintf(s, "b4 sort: recno/prestige/distance #%d = %d   %f   %f", i, recno, db_school_array[recno-1].prestige, db_school_array[recno-1].distance_value);
01190 #endif
01191         DEBUG_LOG(s);
01192 #endif
01193     }
01194 
01195     //---- sort School in array[] by prestige ----//
01196     qsort( schoolSortArray, peer_school_count, sizeof(schoolSortArray[0]), sort_peerschool_prestige_function );
01197 
01198     //
01199     //---create PeerSchool records in peer_school_array---//
01200     //
01201     peer_school_array = (PeerSchool*) mem_add( sizeof(PeerSchool) * (peer_school_count+1) );
01202     PeerSchool *psPtr = peer_school_array;
01203     bool isPlayerAdded = false;
01204 
01205     // loop through schoolSortArray
01206     for ( i=0; i<peer_school_count; i++, psPtr++) {
01207         recno = schoolSortArray[i];
01208 
01209 #if(GAME_VERSION>=200)
01210         if ( !isPlayerAdded && desired_school_array[recno].prestige > player_peer_school->prestige )
01211 #else
01212             if ( !isPlayerAdded && db_school_array[recno-1].prestige > player_peer_school->prestige )
01213 #endif
01214             {
01215                 // insert player_school to the peer_school_array
01216                 // then deallocate memory pointed by player_peer_school
01217 
01218                 // if player_peer_school->prestige is the largest, this segment is not run, see segment after for loop
01219                 psPtr->init(-1);
01220 
01221                 memcpy(psPtr, player_peer_school, sizeof(PeerSchool));
01222                 mem_del(player_peer_school);
01223                 player_peer_school = psPtr;
01224 
01225                 psPtr++;
01226                 isPlayerAdded = true;
01227                 //psPtr->init(recno);           // 1008
01228                 //continue;
01229             }
01230 
01231         //psPtr->init(db_school_array+recno-1);
01232         psPtr->init(recno);
01233 
01234         //--------- assign a new name from made-up names database PEERNAME.DBF  ---//
01235 
01236         int loopCount=0;
01237 
01238         while(1) {
01239             err_when( loopCount++ > 10000 );
01240 
01241             int peerId = m.random(peer_info_count);
01242 
01243             //--- filter out duplication -----//
01244 
01245             char* newName = peer_info_array[peerId].name;
01246 
01247             for ( int j=0; j<peer_school_count; j++ ) {
01248                 if( strcmp( peer_school_array[j].name, newName )==0 )
01249                     break;
01250             }
01251 
01252             if( j<peer_school_count )                   // duplicated.
01253                 continue;
01254 
01255             //-------- set the peer name now -------------//
01256 
01257             strcpy(psPtr->name, newName);
01258             break;
01259         }
01260 
01261 #ifdef DEBUG_PEER
01262         char s[100];
01263         sprintf(s, "af sort: recno/prestige/distance %d = %d   %f   %f", i+1, recno, psPtr->prestige, psPtr->distance_value);
01264         DEBUG_LOG(s);
01265 #endif
01266     }
01267 
01268     // ##### begin Gilbert 16/01/2002 #####//
01269     // fix in version 2 but also apply for version 1
01270     // if player_peer_school has the largest prestige, it was not added to peer_school_array
01271     if( !isPlayerAdded ) {
01272         psPtr->init(-1);
01273 
01274         memcpy(psPtr, player_peer_school, sizeof(PeerSchool));
01275         mem_del(player_peer_school);
01276         player_peer_school = psPtr;
01277 
01278         psPtr++;
01279         isPlayerAdded = true;
01280     }
01281     // ##### end Gilbert 16/01/2002 #####//
01282 
01283     peer_school_count++;                            // include the player school
01284     mem_del( schoolSortArray );                     // sorting finished
01285 
01286     //----------------------------//
01287     // 1029 // see WFM Notes, 19 Sept, section5.4
01288 
01289     memset(PeerSchool::average_faculty_salary, 0, sizeof(PeerSchool::average_faculty_salary));
01290 
01291     psPtr = peer_school_array;
01292 
01293     for ( i=0; i<peer_school_count; i++, psPtr++) {
01294         for (int r=0; r<FACULTY_RANK_LEVEL_COUNT; r++) {
01295             // 51: full professor: middle age group
01296             PeerSchool::average_faculty_salary[Faculty::rank_age_group(r, 51)] += psPtr->school_faculty_array_ex[r].salary;
01297         }
01298     }
01299 
01300     for (int r=0; r<MAX_RANK_AGE_GROUP; r++)
01301         PeerSchool::average_faculty_salary[r] /= peer_school_count;
01302 
01303     //------------------//
01304 
01305     int lowFullProf = Faculty::rank_age_group(FULL_PROF, 41);
01306     int midFullProf = Faculty::rank_age_group(FULL_PROF, 51);
01307     int highFullProf = Faculty::rank_age_group(FULL_PROF, 61);
01308 
01309     char templateCode[1] = { FIRST_TEMPLATE_CODE };
01310     FacultyTemplate* facultyTemplate = faculty_res.get_faculty_template( templateCode, lowFullProf );
01311     FacultyTemplate* facultyTemplate2 = faculty_res.get_faculty_template( templateCode, midFullProf );
01312     FacultyTemplate* facultyTemplate3 = faculty_res.get_faculty_template( templateCode, highFullProf );
01313 
01314     float lowRatio = float(facultyTemplate->overall_salary_multiplier) / facultyTemplate2->overall_salary_multiplier;
01315     float highRatio = float(facultyTemplate3->overall_salary_multiplier) / facultyTemplate2->overall_salary_multiplier;
01316 
01317     PeerSchool::average_faculty_salary[lowFullProf] = int(lowRatio * PeerSchool::average_faculty_salary[midFullProf]);
01318     PeerSchool::average_faculty_salary[highFullProf] = int(highRatio * PeerSchool::average_faculty_salary[midFullProf]);
01319 
01320     //-----------------//
01321     // 0130 scenario(2)
01322 
01323     if ( player_school.scenario_id == SCN_RAISE_SALARY ) {
01324         for (int r=0; r<MAX_RANK_AGE_GROUP; r++)
01325             PeerSchool::average_faculty_salary[r] = int(PeerSchool::average_faculty_salary[r] * 1.1);
01326     }
01327 }
01328 
01329 //-------- End of function SchoolRes::build_peer_school_array --------//
01330 
01331 //-------- Begin of function SchoolRes::next_day --------//
01335 void  SchoolRes::next_day() {
01336     // per year
01337     if ( info.game_day == 1  && info.game_month == finance.fiscal_year_start_month )
01338         PeerSchool::calc_average_faculty_salary();
01339 }
01340 
01341 //-------- End of function SchoolRes::next_day --------//
01342 
01343 #if(GAME_VERSION>=200)
01344 
01345 // --- Begin of function SchoolRes::get_desired_school_array --- //
01346 //
01347 void SchoolRes::get_desired_school_array() {
01348     short numCount=0;
01349 
01350     // get the number count of school are in desired type
01351     for ( int i=0; i<db_school_count; i++ ) {
01352         // they are in desired type
01353         if ( get_db_school(i+1)->control == player_school.control ) {
01354             numCount++;
01355         }
01356     }
01357 
01358     desired_school_count = numCount;
01359     desired_school_array = (School*) mem_add( sizeof(School) * desired_school_count );
01360 
01361     numCount = 0;
01362     // copy the desired school into desired_school_array
01363     for ( i=0; i<db_school_count; i++ ) {
01364         // if they are in desired type
01365         if ( get_db_school(i+1)->control == player_school.control ) {
01366             memcpy( &desired_school_array[numCount], get_db_school(i+1), sizeof(School) );
01367             desired_school_array[numCount].desired_recno = i+1;
01368             numCount++;
01369         }
01370     }
01371 }
01372 
01373 //
01374 // --- End of function SchoolRes::get_desired_school_array --- //
01375 
01376 // --- Begin of function SchoolRes::get_50_school_array --- //
01377 //
01378 void SchoolRes::get_50_school_array() {
01379     // save the  of desired_school_array into schoolSortArray for sorting function
01380     short*  schoolSortArray = (short*) mem_add( desired_school_count * sizeof(short) );
01381 
01382     for ( int i=0; i<desired_school_count; i++ )
01383         schoolSortArray[i] = i;
01384 
01385   // quick sort the desired array
01386     qsort( schoolSortArray, desired_school_count, sizeof(schoolSortArray[0]), sort_school_distance_function );
01387 
01388     // copy the first 50 schools into desired_school_array
01389     short*  tempSchoolRecnoArray = (short*) mem_add( MAX_FIRST_SCHOOL * sizeof(short) );
01390     for ( i=0; i<MAX_FIRST_SCHOOL; i++ )
01391         tempSchoolRecnoArray[i] = desired_school_array[schoolSortArray[i]].desired_recno;
01392     for ( i=0; i<MAX_FIRST_SCHOOL; i++ ) {
01393         memcpy( &desired_school_array[i], get_db_school(tempSchoolRecnoArray[i]), sizeof(School) );
01394         desired_school_array[i].desired_recno = tempSchoolRecnoArray[i];
01395     }
01396 
01397     // resize the desired_school_count and also the desired_school_array
01398     desired_school_count = MAX_FIRST_SCHOOL;
01399 
01400     desired_school_array = (School*) mem_resize( desired_school_array, sizeof(School) * desired_school_count );
01401 
01402     mem_del(schoolSortArray);
01403     mem_del(tempSchoolRecnoArray);
01404 }
01405 
01406 //
01407 // --- End of function SchoolRes::get_50_school_array --- //
01408 #endi