//------- Begin of function Town::setup_link ---------// // void Town::setup_link() { //-----------------------------------------------------------------------------// // check the connected firms location and structure if ai_link_checked is true //-----------------------------------------------------------------------------// if(ai_town) ai_link_checked = 0; //----- build town-to-firm link relationship -------// int firmRecno; Firm* firmPtr; FirmInfo* firmInfo; linked_firm_count = 0; for( firmRecno=firm_array.size() ; firmRecno>0 ; firmRecno-- ) { if( firm_array.is_deleted(firmRecno) ) continue; firmPtr = firm_array[firmRecno]; firmInfo = firm_res[firmPtr->firm_id]; if( !firmInfo->is_linkable_to_town ) continue; //----- only linkable if the firm and the town belong to the same nation or the firm can influence a foreign town, i.e. Camp, Fort and Fryhtan Lair, if( nation_recno==0 ) { //--- independent towns can linked to work firms and markets ---// if( !firmPtr->cast_to_FirmWork() && !firmPtr->cast_to_FirmMarket() && !firmPtr->cast_to_FirmCamp() ) { continue; } } else { //--- nation towns can only linked to own firms or camps -------// if( firmPtr->nation_recno != nation_recno && !firmPtr->cast_to_FirmCamp() ) continue; } //---------- check if the firm is close enough to this firm -------// if( m.points_distance( firmPtr->center_x, firmPtr->center_y, center_x, center_y ) > world.effective_distance(firmPtr->firm_id, 0) ) { continue; } //------ check if both are on the same terrain type ------// if( (world.get_loc(firmPtr->loc_x1, firmPtr->loc_y1)->is_plateau()==1) != (world.get_loc(loc_x1, loc_y1)->is_plateau()==1) ) { continue; } //----- if the firm requires same race -------// if( !firm_res.is_linkable_to_town(firmPtr->firm_id, firmPtr->race_id, race_id) ) continue; //------- determine default link flag -------// int defaultLinkStatus = LINK_EE; if( nation_recno==0 ) // if this is an independent town { if( firmPtr->nation_recno==0 || resistance(firmPtr->nation_recno) > INDEPENDENT_LINK_RESISTANCE ) defaultLinkStatus = LINK_DD; } //-------- add the link now -------// if( linked_firm_count < MAX_LINKED_FIRM_TOWN ) { err_when( linked_firm_count>0 && linked_firm_array[linked_firm_count-1] == firmRecno ); // BUGHERE - check double linking error linked_firm_array[linked_firm_count] = firmRecno; linked_firm_enable_array[linked_firm_count] = defaultLinkStatus; linked_firm_count++; } else { err_here(); } if( firmPtr->linked_town_count < MAX_LINKED_TOWN_TOWN ) { firmPtr->linked_town_array[firmPtr->linked_town_count] = town_recno; firmPtr->linked_town_enable_array[firmPtr->linked_town_count] = defaultLinkStatus; firmPtr->linked_town_count++; if(firmPtr->is_ai) firmPtr->ai_link_checked = 0; } else { err_here(); } } //----- build town-to-town link relationship -------// linked_town_count = 0; int townRecno; Town* townPtr; for( townRecno=town_array.size() ; townRecno>0 ; townRecno-- ) { if( town_array.is_deleted(townRecno) || townRecno==town_recno ) continue; townPtr = town_array[townRecno]; //----- if the firm requires same race -------// if( race_id != townPtr->race_id ) continue; //------ check if the town is close enough to this firm -------// if( m.points_distance( townPtr->center_x, townPtr->center_y, center_x, center_y ) > world.effective_distance(0, 0) ) { continue; } //------ check if both are on the same terrain type ------// if( (world.get_loc(townPtr->loc_x1, townPtr->loc_y1)->is_plateau()==1) != (world.get_loc(loc_x1, loc_y1)->is_plateau()==1) ) { continue; } //-------- link this town -------// if( linked_town_count < MAX_LINKED_TOWN_TOWN ) { linked_town_array[linked_town_count] = townRecno; linked_town_enable_array[linked_town_count] = LINK_EE; linked_town_count++; } else { err_here(); } //-------- link the other town -------// if( townPtr->linked_town_count < MAX_LINKED_TOWN_TOWN ) { townPtr->linked_town_array[townPtr->linked_town_count] = town_recno; townPtr->linked_town_enable_array[townPtr->linked_town_count] = LINK_EE; townPtr->linked_town_count++; if(townPtr->ai_town) townPtr->ai_link_checked = 0; } else { err_here(); } } }
//-------- Begin of function SpyArray::catch_spy ------// // // <int> spyPlace - either SPY_TOWN or SPY_FIRM // <int> spyPlacePara - town_recno or firm_recno // int SpyArray::catch_spy(int spyPlace, int spyPlacePara) { int nationRecno, totalPop; if( spyPlace == SPY_TOWN ) { Town* townPtr = town_array[spyPlacePara]; nationRecno = townPtr->nation_recno; totalPop = townPtr->population; } else if( spyPlace == SPY_FIRM ) { Firm* firmPtr = firm_array[spyPlacePara]; nationRecno = firmPtr->nation_recno; if( firmPtr->cast_to_FirmCamp() ) { FirmCamp *firmCamp = firmPtr->cast_to_FirmCamp(); totalPop = firmCamp->soldier_count + (firmCamp->overseer_recno>0); } else if( firmPtr->cast_to_FirmWork() ) { FirmWork *firmWork = firmPtr->cast_to_FirmWork(); totalPop = firmWork->worker_count; } else if( firmPtr->cast_to_FirmTrain() ) { totalPop = firmPtr->cast_to_FirmTrain()->trainee_count; return 0; // don't catch spy } else if( firmPtr->cast_to_FirmInn() ) { totalPop = firmPtr->cast_to_FirmInn()->inn_unit_count; return 0; // don't catch spy } else if( firmPtr->cast_to_FirmMarket() ) { totalPop = 0; return 0; } else if( firmPtr->cast_to_FirmMonsterTrain() ) { totalPop = firmPtr->cast_to_FirmMonsterTrain()->trainee_count; return 0; // don't catch spy } else if( firmPtr->cast_to_FirmMonsterAlchemy() ) { totalPop = 0; return 0; } else if( firmPtr->cast_to_FirmLishorr() ) { totalPop = 0; return 0; } else if( firmPtr->cast_to_FirmMonsterFortress() ) { FirmMonsterFortress *firmMonsterFortress = firmPtr->cast_to_FirmMonsterFortress(); totalPop = firmMonsterFortress->archer_count + firmMonsterFortress->extra_builder_count; } else if( firmPtr->cast_to_FirmAnimal() ) { totalPop = 0; return 0; } else if( firmPtr->cast_to_FirmIncubator() ) { totalPop = 0; return 0; } else if( firmPtr->cast_to_FirmMagic() ) { totalPop = 0; return 0; } else if( firmPtr->cast_to_FirmOffensive() ) { totalPop = 0; return 0; } else if( firmPtr->cast_to_FirmOffensive2() ) { totalPop = 0; return 0; } else { err_here(); totalPop = 0; } } else err_here(); //--- calculate the total of anti-spy skill in this town ----// int enemySpyCount=0, counterSpySkill=0; Spy* spyPtr; int techLevel = 0; if( nationRecno ) techLevel = tech_res[TECH_COUNTER_SPY]->get_nation_tech_level(nationRecno); int i; for( i=size() ; i>0 ; i-- ) { if( is_deleted(i) ) continue; spyPtr = spy_array[i]; if( spyPtr->spy_place == spyPlace && spyPtr->spy_place_para == spyPlacePara ) { if( spyPtr->true_nation_recno == nationRecno ) counterSpySkill += spyPtr->spy_skill + spyPtr->spy_skill * techLevel / 2; else enemySpyCount++; } } //----- if all citizens are enemy spies ----// if( enemySpyCount == totalPop ) return 0; err_when( enemySpyCount > totalPop ); //-------- try to catch enemy spies now ------// for( i=spy_array.size() ; i>0 ; i-- ) { if( spy_array.is_deleted(i) ) continue; spyPtr = spy_array[i]; if( spyPtr->action_mode == SPY_IDLE ) // it is very hard to get caught in sleep mode continue; if( spyPtr->spy_place == spyPlace && spyPtr->spy_place_para == spyPlacePara && spyPtr->true_nation_recno != nationRecno ) // doesn't get caught in sleep mode { int escapeChance = 100 + spyPtr->spy_skill - counterSpySkill; escapeChance = max( spyPtr->spy_skill/10, escapeChance ); if( m.random(escapeChance) == 0 ) { spyPtr->get_killed(); // only catch one spy per calling return 1; } } } return 0; }
//--------- Begin of function UnitCaravan::disp_stop ---------// // void UnitCaravan::disp_stop(int dispY1, int refreshFlag) { int y = INFO_Y1 + 94; int i, j; for( i = 0; i < MAX_STOP_FOR_CARAVAN; ++i, y += 70 ) { TradeStop *tradeStop = stop_array+i; button_go_stop[i].create( INFO_X1+17, y+2, INFO_X1+167, y+35, i_button_go_stop, ButtonCustomPara( this, tradeStop->firm_recno ) ); button_go_stop[i].set_help_code( "CGOSTOP" ); button_set_stop[i].create( INFO_X1+169, y+2, INFO_X1+215, y+20, i_button_set_stop, ButtonCustomPara( NULL, 0 ) ); button_set_stop[i].set_help_code( "CSETSTOP" ); button_cancel_stop[i].create( INFO_X1+169, y+21, INFO_X1+215, y+39, i_button_cancel_stop, ButtonCustomPara( NULL, 0 ) ); button_cancel_stop[i].set_help_code( "CDELSTOP" ); button_reset_stop[i].create( INFO_X1+169, y+42, INFO_X1+215, y+60, i_button_reset_stop, ButtonCustomPara( NULL, 0 ) ); button_reset_stop[i].set_help_code( "CCLRSEL" ); for( j = 0; j < MAX_GOODS_SELECT_BUTTON; ++j ) button_select_array[i][j].create( INFO_X1+17+carv_gdd_x[j], y+34, INFO_X1+17+carv_gdd_x[j+1]-1, y+61, i_disp_caravan_select_button, ButtonCustomPara( NULL, j ), 0 ); button_go_stop[i].custom_para = ButtonCustomPara( this, tradeStop->firm_recno ); button_go_stop[i].paint(); button_set_stop[i].paint(); button_cancel_stop[i].paint(); button_reset_stop[i].paint(); Firm *firmPtr = NULL; if( !firm_array.is_deleted(tradeStop->firm_recno)) firmPtr = firm_array[tradeStop->firm_recno]; for( j = 0; j < MAX_GOODS_SELECT_BUTTON; ++j ) { // display quantity on the firm int rawId = j+FIRST_GOODS_SELECT_BUTTON-PICK_UP_RAW_FIRST+1; if( rawId < 1 || rawId > MAX_RAW ) rawId = 0; int productId = j+FIRST_GOODS_SELECT_BUTTON-PICK_UP_PRODUCT_FIRST+1; if( productId < 1 || productId > MAX_PRODUCT ) productId = 0; int stock = -1; if( firmPtr ) { if( firmPtr->cast_to_FirmMarket() ) { MarketGoods *marketGoods; if( rawId ) { marketGoods = firmPtr->cast_to_FirmMarket()->market_raw_array(rawId); err_when( marketGoods && marketGoods->raw_id != rawId ); } else if( productId ) { marketGoods = firmPtr->cast_to_FirmMarket()->market_product_array(productId); err_when( marketGoods && marketGoods->product_raw_id != productId ); } else { err_here(); marketGoods = NULL; } if( marketGoods ) stock = (int) marketGoods->stock_qty; } else if( firmPtr->cast_to_FirmMine() ) { if( rawId && firmPtr->cast_to_FirmMine()->raw_id == rawId ) { stock = (int) firmPtr->cast_to_FirmMine()->stock_qty; } } else if( firmPtr->cast_to_FirmFactory() ) { if( productId && firmPtr->cast_to_FirmFactory()->product_raw_id == productId ) { stock = (int) firmPtr->cast_to_FirmFactory()->stock_qty; } //else if( rawId && firmPtr->cast_to_FirmFactory()->product_raw_id == rawId ) //{ // stock = (int) firmPtr->cast_to_FirmFactory()->raw_stock_qty; //} } } if( stock >= 0 ) { // display button button_select_array[i][j].enable_flag = 1; button_select_array[i][j].paint( tradeStop->pick_up_array[j] ); } else { button_select_array[i][j].enable_flag = 0; button_select_array[i][j].pushed_flag = tradeStop->pick_up_array[j]; } } } }
//--------- Begin of function UnitArray::draw_dot ---------// // // Draw 2x2 tiny squares on map window representing the location of the unit ---// // // [int] filterUnitClassId - if given, only display units whose type is filterUnitClassId // void UnitArray::draw_dot(int filterUnitClassId) { int i, j, mapX, mapY; short nationColor; int vgaBufPitch = vga_back.buf_pitch(); short playerNationRecno = nation_array.player_recno; short lineFromX, lineFromY, lineToX, lineToY; short unexploredColor = vga_back.translate_color(UNEXPLORED_COLOR); short nationColorArray[MAX_NATION+1]; for( int n = 0; n < MAX_NATION+1; ++n ) nationColorArray[n] = vga_back.translate_color(nation_array.nation_color_array[n]); // ##### begin Gilbert 2/11 ######// short excitedColorArray[MAX_NATION+1]; //[excitedColorCount]; short slowExcitedColorArray[MAX_NATION+1]; //[excitedColorCount]; for( i = 0; i <= MAX_NATION; ++i ) { if( i == 0 || !nation_array.is_deleted(i) ) { short *remapTable = game.get_color_remap_table(i, 0); excitedColorArray[i] = remapTable[0xe0 + (sys.frame_count % 4)]; slowExcitedColorArray[i] = remapTable[0xe0 + (sys.frame_count % 8)/2]; } else { excitedColorArray[i] = slowExcitedColorArray[i] = vga_back.translate_color(V_WHITE); } } // ##### end Gilbert 2/11 ######// int arraySize = size(); //------------- set boundary of anim_line to mini-map ------------// short animLineBoundX1 = anim_line.bound_x1; short animLineBoundY1 = anim_line.bound_y1; short animLineBoundX2 = anim_line.bound_x2; short animLineBoundY2 = anim_line.bound_y2; anim_line.bound_x1 = MAP_X1; anim_line.bound_y1 = MAP_Y1; anim_line.bound_x2 = MAP_X2; anim_line.bound_y2 = MAP_Y2; // #### begin Gilbert 29/1 ########// int showAttackerPath = nation_array.player_recno && god_res[GOD_JAPANESE]->nation_prayer_count(nation_array.player_recno); int playerNation = nation_array.player_recno; // #### end Gilbert 29/1 ########// for(i=1; i<=arraySize; i++) { register Unit *unitPtr = (Unit*)get_ptr(i); if( !unitPtr || !unitPtr->is_visible() || unitPtr->is_stealth() ) continue; int lineColor = TRANSPARENT_CODE; if( !unitPtr->selected_flag ) // if the unit is currently selected, ignore the filters { if( filterUnitClassId && unit_res[unitPtr->unit_id]->unit_class != filterUnitClassId ) continue; // draw only caravan in trade mode if( world.map_matrix->map_mode == MAP_MODE_TRADE && unitPtr->unit_id != UNIT_CARAVAN ) continue; // filter selected nation if( world.map_matrix->filter_nation_flag && world.map_matrix->filter_nation_recno != unitPtr->nation_recno ) continue; } //---------------- draw unit path in mini_map ------------// if( (config.show_unit_path & 2) && unitPtr->selected_flag && (config.show_ai_info || !playerNation || unitPtr->is_nation(playerNation)) && unitPtr->cur_action != SPRITE_IDLE) { if( unitPtr->mobile_type == UNIT_SEA ) lineColor = V_WHITE; else lineColor = V_BLACK; } // ------ show unit targeting our nation ----------// else if( showAttackerPath && unitPtr->cur_order.mode == UNIT_ATTACK && unitPtr->cur_action != SPRITE_ATTACK // if already attack, not need to show path && !base_obj_array.is_deleted(unitPtr->cur_order.para) && base_obj_array[unitPtr->cur_order.para]->nation_recno == playerNation ) { lineColor = VGA_RED; } if( lineColor != TRANSPARENT_CODE ) { //-----------------------------------------------------------// if(unitPtr->cur_x_loc()!=unitPtr->go_x_loc() || unitPtr->cur_y_loc()!=unitPtr->go_y_loc()) { lineToX = world.map_matrix->calc_loc_pos_x(unitPtr->go_x_loc(), unitPtr->go_y_loc()) + MAP_X1; lineToY = world.map_matrix->calc_loc_pos_y(unitPtr->go_x_loc(), unitPtr->go_y_loc()) + MAP_Y1; lineFromX = world.map_matrix->calc_loc_pos_x(unitPtr->next_x_loc(), unitPtr->next_y_loc()) + MAP_X1; lineFromY = world.map_matrix->calc_loc_pos_y(unitPtr->next_x_loc(), unitPtr->next_y_loc()) + MAP_Y1; vga_back.line(lineFromX, lineFromY, lineToX, lineToY, lineColor); } //-----------------------------------------------------------// if( unitPtr->cur_path && unitPtr->cur_path_result_id > 0 ) { int locFromX, locFromY, locToX, locToY; locFromX = unitPtr->go_x_loc(); locFromY = unitPtr->go_y_loc(); for( j=unitPtr->cur_path_result_id ; j>0 ; j-- ) { PathResult* pathResult = unitPtr->cur_path + j - 1; locToX = pathResult->loc_x; locToY = pathResult->loc_y; lineFromX = world.map_matrix->calc_loc_pos_x(locFromX, locFromY) + MAP_X1; lineFromY = world.map_matrix->calc_loc_pos_y(locFromX, locFromY) + MAP_Y1; lineToX = world.map_matrix->calc_loc_pos_x(locToX, locToY) + MAP_X1; lineToY = world.map_matrix->calc_loc_pos_y(locToX, locToY) + MAP_Y1; vga_back.line(lineFromX, lineFromY, lineToX, lineToY, lineColor); locFromX = locToX; locFromY = locToY; } } } } //---------------- restore boundary setting of anim_line --------------// anim_line.bound_x1 = animLineBoundX1; anim_line.bound_y1 = animLineBoundY1; anim_line.bound_x2 = animLineBoundX2; anim_line.bound_y2 = animLineBoundY2; for(i=1; i<=arraySize; i++) { // #### begin Gilbert 3/11 ######// int dotSize; { // minimize register variable at one time register Unit *unitPtr = (Unit*)get_ptr(i); if( !unitPtr || !unitPtr->is_visible() || unitPtr->is_stealth()) continue; if( !unitPtr->selected_flag ) // if the unit is currently selected, ignore the filters { // draw only caravan in trade mode if( world.map_matrix->map_mode == MAP_MODE_TRADE && unitPtr->unit_id != UNIT_CARAVAN ) continue; if( filterUnitClassId && unit_res[unitPtr->unit_id]->unit_class != filterUnitClassId ) continue; // filter selected nation if( world.map_matrix->filter_nation_flag && world.map_matrix->filter_nation_recno != unitPtr->nation_recno ) continue; } //---------------------------------// if( world.map_matrix->map_mode != MAP_MODE_TRADE ) { if( unitPtr->cur_action == SPRITE_ATTACK ) nationColor = excitedColorArray[unitPtr->nation_recno]; else if( unitPtr->selected_flag ) nationColor = slowExcitedColorArray[unitPtr->nation_recno]; else nationColor = nationColorArray[unitPtr->nation_recno]; } else { // if selected firm is mine, factory or market, // caravan linked to it flashes err_when( MAX_STOP_FOR_CARAVAN != 2 ); // current code check only two stops Firm *firmPtr; if( firm_array.selected_recno && (firmPtr = firm_array[firm_array.selected_recno]) && (firmPtr->cast_to_FirmMine() || firmPtr->cast_to_FirmFactory() || firmPtr->cast_to_FirmMarket()) && ( ((UnitCaravan *)unitPtr)->stop_array[0].firm_recno == firm_array.selected_recno || ((UnitCaravan *)unitPtr)->stop_array[1].firm_recno == firm_array.selected_recno) ) { nationColor = slowExcitedColorArray[unitPtr->nation_recno]; } else { nationColor = nationColorArray[unitPtr->nation_recno]; } } mapX = world.map_matrix->calc_loc_pos_x(unitPtr->cur_x_loc(), unitPtr->cur_y_loc()) + MAP_X1; mapY = world.map_matrix->calc_loc_pos_y(unitPtr->cur_x_loc(), unitPtr->cur_y_loc()) + MAP_Y1; dotSize = unitPtr->mobile_type == UNIT_LAND ? 2 : 3; } { // minimize register variable at one time register short *writePtr = vga_back.buf_ptr(mapX, mapY); if( dotSize == 2 ) { if( writePtr[0] != unexploredColor ) writePtr[0] = nationColor; if( writePtr[1] != unexploredColor ) writePtr[1] = nationColor; if( writePtr[vgaBufPitch] != unexploredColor ) writePtr[vgaBufPitch] = nationColor; if( writePtr[vgaBufPitch+1] != unexploredColor ) writePtr[vgaBufPitch+1] = nationColor; } else if( dotSize == 3 ) { if( writePtr[-vgaBufPitch-1] != unexploredColor ) writePtr[-vgaBufPitch-1] = nationColor; if( writePtr[-vgaBufPitch] != unexploredColor ) writePtr[-vgaBufPitch] = nationColor; if( writePtr[-vgaBufPitch+1] != unexploredColor ) writePtr[-vgaBufPitch+1] = nationColor; if( writePtr[-1] != unexploredColor ) writePtr[-1] = nationColor; if( writePtr[0] != unexploredColor ) writePtr[0] = nationColor; if( writePtr[1] != unexploredColor ) writePtr[1] = nationColor; if( writePtr[vgaBufPitch-1] != unexploredColor ) writePtr[vgaBufPitch-1] = nationColor; if( writePtr[vgaBufPitch] != unexploredColor ) writePtr[vgaBufPitch] = nationColor; if( writePtr[vgaBufPitch+1] != unexploredColor ) writePtr[vgaBufPitch+1] = nationColor; } } // #### end Gilbert 3/11 ######// } //end for }