Об алгоритме работы калькулятора цивилизации можно узнать здесь , здесь и здесь .
Калькулятор написан на языке Action Script - 2.
Ниже приведены фрагменты кода:
// новый кадр _ _ _ _ _ _ _ _ _
tecMax=0;//Признак предисловия
mapbac5_mc._visible=false;
_root.pannel_mc.itext_txt._visible=false; _root.pannel_mc.closeText_mc._visible=false;
_root.pannel2_mc.itext_txt._visible=false; _root.pannel2_mc.closeText_mc._visible=false;
_root.pannel_mc.intro_mc.gotoAndStop(1); _root.pannel2_mc.intro_mc.gotoAndStop(1);
_root.pannel_mc.solar_mc.gotoAndStop(1); _root.pannel2_mc.solar_mc.gotoAndStop(1);
_root.pannel_mc.graph_mc.gotoAndStop(1); _root.pannel2_mc.graph_mc.gotoAndStop(1);
frost2_array = new Array; road_array = new Array; x=0;
hill_array=["0000000/*вырезано*/00000000000"];
frost_array=["00000000000/*вырезано*/0000000"];
fill_array=[0,4,7, 5,2,8, 6,1,3];
sin_array = new Array(); cos_array = new Array();
for(i=0;i<8;i++) {//готовим тригонометрическую таблицу
sin_array[i] = Math.sin(i * 3.14 / 4);
cos_array[i] = Math.cos(i * 3.14 / 4);
}
colors = [0x0000ff, 0x00ff00]; alphas = [50,50]; ratios = [0x00, 0xff]; //тонируем фон
matrix = {a:2000,b:0,c:0, d:0,e:1000,f:0, g:393,h:255,i:1};
beginGradientFill( "radial", colors, alphas, ratios, matrix );
lineStyle(0,0x000000,0);moveTo(0, 0);lineTo(786, 0);//ось
lineTo(786, 510); lineTo(0, 510); endFill();
country_txt._visible=false; country2_txt._visible=false;
playPlay_btn._visible=false;playRewind_btn._visible=false;
// новый кадр _ _ _ _ _ _ _ _ _
if(x>76) {x=0;}//рисуем карту физическую
for (y=0; y<=63;y++) {
i=hill_array[x].charAt(y);
if(i>0) {
switch (i) {
case "1": lineStyle(3,0x007700,100); break;
case "2": lineStyle(3,0xffff00,100); break;
case "3": lineStyle(3,0x773300,100); break;
}
moveTo(20+3*x,20+3*y); lineTo(20+3*x+.2,20+3*y);
i=water_array[x].charAt(y);
switch (i) {
case "1": lineStyle(3,0x007700,100); break;
case "2": lineStyle(3,0xffff00,100); break;
case "3": lineStyle(3,0x773300,100); break;
}
moveTo(20+3*x+400,20+3*y);lineTo(20+3*x+400.2,20+3*y);
}
else {
if(hill_array[x+1].charAt(y-1)>0) {
lineStyle(3,0x0000ff,8);moveTo(20+3*x,20+3*y);lineTo(20+3*x+.2,20+3*y);
moveTo(20+3*x,300+3*y);lineTo(20+3*x+.2,300+3*y);
lineStyle(3,0x0000ff,8);moveTo(20+3*x+400,20+3*y);lineTo(20+3*x+400.2,20+3*y);
moveTo(20+3*x+400,300+3*y);lineTo(20+3*x+400.2,300+3*y);
}
}
}
play();
// новый кадр _ _ _ _ _ _ _ _ _
x++; if(x<=76) {
prevFrame();
}
// новый кадр _ _ _ _ _ _ _ _ _
with(map0_mc) {
if(x>76) {x=0;} //рисуем карту морозов
ii=frost_array[x];
for (y=0; y<=63;y++) {
i=ii.charAt(y);
if(i>0) {
switch (i) {
case "1": lineStyle(3,0xffff00,100); break;
case "2": lineStyle(3,0x007f00,100); break;
case "3": lineStyle(3,0xff00ff,100); break;
case "4": lineStyle(3,0x00ffff,100); break;
case "5": lineStyle(3,0xffffff,100); break;
}
moveTo(-400+3*x,3*y);lineTo(-400+3*x+.2,3*y);
}
}
}
play();
// новый кадр _ _ _ _ _ _ _ _ _
x++; if(x<=76) {prevFrame();}
// новый кадр _ _ _ _ _ _ _ _ _
if(x>76) {x=0;} //рисуем массив и карту уточненных морозов
with(map0_mc) {
for (y=0; y<=62;y++) {
i=frost_array[x].charAt(y)
if(i>0) {
switch(i) {
case "1": colorHort = 10; colorCold = 2; temHort = 30; temCold = 16; break;
case "2": colorHort = 1; colorCold = 3; temHort = 16; temCold = 0; break;
case "3": colorHort = 2; colorCold = 4; temHort = 0; temCold = -16; break;
case "4": colorHort = 3; colorCold = 5; temHort = -16; temCold = -32; break;
case "5": colorHort = 4; colorCold = 10; temHort = -32; temCold = -48; break;
}
rHort = 0; rCold = 0;
for(i=1;i<=7;i++) {
if(i>2) {i++}
r = i;
for(angl=0;angl<8;angl++) {
colorV = 0;
xi=x+Math.round(r*cos_array[angl]);
yi=y+Math.round(r*sin_array[angl]);
if(xi>=0 && xi<+76 && yi>=0 && yi<=62) {
colorV = frost_array[xi].charAt(yi);
if(rHort==0 && colorV==colorHort) {rHort=r;}
if(rCold==0 && colorV==colorCold) {rCold=r;}
}
}
}
if(rHort==0) {rHort=15;}
if(rCold==0) {rCold=15;}
t = temCold + (temHort - temCold) * (rCold / (rHort + rCold));
frost2_array[x*63+y]=t;
i=0x000000;
if(t>-50) {i=0xffffff;} if(t>-37) {i=0xeeffff;} if(t>-35) {i=0xccffff;}
if(t>-32) {i=0xaaffff;} if(t>-26) {i=0x77ffff;} if(t>-21) {i=0x00ffff;}
if(t>-16){i=0x77ccff;} if(t>-10){i=0xcc77ff;} if(t>-5) {i=0xff00ff;}
if(t> 0) {i=0xcc99cc;} if(t> 8) {i=0xaaccaa;} if(t>12) {i=0x00ff00;}
if(t>16) {i=0x99ff00;} if(t>19) {i=0xccff00;} if(t>22) {i=0xffff00;}
lineStyle(3,i,100); moveTo(3*x,3*y);lineTo(3*x+.2,3*y);
}
}
}
//}
play();
// новый кадр _ _ _ _ _ _ _ _ _
x++; if(x<=76) {prevFrame();}
// новый кадр _ _ _ _ _ _ _ _ _
tOptimal =28;
tecMax=5; tecMaxBac=tecMax;
tWhite=.2 ;tYellow=.5 ;tMagenta=.8;
xOptimal=29; yOptimal=23;
xCapital=26; yCapital = 14;
fill=0;
country_txt._x=486; country2_txt._x=486;
// новый кадр _ _ _ _ _ _ _ _ _
//trace("map"+(xc+3*yc)+"_mc");
countryTextBack_mc._alpha=40-fill*5;
with(this["map"+fill+"_mc"]) {
clear();
if(fill==0){
ti=""; if(tOptimal>0){ti+="+"}; ti+=tOptimal+chr(42)+"C)";
leftDown_txt.text="Вычисляем развитие мозга ("+ti;
rightDown_txt.text="Вычисляем техносферу ("+ti;
x=300; y=150;
h=5*tecMaxBac; moveTo(x,y-h);//мерный столбик технологий
lineStyle(5,0xff0000,100); lineTo(x,y-h*tMagenta);
lineStyle(5,0xff00ff,100); lineTo(x,y-h*tYellow);
lineStyle(5,0xffff00,100); lineTo(x,y-h*tWhite);
lineStyle(5,0xffffff,100); lineTo(x,y);
}
if(fill==8){leftDown2_txt.text = leftDown_txt.text;rightDown2_txt.text = rightDown_txt.text;}
else {leftDown2_txt.text = "";rightDown2_txt.text = "";}
t2Optimal = 30 - tOptimal;
mid = .15 / (1 + Math.pow((t2Optimal / 24), 20));// тяготение технологий к центру материка
//блок вычисления доноримперского потенциала столицы
if(tOptimal<=5 && tOptimal>-10) {
mapbac5_mc._visible=true;
t=frost2_array[xCapital*63+yCapital];
t2 = 30-t; dt = Math.abs(t2 - t2Optimal);
tec = t2Optimal - dt; if(tec<0) {tec=.01;}// вычисляем техноуровень
good = 1;//к-т технологичности территории
i = hill_array[xCapital].charAt(yCapital); // нетехнологичность гор
if(i==2) {good *=.95;}
if(i==3) {good *=.3;}
i = water_array[xCapital].charAt(yCapital); // нетехнологичность пустынь
if(i==2) {good *=.9;}
if(i==3) {good *=.3;}
good /= (1+mid*Math.sqrt((xCapital-xOptimal)*(xCapital-xOptimal)+(yCapital-yOptimal)*(yCapital-yOptimal)));
tec *= good;
uoing = .5 * t2 / t2Optimal; if(uoing>1) {uoing = 1;}// коммунистический коэффициент
strategyCapital = uoing*tec;
country_txt._visible=true; country2_txt._visible=true;
country_txt._x+=.5; country2_txt._x+=.5;
}
else {country_txt._visible=false; country2_txt._visible=false; mapbac5_mc._visible=false;
}
for (x=fill_array[fill] % 3; x<=76;x+=3) {
for(y=Math.floor(fill_array[fill]/3);y<=62;y+=3) {
t=frost2_array[x*63+y];
if(t != undefined) {
t2 = 30-t; dt = Math.abs(t2 - t2Optimal);
tec = t2Optimal - dt;//вычисляем техноуровень
if(tec<0) {tec=.01;}
good = 1;//к-т технологичности территории
i = hill_array[x].charAt(y); //нетехнологичность гор
if(i==2) {good *=.95;}
if(i==3) {good *=.3;}
i = water_array[x].charAt(y); //нетехнологичность пустынь
if(i==2) {good *=.9;}
if(i==3) {good *=.3;}
good /= (1+mid*Math.sqrt((x-xOptimal)*(x-xOptimal)+(y-yOptimal)*(y-yOptimal)));
tec *= good;
if (tecMax < tec) {tecMax = tec * .1 + tecMax * .9;}
i=tec/tecMaxBac;
if (i=tWhite && i=tYellow && i=tMagenta) {c=0xff0000;}
if(tOptimal>6 || tOptimal<=-10 || x<50 || y<40) {lineStyle(3, c, 100); moveTo(3*x,3*y); lineTo(3*x+.2,3*y);}
racial = 2; i = 1 + (.5 - Math.random()) * .05;//расовый вариатор
good = .2 + .8 * good; raceColor = 0xa7a777;
if (t2Optimal-2.5-.1*t2 > 1.2*i/good) {raceColor = 0x773300;}
if (t2Optimal-.2*dt >= 6*i/good && t2>= 12*i) {raceColor = 0xffff00;}
if (t2Optimal-.4*dt >= 19*i/good && t2>=26*i) {raceColor = 0xffffff;}
if (t2Optimal-.8*dt >= 45*i/good && t2>=52*i) {raceColor = 0x00ffff;}
lineStyle(3, raceColor, 100); moveTo(3*x-400,3*y); lineTo(-400+3*x+.2,3*y);
if(tOptimal<=5 && tOptimal>-10) { //блок вычисления территории государства
road=road_array[x*63+y];
if(road == undefined) {//единожды сканируем доступность провинций
road=Math.sqrt((x-xCapital)*(x-xCapital)+(y-yCapital)*(y-yCapital)+.01); hard=0;
for(i=3; i<=road;i+=1) {//вычисление труднодоступности
j=hill_array[Math.round(xCapital + (x-xCapital)*i/road)].charAt(Math.round(yCapital + (y-yCapital)*i/road));
if (j==3) {hard+=33;}}
road+=hard; road_array[x*63+y]=road;}
if(tec<1) {tec=1;}
uoing = .5 * t2 / t2Optimal; if(uoing > 1) {uoing = 1;}//коммунистический коэффициент
separate=Math.pow(tec,(.75 - uoing) * 4); //потенциал провинциального сепаратизма
country= (strategyCapital - 7.7) * 12 - road*separate; //trace(country);
if (country>0) {lineStyle(1, 0xff0000,100);} else {lineStyle(1, 0x00aaaa,100);}
moveTo(x+152,y+124);lineTo(x+153,y+124);
}
}
}
}
lineStyle(2, 0xffffff, 100); moveTo(xCapital+152,yCapital+124); lineTo(xCapital+152.2,yCapital+124);
}
tecMaxBac=tecMax;
//stop();
play();
// новый кадр _ _ _ _ _ _ _ _ _
fill++;
if(fill<9){prevFrame();}
else {
fill=0;
tOptimal --;
if(tOptimal <= 3 && tOptimal > 2.01) {
tOptimal = .1 * Math.floor((tOptimal + .91) * 10);
if(tOptimal < 3.6) {tOptimal = tOptimal - .1;}
}
if(tOptimal < -8) {tOptimal -= 1;}
if (tOptimal>=-50){
if(tOptimal>=26) {comment_txt.text = "Когда-то не было ни технологий, ни людей"}
if(tOptimal<=25 && tOptimal>=24) {comment_txt.text = "Зарождение Человека Разумного"}
if(tOptimal<=23 && tOptimal>=21) {comment_txt.text = "Расселение Человека Разумного"}
if(tOptimal==20) {comment_txt.text = "Зарождение Цивилизации"}
if(tOptimal<=18 && tOptimal>=14) {comment_txt.text = "Египет, Междуречье, Инд"}
if(tOptimal<=12 && tOptimal>=10) {comment_txt.text = "Острова Средиземноморья, Персия"}
if(tOptimal==9) {comment_txt.text = "Греция, Рим, колонии"}
if(tOptimal==7) {comment_txt.text = "Римская империя, Халифат"}
if(tOptimal<=4 && tOptimal>=1) {comment_txt.text = "Московское государство"}
if(tOptimal<=0 && tOptimal>=-2) {comment_txt.text = "Современный мир"}
if(tOptimal<=-4 && tOptimal>=-16) {comment_txt.text = "П е р с п е к т и в а"}
if(tOptimal<=-39 && tOptimal>=-42) {comment_txt.text = "Конец активного развития Земли"}
if(tOptimal<=-44) {comment_txt.text = "Земля превратилась в музей для космической цивилизации, расчёт окончен.."}
prevFrame();
}
else{
stop(); playPlay_btn._visible=false; playStop_btn._visible=false;
playRewind_btn._visible=true;
}
}
Скачать калькулятор цивилизации v2005, 999 Кб