'use strict';var Micro={speedPowerScan:[2,4,5],speedPollutionTerrainLandValueScan:[2,7,17],speedCrimeScan:[1,8,18],speedPopulationDensityScan:[1,9,19],speedFireAnalysis:[1,10,20],CENSUS_FREQUENCY_10:4};Micro.CENSUS_FREQUENCY_120=10*Micro.CENSUS_FREQUENCY_10;Micro.TAX_FREQUENCY=48;Micro.MAP_WIDTH=128;Micro.MAP_HEIGHT=128;Micro.MAP_DEFAULT_WIDTH=3*Micro.MAP_WIDTH;Micro.MAP_DEFAULT_HEIGHT=3*Micro.MAP_HEIGHT;Micro.MAP_BIG_DEFAULT_WIDTH=16*Micro.MAP_WIDTH;Micro.MAP_BIG_DEFAULT_HEIGHT=16*Micro.MAP_HEIGHT; Micro.MAP_BIG_DEFAULT_ID="bigMap";Micro.MAP_PARENT_ID="splashContainer";Micro.MAP_DEFAULT_ID="SplashCanvas";Micro.DEFAULT_WIDTH=400;Micro.DEFAULT_HEIGHT=400;Micro.DEFAULT_ID="MicropolisCanvas";Micro.RCI_DEFAULT_ID="RCICanvas";Micro.arrs="res com ind crime money pollution".split(" ");var M_ARRAY_TYPE;M_ARRAY_TYPE||(M_ARRAY_TYPE="undefined"!==typeof Float32Array?Float32Array:Array);Micro.clamp=function(a,b,c){return ac?c:a}; Micro.makeConstantDescriptor=function(a){return{configurable:!1,enumerable:!1,writeable:!1,value:a}};Micro.rotate10Arrays=function(){for(var a=0;aarguments.length)throw new TypeError;if(a==this.INVALID)return a;b||0===b||(b=1);return a+b},increment90:function(a){if(1>arguments.length)throw new TypeError;return this.increment45(a,2)},rotate45:function(a,b){if(1>arguments.length)throw new TypeError;if(a==this.INVALID)return a;b||0===b||(b=1);return(a-this.NORTH+ b&7)+this.NORTH},rotate90:function(a){if(1>arguments.length)throw new TypeError;return this.rotate45(a,2)},rotate180:function(a){if(1>arguments.length)throw new TypeError;return this.rotate45(a,4)}};var Direction=new Micro.Direction;var messageData={AUTOBUDGET_CHANGED:Micro.makeConstantDescriptor("Autobudget changed"),BUDGET_NEEDED:Micro.makeConstantDescriptor("User needs to budget"),BLACKOUTS_REPORTED:Micro.makeConstantDescriptor("Blackouts reported"),DATE_UPDATED:Micro.makeConstantDescriptor("Date changed"),DID_TOOL:Micro.makeConstantDescriptor("Tool applied"),EARTHQUAKE:Micro.makeConstantDescriptor("Earthquake"),EXPLOSION_REPORTED:Micro.makeConstantDescriptor("Explosion Reported"),EVAL_UPDATED:Micro.makeConstantDescriptor("Evaluation Updated"), FIRE_REPORTED:Micro.makeConstantDescriptor("Fire!"),FIRE_STATION_NEEDS_FUNDING:Micro.makeConstantDescriptor("Fire station needs funding"),FLOODING_REPORTED:Micro.makeConstantDescriptor("Flooding reported"),FUNDS_CHANGED:Micro.makeConstantDescriptor("Total funds has changed"),HEAVY_TRAFFIC:Micro.makeConstantDescriptor("Total funds has changed"),HELICOPTER_CRASHED:Micro.makeConstantDescriptor("Helicopter crashed"),HIGH_CRIME:Micro.makeConstantDescriptor("High crime"),HIGH_POLLUTION:Micro.makeConstantDescriptor("High pollution"), MONSTER_SIGHTED:Micro.makeConstantDescriptor("Monster sighted"),NEED_ELECTRICITY:Micro.makeConstantDescriptor("More power needed"),NEED_FIRE_STATION:Micro.makeConstantDescriptor("Fire station needed"),NEED_MORE_COMMERCIAL:Micro.makeConstantDescriptor("More commercial zones needed"),NEED_MORE_INDUSTRIAL:Micro.makeConstantDescriptor("More industrial zones needed"),NEED_MORE_RESIDENTIAL:Micro.makeConstantDescriptor("More residential needed"),NEED_MORE_RAILS:Micro.makeConstantDescriptor("More railways needed"), NEED_MORE_ROADS:Micro.makeConstantDescriptor("More roads needed"),NEED_POLICE_STATION:Micro.makeConstantDescriptor("Police station needed"),NEED_AIRPORT:Micro.makeConstantDescriptor("Airport needed"),NEED_SEAPORT:Micro.makeConstantDescriptor("Seaport needed"),NEED_STADIUM:Micro.makeConstantDescriptor("Stadium needed"),NO_MONEY:Micro.makeConstantDescriptor("No money"),NOT_ENOUGH_POWER:Micro.makeConstantDescriptor("Not enough power"),NUCLEAR_MELTDOWN:Micro.makeConstantDescriptor("Nuclear Meltdown"), PLANE_CRASHED:Micro.makeConstantDescriptor("Plane crashed"),POLICE_NEEDS_FUNDING:Micro.makeConstantDescriptor("Police need funding"),QUERY_WINDOW_NEEDED:Micro.makeConstantDescriptor("Query window needed"),REACHED_CAPITAL:Micro.makeConstantDescriptor("Now a capital"),REACHED_CITY:Micro.makeConstantDescriptor("Now a city"),REACHED_METROPOLIS:Micro.makeConstantDescriptor("Now a metropolis"),REACHED_MEGALOPOLIS:Micro.makeConstantDescriptor("Now a megalopolis"),REACHED_TOWN:Micro.makeConstantDescriptor("Now a town"), REACHED_VILLAGE:Micro.makeConstantDescriptor("Now a village"),ROAD_NEEDS_FUNDING:Micro.makeConstantDescriptor("Roads need funding"),SHIP_CRASHED:Micro.makeConstantDescriptor("Shipwrecked"),SOUND_EXPLOSIONHIGH:Micro.makeConstantDescriptor("Explosion! Bang!"),SOUND_EXPLOSIONLOW:Micro.makeConstantDescriptor("Explosion! Bang!"),SOUND_HEAVY_TRAFFIC:Micro.makeConstantDescriptor("Heavy Traffic sound"),SOUND_HONKHONK:Micro.makeConstantDescriptor("HonkHonk sound"),SOUND_MONSTER:Micro.makeConstantDescriptor("Monster sound"), TAX_TOO_HIGH:Micro.makeConstantDescriptor("Tax too high"),TORNADO_SIGHTED:Micro.makeConstantDescriptor("Tornado sighted"),TRAFFIC_JAMS:Micro.makeConstantDescriptor("Traffic jams reported"),TRAIN_CRASHED:Micro.makeConstantDescriptor("Train crashed"),VALVES_UPDATED:Micro.makeConstantDescriptor("Valves updated"),WELCOME:Micro.makeConstantDescriptor("Welcome to 3D city"),WELCOMEBACK:Micro.makeConstantDescriptor("Welcome back to your 3D city")},Messages=Object.defineProperties({},messageData);Micro.MessageManager=function(){this.data=[]};Micro.MessageManager.prototype={constructor:Micro.MessageManager,sendMessage:function(a,b){this.data.push({message:a,data:b})},clear:function(){this.data=[]},getMessages:function(){return this.data.slice()}};Micro.Text=function(){var a={};a[""+Micro.LEVEL_EASY]="Easy";a[""+Micro.LEVEL_MED]="Medium";a[""+Micro.LEVEL_HARD]="Hard";var b={};b[Micro.CC_VILLAGE]="VILLAGE";b[Micro.CC_TOWN]="TOWN";b[Micro.CC_CITY]="CITY";b[Micro.CC_CAPITAL]="CAPITAL";b[Micro.CC_METROPOLIS]="METROPOLIS";b[Micro.CC_MEGALOPOLIS]="MEGALOPOLIS";var c={};c[Micro.CRIME]="Crime";c[Micro.POLLUTION]="Pollution";c[Micro.HOUSING]="Housing";c[Micro.TAXES]="Taxes";c[Micro.TRAFFIC]="Traffic";c[Micro.UNEMPLOYMENT]="Unemployment";c[Micro.FIRE]= "Fire";var d={};d[Messages.FIRE_STATION_NEEDS_FUNDING]="Fire departments need funding";d[Messages.NEED_AIRPORT]="Commerce requires an Airport";d[Messages.NEED_FIRE_STATION]="Citizens demand a Fire Department";d[Messages.NEED_ELECTRICITY]="Build a Power Plant";d[Messages.NEED_MORE_INDUSTRIAL]="More industrial zones needed";d[Messages.NEED_MORE_COMMERCIAL]="More commercial zones needed";d[Messages.NEED_MORE_RESIDENTIAL]="More residential zones needed";d[Messages.NEED_MORE_RAILS]="Inadequate rail system"; d[Messages.NEED_MORE_ROADS]="More roads required";d[Messages.NEED_POLICE_STATION]="Citizens demand a Police Department";d[Messages.NEED_SEAPORT]="Industry requires a Sea Port";d[Messages.NEED_STADIUM]="Residents demand a Stadium";d[Messages.ROAD_NEEDS_FUNDING]="Roads deteriorating, due to lack of funds";d[Messages.POLICE_NEEDS_FUNDING]="Police departments need funding";d[Messages.WELCOME]="Welcome to 3D City";d[Messages.WELCOMEBACK]="Welcome to 3D City";var e={};e[Messages.BLACKOUTS_REPORTED]="Brownouts, build another Power Plant"; e[Messages.COPTER_CRASHED]="A helicopter crashed ";e[Messages.EARTHQUAKE]="Major earthquake reported !!";e[Messages.EXPLOSION_REPORTED]="Explosion detected ";e[Messages.FLOODING_REPORTED]="Flooding reported !";e[Messages.FIRE_REPORTED]="Fire reported ";e[Messages.HEAVY_TRAFFIC]="Heavy Traffic reported";e[Messages.HIGH_CRIME]="Crime very high";e[Messages.HIGH_POLLUTION]="Pollution very high";e[Messages.MONSTER_SIGHTED]="A Monster has been sighted !";e[Messages.NO_MONEY]="YOUR CITY HAS GONE BROKE"; e[Messages.NOT_ENOUGH_POWER]="Blackouts reported. insufficient power capacity";e[Messages.NUCLEAR_MELTDOWN]="A Nuclear Meltdown has occurred !!";e[Messages.PLANE_CRASHED]="A plane has crashed ";e[Messages.SHIP_CRASHED]="Shipwreck reported ";e[Messages.TAX_TOO_HIGH]="Citizens upset. The tax rate is too high";e[Messages.TORNADO_SIGHTED]="Tornado reported !";e[Messages.TRAFFIC_JAMS]="Frequent traffic jams reported";e[Messages.TRAIN_CRASHED]="A train crashed ";return{badMessages:e,cityClass:b,crimeStrings:["Safe", "Light","Moderate","Dangerous"],densityStrings:["Low","Medium","High","Very High"],gameLevel:a,goodMessages:" {}",landValueStrings:["Slum","Lower Class","Middle Class","High"],months:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),neutralMessages:d,problems:c,pollutionStrings:["None","Moderate","Heavy","Very Heavy"],rateStrings:["Declining","Stable","Slow Growth","Fast Growth"],toolMessages:{noMoney:"Insufficient funds to build that",needsDoze:"Area must be bulldozed first"},zoneTypes:"Clear;Water;Trees;Rubble;Flood;Radioactive Waste;Fire;Road;Power;Rail;Residential;Commercial;Industrial;Seaport;Airport;Coal Power;Fire Department;Police Department;Stadium;Nuclear Power;Draw Bridge;Radar Dish;Fountain;Industrial;Steelers 38 Bears 3;Draw Bridge;Ur 238".split(";")}}; var TXT=new Micro.Text;Micro.CensusProps="resPop comPop indPop crimeRamp pollutionRamp landValueAverage pollutionAverage crimeAverage totalPop resHist10 resHist120 comHist10 comHist120 indHist10 indHist120 crimeHist10 crimeHist120 moneyHist10 moneyHist120 pollutionHist10 pollutionHist120".split(" "); Micro.Census=function(){this.clearCensus();this.changed=!1;for(var a=this.totalPop=this.crimeAverage=this.pollutionAverage=this.landValueAverage=this.pollutionRamp=this.crimeRamp=0;athis.resPopScaled?this.needHospital=-1:this.hospitalPop===this.resPopScaled&&(this.needHospital=0);this.changed=!0},take120Census:function(){Micro.rotate120Arrays.call(this);this.resHist120[0]=Math.floor(this.resPop/8);this.comHist120[0]=this.comPop;this.indHist120[0]=this.indPop;this.crimeHist120[0]=this.crimeHist10[0];this.pollutionHist120[0]= this.pollutionHist10[0];this.moneyHist120[0]=this.moneyHist10[0];this.changed=!0}};Micro.PROBLEMS="CVP_CRIME CVP_POLLUTION CVP_HOUSING CVP_TAXES CVP_TRAFFIC CVP_UNEMPLOYMENT CVP_FIRE".split(" ");Micro.NUMPROBLEMS=Micro.PROBLEMS.length;Micro.NUM_COMPLAINTS=4;Micro.EvalProps=["cityClass","cityScore"];Micro.getTrafficAverage=function(a){var b=a.trafficDensityMap;a=a.landValueMap;for(var c=0,d=1,e=0;ec&&600>d;)Random.getRandom(300) Micro.NUMPROBLEMS&&(b=0),d++},doProblems:function(a,b,c,d){for(var e=[],f=0;f a&&!e[c]&&(b=c,a=this.problemVotes[c]);this.problemOrder[f]=b;bd.resValve&&(f=Math.round(0.85*f));-1E3>d.comValve&&(f=Math.round(0.85*f));-1E3>d.indValve&&(f=Math.round(0.85*f));a=1;0===this.cityPop||0===this.cityPopDelta?a=1:this.cityPopDelta==this.cityPop?a=1:0this.cityPopDelta&&(a=0.95+Math.floor(this.cityPopDelta/ (this.cityPop-this.cityPopDelta)));f=Math.round(f*a);f=f-Micro.getFireSeverity(b)-c.cityTax;a=b.unpoweredZoneCount+b.poweredZoneCount;0a;a++)Random.getRandom(1E3)a||a>=Micro.NUM_COMPLAINTS||this.problemOrder[a]===Micro.NUMPROBLEMS?-1:this.problemOrder[a]},getProblemVotes:function(a){return 0>a||a>=Micro.NUM_COMPLAINTS||this.problemOrder[a]==Micro.NUMPROBLEMS?-1:this.problemVotes[this.problemOrder[a]]}};Micro.BudgetProps="autoBudget totalFunds policePercent roadPercent firePercent roadSpend policeSpend fireSpend roadMaintenanceBudget policeMaintenanceBudget fireMaintenanceBudget cityTax roadEffect policeEffect fireEffect".split(" "); Micro.Budget=function(){this.roadEffect=Micro.MAX_ROAD_EFFECT;this.policeEffect=Micro.MAX_POLICESTATION_EFFECT;this.fireEffect=Micro.MAX_FIRESTATION_EFFECT;this.totalFunds=0;this.cityTax=7;this.policeFund=this.fireFund=this.roadFund=this.taxFund=this.cashFlow=0;this.policePercent=this.firePercent=this.roadPercent=1;this.policeSpend=this.fireSpend=this.roadSpend=0;this.autoBudget=!0}; Micro.Budget.prototype={constructor:Micro.Budget,save:function(a){for(var b=0,c=Micro.BudgetProps.length;b=this.roadSpend?this.roadSpend:e,e=e-f,g=e>=this.fireSpend?this.fireSpend:e,e=e-g,h=e>=this.policeSpend?this.policeSpend:e;this.roadPercent=0=c?this.doBudgetSpend(f, g,h,this.cityTax,b):(this.autoBudget=!1,b.sendMessage(Messages.AUTOBUDGET_CHANGED,this.autoBudget),b.sendMessage(Messages.BUDGET_NEEDED),b.sendMessage(Messages.NO_MONEY))},doBudgetSpend:function(a,b,c,d,e){this.roadSpend=a;this.fireSpend=b;this.policeSpend=c;this.setTax(d);this.spend(-(this.taxFund-(this.roadSpend+this.fireSpend+this.policeSpend)),e);this.updateFundEffects()},updateFundEffects:function(){this.roadEffect=Micro.MAX_ROAD_EFFECT;this.policeEffect=Micro.MAX_POLICESTATION_EFFECT;this.fireEffect= Micro.MAX_FIRESTATION_EFFECT;0a)throw Error("Invalid parameter");var b=0;a=Tile.BIT_END<<1)throw Error("Invalid parameter");this._value|=a},removeFlags:function(a){if(!arguments.length||"number"!==typeof a||a=Tile.BIT_END<<1)throw Error("Invalid parameter");this._value&=~a},setFlags:function(a){this._value=this._value&~Tile.ALLBITS|a},getFlags:function(){return this._value& Tile.ALLBITS},getRawValue:function(){return this._value},set:function(a,b){if(2>arguments.length||"number"!==typeof a||"number"!==typeof b||a>=Tile.TILE_COUNT)throw Error("Invalid parameter");this.setValue(a);this.setFlags(b)},toString:function(){var a="Tile# "+this.getValue(),a=a+(this.isCombustible()?" burning":""),a=a+(this.isPowered()?" powered":""),a=a+(this.isAnimated()?" animated":""),a=a+(this.isConductive()?" conductive":""),a=a+(this.isZone()?" zone":"");return a+=this.isBulldozable()?" bulldozeable": ""}};var Tile={POWERBIT:32768,CONDBIT:16384,BURNBIT:8192,BULLBIT:4096,ANIMBIT:2048,ZONEBIT:1024};Tile.BLBNBIT=Tile.BULLBIT|Tile.BURNBIT;Tile.BLBNCNBIT=Tile.BULLBIT|Tile.BURNBIT|Tile.CONDBIT;Tile.BNCNBIT=Tile.BURNBIT|Tile.CONDBIT;Tile.ASCBIT=Tile.ANIMBIT|Tile.CONDBIT|Tile.BURNBIT;Tile.ALLBITS=Tile.POWERBIT|Tile.CONDBIT|Tile.BURNBIT|Tile.BULLBIT|Tile.ANIMBIT|Tile.ZONEBIT;Tile.BIT_START=1024;Tile.BIT_END=32768;Tile.BIT_MASK=Tile.BIT_START-1;Tile.DIRT=0;Tile.RIVER=2;Tile.REDGE=3;Tile.CHANNEL=4; Tile.FIRSTRIVEDGE=5;Tile.LASTRIVEDGE=20;Tile.WATER_LOW=Tile.RIVER;Tile.WATER_HIGH=Tile.LASTRIVEDGE;Tile.TREEBASE=21;Tile.WOODS_LOW=Tile.TREEBASE;Tile.LASTTREE=36;Tile.WOODS=37;Tile.UNUSED_TRASH1=38;Tile.UNUSED_TRASH2=39;Tile.WOODS_HIGH=Tile.UNUSED_TRASH2;Tile.WOODS2=40;Tile.WOODS3=41;Tile.WOODS4=42;Tile.WOODS5=43;Tile.RUBBLE=44;Tile.LASTRUBBLE=47;Tile.FLOOD=48;Tile.LASTFLOOD=51;Tile.RADTILE=52;Tile.UNUSED_TRASH3=53;Tile.UNUSED_TRASH4=54;Tile.UNUSED_TRASH5=55;Tile.FIRE=56;Tile.FIREBASE=Tile.FIRE; Tile.LASTFIRE=63;Tile.HBRIDGE=64;Tile.ROADBASE=Tile.HBRIDGE;Tile.VBRIDGE=65;Tile.ROADS=66;Tile.ROADS2=67;Tile.ROADS3=68;Tile.ROADS4=69;Tile.ROADS5=70;Tile.ROADS6=71;Tile.ROADS7=72;Tile.ROADS8=73;Tile.ROADS9=74;Tile.ROADS10=75;Tile.INTERSECTION=76;Tile.HROADPOWER=77;Tile.VROADPOWER=78;Tile.BRWH=79;Tile.LTRFBASE=80;Tile.BRWV=95;Tile.BRWXXX1=111;Tile.BRWXXX2=127;Tile.BRWXXX3=143;Tile.HTRFBASE=144;Tile.BRWXXX4=159;Tile.BRWXXX5=175;Tile.BRWXXX6=191;Tile.LASTROAD=206;Tile.BRWXXX7=207;Tile.HPOWER=208; Tile.VPOWER=209;Tile.LHPOWER=210;Tile.LVPOWER=211;Tile.LVPOWER2=212;Tile.LVPOWER3=213;Tile.LVPOWER4=214;Tile.LVPOWER5=215;Tile.LVPOWER6=216;Tile.LVPOWER7=217;Tile.LVPOWER8=218;Tile.LVPOWER9=219;Tile.LVPOWER10=220;Tile.RAILHPOWERV=221;Tile.RAILVPOWERH=222;Tile.POWERBASE=Tile.HPOWER;Tile.LASTPOWER=Tile.RAILVPOWERH;Tile.UNUSED_TRASH6=223;Tile.HRAIL=224;Tile.VRAIL=225;Tile.LHRAIL=226;Tile.LVRAIL=227;Tile.LVRAIL2=228;Tile.LVRAIL3=229;Tile.LVRAIL4=230;Tile.LVRAIL5=231;Tile.LVRAIL6=232;Tile.LVRAIL7=233; Tile.LVRAIL8=234;Tile.LVRAIL9=235;Tile.LVRAIL10=236;Tile.HRAILROAD=237;Tile.VRAILROAD=238;Tile.RAILBASE=Tile.HRAIL;Tile.LASTRAIL=238;Tile.ROADVPOWERH=239;Tile.RESBASE=240;Tile.FREEZ=244;Tile.HOUSE=249;Tile.LHTHR=Tile.HOUSE;Tile.HHTHR=260;Tile.RZB=265;Tile.HOSPITALBASE=405;Tile.HOSPITAL=409;Tile.CHURCHBASE=414;Tile.CHURCH0BASE=414;Tile.CHURCH=418;Tile.CHURCH0=418;Tile.COMBASE=423;Tile.COMCLR=427;Tile.CZB=436;Tile.COMLAST=609;Tile.INDBASE=612;Tile.INDCLR=616;Tile.LASTIND=620;Tile.IND1=621; Tile.IZB=625;Tile.IND2=641;Tile.IND3=644;Tile.IND4=649;Tile.IND5=650;Tile.IND6=676;Tile.IND7=677;Tile.IND8=686;Tile.IND9=689;Tile.PORTBASE=693;Tile.PORT=698;Tile.LASTPORT=708;Tile.AIRPORTBASE=709;Tile.RADAR=711;Tile.AIRPORT=716;Tile.COALBASE=745;Tile.POWERPLANT=750;Tile.LASTPOWERPLANT=760;Tile.FIRESTBASE=761;Tile.FIRESTATION=765;Tile.POLICESTBASE=770;Tile.POLICESTATION=774;Tile.STADIUMBASE=779;Tile.STADIUM=784;Tile.FULLSTADIUM=800;Tile.NUCLEARBASE=811;Tile.NUCLEAR=816;Tile.LASTZONE=826; Tile.LIGHTNINGBOLT=827;Tile.HBRDG0=828;Tile.HBRDG1=829;Tile.HBRDG2=830;Tile.HBRDG3=831;Tile.HBRDG_END=832;Tile.RADAR0=832;Tile.RADAR1=833;Tile.RADAR2=834;Tile.RADAR3=835;Tile.RADAR4=836;Tile.RADAR5=837;Tile.RADAR6=838;Tile.RADAR7=839;Tile.FOUNTAIN=840;Tile.INDBASE2=844;Tile.TELEBASE=844;Tile.TELELAST=851;Tile.SMOKEBASE=852;Tile.TINYEXP=860;Tile.SOMETINYEXP=864;Tile.LASTTINYEXP=867;Tile.TINYEXPLAST=883;Tile.COALSMOKE1=916;Tile.COALSMOKE2=920;Tile.COALSMOKE3=924;Tile.COALSMOKE4=928; Tile.FOOTBALLGAME1=932;Tile.FOOTBALLGAME2=940;Tile.VBRDG0=948;Tile.VBRDG1=949;Tile.VBRDG2=950;Tile.VBRDG3=951;Tile.NUKESWIRL1=952;Tile.NUKESWIRL2=953;Tile.NUKESWIRL3=954;Tile.NUKESWIRL4=955;Tile.CHURCH1BASE=956;Tile.CHURCH1=960;Tile.CHURCH2BASE=965;Tile.CHURCH2=969;Tile.CHURCH3BASE=974;Tile.CHURCH3=978;Tile.CHURCH4BASE=983;Tile.CHURCH4=987;Tile.CHURCH5BASE=992;Tile.CHURCH5=996;Tile.CHURCH6BASE=1001;Tile.CHURCH6=1005;Tile.CHURCH7BASE=1010;Tile.CHURCH7=1014;Tile.CHURCH7LAST=1018;Tile.TILE_COUNT=1024; Tile.TILE_INVALID=-1;Tile.MIN_SIZE=16;Micro.PositionMaker=function(a,b){function c(a){return"number"===typeof a}if(2>arguments.length||"number"!==typeof a||"number"!==typeof b||0>a||0>b)throw Error("Invalid parameter");var d=[Direction.NORTH,Direction.NORTHEAST,Direction.EAST,Direction.SOUTHEAST,Direction.SOUTH,Direction.SOUTHWEST,Direction.WEST,Direction.NORTHWEST,Direction.INVALID],e=function(f,g,h){if(0===arguments.length)return this.y=this.x=0,this;if(!(1!==arguments.length&&3!==arguments.length||f instanceof e))throw Error("Invalid parameter"); if(!(3!==arguments.length||c(g)&&c(h)))throw Error("Invalid parameter");var k;if((k=2===arguments.length)&&!(k=c(f)&&!c(g))&&!(k=f instanceof e&&!c(g))){if(k=f instanceof e)if(k=c(g))k=!(c(g)&&-1!==d.indexOf(g));k=k||!c(f)&&!(f instanceof e)}if(k)throw Error("Invalid parameter");k=!0;c(f)?(this.x=f,this.y=g):(this._assignFrom(f),2===arguments.length?k=this.move(g):3===arguments.length&&(this.x+=g,this.y+=h));if(0>this.x||this.x>=a||0>this.y||this.y>=b||!k)throw Error("Invalid parameter");};e.prototype._assignFrom= function(a){this.x=a.x;this.y=a.y};e.prototype.toString=function(){return"("+this.x+", "+this.y+")"};e.prototype.toInt=function(){return this.y*a+this.x};e.prototype.move=function(c){switch(c){case Direction.INVALID:return!0;case Direction.NORTH:if(0a||0>b||a>=d||b>=e)return console.warn("getTile called with bad bounds",a,b),new Tile(Tile.TILE_INVALID); a=this.data[a+b*d];if(!c)return a;c.set(a);return a},getTileValue:function(a,b){var c=Error("Invalid parameter");if(1>arguments.length)throw c;"object"===typeof a&&(b=a.y,a=a.x);if(!this.testBounds(a,b))throw c;c=this._calculateIndex(a,b);c in this.data||(this.data[c]=new Micro.Tile(this.defaultValue));return this.data[c].getValue()},getTileFlags:function(a,b){var c=Error("Invalid parameter");if(1>arguments.length)throw c;"object"===typeof a&&(b=a.y,a=a.x);if(!this.testBounds(a,b))throw c;c=this._calculateIndex(a, b);c in this.data||(this.data[c]=new Micro.Tile(this.defaultValue));return this.data[c].getFlags()},getTiles:function(a,b,c,d){var e=Error("Invalid parameter");if(3>arguments.length)throw e;3===arguments.length&&(d=c,c=b,b=a.y,a=a.x);if(!this.testBounds(a,b))throw e;for(var e=[],f=b,g=b+d;farguments.length)throw f; 3===arguments.length&&(d=c,c=b,b=a.y,a=a.x);for(var f=this.width,g=this.height,h=b,k=b+d;hh||0>l||h>=g||l>=f?Tile.TILE_INVALID:this.data[l+h*f].getRawValue();return e},getTileFromMapOrDefault:function(a,b,c){switch(b){case this.Direction.NORTH:return 0arguments.length)throw d;2===arguments.length&&(c=b,b=a.y,a=a.x);if(!this.testBounds(a,b))throw d;d=this._calculateIndex(a,b);this.data[d].setFlags(c)},addTileFlags:function(a,b,c){var d=Error("Invalid parameter");if(2>arguments.length)throw d;2===arguments.length&&(c=b,b=a.y,a=a.x);if(!this.testBounds(a,b))throw d;d=this._calculateIndex(a,b);this.data[d].addFlags(c)},removeTileFlags:function(a,b,c){var d=Error("Invalid parameter"); if(2>arguments.length)throw d;2===arguments.length&&(c=b,b=a.y,a=a.x);if(!this.testBounds(a,b))throw d;d=this._calculateIndex(a,b);this.data[d].removeFlags(c)},putZone:function(a,b,c,d){var e=Error("Invalid parameter");if(!this.testBounds(a,b)||!this.testBounds(a-1+d,b-1+d))throw e;c=c-1-d;for(var e=a-1,f=b-1,g=f;gMicro.TERRAIN_CREATE_ISLAND&&10>Random.getRandom(100))return this.makeIsland(),this.map;1===Micro.TERRAIN_CREATE_ISLAND?this.makeNakedIsland():this.clearMap();if(0!==Micro.TERRAIN_CURVE_LEVEL){var c= 40+Random.getRandom(this.map.width-79),d=33+Random.getRandom(this.map.height-66),c=new this.map.Position(c,d);this.doRivers(c)}0!==Micro.TERRAIN_LAKE_LEVEL&&this.makeLakes();this.smoothRiver();0!==Micro.TERRAIN_TREE_LEVEL&&this.doTrees();return this.map},clearMap:function(){var a,b,c=this.map.width,d=this.map.height;for(a=0;aTile.WOODS&&this.map.setTile(a,b,Tile.DIRT,0)},makeNakedIsland:function(){this.map.isIsland=!0;var a=Micro.ISLAND_RADIUS,b,c,d=this.map.width,e=this.map.height;for(c=0;cMicro.TERRAIN_LAKE_LEVEL?Random.getRandom(11): 0.5*Micro.TERRAIN_LAKE_LEVEL;0Micro.TERRAIN_TREE_LEVEL?Random.getRandom(150)+50:Random.getRandom(100+2*Micro.TERRAIN_TREE_LEVEL)+50;for(var d=new this.map.Position(a, b);0Micro.TERRAIN_TREE_LEVEL?Random.getRandom(100)+50:Micro.TERRAIN_TREE_LEVEL+3;for(a=0;ac;c++)if(m<<=1,f=a+k[c],g=b+l[c],h=this.map.testBounds(f,g))f=this.map.getTileValue(f,g),f!==Tile.DIRT&&(fTile.WOODS_HIGH)&&m++;c=this.riverEdge[m&15];c!==Tile.RIVER&&Random.getRandom(2)&&c++;this.map.setTile(a,b,c,Tile.BULLBIT)}},isTree:function(a){return a>=Tile.WOODS_LOW&&a<=Tile.WOODS_HIGH},smoothTrees:function(){var a,b,c=this.map.width, d=this.map.height;for(a=0;ah;h++){var g=g<<1,k=a+d[h],l=b+e[h];this.map.testBounds(k,l)&&this.isTree(this.map.getTileValue(k,l))&&g++}(d=f[g&15])?(d!==Tile.WOODS&&a+b&1&&(d-=8),this.map.setTile(a,b,d,Tile.BLBNBIT)):c||this.map.setTile(a,b,d,0)}}, doRivers:function(a){var b=Direction.NORTH+2*Random.getRandom(3);this.doBRiver(a,b,b);var b=Direction.rotate180(b),c=this.doBRiver(a,b,b),b=Direction.NORTH+2*Random.getRandom(3);this.doSRiver(a,b,c)},doBRiver:function(a,b,c){var d,e;0>Micro.TERRAIN_CURVE_LEVEL?(d=100,e=200):(d=Micro.TERRAIN_CURVE_LEVEL+10,e=Micro.TERRAIN_CURVE_LEVEL+100);for(a=new this.map.Position(a);this.map.testBounds(a.x+4,a.y+4);)this.plopBRiver(a),10>Random.getRandom(d+1)?c=b:(90Micro.TERRAIN_CURVE_LEVEL?(d=100,e=200):(d=Micro.TERRAIN_CURVE_LEVEL+10,e=Micro.TERRAIN_CURVE_LEVEL+100);for(a=new this.map.Position(a);this.map.testBounds(a.x+3,a.y+3);)this.plopSRiver(a),10>Random.getRandom(d+1)?c=b:(90b;b++)for(var c=0;9>c;c++)this.putOnMap(this.BRMatrix[c][b],a.x+b,a.y+c)},plopSRiver:function(a){for(var b=0;6>b;b++)for(var c=0;6>c;c++)this.putOnMap(this.SRMatrix[c][b],a.x+b,a.y+c)},smoothWater:function(){var a,b,c,d,e,f=this.map.width,g=this.map.height;for(a=0;a=Tile.WATER_LOW&& c<=Tile.WATER_HIGH)for(d=new this.map.Position(a,b),e=Direction.BEGIN;eTile.WATER_HIGH){this.map.setTile(a,b,Tile.REDGE,0);break}for(a=0;a=Tile.WATER_LOW&&c<=Tile.WATER_HIGH){var h=!0;d=new this.map.Position(a,b);for(e=Direction.BEGIN;eTile.WATER_HIGH){h=!1;break}h&&this.map.setTile(a,b,Tile.RIVER,0)}for(a=0;a=Tile.WOODS_LOW&&c<=Tile.WOODS_HIGH)for(d=new this.map.Position(a,b),e=Direction.BEGIN;e=Tile.FIRSTRIVEDGE&&a<=Tile.LASTRUBBLE||a>=Tile.POWERBASE+2&&a<=Tile.POWERBASE+12||a>=Tile.TINYEXP&&a<=Tile.LASTTINYEXP+2});Micro.isCommercial=Micro.unwrapTile(function(a){return a>=Tile.COMBASE&&a=Tile.ROADBASE&&a<=Tile.LASTRAIL||a===Tile.RAILHPOWERV||a===Tile.RAILVPOWERH}); Micro.isFire=Micro.unwrapTile(function(a){return a>=Tile.FIREBASE&&a=Tile.FLOOD&&a=Tile.INDBASE&&a=Tile.TINYEXP&&a<=Tile.LASTTINYEXP});Micro.isRail=Micro.unwrapTile(function(a){return a>=Tile.RAILBASE&&a=Tile.RESBASE&&a=Tile.ROADBASE&&a=Tile.ROADBASE&&a<=Tile.LASTROAD+1?(a&15)+64:a});Micro.isCommercialZone=function(a){return a.isZone()&&Micro.isCommercial(a)};Micro.isIndustrialZone=function(a){return a.isZone()&&Micro.isIndustrial(a)};Micro.isResidentialZone=function(a){return a.isZone()&&Micro.isResidential(a)}; Micro.randomFire=function(){return new Micro.Tile(Tile.FIRE+(Random.getRandom16()&3),Tile.ANIMBIT)};Micro.randomRubble=function(){return new Micro.Tile(Tile.RUBBLE+(Random.getRandom16()&3),Tile.BULLBIT)};Micro.HOSPITAL=function(){};Micro.checkBigZone=function(a){switch(a){case Tile.POWERPLANT:case Tile.PORT:case Tile.NUCLEAR:case Tile.STADIUM:a={zoneSize:4,deltaX:0,deltaY:0};break;case Tile.POWERPLANT+1:case Tile.COALSMOKE3:case Tile.COALSMOKE3+1:case Tile.COALSMOKE3+2:case Tile.PORT+1:case Tile.NUCLEAR+1:case Tile.STADIUM+1:a={zoneSize:4,deltaX:-1,deltaY:0};break;case Tile.POWERPLANT+4:case Tile.PORT+4:case Tile.NUCLEAR+4:case Tile.STADIUM+4:a={zoneSize:4,deltaX:0,deltaY:-1};break;case Tile.POWERPLANT+5:case Tile.PORT+5:case Tile.NUCLEAR+ 5:case Tile.STADIUM+5:a={zoneSize:4,deltaX:-1,deltaY:-1};break;case Tile.AIRPORT:a={zoneSize:6,deltaX:0,deltaY:0};break;case Tile.AIRPORT+1:a={zoneSize:6,deltaX:-1,deltaY:0};break;case Tile.AIRPORT+2:a={zoneSize:6,deltaX:-2,deltaY:0};break;case Tile.AIRPORT+3:a={zoneSize:6,deltaX:-3,deltaY:0};break;case Tile.AIRPORT+6:a={zoneSize:6,deltaX:0,deltaY:-1};break;case Tile.AIRPORT+7:a={zoneSize:6,deltaX:-1,deltaY:-1};break;case Tile.AIRPORT+8:a={zoneSize:6,deltaX:-2,deltaY:-1};break;case Tile.AIRPORT+9:a= {zoneSize:6,deltaX:-3,deltaY:-1};break;case Tile.AIRPORT+12:a={zoneSize:6,deltaX:0,deltaY:-2};break;case Tile.AIRPORT+13:a={zoneSize:6,deltaX:-1,deltaY:-2};break;case Tile.AIRPORT+14:a={zoneSize:6,deltaX:-2,deltaY:-2};break;case Tile.AIRPORT+15:a={zoneSize:6,deltaX:-3,deltaY:-2};break;case Tile.AIRPORT+18:a={zoneSize:6,deltaX:0,deltaY:-3};break;case Tile.AIRPORT+19:a={zoneSize:6,deltaX:-1,deltaY:-3};break;case Tile.AIRPORT+20:a={zoneSize:6,deltaX:-2,deltaY:-3};break;case Tile.AIRPORT+21:a={zoneSize:6, deltaX:-3,deltaY:-3};break;default:a={zoneSize:0,deltaX:0,deltaY:0}}return a};Micro.checkZoneSize=function(a){return a>=Tile.RESBASE-1&&a<=Tile.PORTBASE-1||a>=Tile.LASTPOWERPLANT+1&&a<=Tile.POLICESTATION+4||a>=Tile.CHURCH1BASE&&a<=Tile.CHURCH7LAST?3:a>=Tile.PORTBASE&&a<=Tile.LASTPORT||a>=Tile.COALBASE&&a<=Tile.LASTPOWERPLANT||a>=Tile.STADIUMBASE&&a<=Tile.LASTZONE?4:0}; Micro.fireZone=function(a,b,c,d){var e=a.getTileValue(b,c),f=2,g=d.rateOfGrowthMap.worldGet(b,c),g=Micro.clamp(g-20,-200,200);d.rateOfGrowthMap.worldSet(b,c,g);e===Tile.AIRPORT?f=5:e>=Tile.PORTBASE?f=3:e=Tile.ROADBASE)&&a.addTileFlags(g,h,Tile.BULLBIT)}}; Micro.getLandPollutionValue=function(a,b,c){var d=a.landValueMap.worldGet(b,c),d=d-a.pollutionDensityMap.worldGet(b,c);return 30>d?0:80>d?1:150>d?2:3};Micro.incRateOfGrowth=function(a,b,c,d){var e=a.rateOfGrowthMap.worldGet(b,c);d=Micro.clamp(e+4*d,-200,200);a.rateOfGrowthMap.worldSet(b,c,d)}; Micro.putZone=function(a,b,c,d,e){for(var f=0;3>f;f++)for(var g=0;3>g;g++){var h=a.getTileValue(b+g,c+f);if(h>=Tile.FLOOD&&h>4};Micro.worldToPix=function(a){return a<<4};Micro.turnTo=function(a,b){if(a===b)return a;ab-a?a++:a--:4>a-b?a--:a++;8a&&(a=8);return a};Micro.absoluteValue=function(a){return Math.abs(a)};Micro.getTileValue=function(a,b,c){b=Micro.pixToWorld(b);c=Micro.pixToWorld(c);return 0>b||b>=a.width||0>c||c>=a.height?-1:a.getTileValue(b,c)};Micro.directionTable=[0,3,2,1,3,4,5,7,6,5,7,8,1]; Micro.getDir=function(a,b,c,d){a=c-a;b=d-b;d=0>a?0>b?11:8:0>b?2:5;a=Math.abs(a);b=Math.abs(b);2*ad||12Tile.RZB&&a.makeExplosionAt(d,e)),Micro.checkWet(k)?b.setTo(f,g,new Micro.Tile(Tile.RIVER)):b.setTo(f,g,new Micro.Tile(Tile.TINYEXP,Tile.BULLBIT|Tile.ANIMBIT))):k>=Tile.ROADBASE&&k<=Tile.LASTROAD&&b.setTo(f,g,new Micro.Tile(Tile.RIVER)))}}; Micro.getDistance=function(a,b,c,d){return Math.abs(a-c)+Math.abs(b-d)};Micro.checkSpriteCollision=function(a,b){return 0!==a.frame&&0!==b.frame&&30>Micro.getDistance(a.x,a.y,b.x,b.y)};Micro.SMOOTH_NEIGHBOURS_THEN_BLOCK=0;Micro.SMOOTH_ALL_THEN_CLAMP=1;Micro.smoothMap=function(a,b,c){for(var d=0,e=a.width;d>2,255d&&(d++,d=Micro.clamp(d,-200,200),a.set(b,c,d)))}};Micro.neutraliseRateOfGrowthMap=function(a){a=a.rateOfGrowthMap;for(var b=0,c=a.width;b=d?a.worldSet(b,c,0):200=f?0:200=Tile.HTRFBASE)return 75;if(a>=Tile.LTRFBASE)return 50;if(aTile.FIREBASE)return 90;if(a>=Tile.RADTILE)return 255}return 0}return a<=Tile.LASTIND?0:aa.cityCentreX?b-a.cityCentreX:a.cityCentreX-b)+(c>a.cityCentreY?c-a.cityCentreY:a.cityCentreY-c),64)}; Micro.pollutionTerrainLandValueScan=function(a,b,c){var d=c.tempMap1,e=c.tempMap2,f=c.tempMap3;f.clear();var g=c.landValueMap,h=c.terrainDensityMap,k=c.pollutionDensityMap,l=c.crimeRateMap,m,n,p,q=0,x=0;c=0;for(n=g.width;cTile.DIRT&&(v=Tile.ROADBASE&&(s=!0)))}r=Math.min(r,255);d.set(c, m,r);s?(r=34-Math.floor(Micro.getCityCentreDistance(a,u,t)/2),r<<=2,r+=h.get(c>>1,m>>1),r-=k.get(c,m),190e||q===e&&Random.getChance(3)))e=q,a.pollutionMaxX= c,a.pollutionMaxY=m;b.pollutionAverage=g?Math.floor(l/g):0;Micro.smoothMap(f,h,Micro.SMOOTH_NEIGHBOURS_THEN_BLOCK)}; Micro.crimeScan=function(a,b){var c=b.policeStationMap,d=b.policeStationEffectMap,e=b.crimeRateMap,f=b.landValueMap,g=b.populationDensityMap;Micro.smoothMap(c,d,Micro.SMOOTH_NEIGHBOURS_THEN_BLOCK);Micro.smoothMap(d,c,Micro.SMOOTH_NEIGHBOURS_THEN_BLOCK);Micro.smoothMap(c,d,Micro.SMOOTH_NEIGHBOURS_THEN_BLOCK);for(var h=d=0,k=0,l=e.mapWidth,m=e.blockSize;k=Tile.LHTHR&&d<=Tile.HHTHR&&(e+=1);return e}return 8*(Math.floor((d-Tile.RZB)/9)%4+1)+16},c=[0,3,6,1,4,7,2,5,8],d=function(a,b,d,e,f,n,p){if(0!==f)if(16=Tile.LHTHR&&e<=Tile.HHTHR){a.setTo(f,p,new Micro.Tile(c[n]+Tile.RESBASE,Tile.BLBNCNBIT));return}n+=1}},e=function(c,e,f,l){var m;a.census.resZonePop+=1;m=c.getTileValue(e,f);var n=b(c,e,f,m);a.census.resPop+= n;var p=c.getTile(e,f).isPowered();l=Micro.ROUTE_FOUND;if(n>Random.getRandom(35)&&(l=a.traffic.makeTraffic(e,f,a.blockMaps,Micro.isCommercial),l===Micro.NO_ROAD_FOUND)){m=Micro.getLandPollutionValue(a.blockMaps,e,f);d(c,e,f,a.blockMaps,n,m,p);return}if(m===Tile.FREEZ||Random.getChance(7))if(m=a.blockMaps,l===Micro.NO_ROAD_FOUND?l=-3E3:(l=m.landValueMap.worldGet(e,f),l-=m.pollutionDensityMap.worldGet(e,f),l=0>l?0:Math.min(32*l,6E3),l-=3E3),l=a.valves.resValve+l,p||(l=-500),-350Random.getRandom16Signed())if(0=== n&&Random.getChance(3))0n){for(var p=n=0,q=[0,-1,0,1,-1,1,-1,0,1],x=[0,-1,-1,-1,0,0,1,1,1],r=0;9>r;r++){var s;s=c;var u=e+q[r],t=f+x[r],w=[0,1,0,-1],y=[-1,0,1,0],v=s.getTileValue(u,t);if(vTile.RESBASE+8)s=-1;else{for(var A=1,z=0;4>z;z++){var v= u+w[z],B=t+y[z];0>v||v>=s.width||0>B||B>=s.height||(v=s.getTileValue(v,B),v!==Tile.DIRT&&v<=Tile.LASTROAD&&(A+=1))}s=A}s>p?(p=s,n=r):s===p&&Random.getChance(7)&&(n=r)}0n&&(Micro.putZone(c,e,f,9*(4*m+(Math.floor(n/ 8)-1))+Tile.RZB,p),Micro.incRateOfGrowth(l,e,f,8))}}else 350>l&&l+26380Random.getRandom(5)&&(m=a.traffic.makeTraffic(f,g,a.blockMaps,Micro.isIndustrial),m===Micro.NO_ROAD_FOUND)){k=Micro.getLandPollutionValue(a.blockMaps,f,g);c(d,f,g,a.blockMaps,h,k,l);return}if(Random.getChance(7))if(k=m===Micro.NO_ROAD_FOUND?-3E3:a.blockMaps.comRateMap.worldGet(f,g),k=a.valves.comValve+k,l||(k=-500),m&&-350Random.getRandom16Signed()){k=Micro.getLandPollutionValue(a.blockMaps,f,g);var m=a.blockMaps,n=m.landValueMap.worldGet(f,g);!(h>n>>5)&&5>h&&(Micro.putZone(d,f,g, 9*(5*k+h)+Tile.CZB,l),Micro.incRateOfGrowth(m,f,g,8))}else 350>k&&k+26380>3,d[n]&&p?g.addTileFlags(k+e[n],l+f[n],Tile.ASCBIT):(g.addTileFlags(k+e[n],l+f[n],Tile.BNCNBIT),g.removeTileFlags(k+e[n],l+f[n],Tile.ANIMBIT)));n=Micro.ROUTE_FOUND;if(m>Random.getRandom(5)&&(n=a.traffic.makeTraffic(k,l,a.blockMaps,Micro.isResidential),n===Micro.NO_ROAD_FOUND)){c(g,k,l,a.blockMaps,m,Random.getRandom16()&1,p);return}if(Random.getChance(7)){var q;q=n===Micro.NO_ROAD_FOUND?-1E3:0;q=a.valves.indValve+ q;p||(q=-500);n&&-350Random.getRandom16Signed()?(n=a.blockMaps,q=Random.getRandom16()&1,4>m&&(Micro.putZone(g,k,l,9*(4*q+m)+Tile.IZB,p),Micro.incRateOfGrowth(n,k,l,8))):350>q&&q+26380g;g++)if(Random.getChance(7)&&d.testBounds(e+b[g],f+c[g])){var n=d.getTile(e,f);n.isCombustible()&&(n.isZone()&&(Micro.fireZone(d,e,f,a.blockMaps),n.getValue()>Tile.IZB&&a.spriteManager.makeExplosionAt(e,f)),d.setTo(Micro.randomFire()))}n=10;g=a.blockMaps.fireStationEffectMap.worldGet(e,f);100h;h++){var k=b+d[h],l=c+e[h];a.testBounds(k,l)&&a.getTileValue(k,l)===(f[h]&Tile.BIT_MASK)&&a.setTileValue(k,l,g[h])}},c=function(a,b,c,d,e,f,g){for(var h=0;7>h;h++){var k=b+d[h],l=c+e[h];if(a.testBounds(k,l)){var m=a.getTileValue(k,l);m!==Tile.CHANNEL&&(m&15)!==(f[h]&15)||a.setTileValue(k,l,g[h])}}},d=[0,1,0,0,0,0,1],e=[-2,-2,-1,0,1,2,2],f=[Tile.VBRDG0|Tile.BULLBIT,Tile.VBRDG1|Tile.BULLBIT,Tile.RIVER,Tile.BRWV|Tile.BULLBIT,Tile.RIVER, Tile.VBRDG2|Tile.BULLBIT,Tile.VBRDG3|Tile.BULLBIT],g=[Tile.VBRIDGE|Tile.BULLBIT,Tile.RIVER,Tile.VBRIDGE|Tile.BULLBIT,Tile.VBRIDGE|Tile.BULLBIT,Tile.VBRIDGE|Tile.BULLBIT,Tile.VBRIDGE|Tile.BULLBIT,Tile.RIVER],h=[-2,2,-2,-1,0,1,2],k=[-1,-1,0,0,0,0,0],l=[Tile.HBRDG1|Tile.BULLBIT,Tile.HBRDG3|Tile.BULLBIT,Tile.HBRDG0|Tile.BULLBIT,Tile.RIVER,Tile.BRWH|Tile.BULLBIT,Tile.RIVER,Tile.HBRDG2|Tile.BULLBIT],m=[Tile.RIVER,Tile.RIVER,Tile.HBRIDGE|Tile.BULLBIT,Tile.HBRIDGE|Tile.BULLBIT,Tile.HBRIDGE|Tile.BULLBIT,Tile.HBRIDGE| Tile.BULLBIT,Tile.HBRIDGE|Tile.BULLBIT],n=[Tile.ROADBASE,Tile.LTRFBASE,Tile.HTRFBASE],p=function(q,p,r,s){a.census.roadTotal+=1;s=q.getTile(p,r);var u=s.getValue();if(a.budget.shouldDegradeRoad()&&Random.getChance(511)&&(s=q.getTile(p,r),!s.isConductive()&&a.budget.roadEffect<(Random.getRandom16()&31))){s.getValue();2>(u&15)||15===(u&15)?q.setTo(p,r,Tile.RIVER):q.setTo(p,r,Micro.randomRubble());return}if(!s.isCombustible()){a.census.roadTotal+=4;var t;a:if(u===Tile.BRWV)Random.getChance(3)&&340a.spriteManager.getBoatDistance(p,r)||Random.getChance(7))if(u&1){if(p>6;1=Tile.TINYEXP&&c<=Tile.LASTTINYEXP||c=Tile.ROADS&&d<=Tile.INTERSECTION?(0=Tile.ROADBASE&&d<=Tile.VROADPOWER)&&d!==Tile.HROADPOWER&&d!==Tile.VRAILROAD&&d!==Tile.ROADBASE&&(c|=1)),a=Tile.ROADBASE&&d<=Tile.VROADPOWER)&&d!== Tile.VROADPOWER&&d!==Tile.HRAILROAD&&d!==Tile.VBRIDGE&&(c|=2)),b=Tile.ROADBASE&&d<=Tile.VROADPOWER)&&d!==Tile.HROADPOWER&&d!==Tile.VRAILROAD&&d!==Tile.ROADBASE&&(c|=4)),0=Tile.ROADBASE&&d<=Tile.VROADPOWER)&&d!==Tile.VROADPOWER&&d!==Tile.HRAILROAD&&d!==Tile.VBRIDGE&&(c|=8)),this._worldEffects.setTile(a,b,Micro.RoadTable[c]| Tile.BULLBIT|Tile.BURNBIT)):d>=Tile.LHRAIL&&d<=Tile.LVRAIL10?(0=Tile.RAILHPOWERV&&d<=Tile.VRAILROAD&&d!==Tile.RAILHPOWERV&&d!==Tile.HRAILROAD&&d!==Tile.HRAIL&&(c|=1)),a=Tile.RAILHPOWERV&&d<=Tile.VRAILROAD&&d!==Tile.RAILVPOWERH&&d!==Tile.VRAILROAD&&d!==Tile.VRAIL&&(c|=2)),b=Tile.RAILHPOWERV&&d<=Tile.VRAILROAD&&d!==Tile.RAILHPOWERV&&d!==Tile.HRAILROAD&&d!==Tile.HRAIL&&(c|=4)),0=Tile.RAILHPOWERV&&d<=Tile.VRAILROAD&&d!==Tile.RAILVPOWERH&&d!==Tile.VRAILROAD&&d!==Tile.VRAIL&&(c|=8)),this._worldEffects.setTile(a,b,Micro.RailTable[c]|Tile.BULLBIT|Tile.BURNBIT)):d>=Tile.LHPOWER&&d<=Tile.LVPOWER10&&(0a||a+this.size>this._map.width||0>b||b+this.size>this._map.height)return this.TOOLRESULT_FAILED;for(var c,d,e,f=0;f=Tile.LHRAIL&&d<=Tile.HRAILROAD)){this._worldEffects.setTile(a,b,Tile.HRAIL, Tile.BULLBIT);break}if(0Tile.VRAIL&&dTile.HRAIL&&dTile.HRAIL&&d=Tile.ROADS&&c<=Tile.HROADPOWER)){this._worldEffects.setTile(a,b,Tile.HBRIDGE,Tile.BULLBIT);break}if(0< a&&(c=this._worldEffects.getTileValue(a-1,b),c=Micro.normalizeRoad(c),c===Tile.VRAILROAD||c===Tile.HBRIDGE||c>=Tile.ROADS&&c<=Tile.INTERSECTION)){this._worldEffects.setTile(a,b,Tile.HBRIDGE,Tile.BULLBIT);break}if(b=Tile.VBRIDGE&&c<=Tile.INTERSECTION)){this._worldEffects.setTile(a,b,Tile.VBRIDGE,Tile.BULLBIT);break}if(0=Tile.VBRIDGE&&c<=Tile.INTERSECTION)){this._worldEffects.setTile(a,b,Tile.VBRIDGE,Tile.BULLBIT);break}return this.TOOLRESULT_FAILED;case Tile.LHPOWER:this._worldEffects.setTile(a,b,Tile.VROADPOWER|Tile.CONDBIT|Tile.BURNBIT|Tile.BULLBIT);break;case Tile.LVPOWER:this._worldEffects.setTile(a,b,Tile.HROADPOWER|Tile.CONDBIT|Tile.BURNBIT|Tile.BULLBIT);break;case Tile.LHRAIL:this._worldEffects.setTile(a,b,Tile.HRAILROAD|Tile.BURNBIT|Tile.BULLBIT);break;case Tile.LVRAIL:this._worldEffects.setTile(a, b,Tile.VRAILROAD|Tile.BURNBIT|Tile.BULLBIT);break;default:return this.TOOLRESULT_FAILED}this.addCost(d);this.checkZoneConnections(a,b);return this.TOOLRESULT_OK};Micro.RoadTool.prototype.doTool=function(a,b,c,d){this.result=this.layRoad(a,b)};Micro.QueryTool=function(a){Micro.BaseTool.call(this);this.init(0,a,!1,!1);this.txt=""};var debug=!0;Micro.QueryTool.prototype=Object.create(Micro.BaseTool.prototype);Micro.QueryTool.prototype.classifyPopulationDensity=function(a,b,c){a=c.populationDensityMap.worldGet(a,b);a=a>>6&3;this.txt+="Density: "+TXT.densityStrings[a]+"
"}; Micro.QueryTool.prototype.classifyLandValue=function(a,b,c){a=c.landValueMap.worldGet(a,b);b=0;150<=a?b=3:80<=a?b=2:30<=a&&(b=1);this.txt+="Value: "+TXT.landValueStrings[b]+"
"};Micro.QueryTool.prototype.classifyCrime=function(a,b,c){a=c.crimeRateMap.worldGet(a,b);a=a>>6&3;this.txt+="Crime: "+TXT.crimeStrings[a]+"
"};Micro.QueryTool.prototype.classifyPollution=function(a,b,c){a=c.pollutionDensityMap.worldGet(a,b);a=a>>6&3;this.txt+="Pollution: "+TXT.pollutionStrings[a]+"
"}; Micro.QueryTool.prototype.classifyRateOfGrowth=function(a,b,c){a=c.rateOfGrowthMap.worldGet(a,b);a=a>>6&3;this.txt+="Growth: "+TXT.rateStrings[a]};Micro.QueryTool.prototype.classifyDebug=function(a,b,c){}; Micro.QueryTool.prototype.classifyZone=function(a,b){var c=[Tile.DIRT,Tile.RIVER,Tile.TREEBASE,Tile.RUBBLE,Tile.FLOOD,Tile.RADTILE,Tile.FIRE,Tile.ROADBASE,Tile.POWERBASE,Tile.RAILBASE,Tile.RESBASE,Tile.COMBASE,Tile.INDBASE,Tile.PORTBASE,Tile.AIRPORTBASE,Tile.COALBASE,Tile.FIRESTBASE,Tile.POLICESTBASE,Tile.STADIUMBASE,Tile.NUCLEARBASE,Tile.HBRDG0,Tile.RADAR0,Tile.FOUNTAIN,Tile.INDBASE2,Tile.FOOTBALLGAME1,Tile.VBRDG0,952],d=this._map.getTileValue(a,b);d>=Tile.COALSMOKE1&&d"};Micro.QueryTool.prototype.getInfo=function(){return this.txt}; Micro.QueryTool.prototype.doTool=function(a,b,c,d){this._map.getTileValue(a,b);debug&&this._map.getTile(a,b);this.classifyZone(a,b);this.classifyPopulationDensity(a,b,d);this.classifyLandValue(a,b,d);this.classifyCrime(a,b,d);this.classifyPollution(a,b,d);this.classifyRateOfGrowth(a,b,d);this.classifyDebug(a,b,d);c.sendMessage(Messages.QUERY_WINDOW_NEEDED);this.result=this.TOOLRESULT_OK};Micro.GameTools=function(a){return{airport:new Micro.BuildingTool(1E4,Tile.AIRPORT,a,6,!1),bulldozer:new Micro.BulldozerTool(a),coal:new Micro.BuildingTool(3E3,Tile.POWERPLANT,a,4,!1),commercial:new Micro.BuildingTool(100,Tile.COMCLR,a,3,!1),fire:new Micro.BuildingTool(500,Tile.FIRESTATION,a,3,!1),industrial:new Micro.BuildingTool(100,Tile.INDCLR,a,3,!1),nuclear:new Micro.BuildingTool(5E3,Tile.NUCLEAR,a,4,!0),park:new Micro.ParkTool(a),police:new Micro.BuildingTool(500,Tile.POLICESTATION,a,3,!1), port:new Micro.BuildingTool(3E3,Tile.PORT,a,4,!1),rail:new Micro.RailTool(a),residential:new Micro.BuildingTool(100,Tile.FREEZ,a,3,!1),road:new Micro.RoadTool(a),query:new Micro.QueryTool(a),stadium:new Micro.BuildingTool(5E3,Tile.STADIUM,a,4,!1),wire:new Micro.WireTool(a)}};Micro.BaseSprite=function(){}; Micro.BaseSprite.prototype={constructor:Micro.BaseSprite,init:function(a,b,c,d,e){this.type=a;this.map=b;this.spriteManager=c;this.x=d;this.y=e;this.accel=this.turn=this.flag=this.step=this.newDir=this.dir=this.soundCount=this.count=this.destY=this.destX=this.origY=this.origX=0;this.speed=100},getFileName:function(){return["obj",this.type,"-",this.frame-1].join("")},spriteNotInBounds:function(){var a=Micro.pixToWorld(this.x),b=Micro.pixToWorld(this.y);return 0>a||0>b||a>=this.map.width||b>=this.map.height}};Micro.TrainSprite=function(a,b,c,d){Micro.BaseSprite.call(this);this.init(Micro.SPRITE_TRAIN,a,b,c,d);this.height=this.width=32;this.yOffset=this.xOffset=-16;this.frame=1;this.dir=4;this.tileDeltaX=[0,16,0,-16];this.tileDeltaY=[-16,0,16,0];this.xDelta=[0,4,0,-4,0];this.yDelta=[-4,0,4,0,0];this.TrainPic2=[1,2,1,2,5];this.NORTHSOUTH=1;this.EASTWEST=2;this.NWSE=3;this.NESW=4;this.UNDERWATER=5;this.NORTH=0;this.EAST=1;this.SOUTH=2;this.WEST=3;this.CANTMOVE=4};Micro.TrainSprite.prototype=Object.create(Micro.BaseSprite.prototype); Micro.TrainSprite.prototype.move=function(a,b,c,d){if(this.frame===this.NWSE||this.frame===this.NESW)this.frame=this.TrainPic2[this.dir];this.x+=this.xDelta[this.dir];this.y+=this.yDelta[this.dir];if(0===(a&3)){for(b=a=Random.getRandom16()&3;b=Tile.RAILBASE&&d<=Tile.LASTRAIL||d===Tile.RAILVPOWERH||d===Tile.RAILHPOWERV){this.frame=this.dir!==c&&this.dir!== this.CANTMOVE?this.dir+c===this.WEST?this.NWSE:this.NESW:this.TrainPic2[c];if(d===Tile.HRAIL||d===Tile.VRAIL)this.frame=this.UNDERWATER;this.dir=c;return}this.dir===this.CANTMOVE?this.frame=0:this.dir=this.CANTMOVE}};Micro.TrainSprite.prototype.explodeSprite=function(a){this.frame=0;this.spriteManager.makeExplosionAt(this.x,this.y);a.sendMessage(Messages.TRAIN_CRASHED)};Micro.AirplaneSprite=function(a,b,c,d){Micro.BaseSprite.call(this);this.init(Micro.SPRITE_AIRPLANE,a,b,c,d);this.height=this.width=48;this.yOffset=this.xOffset=-24;c>Micro.worldToPix(a.width-20)?(this.destX=this.x-200,this.frame=7):(this.destX=this.x+200,this.frame=11);this.destY=this.y;this.xDelta=[0,0,6,8,6,0,-6,-8,-6,8,8,8];this.yDelta=[0,-8,-6,0,6,8,6,0,-6,0,0,0]};Micro.AirplaneSprite.prototype=Object.create(Micro.BaseSprite.prototype); Micro.AirplaneSprite.prototype.move=function(a,b,c,d){d=this.frame;0===a%5&&(8d&&(d=3)):(a=Micro.getDir(this.x,this.y,this.destX,this.destY),d=Micro.turnTo(d,a)),this.frame=d);50>Micro.absoluteDistance(this.x,this.y,this.destX,this.destY)&&(this.destX=Random.getRandom(Micro.worldToPix(this.map.width))+8,this.destY=Random.getRandom(Micro.worldToPix(this.map.height))+8);if(c.enableDisasters){c=!1;a=this.spriteManager.getSpriteList();for(var e=0;e=Micro.worldToPix(a.width-4)?this.frame=7:d=Micro.worldToPix(a.height-4)?this.frame=1:this.frame=3;this.newDir=this.frame;this.dir=10;this.count=1;this.tileDeltaX=[0,0,1,1,1,0,-1,-1,-1];this.tileDeltaY=[0,-1,-1,0,1,1,1,0,-1];this.xDelta=[0,0,2,2,2,0,-2,-2,-2];this.yDelta= [0,-2,-2,0,2,2,2,0,-2];this.tileWhiteList=[Tile.RIVER,Tile.CHANNEL,Tile.POWERBASE,Tile.POWERBASE+1,Tile.RAILBASE,Tile.RAILBASE+1,Tile.BRWH,Tile.BRWV];this.CANTMOVE=10};Micro.BoatSprite.prototype=Object.create(Micro.BaseSprite.prototype); Micro.BoatSprite.prototype.move=function(a,b,c,d){a=Tile.RIVER;0c&&a!==this.tileWhiteList[c];c++)7=== c&&(this.explodeSprite(b),Micro.destroyMapTile(this.spriteManager,this.map,d,this.x,this.y))};Micro.BoatSprite.prototype.explodeSprite=function(a){this.frame=0;this.spriteManager.makeExplosionAt(this.x,this.y);a.sendMessage(Messages.SHIP_CRASHED)};Micro.BoatSprite.prototype.oppositeAndUnderwater=function(a,b,c){b+=4;8Micro.absoluteDistance(this.x,this.y,this.origX,this.origY))){this.frame=0;return}if(0===this.soundCount){c=Micro.pixToWorld(this.x); var e=Micro.pixToWorld(this.y);0<=c&&cMicro.worldToPix(a.width)/2?d>Micro.worldToPix(a.height)/2?this.frame=10:this.frame=7:d>Micro.worldToPix(a.height)/2?this.frame=1:this.frame=4;this.flag=0;this.count=1E3;this.destX=Micro.worldToPix(a.pollutionMaxX);this.destY=Micro.worldToPix(a.pollutionMaxY);this.origX=this.x;this.origY=this.y;this._seenLand=!1;this.xDelta=[2,2,-2,-2, 0];this.yDelta=[-2,2,2,-2,0];this.cardinals1=[0,1,2,3];this.cardinals2=[1,2,3,0];this.diagonals1=[2,5,8,11];this.diagonals2=[11,2,5,8]};Micro.MonsterSprite.prototype=Object.create(Micro.BaseSprite.prototype); Micro.MonsterSprite.prototype.move=function(a,b,c,d){0a){c=(this.frame-1)%3;2===c&&(this.step=0);0===c&&(this.step=1);this.step?c++:c--;if(60>Micro.absoluteDistance(this.x,this.y,this.destX,this.destY))if(0===this.flag)this.flag=1,this.destX=this.origX,this.destY=this.origY;else{this.frame=0;return}e=Micro.getDir(this.x,this.y,this.destX,this.destY);e=Math.floor((e-1)/2);e!==a&&Random.getChance(10)&&(c=Random.getRandom16()& 1?this.cardinals1[a]:this.cardinals2[a],a=4,this.soundCount||(b.sendMessage(Messages.SOUND_MONSTER),this.soundCount=50+Random.getRandom(100)))}else a=4,e=this.frame,c=e-13&3,Random.getRandom16()&3||(c=Random.getRandom16()&1?this.diagonals1[c]:this.diagonals2[c],a=Math.floor((c-1)/3),c=(c-1)%3);c=3*a+c+1;16this.count)this.frame= 0;if(a===Tile.DIRT||a>Tile.WATER_HIGH)this._seenLand=!0;a=this.spriteManager.getSpriteList();for(c=0;c=a&&e.y+e.yOffset>=b&&!(e.x+e.xOffset>=c&&e.y+e.yOffset>=d)})},moveObjects:function(){var a= this.sim.messageManager,b=this.sim.disasterManager,c=this.sim.blockMaps;this.spriteCycle+=1;for(var d=this.spriteList.slice(),e=d.length;e--;){var f=d[e];0!==f.frame&&f.move(this.spriteCycle,a,b,c)}this.pruneDeadSprites()},makeSprite:function(a,b,c){this.spriteList.push(new constructors[a](this.map,this,b,c))},makeTornado:function(a){var b=this.getSprite(Micro.SPRITE_TORNADO);if(null!==b)b.count=200;else{var b=Random.getRandom(Micro.worldToPix(this.map.width)-800)+400,c=Random.getRandom(Micro.worldToPix(this.map.height)- 200)+100;this.makeSprite(Micro.SPRITE_TORNADO,b,c);a.sendMessage(Messages.TORNADO_SIGHTED,{x:Micro.pixToWorld(b),y:Micro.pixToWorld(c)})}},makeExplosion:function(a,b){this.map.testBounds(a,b)&&this.makeExplosionAt(Micro.worldToPix(a),Micro.worldToPix(b))},makeExplosionAt:function(a,b){this.makeSprite(Micro.SPRITE_EXPLOSION,a,b)},generatePlane:function(a,b){null===this.getSprite(Micro.SPRITE_AIRPLANE)&&this.makeSprite(Micro.SPRITE_AIRPLANE,Micro.worldToPix(a),Micro.worldToPix(b))},generateTrain:function(a, b,c){20c;c++){var d=Random.getRandom(this.map.width-20)+10,e=Random.getRandom(this.map.height-10)+5;if(this.map.getTile(d,e).getValue()===Tile.RIVER){this.makeMonsterAt(a,d,e);b=1;break}}0===b&&this.makeMonsterAt(a,60,50)},pruneDeadSprites:function(a){this.spriteList=this.spriteList.filter(function(a){return 0!==a.frame})}};var constructors={}; constructors[Micro.SPRITE_TRAIN]=Micro.TrainSprite;constructors[Micro.SPRITE_SHIP]=Micro.BoatSprite;constructors[Micro.SPRITE_MONSTER]=Micro.MonsterSprite;constructors[Micro.SPRITE_HELICOPTER]=Micro.CopterSprite;constructors[Micro.SPRITE_AIRPLANE]=Micro.AirplaneSprite;constructors[Micro.SPRITE_TORNADO]=Micro.TornadoSprite;constructors[Micro.SPRITE_EXPLOSION]=Micro.ExplosionSprite;Micro.MapScanner=function(a,b){this._map=a;this.mapHeight=this._map.height;this.mapWidth=this._map.width;this._actions=[];this.sim=b}; Micro.MapScanner.prototype={constructor:Micro.MapScanner,addAction:function(a,b){this._actions.push({criterion:a,action:b})},mapScan:function(a,b,c){var d,e,f,g;for(c=this.mapHeight;c--;)for(d=a;dc){b.sendMessage(Messages.NOT_ENOUGH_POWER);return}f!==Direction.INVALID&&e.move(f);this.powerGridMap.worldSet(e.x,e.y,1);g=0;for(var h=Direction.BEGIN;hg;)this.testForConductive(e,h)&&(g++,f=h),h=Direction.increment90(h);1f;f++)a.addTileFlags(b+d[f],c+e[f],Tile.ANIMBIT)},nuclearPowerFound:function(a,b,c,d){d=[3E4,2E4,1E4];if(!this.sim.disasterManager.disastersEnabled||0!==Random.getRandom(d[this.sim.gameLevel]))if(this.sim.census.nuclearPowerPop+=1,this._powerStack.push(new a.Position(b,c)),!this.sim.is3D)for(d=0;4>d;d++)a.addTileFlags(b,c,Tile.ANIMBIT| Tile.CONDBIT|Tile.POWERBIT|Tile.BURNBIT)},registerHandlers:function(a,b){a.addAction(Tile.POWERPLANT,this.coalPowerFound.bind(this));a.addAction(Tile.NUCLEAR,this.nuclearPowerFound.bind(this));b.addAction(Tile.POWERPLANT,7,4);b.addAction(Tile.NUCLEAR,7,4)}};Micro.RepairManager=function(a){this._map=a;this._actions=[]}; Micro.RepairManager.prototype={constructor:Micro.RepairManager,addAction:function(a,b,c){this._actions.push({criterion:a,period:b,zoneSize:c})},repairZone:function(a,b,c){for(var d=this._map.getTileValue(a,b)-c-2,e=-1;e=Tile.ROADBASE)&&this._map.setTo(a+f,b+e,new Micro.Tile(d,Tile.CONDBIT|Tile.BURNBIT)))}},checkTile:function(a,b,c){for(var d=0,e=this._actions.length;d< e;d++){var f=this._actions[d];if(0===(c&f.period)){var g=this._map.getTile(a,b),h=g.getValue(),k=Micro.isCallable(f.criterion);k&&f.criterion.call(null,g)?this.repairZone(a,b,f.zoneSize):k||f.criterion!==h||this.repairZone(a,b,f.zoneSize)}}}};Micro.vulnerable=function(a){var b=a.getValue();return bTile.LASTZONE||a.isZone()?!1:!0};Micro.DisasterManager=function(a,b,c){this._map=a;this._spriteManager=b;this._gameLevel=c;this._floodCount=0;this.DisChance=[4800,2400,60];this.Dx=[0,1,0,-1];this.Dy=[-1,0,1,0];Object.defineProperty(this,"disastersEnabled",Micro.makeConstantDescriptor(!1))}; Micro.DisasterManager.prototype={constructor:Micro.DisasterManager,doDisasters:function(a,b){this._floodCount&&this._floodCount--;if(this.disastersEnabled&&Random.getRandom(this.DisChance[this._gameLevel]))switch(Random.getRandom(8)){case 0:case 1:this.setFire(b);break;case 2:case 3:this.makeFlood(b);break;case 5:this._spriteManager.makeTornado(b);break;case 7:case 8:60(c?Tile.LHTHR:Tile.TREEBASE)&&gb;b++){var c=Random.getRandom(this._map.width-1),d=Random.getRandom(this._map.height-1),e=this._map.getTileValue(c,d);if(e>Tile.CHANNEL&&e<=Tile.WATER_HIGH)for(e=0;4>e;e++){var f=c+this.Dx[e],g=d+this.Dy[e];if(this._map.testBounds(f, g)){var h=this._map.getTile(f,g);h.getValue();if(h===Tile.DIRT||h.isBulldozable()&&h.isCombustible){this._map.setTo(f,g,new Tile(Tile.FLOOD));this._floodCount=30;a.sendMessage(Messages.FLOODING_REPORTED,{x:f,y:g});return}}}}},doFlood:function(a,b,c){if(0d;d++){if(Random.getChance(7)){var e=a+this.Dx[d],f=b+this.Dy[d];if(this._map.testBounds(e,f)){var g=this._map.getTile(e,f),h=g.getValue();if(g.isCombustible()||h===Tile.DIRT||h>=Tile.WOODS5&&hf;f++)if(e=b-20+Random.getRandom(40), d=c-15+Random.getRandom(30),this._map.testBounds(e,d)){var g=this._map.getTile(e,d);g.isZone()||(g.isCombustible()||g.getValue()===Tile.DIRT)&&this._map.setTo(e,d,new Tile(Tile.RADTILE))}a.sendMessage(Messages.NUCLEAR_MELTDOWN,{x:b,y:c})}};Micro.InputStatus=function(a){this.gameTools=new Micro.GameTools(a);this.canvas=document.getElementById(Micro.DEFAULT_ID);this.clickY=this.clickX=-1;this.right=this.left=this.down=this.up=!1;this.mouseY=this.mouseX=-1;this.currentTool=this.toolName=null;this.toolWidth=0;this.toolColour="";this.speedChangeRequested=this.disasterRequested=this.evalRequested=this.budgetRequested=!1;this.requestedSpeed=null;this.bindKeys();var b=this;this.canvas.addEventListener("mouseenter",function(a){b.mouseEnterHandler(a)}, !1);this.canvas.addEventListener("mouseleave",function(a){b.mouseLeaveHandler(a)},!1);a=document.getElementsByClassName("toolButton");for(var c=0;c=Tile.ROADBASE&&cb;b++){var c=a.x+Micro.perimX[b],d=a.y+Micro.perimY[b];if(this._map.testBounds(c,d)&&Micro.isDriveable(this._map.getTileValue(c,d)))return a.x=c,a.y=d,!0}return!1},tryDrive:function(a,b){for(var c=Direction.INVALID,d=new this._map.Position(a), e=0;ef;f++)d!=b&&Micro.isDriveable(this._map.getTileFromMapOrDefault(a,d,Tile.DIRT))?(c[f]=d,e++):c[f]=Direction.INVALID,d=Direction.rotate90(d);if(0===e)return Direction.INVALID; if(1===e)for(f=0;4>f;f++)if(c[f]!=Direction.INVALID)return c[f];for(f=Random.getRandom16()&3;c[f]===Direction.INVALID;)f=f+1&3;return c[f]},driveDone:function(a,b){return 0a||a>=this._map.width||0>h||h>=this._map.height)){var k=this._map.getTile(a,h);if(k.isZone()&&!k.isPowered()&&this.shouldBlink)g.push({x:a,y:h,tileValue:Tile.LIGHTNINGBOLT});else if(k.isAnimated()){var k=k.getValue(),l=Tile.TILE_INVALID,m;this._lastPainted&&(m=this._lastPainted.getTile(a,h));f?l=m&&this.inSequence(k,m)?this._data[m]:this._data[k]:m&&this.inSequence(k,m)&&(l=m);l!==Tile.TILE_INVALID&&(g.push({x:a,y:h,tileValue:l}),e.setTile(a,h,l))}}this._lastPainted=e;return g},registerSingleAnimation:function(a){for(var b= 1;barguments.length){if(!(a instanceof Micro.BlockMap)||2===arguments.length&&"function"!==typeof b)throw h;e=a;f=void 0===b?g:b}void 0!==e&&(a=e.gameMapWidth,b=e.gameMapHeight,c=e.blockSize,d=e.defaultValue);Object.defineProperties(this,{gameMapWidth:Micro.makeConstantDescriptor(a),gameMapHeight:Micro.makeConstantDescriptor(b),width:Micro.makeConstantDescriptor(Math.floor((a+1)/c)),height:Micro.makeConstantDescriptor(Math.floor((b+ 1)/c)),blockSize:Micro.makeConstantDescriptor(c),defaultValue:Micro.makeConstantDescriptor(d)});this.data=[];e?Micro.copyFrom.call(this,e,f):this.clear()}; Micro.BlockMap.prototype={constructor:Micro.BlockMap,clear:function(){for(var a=Math.floor(this.gameMapWidth/this.blockSize)+1,b=Math.floor(this.gameMapHeight/this.blockSize)+1;b--;)this.data[b]=Micro.makeArrayOf(a,this.defaultValue)},copyFrom:function(a,b){a.width===this.width&&a.height===this.height&&a.blockSize===this.blockSize||console.warn("Copying from incompatible blockMap!");for(var c=0,d=a.height;c=this.census.resZonePop&&this.messageManager.sendMessage(Messages.NEED_MORE_RESIDENTIAL);break;case 5:Math.floor(a/8)>=this.census.comZonePop&& this.messageManager.sendMessage(Messages.NEED_MORE_COMMERCIAL);break;case 10:Math.floor(a/8)>=this.census.indZonePop&&this.messageManager.sendMessage(Messages.NEED_MORE_INDUSTRIAL);break;case 14:10this.census.roadTotal&&this.messageManager.sendMessage(Messages.NEED_MORE_ROADS);break;case 18:50this.census.railTotal&&this.messageManager.sendMessage(Messages.NEED_MORE_RAILS);break;case 22:10this.census.poweredZoneCount/a&&this.messageManager.sendMessage(Messages.BLACKOUTS_REPORTED);break;case 35:60>2;if(1E6<=a)this.setYear(this.startingYear);else if(this._cityYearLast!==a||this._cityMonthLast!==b)this._cityYearLast=a,this._cityMonthLast=b,this.messageManager.sendMessage(Messages.DATE_UPDATED,{month:b,year:a})}};