//------- Begin of function Town::think_independent_set_link --------// // // Independent town thinking. // void Town::think_independent_set_link() { //---- think about working for foreign firms ------// int linkStatus; Firm* firmPtr; for(int i=0; i<linked_firm_count; i++) { firmPtr = firm_array[linked_firm_array[i]]; if( firmPtr->firm_id == FIRM_CAMP ) // a town cannot change its status with a military camp continue; //---- think about the link status ----// linkStatus = 0; if( firmPtr->nation_recno == 0 ) // if the firm is also an independent firm linkStatus = 1; if( average_resistance(firmPtr->nation_recno) <= INDEPENDENT_LINK_RESISTANCE ) linkStatus = 1; //---- set the link status -------// toggle_firm_link( i+1, linkStatus, COMMAND_AI ); } ai_link_checked = 1; }
//------ Begin of function FirmMarket::ai_update_link_status ------// // void FirmMarket::ai_update_link_status() { //---- consider enabling/disabling links to firms ----// Nation* nationPtr = nation_array[nation_recno]; Firm* firmPtr; int rc; int i; for(i=0; i<linked_firm_count; i++) { err_when(!linked_firm_array[i] || firm_array.is_deleted(linked_firm_array[i])); firmPtr = firm_array[linked_firm_array[i]]; //-------- check product type ----------// rc = firmPtr->firm_id == FIRM_MINE || firmPtr->firm_id == FIRM_FACTORY; // for output raw materials to the factory to manufacture toggle_firm_link( i+1, rc, COMMAND_AI ); // enable the link } //----- always enable links to towns as there is no downsides for selling goods to the villagers ----// for(i=0; i<linked_town_count; i++) { err_when(!linked_town_array[i] || town_array.is_deleted(linked_town_array[i])); toggle_town_link( i+1, 1, COMMAND_AI ); // enable the link } }
//----- Begin of function Town::update_camp_link -----// // // Update the status of links from this town to camps. // void Town::update_camp_link() { //--- enable the link of the town's side to all linked camps ---// Firm* firmPtr; int i; for( i=0 ; i<linked_firm_count ; i++ ) { firmPtr = firm_array[linked_firm_array[i]]; if( !firmPtr->cast_to_FirmCamp() ) continue; //--- don't set it if the town and camp both belong to a human player, the player will set it himself ---// if( firmPtr->nation_recno == nation_recno && nation_recno && !nation_array[nation_recno]->is_ai() ) { continue; } //--------------------------------------------// toggle_firm_link( i+1, 1, COMMAND_AUTO ); } //------- update camp link status -------// has_linked_own_camp = 0; has_linked_enemy_camp = 0; for( i=0 ; i<linked_firm_count ; i++ ) { if( linked_firm_enable_array[i] != LINK_EE ) continue; firmPtr = firm_array[linked_firm_array[i]]; if( !firmPtr->cast_to_FirmCamp() || firmPtr->cast_to_FirmCamp()->overseer_recno == 0 ) { continue; } if( firmPtr->nation_recno == nation_recno ) has_linked_own_camp = 1; else has_linked_enemy_camp = 1; } }
//------- 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; }
//------- Begin of function Town::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 Town::draw_detect_link_line(int actionDetect) { //-------- 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 ---------// char* bitmapPtr; for(int i=0 ; i<linked_firm_count ; i++ ) { int firmX, firmY; Firm *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 ); if( !can_toggle_firm_link(linked_firm_array[i]) ) continue; //------ draw the link icon and detect mouse action -----// bitmapPtr = power.get_link_icon( linked_firm_enable_array[i], nation_recno==firmPtr->nation_recno ); if( actionDetect ) { int rc = world.zoom_matrix->detect_bitmap_clip( firmX-11, firmY-11, bitmapPtr ); if( rc ) mouse.reset_click(); // reset queued mouse click for fast single clicking //------ left clicking to toggle link -------// if( rc==1 && nation_recno==nation_array.player_recno ) { if( linked_firm_enable_array[i] & LINK_ED ) { toggle_firm_link( i+1, 0, COMMAND_PLAYER ); // ###### begin Gilbert 25/9 #######// se_ctrl.immediate_sound("TURN_OFF"); // ###### end Gilbert 25/9 #######// } else { toggle_firm_link( i+1, 1, COMMAND_PLAYER ); // ###### begin Gilbert 25/9 #######// se_ctrl.immediate_sound("TURN_ON"); // ###### end Gilbert 25/9 #######// } // ######## begin Gilbert 23/9 ##########// if( firmPtr->firm_id == FIRM_CAMP && !remote.is_enable()) // ######## end Gilbert 23/9 ##########// { if( nation_recno ) update_target_loyalty(); else update_target_resistance(); update_camp_link(); } return 1; } //------ right clicking to recruit soldiers ------// else if( rc==2 ) { if( firmPtr->nation_recno == nation_recno && !firmPtr->under_construction && firmPtr->worker_array && firmPtr->worker_count < MAX_WORKER ) { firmPtr->pull_town_people(town_recno, COMMAND_PLAYER, browse_selected_race_id(), 1); // last 1-force pulling people from the town to the firm // ###### begin Gilbert 25/9 #######// se_ctrl.immediate_sound("PULL_MAN"); // ###### end Gilbert 25/9 #######// } } } else { if( nation_recno == nation_array.player_recno ) world.zoom_matrix->put_bitmap_clip( firmX-11, firmY-11, bitmapPtr ); } } //------ draw lines to linked towns ---------// bool awesome_lines_flag = false; // Set this to true to draw animated lines to ALL towns in the network. Not advised for actual play. for( int i=0 ; i<linked_town_count ; i++ ) { int townX, townY; int townRecno = linked_town_array[i]; Town *townPtr = town_array[townRecno]; 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 ( !awesome_lines_flag || (townPtr->nation_recno != nation_array.player_recno) ) anim_line.draw_line(&vga_back, srcX, srcY, townX, townY, linked_town_enable_array[i]==LINK_EE ); } //------------ detect on the migration icon ------------// // allow migration to any town in the same town network // if (town_network_recno != 0 && (nation_recno == nation_array.player_recno)) { TownNetwork &townNetwork = *town_network_array[town_network_recno]; bitmapPtr = image_icon.get_ptr("MIGRATE"); for (int i = 0; i < townNetwork.size(); ++i) { int townRecno = townNetwork[i]; Town *townPtr = town_array[townRecno]; // Do not draw/detect on self if (townRecno == town_recno) continue; int townX, townY; 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 awesome_lines_flag is true then draw the aminated lines on all towns in the town-network if (awesome_lines_flag) { anim_line.draw_line(&vga_back, srcX, srcY, townX, townY, 1 /*-animated*/); } // Only perform checks on migration (draw/detect) when the 'active' part of the town is within // the zoom matrix if ( world.zoom_matrix->is_bitmap_clip( townX-11, townY-11, bitmapPtr ) && can_migrate(townRecno) ) { if( actionDetect ) { int detectClick = world.zoom_matrix->detect_bitmap_clip( townX-11, townY-11, bitmapPtr ); if( detectClick ) { mouse.reset_click(); // reset queued mouse click for fast single clicking // Migrate 1 person on left click and 10 people on right click err_when(town_array[townRecno]->population>MAX_TOWN_POPULATION); int migrateRaceId = browse_selected_race_id(); err_when( !migrateRaceId ); migrate_to(townRecno, COMMAND_PLAYER, migrateRaceId, (detectClick == 1 ? 1 : 10)); // ###### begin Gilbert 25/9 #######// se_ctrl.immediate_sound("PULL_MAN"); // ###### end Gilbert 25/9 #######// return 1; } } else { world.zoom_matrix->put_bitmap_clip( townX-11, townY-11, bitmapPtr ); } } } } return 0; }
//------- Begin of function Town::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 Town::draw_detect_link_line(int actionDetect) { int i, firmX, firmY, townX, townY; Firm* firmPtr; Town* townPtr; //-------- 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 ---------// char* bitmapPtr; char goodLinkName[9] = "GOODLINK"; goodLinkName[7] = '1'+(char)(sys.frame_count%3); 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 ); if( !can_toggle_firm_link(linked_firm_array[i]) ) continue; //------ draw the link icon and detect mouse action -----// bitmapPtr = power.get_link_icon( linked_firm_enable_array[i], nation_recno==firmPtr->nation_recno ); if( actionDetect ) { int rc = world.zoom_matrix->detect_bitmap_clip( firmX-11, firmY-11, bitmapPtr ); if( rc ) mouse.reset_click(); // reset queued mouse click for fast single clicking //------ left clicking to toggle link -------// if( rc==1 && nation_recno==nation_array.player_recno ) { if( linked_firm_enable_array[i] & LINK_ED ) { toggle_firm_link( i+1, 0, COMMAND_PLAYER ); // ###### begin Gilbert 25/9 #######// se_ctrl.immediate_sound("TURN_OFF"); // ###### end Gilbert 25/9 #######// } else { toggle_firm_link( i+1, 1, COMMAND_PLAYER ); // ###### begin Gilbert 25/9 #######// se_ctrl.immediate_sound("TURN_ON"); // ###### end Gilbert 25/9 #######// } // ######## begin Gilbert 23/9 ##########// if( firmPtr->firm_id == FIRM_CAMP && !remote.is_enable()) // ######## end Gilbert 23/9 ##########// { if( nation_recno ) update_target_loyalty(); else update_target_resistance(); update_camp_link(); } return 1; } //------ right clicking to recruit soldiers ------// else if( rc==2 ) { if( firmPtr->nation_recno == nation_recno && !firmPtr->under_construction && firmPtr->worker_array && firmPtr->worker_count < MAX_WORKER ) { firmPtr->pull_town_people(town_recno, COMMAND_PLAYER, browse_selected_race_id(), 1); // last 1-force pulling people from the town to the firm // ###### begin Gilbert 25/9 #######// se_ctrl.immediate_sound("PULL_MAN"); // ###### end Gilbert 25/9 #######// } } } else { if( nation_recno == nation_array.player_recno ) world.zoom_matrix->put_bitmap_clip( firmX-11, firmY-11, bitmapPtr ); } } //------ draw lines to linked towns ---------// int townRecno; for( i=0 ; i<linked_town_count ; i++ ) { townRecno = linked_town_array[i]; townPtr = town_array[townRecno]; 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; anim_line.draw_line(&vga_back, srcX, srcY, townX, townY, linked_town_enable_array[i]==LINK_EE ); //------- detect on the migration icon -------// if( nation_recno == nation_array.player_recno && nation_recno == townPtr->nation_recno && can_migrate(townRecno) ) { bitmapPtr = image_icon.get_ptr("MIGRATE"); if( actionDetect ) { if( world.zoom_matrix->detect_bitmap_clip( townX-11, townY-11, bitmapPtr ) ) { mouse.reset_click(); // reset queued mouse click for fast single clicking err_when(town_array[townRecno]->population>MAX_TOWN_POPULATION); migrate_to(townRecno, COMMAND_PLAYER); // ###### begin Gilbert 25/9 #######// se_ctrl.immediate_sound("PULL_MAN"); // ###### end Gilbert 25/9 #######// return 1; } } else { world.zoom_matrix->put_bitmap_clip( townX-11, townY-11, bitmapPtr ); } } } return 0; }