//--------- Begin of function TownArray::settle --------// // // A unit settles on a given location and form a town town. // // return: <int> 1 - settled and a town town is formed successfully. // 0 - settling failed. too close to a town of another nation. // int TownArray::settle(int unitRecno, int xLoc, int yLoc) { if(!world.can_build_town(xLoc, yLoc, unitRecno)) return 0; //--------- get the nearest town town ------------// Unit* unitPtr = unit_array[unitRecno]; char nationRecno = unitPtr->nation_recno; //----- it's far enough to form another town --------// int townRecno = town_array.add_town( nationRecno, unitPtr->race_id, xLoc, yLoc ); //---------- init town population ----------// Town* townPtr = town_array[townRecno]; //----------------------------------------------------// // if the settle unit is standing in the town area // cargo_recno of that location is unchange in town_array.add_town // so update the location now //----------------------------------------------------// short uXLoc = unitPtr->next_x_loc(); short uYLoc = unitPtr->next_y_loc(); Location *locPtr = world.get_loc(uXLoc, uYLoc); townPtr->assign_unit(unitRecno); if( uXLoc>=townPtr->loc_x1 && uXLoc<=townPtr->loc_x2 && uYLoc>=townPtr->loc_y1 && uYLoc<=townPtr->loc_y2 ) locPtr->set_town(townPtr->town_recno); #ifdef DEBUG // make sure cargo recno is set to town's for( uYLoc = townPtr->loc_y1; uYLoc <= townPtr->loc_y2; ++uYLoc) { for( uXLoc = townPtr->loc_x1; uXLoc <= townPtr->loc_x2; ++uXLoc) { err_when( world.get_loc(uXLoc, uYLoc)->town_recno() != townPtr->town_recno ); } } #endif townPtr->update_target_loyalty(); //--------- hide the unit from the map ----------// return 1; }
//--------- Begin of function FirmCamp::update_influence ---------// // // Update this camp's influence on neighbor towns. // void FirmCamp::update_influence() { int i; Town* townPtr; for( i=0 ; i<linked_town_count ; i++ ) { if(town_array.is_deleted(linked_town_array[i])) continue; townPtr = town_array[linked_town_array[i]]; if( linked_town_enable_array[i] == LINK_EE ) { if( townPtr->nation_recno ) townPtr->update_target_loyalty(); else townPtr->update_target_resistance(); } } }
//------- Begin of function Firm::draw_detect_link_line ---------// // // [int] actionDetect - 0 - this is a draw action // 1 - this is a detect action // (default: 0) // // return: <int> 1 - detected // 0 - not detected // int Firm::draw_detect_link_line(int actionDetect) { if( firm_id == FIRM_INN ) // FirmInn's link is only for scan for neighbor inns quickly, the link line is not displayed return 0; //--------------------------------------// int i, firmX, firmY, townX, townY; Firm* firmPtr; Town* townPtr; FirmInfo* firmInfo = firm_res[firm_id]; //-------- set source points ----------// int srcX = ( ZOOM_X1 + (loc_x1-world.zoom_matrix->top_x_loc) * ZOOM_LOC_WIDTH + ZOOM_X1 + (loc_x2-world.zoom_matrix->top_x_loc+1) * ZOOM_LOC_WIDTH ) / 2; int srcY = ( ZOOM_Y1 + (loc_y1-world.zoom_matrix->top_y_loc) * ZOOM_LOC_HEIGHT + ZOOM_Y1 + (loc_y2-world.zoom_matrix->top_y_loc+1) * ZOOM_LOC_HEIGHT ) / 2; //------ draw lines to linked firms ---------// int lineType; char* bitmapPtr; for( i=0 ; i<linked_firm_count ; i++ ) { firmPtr = firm_array[linked_firm_array[i]]; firmX = ( ZOOM_X1 + (firmPtr->loc_x1-world.zoom_matrix->top_x_loc) * ZOOM_LOC_WIDTH + ZOOM_X1 + (firmPtr->loc_x2-world.zoom_matrix->top_x_loc+1) * ZOOM_LOC_WIDTH ) / 2; firmY = ( ZOOM_Y1 + (firmPtr->loc_y1-world.zoom_matrix->top_y_loc) * ZOOM_LOC_HEIGHT + ZOOM_Y1 + (firmPtr->loc_y2-world.zoom_matrix->top_y_loc+1) * ZOOM_LOC_HEIGHT ) / 2; anim_line.draw_line(&vga_back, srcX, srcY, firmX, firmY, linked_firm_enable_array[i]==LINK_EE ); //----- check if this firm can toggle link or not -----// if( !can_toggle_firm_link(firmPtr->firm_recno) ) continue; //------ if the link is switchable -------// bitmapPtr = power.get_link_icon( linked_firm_enable_array[i], nation_recno==firmPtr->nation_recno ); if( actionDetect ) { if( own_firm() && world.zoom_matrix->detect_bitmap_clip( firmX-11, firmY-11, bitmapPtr ) ) { if( linked_firm_enable_array[i] & LINK_ED ) { toggle_firm_link( i+1, 0, COMMAND_PLAYER ); se_ctrl.immediate_sound("TURN_OFF"); } else { toggle_firm_link( i+1, 1, COMMAND_PLAYER ); se_ctrl.immediate_sound("TURN_ON"); } return 1; } } else { if( nation_recno == nation_array.player_recno ) world.zoom_matrix->put_bitmap_clip( firmX-11, firmY-11, bitmapPtr ); } } //------ draw lines to linked towns ---------// for( i=0 ; i<linked_town_count ; i++ ) { townPtr = town_array[linked_town_array[i]]; townX = ( ZOOM_X1 + (townPtr->loc_x1-world.zoom_matrix->top_x_loc) * ZOOM_LOC_WIDTH + ZOOM_X1 + (townPtr->loc_x2-world.zoom_matrix->top_x_loc+1) * ZOOM_LOC_WIDTH ) / 2; townY = ( ZOOM_Y1 + (townPtr->loc_y1-world.zoom_matrix->top_y_loc) * ZOOM_LOC_HEIGHT + ZOOM_Y1 + (townPtr->loc_y2-world.zoom_matrix->top_y_loc+1) * ZOOM_LOC_HEIGHT ) / 2; if( worker_array && selected_worker_id && worker_array[selected_worker_id-1].town_recno == townPtr->town_recno ) { lineType = -1; anim_line.thick_line(&vga_back, srcX, srcY, townX, townY, linked_town_enable_array[i]==LINK_EE, lineType ); } else { lineType = 0; anim_line.draw_line(&vga_back, srcX, srcY, townX, townY, linked_town_enable_array[i]==LINK_EE, lineType ); } //----- check if this firm can toggle link or not -----// if( !can_toggle_town_link() ) continue; //--------- draw link symbol -----------// bitmapPtr = power.get_link_icon( linked_town_enable_array[i], nation_recno==townPtr->nation_recno ); if( actionDetect ) { int rc = world.zoom_matrix->detect_bitmap_clip( townX-11, townY-11, bitmapPtr ); //------ left clicking to toggle link -------// if( rc==1 && own_firm() ) { if( linked_town_enable_array[i] & LINK_ED ) { toggle_town_link( i+1, 0, COMMAND_PLAYER ); se_ctrl.immediate_sound("TURN_OFF"); } else { toggle_town_link( i+1, 1, COMMAND_PLAYER ); se_ctrl.immediate_sound("TURN_ON"); } // // update RemoteMsg::firm_toggle_link_town() // if( firm_id == FIRM_CAMP && !remote.is_enable()) { if( townPtr->nation_recno ) townPtr->update_target_loyalty(); else townPtr->update_target_resistance(); townPtr->update_camp_link(); } return 1; } //------ right clicking to move workers ------// else if( rc==2 && selected_worker_id > 0 ) { //--- only when this worker is ours ----// if( firm_res[firm_id]->live_in_town && worker_array[selected_worker_id-1].is_nation(firm_recno, nation_array.player_recno) ) { if(townPtr->population>=MAX_TOWN_POPULATION) return 0; set_worker_home_town(townPtr->town_recno, COMMAND_PLAYER); se_ctrl.immediate_sound("PULL_MAN"); return 1; } } } else { if( nation_recno == nation_array.player_recno ) world.zoom_matrix->put_bitmap_clip( townX-11, townY-11, bitmapPtr ); } } return 0; }