/* * Seven Kingdoms: Ancient Adversaries * * Copyright 1997,1998 Enlight Software Ltd. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ //Filename : OTOWNDRW.CPP //Description : Town drawing routines #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //------- Begin of function Town::draw -----------// // // Draw the town section on the zoom map // // [int] displayLayer : 1 = normal layer (default : 1) // : 2 = layer above the town // : 4 = layer below the town // void Town::draw(int displayLayer) { TownLayout* townLayout = town_res.get_layout(layout_id); TownSlot* townSlot = town_res.get_slot(townLayout->first_slot_recno); int sectionX1 = loc_x1 * ZOOM_LOC_WIDTH; int sectionY1 = loc_y1 * ZOOM_LOC_HEIGHT; if( displayLayer==4 ) { int townX1 = ZOOM_X1 + (loc_x1-world.zoom_matrix->top_x_loc) * ZOOM_LOC_WIDTH; int townY1 = ZOOM_Y1 + (loc_y1-world.zoom_matrix->top_y_loc) * ZOOM_LOC_HEIGHT; townX1 += (STD_TOWN_LOC_WIDTH * ZOOM_LOC_WIDTH - get_bitmap_width(townLayout->ground_bitmap_ptr))/2; // adjust offset townY1 += (STD_TOWN_LOC_HEIGHT * ZOOM_LOC_HEIGHT - get_bitmap_height(townLayout->ground_bitmap_ptr))/2; // adjust offset world.zoom_matrix->put_bitmap_remap_clip( townX1, townY1, townLayout->ground_bitmap_ptr ); return; } //-------- draw plants, buildings and flags --------// for( int i=0 ; islot_count ; i++, townSlot++ ) { //----- build_type==0 if plants -----// switch(townSlot->build_type) { //----- build_type>0 if town buildings -----// case TOWN_OBJECT_HOUSE: town_res.get_build( slot_object_id_array[i] ) ->draw(town_recno, sectionX1+townSlot->base_x, sectionY1+townSlot->base_y ); break; case TOWN_OBJECT_PLANT: plant_res.get_bitmap( slot_object_id_array[i] ) ->draw_at(sectionX1+townSlot->base_x, sectionY1+townSlot->base_y); break; case TOWN_OBJECT_FARM: draw_farm(sectionX1+townSlot->base_x, sectionY1+townSlot->base_y, townSlot->build_code ); break; case TOWN_OBJECT_FLAG: if( nation_recno ) draw_flag(sectionX1+townSlot->base_x, sectionY1+townSlot->base_y); break; } } } //-------- End of function Town::draw -----------// //------- Begin of function Town::draw_flag -----------// // // Draw the town section on the zoom map // void Town::draw_flag(int absBaseX, int absBaseY) { char flagName[] = "FLAG-1"; flagName[5] = '1' + (char) ((sys.frame_count+town_recno)%8) / 2; char* colorRemapTable = game.get_color_remap_table(nation_recno, 0); int drawX = absBaseX - world.view_top_x + ZOOM_X1 - 9; int drawY = absBaseY - world.view_top_y + ZOOM_Y1 - 97; world.zoom_matrix->put_bitmap_remap_clip(drawX, drawY, image_spict.get_ptr(flagName), colorRemapTable, 1); // 1-the bitmap is compressed } //-------- End of function Town::draw_flag -----------// //------- Begin of function Town::draw_farm -----------// // // Draw farming field. // void Town::draw_farm(int absBaseX, int absBaseY, int farmId) { err_when( farmId<1 || farmId>9 ); char farmName[] = "FARM-1"; farmName[5] = '0' + farmId; int drawX = absBaseX - world.view_top_x + ZOOM_X1; int drawY = absBaseY - world.view_top_y + ZOOM_Y1; world.zoom_matrix->put_bitmap_clip(drawX, drawY, image_spict.get_ptr(farmName), 1); // 1-the bitmap is compressed } //-------- End of function Town::draw_farm -----------// //------- Begin of function Town::is_in_zoom_win -----------// // // Whether the town section is in the current zoom window. // int Town::is_in_zoom_win() { int x1=world.zoom_matrix->top_x_loc; int y1=world.zoom_matrix->top_y_loc; int x2=x1+world.zoom_matrix->disp_x_loc-1; int y2=y1+world.zoom_matrix->disp_y_loc-1; return m.is_touch( x1, y1, x2, y2, loc_x1, loc_y1, loc_x2, loc_y2 ); } //--------- End of function Town::is_in_zoom_win -----------// //------- Begin of function Town::draw_selected -----------// // // Draw a square around the town section on the map. // void Town::draw_selected() { draw_detect_link_line(0); // 0-the action is draw only, not detecting } //--------- End of function Town::draw_selected -----------// //------- 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: 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 ; iloc_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 ; iloc_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; } //------- End of function Town::draw_detect_link_line ---------// //------- Begin of function Town::can_toggle_firm_link ---------// // // Return whether this town can toggle the link to the given // firm. // int Town::can_toggle_firm_link(int firmRecno) { if( !nation_recno ) // cannot toggle for independent town return 0; //------------------------------------// Firm* firmPtr; for( int i=0 ; ifirm_id ) { //-- you can only toggle a link to a camp if the camp is yours --// case FIRM_CAMP: return firmPtr->nation_recno == nation_recno; //--- town to market link is governed by trade treaty and cannot be toggled ---// case FIRM_MARKET: return 0; // !nation_array[nation_recno]->get_relation(firmPtr->nation_recno)->trade_treaty; default: return firm_res[firmPtr->firm_id]->is_linkable_to_town; } } return 0; } //------- Begin of function Town::can_toggle_firm_link ---------//