// 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; location_t tmpLoc; //DATA ARRAYS: here's where you fill in the above arrays enadv[0]=AdvanceDB(ADVANCE_BRONZE_WORKING); OLD_UNIT_TYPE[0]=UnitDB(UNIT_SPEARMAN); NEW_UNIT_TYPE[0]=UnitDB(UNIT_HOPLITE); PER_UNIT_UPDATE_COST[0]=280; enadv[1]=AdvanceDB(ADVANCE_BARRACKS); OLD_UNIT_TYPE[1]=UnitDB(UNIT_WARRIOR); NEW_UNIT_TYPE[1]=UnitDB(UNIT_HYPASPISTS); PER_UNIT_UPDATE_COST[1]=40; enadv[2]=AdvanceDB(ADVANCE_IRON_WORKING); OLD_UNIT_TYPE[2]=UnitDB(UNIT_HYPASPISTS); NEW_UNIT_TYPE[2]=UnitDB(UNIT_LEGION); PER_UNIT_UPDATE_COST[2]=525; enadv[3]=AdvanceDB(ADVANCE_BANKING); OLD_UNIT_TYPE[3]=UnitDB(UNIT_LEGION); NEW_UNIT_TYPE[3]=UnitDB(UNIT_PIKEMEN); PER_UNIT_UPDATE_COST[3]=750; enadv[4]=AdvanceDB(ADVANCE_FLINTLOCK); OLD_UNIT_TYPE[4]=UnitDB(UNIT_PIKEMEN); NEW_UNIT_TYPE[4]=UnitDB(UNIT_ARQUEBUSIER); PER_UNIT_UPDATE_COST[4]=800; enadv[5]=AdvanceDB(ADVANCE_FLINTLOCK); OLD_UNIT_TYPE[5]=UnitDB(UNIT_MAN_AT_ARMS); NEW_UNIT_TYPE[5]=UnitDB(UNIT_ARQUEBUSIER); PER_UNIT_UPDATE_COST[5]=800; enadv[6]=AdvanceDB(ADVANCE_RAILROAD); OLD_UNIT_TYPE[6]=UnitDB(UNIT_ARQUEBUSIER); NEW_UNIT_TYPE[6]=UnitDB(UNIT_INFANTRYMAN); PER_UNIT_UPDATE_COST[6]=1100; enadv[7]=AdvanceDB(ADVANCE_MASS_PRODUCTION); OLD_UNIT_TYPE[7]=UnitDB(UNIT_INFANTRYMAN); NEW_UNIT_TYPE[7]=UnitDB(UNIT_MACHINE_GUNNER); PER_UNIT_UPDATE_COST[7]=1400; enadv[8]=AdvanceDB(ADVANCE_CHAOS_THEORY); OLD_UNIT_TYPE[8]=UnitDB(UNIT_MACHINE_GUNNER); NEW_UNIT_TYPE[8]=UnitDB(UNIT_HOVER_INFANTRY); PER_UNIT_UPDATE_COST[8]=2800; enadv[9]=AdvanceDB(ADVANCE_HORSE_ARMOR); OLD_UNIT_TYPE[9]=UnitDB(UNIT_JAVELIN_CAVALRY); NEW_UNIT_TYPE[9]=UnitDB(UNIT_HORSEMAN); PER_UNIT_UPDATE_COST[9]=650; enadv[10]=AdvanceDB(ADVANCE_STIRRUP); OLD_UNIT_TYPE[10]=UnitDB(UNIT_HORSEMAN); NEW_UNIT_TYPE[10]=UnitDB(UNIT_CATAPHRACT); PER_UNIT_UPDATE_COST[10]=800; enadv[11]=AdvanceDB(ADVANCE_CAVALRY_TACTICS); OLD_UNIT_TYPE[11]=UnitDB(UNIT_CATAPHRACT); NEW_UNIT_TYPE[11]=UnitDB(UNIT_CAVALRY); PER_UNIT_UPDATE_COST[11]=1400; enadv[12]=AdvanceDB(ADVANCE_CAVALRY_TACTICS); OLD_UNIT_TYPE[12]=UnitDB(UNIT_KNIGHT); NEW_UNIT_TYPE[12]=UnitDB(UNIT_CAVALRY); PER_UNIT_UPDATE_COST[12]=1400; enadv[13]=AdvanceDB(ADVANCE_SIEGE_WEAPONS); OLD_UNIT_TYPE[13]=UnitDB(UNIT_BELFROI); NEW_UNIT_TYPE[13]=UnitDB(UNIT_CATAPULT); PER_UNIT_UPDATE_COST[13]=800; enadv[14]=AdvanceDB(ADVANCE_GREEK_FIRE); OLD_UNIT_TYPE[14]=UnitDB(UNIT_CATAPULT); NEW_UNIT_TYPE[14]=UnitDB(UNIT_TREBUCHET); PER_UNIT_UPDATE_COST[14]=1000; enadv[15]=AdvanceDB(ADVANCE_EXPLOSIVES); OLD_UNIT_TYPE[15]=UnitDB(UNIT_CANNON); NEW_UNIT_TYPE[15]=UnitDB(UNIT_ARTILLERY); PER_UNIT_UPDATE_COST[15]=1700; enadv[16]=AdvanceDB(ADVANCE_HULL_MAKING); OLD_UNIT_TYPE[16]=UnitDB(UNIT_CORACLE); NEW_UNIT_TYPE[16]=UnitDB(UNIT_LONGSHIP); PER_UNIT_UPDATE_COST[16]=650; enadv[17]=AdvanceDB(ADVANCE_GREEK_FIRE); OLD_UNIT_TYPE[17]=UnitDB(UNIT_TRIREME); NEW_UNIT_TYPE[17]=UnitDB(UNIT_DROMON); PER_UNIT_UPDATE_COST[17]=800; enadv[18]=AdvanceDB(ADVANCE_GREEK_FIRE); OLD_UNIT_TYPE[18]=UnitDB(UNIT_HEPTIREME); NEW_UNIT_TYPE[18]=UnitDB(UNIT_DROMON); PER_UNIT_UPDATE_COST[18]=800; enadv[19]=AdvanceDB(ADVANCE_MASS_PRODUCTION); OLD_UNIT_TYPE[19]=UnitDB(UNIT_IRONCLAD); NEW_UNIT_TYPE[19]=UnitDB(UNIT_FRIGATE);// PT BOAT PER_UNIT_UPDATE_COST[19]=1700; enadv[20]=AdvanceDB(ADVANCE_PLASMA_WEAPONRY); OLD_UNIT_TYPE[20]=UnitDB(UNIT_BATTLESHIP); NEW_UNIT_TYPE[20]=UnitDB(UNIT_PLASMA_DESTROYER); PER_UNIT_UPDATE_COST[20]=5200; enadv[21]=AdvanceDB(ADVANCE_SMART_MATERIALS); OLD_UNIT_TYPE[21]=UnitDB(UNIT_PLASMA_DESTROYER); NEW_UNIT_TYPE[21]=UnitDB(UNIT_DREADNAUGHT); PER_UNIT_UPDATE_COST[21]=7000; enadv[22]=AdvanceDB(ADVANCE_NUCLEAR_POWER); OLD_UNIT_TYPE[22]=UnitDB(UNIT_SUBMARINE); NEW_UNIT_TYPE[22]=UnitDB(UNIT_NUCLEAR_SUBMARINE); PER_UNIT_UPDATE_COST[22]=2200; enadv[23]=AdvanceDB(ADVANCE_SUPERSONIC_FLIGHT); OLD_UNIT_TYPE[23]=UnitDB(UNIT_FIGHTER); NEW_UNIT_TYPE[23]=UnitDB(UNIT_INTERCEPTOR); PER_UNIT_UPDATE_COST[23]=2900; enadv[24]=AdvanceDB(ADVANCE_ADVANCED_COMPOSITES); OLD_UNIT_TYPE[24]=UnitDB(UNIT_INTERCEPTOR); NEW_UNIT_TYPE[24]=UnitDB(UNIT_STEALTH_FIGHTER); PER_UNIT_UPDATE_COST[24]=3300; enadv[25]=AdvanceDB(ADVANCE_ADVANCED_COMPOSITES); OLD_UNIT_TYPE[25]=UnitDB(UNIT_BOMBER); NEW_UNIT_TYPE[25]=UnitDB(UNIT_STEALTH_BOMBER); PER_UNIT_UPDATE_COST[25]=4000; enadv[26]=AdvanceDB(ADVANCE_BRONZE_WORKING); OLD_UNIT_TYPE[26]=UnitDB(UNIT_SPEARMAN_MILITIA); NEW_UNIT_TYPE[26]=UnitDB(UNIT_HOPLITE_MILITIA); PER_UNIT_UPDATE_COST[26]=280; enadv[27]=AdvanceDB(ADVANCE_IRON_WORKING); OLD_UNIT_TYPE[27]=UnitDB(UNIT_HOPLITE_MILITIA); NEW_UNIT_TYPE[27]=UnitDB(UNIT_LEGION_MILITIA); PER_UNIT_UPDATE_COST[27]=525; enadv[28]=AdvanceDB(ADVANCE_DARK_AGES); OLD_UNIT_TYPE[28]=UnitDB(UNIT_LEGION_MILITIA); NEW_UNIT_TYPE[28]=UnitDB(UNIT_MAN_AT_ARMS_MILITIA); PER_UNIT_UPDATE_COST[28]=620; enadv[29]=AdvanceDB(ADVANCE_RAILROAD); OLD_UNIT_TYPE[29]=UnitDB(UNIT_MAN_AT_ARMS_MILITIA); NEW_UNIT_TYPE[29]=UnitDB(UNIT_INFANTRYMAN_MILITIA); PER_UNIT_UPDATE_COST[29]=1100; enadv[30]=AdvanceDB(ADVANCE_MASS_PRODUCTION); OLD_UNIT_TYPE[30]=UnitDB(UNIT_INFANTRYMAN_MILITIA); NEW_UNIT_TYPE[30]=UnitDB(UNIT_MACHINE_GUNNER_MILITIA); PER_UNIT_UPDATE_COST[30]=1400; enadv[31]=AdvanceDB(ADVANCE_ARCHERY); OLD_UNIT_TYPE[31]=UnitDB(UNIT_SLINGER); NEW_UNIT_TYPE[31]=UnitDB(UNIT_ARCHER); PER_UNIT_UPDATE_COST[31]=400; enadv[32]=AdvanceDB(ADVANCE_CROSSBOW); OLD_UNIT_TYPE[32]=UnitDB(UNIT_COMPOSITE_ARCHER); NEW_UNIT_TYPE[32]=UnitDB(UNIT_CROSSBOWMAN); PER_UNIT_UPDATE_COST[32]=800; enadv[33]=AdvanceDB(ADVANCE_CROSSBOW); OLD_UNIT_TYPE[33]=UnitDB(UNIT_ARCHER); NEW_UNIT_TYPE[33]=UnitDB(UNIT_CROSSBOWMAN); PER_UNIT_UPDATE_COST[33]=800; enadv[34]=AdvanceDB(ADVANCE_IRON_WORKING); OLD_UNIT_TYPE[34]=UnitDB(UNIT_HOPLITE); NEW_UNIT_TYPE[34]=UnitDB(UNIT_LEGION); PER_UNIT_UPDATE_COST[34]=525; enadv[35]=AdvanceDB(ADVANCE_RAILROAD); OLD_UNIT_TYPE[35]=UnitDB(UNIT_CROSSBOWMAN); NEW_UNIT_TYPE[35]=UnitDB(UNIT_INFANTRYMAN); PER_UNIT_UPDATE_COST[35]=1100; // Templates for adding more data: //enadv[]=AdvanceDB(ADVANCE_); //OLD_UNIT_TYPE[]=UnitDB(UNIT_); //NEW_UNIT_TYPE[]=UnitDB(UNIT_); //PER_UNIT_UPDATE_COST[]= ; //enadv[]=AdvanceDB(ADVANCE_); //OLD_UNIT_TYPE[]=UnitDB(UNIT_); //NEW_UNIT_TYPE[]=UnitDB(UNIT_); //PER_UNIT_UPDATE_COST[]=; // 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; } } } } if (NUM_OBS_UNITS) { 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]) && NUM_OBS_UNITS >1 ){ message(player[0], 'ObsUnitsCostOK'); } else { message(player[0], 'ObsUnitsCostNotEnoughGold'); } } } messagebox 'ObsUnitsCostOKand1unit' { army_t tmpArmy; location_t tmpLoc; // 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){ tmpLoc=OBS_UNIT_ARRAY[0].location; Event:DisbandUnit(OBS_UNIT_ARRAY[0]); CreateUnit(player[0],NEW_UNIT_TYPE[UPDATE_TYPES_ARRAY[UPDATE_TYPES_INDEX]],tmpLoc,0); AddGold(player[0], -TOTAL_COST); Kill(); UPDATE_TYPES_INDEX=UPDATE_TYPES_INDEX+1; if (UPDATE_TYPES_INDEX