// Unit Updater Globals int_t UPDATE_TYPES_ARRAY[]; // an array of types of obsolete units that we find int_t NUM_UPDATE_TYPES; // the number of types in UPDATE_TYPES_ARRAY[] int_t UPDATE_TYPES_INDEX;// an index for UPDATE_TYPES_ARRAY unit_t OBS_UNIT_ARRAY[];//an array of obsolete units that we find int_t NUM_OBS_UNITS;// the number of units in OBS_UNIT_ARRAY[], used in messages int_t OBS_UNIT_INDEX;// an index for OBS_UNIT_ARRAY int_t OLD_UNIT_TYPE[];// the UnitDB index of the unit that's become obsolete int_t NEW_UNIT_TYPE[];// the UnitDB index of the unit that's become available int_t PER_UNIT_UPDATE_COST[];// How much it costs to update a unit of type OLD_UNIT_TYPE // to a unit of NEW_UNIT_TYPE[] int_t TOTAL_COST;// Total Cost of updating a bunch of units of some given type //////// //CODE HandleEvent(GrantAdvance)'UnitUpdater' post { int_t theAdvance; int_t i; int_t j; int_t k; int_t enadv[]; // the AdvanceDB index of the enabling advance army_t tmpArmy; unit_t tmpUnit; city_t tmpCity; //DATA ARRAYS: here's where you fill in the above arrays enadv[0]=AdvanceDB(ADVANCE_INFANTRY_TACTICS); OLD_UNIT_TYPE[0]=UnitDB(UNIT_SPEARMAN); NEW_UNIT_TYPE[0]=UnitDB(UNIT_PHALANX); PER_UNIT_UPDATE_COST[0]=30; enadv[1]=AdvanceDB(ADVANCE_STIRRUP); OLD_UNIT_TYPE[1]=UnitDB(UNIT_WARRIOR); NEW_UNIT_TYPE[1]=UnitDB(UNIT_PHALANX); PER_UNIT_UPDATE_COST[1]=40; enadv[3]=AdvanceDB(ADVANCE_BANKING); OLD_UNIT_TYPE[3]=UnitDB(UNIT_HEAVY_SWORDSMAN); NEW_UNIT_TYPE[3]=UnitDB(UNIT_PIKEMEN); PER_UNIT_UPDATE_COST[3]=75; enadv[4]=AdvanceDB(ADVANCE_FLINTLOCK); OLD_UNIT_TYPE[4]=UnitDB(UNIT_FYRDMAN); NEW_UNIT_TYPE[4]=UnitDB(UNIT_MUSKETEER); PER_UNIT_UPDATE_COST[4]=80; enadv[6]=AdvanceDB(ADVANCE_CONSCRIPTION); OLD_UNIT_TYPE[6]=UnitDB(UNIT_PIKEMEN); NEW_UNIT_TYPE[6]=UnitDB(UNIT_INFANTRYMAN); PER_UNIT_UPDATE_COST[6]=90; enadv[7]=AdvanceDB(ADVANCE_CYBERNETICS); OLD_UNIT_TYPE[7]=UnitDB(UNIT_MACHINE_GUNNER); NEW_UNIT_TYPE[7]=UnitDB(UNIT_PLASMATICA); PER_UNIT_UPDATE_COST[7]=280; enadv[8]=AdvanceDB(ADVANCE_REPEATING_RIFLES); OLD_UNIT_TYPE[8]=UnitDB(UNIT_MUSKETEER); NEW_UNIT_TYPE[8]=UnitDB(UNIT_RIFLEMAN); PER_UNIT_UPDATE_COST[8]=100; enadv[9]=AdvanceDB(ADVANCE_AUTOMATIC_RIFLES); OLD_UNIT_TYPE[9]=UnitDB(UNIT_RIFLEMAN); NEW_UNIT_TYPE[9]=UnitDB(UNIT_MACHINE_GUNNER); PER_UNIT_UPDATE_COST[9]=120; enadv[10]=AdvanceDB(ADVANCE_FLINTLOCK); OLD_UNIT_TYPE[10]=UnitDB(UNIT_KNIGHT); NEW_UNIT_TYPE[10]=UnitDB(UNIT_CAVALRY); PER_UNIT_UPDATE_COST[10]=100; enadv[11]=AdvanceDB(ADVANCE_THEOLOGY); OLD_UNIT_TYPE[11]=UnitDB(UNIT_PHALANX); NEW_UNIT_TYPE[11]=UnitDB(UNIT_FYRDMAN); PER_UNIT_UPDATE_COST[11]=60; enadv[12]=AdvanceDB(ADVANCE_GEOMETRY); OLD_UNIT_TYPE[12]=UnitDB(UNIT_ARCHER); NEW_UNIT_TYPE[12]=UnitDB(UNIT_CATAPULT); PER_UNIT_UPDATE_COST[12]=70; enadv[14]=AdvanceDB(ADVANCE_EXPLOSIVES); OLD_UNIT_TYPE[14]=UnitDB(UNIT_CULVERIN); NEW_UNIT_TYPE[14]=UnitDB(UNIT_ANTIAIR); PER_UNIT_UPDATE_COST[14]=140; enadv[16]=AdvanceDB(ADVANCE_TANK_WARFARE); OLD_UNIT_TYPE[16]=UnitDB(UNIT_INFANTRYMAN); NEW_UNIT_TYPE[16]=UnitDB(UNIT_FASCIST); PER_UNIT_UPDATE_COST[16]=140; enadv[17]=AdvanceDB(ADVANCE_DEEP_BATTLE_TACTICS); OLD_UNIT_TYPE[17]=UnitDB(UNIT_MARINE); NEW_UNIT_TYPE[17]=UnitDB(UNIT_PARATROOPER); PER_UNIT_UPDATE_COST[17]=170; enadv[18]=AdvanceDB(ADVANCE_INTERNAL_COMBUSTION); OLD_UNIT_TYPE[18]=UnitDB(UNIT_MONITOR); NEW_UNIT_TYPE[18]=UnitDB(UNIT_PT_BOAT);// PT BOAT PER_UNIT_UPDATE_COST[18]=100; enadv[19]=AdvanceDB(ADVANCE_PLASMA_WEAPONRY); OLD_UNIT_TYPE[19]=UnitDB(UNIT_MISSILE_CRUISER); NEW_UNIT_TYPE[19]=UnitDB(UNIT_PLASMA_DESTROYER); PER_UNIT_UPDATE_COST[19]=380; enadv[20]=AdvanceDB(ADVANCE_CHAOS_THEORY); OLD_UNIT_TYPE[20]=UnitDB(UNIT_MECHANIZED_INFANTRY); NEW_UNIT_TYPE[20]=UnitDB(UNIT_HOVER_INFANTRY); PER_UNIT_UPDATE_COST[20]=350; enadv[21]=AdvanceDB(ADVANCE_ELECTRONICS); OLD_UNIT_TYPE[21]=UnitDB(UNIT_SUBMARINE); NEW_UNIT_TYPE[21]=UnitDB(UNIT_NUCLEAR_SUBMARINE); PER_UNIT_UPDATE_COST[21]=200; enadv[22]=AdvanceDB(ADVANCE_SUPERSONIC_FLIGHT); OLD_UNIT_TYPE[22]=UnitDB(UNIT_BRITISH_FIGHTER); NEW_UNIT_TYPE[22]=UnitDB(UNIT_INTERCEPTOR); PER_UNIT_UPDATE_COST[22]=220; enadv[23]=AdvanceDB(ADVANCE_THERMAL_IMAGING); OLD_UNIT_TYPE[23]=UnitDB(UNIT_INTERCEPTOR); NEW_UNIT_TYPE[23]=UnitDB(UNIT_STEALTH_FIGHTER); PER_UNIT_UPDATE_COST[23]=350; enadv[24]=AdvanceDB(ADVANCE_THERMAL_IMAGING); OLD_UNIT_TYPE[24]=UnitDB(UNIT_JET_BOMBER); NEW_UNIT_TYPE[24]=UnitDB(UNIT_STEALTH_BOMBER); PER_UNIT_UPDATE_COST[24]=420; enadv[25]=AdvanceDB(ADVANCE_AUTOMOBILE); OLD_UNIT_TYPE[25]=UnitDB(UNIT_CAVALRY); NEW_UNIT_TYPE[25]=UnitDB(UNIT_GERMAN_TANK2); PER_UNIT_UPDATE_COST[25]=160; enadv[26]=AdvanceDB(ADVANCE_IRON_WORKING); OLD_UNIT_TYPE[26]=UnitDB(UNIT_SWORDSMAN); NEW_UNIT_TYPE[26]=UnitDB(UNIT_HEAVY_SWORDSMAN); PER_UNIT_UPDATE_COST[26]=50; enadv[27]=AdvanceDB(ADVANCE_STIRRUP); OLD_UNIT_TYPE[27]=UnitDB(UNIT_CHARIOT); NEW_UNIT_TYPE[27]=UnitDB(UNIT_HEAVY_CAVALRY); PER_UNIT_UPDATE_COST[27]=60; enadv[28]=AdvanceDB(ADVANCE_FEUDALISM); OLD_UNIT_TYPE[28]=UnitDB(UNIT_HEAVY_CAVALRY); NEW_UNIT_TYPE[28]=UnitDB(UNIT_KNIGHT); PER_UNIT_UPDATE_COST[28]=70; enadv[29]=AdvanceDB(ADVANCE_TANK_WARFARE); OLD_UNIT_TYPE[29]=UnitDB(UNIT_CANNON); NEW_UNIT_TYPE[29]=UnitDB(UNIT_SELF_PROP_GUN); PER_UNIT_UPDATE_COST[29]=140; enadv[30]=AdvanceDB(ADVANCE_INTEGRATED_MOBILE_WARFARE); OLD_UNIT_TYPE[30]=UnitDB(UNIT_GERMAN_TANK2); NEW_UNIT_TYPE[30]=UnitDB(UNIT_TANK); PER_UNIT_UPDATE_COST[30]=150; enadv[31]=AdvanceDB(ADVANCE_MECHANICAL_POWER); OLD_UNIT_TYPE[31]=UnitDB(UNIT_CATAPULT); NEW_UNIT_TYPE[31]=UnitDB(UNIT_SIEGE_ENGINE); PER_UNIT_UPDATE_COST[31]=80; enadv[32]=AdvanceDB(ADVANCE_CANNON_MAKING); OLD_UNIT_TYPE[32]=UnitDB(UNIT_SIEGE_ENGINE); NEW_UNIT_TYPE[32]=UnitDB(UNIT_CULVERIN); PER_UNIT_UPDATE_COST[32]=90; enadv[33]=AdvanceDB(ADVANCE_FUSION); OLD_UNIT_TYPE[33]=UnitDB(UNIT_TANK); NEW_UNIT_TYPE[33]=UnitDB(UNIT_HOVERTANK); PER_UNIT_UPDATE_COST[33]=300; enadv[34]=AdvanceDB(ADVANCE_INTEGRATED_MOBILE_WARFARE); OLD_UNIT_TYPE[34]=UnitDB(UNIT_SELF_PROP_GUN); NEW_UNIT_TYPE[34]=UnitDB(UNIT_WAR_WALKER); PER_UNIT_UPDATE_COST[34]=180; enadv[35]=AdvanceDB(ADVANCE_ROBOTICS); OLD_UNIT_TYPE[35]=UnitDB(UNIT_ANTIAIR); NEW_UNIT_TYPE[35]=UnitDB(UNIT_HOWITZER); PER_UNIT_UPDATE_COST[35]=140; enadv[36]=AdvanceDB(ADVANCE_NANO_MACHINES); OLD_UNIT_TYPE[36]=UnitDB(UNIT_HOWITZER); NEW_UNIT_TYPE[36]=UnitDB(UNIT_AT_ARTILLERY); PER_UNIT_UPDATE_COST[36]=270; enadv[37]=AdvanceDB(ADVANCE_PLASMA_WEAPONRY); OLD_UNIT_TYPE[37]=UnitDB(UNIT_WAR_WALKER); NEW_UNIT_TYPE[37]=UnitDB(UNIT_FUSION_TANK); PER_UNIT_UPDATE_COST[37]=350; enadv[38]=AdvanceDB(ADVANCE_COMPASS); OLD_UNIT_TYPE[38]=UnitDB(UNIT_CORACLE); NEW_UNIT_TYPE[38]=UnitDB(UNIT_COG); PER_UNIT_UPDATE_COST[38]=50; enadv[39]=AdvanceDB(ADVANCE_OCEAN_FARING); OLD_UNIT_TYPE[39]=UnitDB(UNIT_COG); NEW_UNIT_TYPE[39]=UnitDB(UNIT_CARRACK); PER_UNIT_UPDATE_COST[39]=70; enadv[40]=AdvanceDB(ADVANCE_NAVAL_TACTICS); OLD_UNIT_TYPE[40]=UnitDB(UNIT_CARRACK); NEW_UNIT_TYPE[40]=UnitDB(UNIT_SHIP_OF_THE_LINE); PER_UNIT_UPDATE_COST[40]=100; enadv[41]=AdvanceDB(ADVANCE_STEAM_ENGINE); OLD_UNIT_TYPE[41]=UnitDB(UNIT_SHIP_OF_THE_LINE); NEW_UNIT_TYPE[41]=UnitDB(UNIT_IRONCLAD); PER_UNIT_UPDATE_COST[41]=130; enadv[42]=AdvanceDB(ADVANCE_MASS_PRODUCTION); OLD_UNIT_TYPE[42]=UnitDB(UNIT_IRONCLAD); NEW_UNIT_TYPE[42]=UnitDB(UNIT_DESTROYER); PER_UNIT_UPDATE_COST[42]=160; enadv[43]=AdvanceDB(ADVANCE_STEEL); OLD_UNIT_TYPE[43]=UnitDB(UNIT_PRIVATEER); NEW_UNIT_TYPE[43]=UnitDB(UNIT_TROOP_SHIP); PER_UNIT_UPDATE_COST[43]=110; enadv[44]=AdvanceDB(ADVANCE_ADVANCED_COMPOSITES); OLD_UNIT_TYPE[44]=UnitDB(UNIT_DESTROYER); NEW_UNIT_TYPE[44]=UnitDB(UNIT_MISSILE_CRUISER); PER_UNIT_UPDATE_COST[44]=300; enadv[45]=AdvanceDB(ADVANCE_ULTRAPRESSURE_MACHINERY); OLD_UNIT_TYPE[45]=UnitDB(UNIT_BATTLESHIP); NEW_UNIT_TYPE[45]=UnitDB(UNIT_KRAKEN); PER_UNIT_UPDATE_COST[45]=500; enadv[46]=AdvanceDB(ADVANCE_SMART_MATERIALS); OLD_UNIT_TYPE[46]=UnitDB(UNIT_KRAKEN); NEW_UNIT_TYPE[46]=UnitDB(UNIT_DREADNAUGHT); PER_UNIT_UPDATE_COST[46]=650; enadv[47]=AdvanceDB(ADVANCE_HIGH_PRES_CONSTRUCTION); OLD_UNIT_TYPE[47]=UnitDB(UNIT_NUCLEAR_SUBMARINE); NEW_UNIT_TYPE[47]=UnitDB(UNIT_SCOUT_SUB); PER_UNIT_UPDATE_COST[47]=270; enadv[48]=AdvanceDB(ADVANCE_DEEP_BATTLE_TACTICS); OLD_UNIT_TYPE[48]=UnitDB(UNIT_DIVE_BOMBER); NEW_UNIT_TYPE[48]=UnitDB(UNIT_ATTACK_HELICOPTER); PER_UNIT_UPDATE_COST[48]=200; enadv[49]=AdvanceDB(ADVANCE_JET_PROPULSION); OLD_UNIT_TYPE[49]=UnitDB(UNIT_BOMBER); NEW_UNIT_TYPE[49]=UnitDB(UNIT_JET_BOMBER); PER_UNIT_UPDATE_COST[49]=250; // CODE theAdvance=value[0]; if(UPDATE_TYPES_ARRAY.#>0){ // re-initialize UPDATE_TYPES_ARRAY for (k=0; k 0) {// re-initialize OBS_UNIT_ARRAY for(k = 0; k < OBS_UNIT_ARRAY.#; k = k + 1) { OBS_UNIT_ARRAY[k] = 0; } } //find all of the player's (obsolete) units of type OLD_UNIT_TYPE[i] // and put them in an array NUM_OBS_UNITS=0; for(j = 0; j < player[0].armies; j = j + 1) { GetArmyByIndex(player[0], j, tmpArmy); for(k = 0; k < tmpArmy.size; k = k + 1) { if(GetUnitFromArmy(tmpArmy, k, tmpUnit)) { if(tmpUnit.type == OLD_UNIT_TYPE[i]) { OBS_UNIT_ARRAY[NUM_OBS_UNITS] = tmpUnit; NUM_OBS_UNITS = NUM_OBS_UNITS + 1; } } } } // now check and update all buildqueues for(k=0; k0) { message(player[0], 'FoundObsUnits'); } } messagebox 'FoundObsUnits' { int_t k; // now we've got to do it all over again, //this time giving the human player choices Show(); Text (ID_MObsUnitsFirst) ; // Great news, Sire! Our recent discovery will allow us to re-train and re-equip some of //our military units. We have already switched production to the new units but we have some // old units in use. Shall I proceed? Button(ID_NO){ Kill(); } Button(ID_YES){// base clause for obsolete unit TYPES Kill(); UPDATE_TYPES_INDEX=0; message(player[0], 'ObsUnitsTypesNext'); } } messagebox 'ObsUnitsTypesNext' { int_t k; int_t j; army_t tmpArmy; unit_t tmpUnit; Abort(); if(OBS_UNIT_ARRAY.# > 0) {// re-initialize OBS_UNIT_ARRAY for(k = 0; k < OBS_UNIT_ARRAY.#; k = k + 1) { OBS_UNIT_ARRAY[k] = 0; } } //find all of the player's obsolete units of type // OLD_UNIT_TYPE[UPDATE_TYPES_ARRAY[UPDATE_TYPES_INDEX]] and put them in an array NUM_OBS_UNITS=0; for(j = 0; j < player[0].armies; j = j + 1) { GetArmyByIndex(player[0], j, tmpArmy); for(k = 0; k < tmpArmy.size; k = k + 1) { if(GetUnitFromArmy(tmpArmy, k, tmpUnit)) { if(tmpUnit.type == OLD_UNIT_TYPE[UPDATE_TYPES_ARRAY[UPDATE_TYPES_INDEX]]) { OBS_UNIT_ARRAY[NUM_OBS_UNITS] = tmpUnit; NUM_OBS_UNITS = NUM_OBS_UNITS + 1; } } } } TOTAL_COST=((NUM_OBS_UNITS)*PER_UNIT_UPDATE_COST[UPDATE_TYPES_ARRAY[UPDATE_TYPES_INDEX]]); if (TOTAL_COST <= PlayerGold(player[0]) && (NUM_OBS_UNITS ==1) ){ //special case: slightly different message and text message(player[0], 'ObsUnitsCostOKand1unit'); } elseif (TOTAL_COST <= PlayerGold(player[0]) && (OBS_UNIT_ARRAY.# >1) ){ message(player[0], 'ObsUnitsCostOK'); } else { message(player[0], 'ObsUnitsCostNotEnoughGold'); } } messagebox 'ObsUnitsCostOKand1unit' { army_t tmpArmy; // if it's in an army, get it out first if (GetArmyFromUnit(OBS_UNIT_ARRAY[0],tmpArmy) ){ Event:UngroupOrder(tmpArmy); } SelectUnit(OBS_UNIT_ARRAY[0]); AddCenter(OBS_UNIT_ARRAY[0].location); Text (ID_MObsUnitsCostOKand1unit) ; // We have {NUM_OBS_UNITS} {OBS_UNIT_ARRAY[0].name} unit who is pleading for //more modern equipment. It will cost {TOTAL_COST} gold to provide them with it and we have enough gold in // the treasury. Shall we re-train and re-equip them? Button(ID_YES){ CreateUnit(player[0],NEW_UNIT_TYPE[UPDATE_TYPES_ARRAY[UPDATE_TYPES_INDEX]],OBS_UNIT_ARRAY[0].location,0); Event:DisbandUnit(OBS_UNIT_ARRAY[0]); AddGold(player[0], -TOTAL_COST); Kill(); UPDATE_TYPES_INDEX=UPDATE_TYPES_INDEX+1; if (UPDATE_TYPES_INDEX