Skip to content

Instantly share code, notes, and snippets.

@adler3d
Last active December 30, 2016 13:35
Show Gist options
  • Save adler3d/ad48c0f627990e3f34373bfa7e949267 to your computer and use it in GitHub Desktop.
Save adler3d/ad48c0f627990e3f34373bfa7e949267 to your computer and use it in GitHub Desktop.
var g_code=(()=>{
// BEGIN
var qapsort=(arr,cb)=>{if(typeof cb=='undefined')cb=e=>e;return arr.sort((a,b)=>cb(b)-cb(a));}
var mapaddfront=(obj,n)=>{for(var k in obj)n[k]=obj[k];return n;}
var mapclone=obj=>mapaddfront(obj,{});
var mapvals=m=>Object.values(m);
var mapkeys=m=>Object.keys(m);
var FToS=n=>(n+0).toFixed(2);var limit0=x=>x<0?0:x;
var drop_last_nums=s=>isNaN(s.slice(-1))?s:drop_last_nums(s.slice(0,-1));
var sn2i={};
var regunit_rod_and_frac=s=>{
var t=s.trim().split(',');
sn2i[t[0]]={rod:t[1],frac:t[2]};
};
//unit,rod,frac
(()=>{
pic,peh,ord
arb,str,ord
ric,cov,ord
ber,peh,war
gig,str,war
val,cov,war
fan,peh,mag
pir,str,mag
kas,cov,mag
}).toSource().split("\n").slice(1).slice(0,-1).map(regunit_rod_and_frac);
var humans="fan,pir,kas,ber,gig,val,pic,arb,ric".split(",");
"fan,pir,kas".split(",").map(e=>sn2i["dark"+e]=sn2i[e]);
"ber,gig,val".split(",").map(e=>sn2i[e+"nae"]=sn2i[e]);
"pic,arb,ric".split(",").map(e=>sn2i["gvard"+e]=sn2i[e]);
"fan,pir,kas".split(",").map(e=>sn2i["fro"+e]=sn2i[e]);
"ber,gig,val".split(",").map(e=>sn2i["fro"+e]=sn2i[e]);
"pic,arb,ric".split(",").map(e=>sn2i["fro"+e]=sn2i[e]);
var is_fro=u=>"frober,fropir,froric".split(",").includes(u);
var a2i=(name,arr)=>{
var out=mapaddfront({att:arr[0],hp:arr[1],soul:arr[2]},arr[3]?{cost:arr[3]}:{});
units[name]=out;
out.name=name;
out.short_name=drop_last_nums(name);
QapAssert(out.short_name in sn2i);
out.rod=sn2i[out.short_name].rod;
out.frac=sn2i[out.short_name].frac;
if(humans.includes(out.short_name))out.race="hum";
if(is_fro(name))out.race="fro";
return out;
};
var attmul=(u,k)=>{u=mapclone(u);u.att*=k;return u;}
var hpmul=(u,k)=>{u=mapclone(u);u.hp*=k;return u;}
var units={};
eval(
(()=>{
bur={att:88888,hp:1010101,soul:44,def:99,race:"meh"};
burx={att:1010101,hp:2020202,soul:44,def:99,race:"meh"};
rudxih={att:1230,hp:1002,def:99,race:"meh"};
rudxim={att:1200,hp:1001,def:99,race:"meh"};
rudxia={att:1260,hp:1003,def:99,race:"meh"};
com={att:200000,hp:900000,soul:44,def:70};
kre ={att:57,hp:65,soul:9,race:"hum"};
kre3={att:66,hp:80,soul:9,race:"hum"};
skelet_pod={att:150,hp:620,soul:50,cost:[20,1,1,1],race:"undead"};
elten={race:"el",att:100000000,hp:1,soul:0};
elvod={race:"el",att:4000,hp:2500,soul:0};
elair={race:"el",att:1385,hp:1310,soul:0,att_vs:{race:{gnom:500}}};
elair1={race:"el",att:1520,hp:1445,soul:0,att_vs:{race:{gnom:500}}};;
elair3={race:"el",att:1790,hp:1710,soul:0,att_vs:{race:{gnom:500}}};;
elogn={race:"el",att:1460,hp:1200,soul:0,att_vs:{race:{fro:500}}};
elogn3={race:"el",att:1900,hp:1570,soul:0,att_vs:{race:{fro:500}},cost:[60*60*24/(55*2)]};
}).toSource().split("\n").slice(1).slice(0,-1).map(e=>{
var t=e.split("={");t[0]=t[0].trim();
var t0s=JSON.stringify(t[0]);
return t[0]+"={unk:1,rod:'unk',frac:'unk',name:"+t0s+","+t[1]+";units["+t0s+"]="+t[0]+";";
}).join("\n")
);
skelet_pod.cost[0]=16.074844074844076;//timeexpr("pic*1+ric*208+arb*1+ric*221")/481==16.074844074844076;
/*
bad case: timeexpr("gig*74+pir*437")/751=17.58721704394141;
best_case: timeexpr("ric*420+arb*90")/706=11.473087818696884
*/
//rudxih,1230,1002,854;rudxim,1200,1001,1051;rudxia,1260,1003,836
//rudxih,maxn,854;rudxim,maxn,1051;rudxia,maxn,836
var line_fixer=e=>{
var t=e.split("=a2i(");t[0]=t[0].trim();return t[0]+"=a2i("+JSON.stringify(t[0])+","+t[1];
};
eval(
(()=>{
pic =a2i([37,135,10,[4,15,10,27]]);
pic1=a2i([39,140,10,pic.cost]);
pic3=a2i([43,155,10,pic.cost]);
pic4=a2i([46,165,10,pic.cost]);
pic5=a2i([49,170,10,pic.cost]);
pic6=a2i([52,180,10,pic.cost]);
arb =a2i([64,170,15,[6,20,25,33]]);
arb1=a2i([68,180,15,arb.cost]);
arb3=a2i([76,200,15,arb.cost]);
arb4=a2i([81,210,15,arb.cost]);
arb7=a2i([96,250,15,arb.cost]);
ric =a2i([140,690,45,[18,130,90,14]]);
ric3=a2i([170,800,45,ric.cost]);
ric4=a2i([180,840,45,ric.cost]);
ber =a2i([165,420,35,[14,30,90,62]]);
ber3=a2i([190,490,35,ber.cost]);
pir =a2i([230,410,40,[16,90,88,30]]);
pir2=a2i([250,460,40,pir.cost]);
pir5=a2i([290,530,40,pir.cost]);
pir6=a2i([310,560,40,pir.cost]);
val =a2i([280,1300,80,[32,90,198,128]]);
val2=a2i([310,1400,80,val.cost]);
val3=a2i([330,1500,80,val.cost]);
fan =a2i([580,1700,130,[52,290,376,10]]);
fan1=a2i([610,1800,130,fan.cost]);
fan3=a2i([670,2000,130,fan.cost]);
fan5=a2i([750,2200,130,fan.cost]);
gig =a2i([1150,2400,210,[84,277,528,287]]);
gig1=a2i([1200,2500,210,gig.cost]);
gig5=a2i([1500,3100,210,gig.cost]);
kas =a2i([1500,1500,180,[72,390,510,36]]);
kas1=a2i([1600,1600,180,kas.cost]);
kas4=a2i([1900,1900,180,kas.cost]);
darkfan=a2i([790,2350,130,fan.cost.map(e=>e*2)]);
darkpir=a2i([330,600,40,pir.cost.map(e=>e*2)]);
darkkas=a2i([2000,2000,180,kas.cost.map(e=>e*2)]);
bernae=a2i([255,640,35,ber.cost.map(e=>e*2)]);
gignae=a2i([1590,3300,210,gig.cost.map(e=>e*2)]);
valnae=a2i([410,1850,80,val.cost.map(e=>e*2)]);
gvardpic=a2i([60,205,10,pic.cost.map(e=>e*2)]);
gvardarb=a2i([105,265,15,arb.cost.map(e=>e*2)]);
gvardric=a2i([230,1060,45,ric.cost.map(e=>e*2)]);
}).toSource().split("\n").slice(1).slice(0,-1).map(line_fixer).join("\n")
);
arr_rod ="peh,str,cov".split(",");
arr_frac="ord,war,mag".split(",");
//u,rod,frac
/*
pic,peh,ord
arb,str,ord
ric,cov,ord
ber,peh,war
gig,str,war
val,cov,war
fan,peh,mag
pir,str,mag
kas,cov,mag
*/
var strings_for_eval=[];
var gnomes={};
var g_str_gnomes="gnompeh,990,840,cov:50,str:35;gnomstr,1020,960,peh:50,cov:35;gnomcov,1060,1020,str:50,peh:35";
g_str_gnomes.split(";").map(e=>e.split(",")).map(e=>{
var u=e[0];
gnomes[u]={name:u,att:e[1]|0,hp:e[2]|0,rod:e[0].slice(-3),frac:"gnom",enemy_rods:eval("0||{"+e[3]+","+e[4]+"}")}
units[u]=gnomes[u];
strings_for_eval.push("var "+u+"=units."+u+";");
});
strings_for_eval=strings_for_eval.join("\n");
eval(strings_for_eval);
var strings_for_eval=[];
var info=[
"gig5,40,60;arb7,40,60;kas4,40,60",
"val6,390,1750,40,60;pic7,55,190,40,60;pir6,310,560,40,60;"+
"kas4,1900,1900,40,60;ric7,220,990,40,60;"+
"ric1,150,720,16,24;pic1,39,140,16,24;"+
"fan5,750,2200,40,60;"+
"arb4,81,210,28,42;"+
"pic6,52,180,36,54;"+
"darkpir,330,600,50,70;"+
"ber5,215,540,32,48;"+
"pir2,250,460,24,36;pic4,46,165,28,42;ric7,220,990,40,60;"+
"gig2,1250,2600,28,42;fan2,640,1900,28,42;pir3,260,480,28,42;ric4,180,840,28,42;"+
"val4,350,1550,32,48;pir4,280,510,32,48;pic5,49,170,32,48;gig3,1350,2800,32,48;kas2,1700,1700,32,48;"+
"ric6,205,940,36,54;arb6,91,235,36,54;ber4,200,510,28,42;gig4,1400,2900,36,54;kas3,1800,1800,36,54;"+
"frober,280,680,55,75;fropir,350,650,55,75;froric,350,1100,55,75;"+
"fan3,670,200,32,48",
"gig5,1500,3100,40,60",
];
var unit_dmg_koef_for_next={};
//24,36;lvl3,pic,arb,ric,ber;lvl2,pir,val;lvl1,fan,gig;def,kas;
"kas4".split(",").map(e=>{unit_dmg_koef_for_next[e+"4"]={rod:40,frac:60};});
"kas".split(",").map(e=>{unit_dmg_koef_for_next[e+"1"]={rod:28,frac:42};});
"pic,arb,ric,ber".split(",").map(e=>{unit_dmg_koef_for_next[e+"3"]={rod:24,frac:36};});
"pir,val".split(",").map(e=>{unit_dmg_koef_for_next[e+"2"]={rod:24,frac:36};});
"fan,gig".split(",").map(e=>{unit_dmg_koef_for_next[e+"1"]={rod:24,frac:36};});
"kas".split(",").map(e=>{unit_dmg_koef_for_next[e ]={rod:24,frac:36};});
"pic,arb,ric,ber".split(",").map(e=>{unit_dmg_koef_for_next[e ]={rod:12,frac:18};});
"pir,val".split(",").map(e=>{unit_dmg_koef_for_next[e ]={rod:16,frac:24};});
"fan,gig".split(",").map(e=>{unit_dmg_koef_for_next[e ]={rod:20,frac:30};});
"fan,pir,kas".split(",").map(e=>unit_dmg_koef_for_next["dark"+e]={rod:50,frac:70});
"ber,gig,val".split(",").map(e=>unit_dmg_koef_for_next[e+"nae"]={rod:50,frac:70});
"pic,arb,ric".split(",").map(e=>unit_dmg_koef_for_next["gvard"+e]={rod:50,frac:70});
info[1].split(";").map(e=>{
var t=e.split(",");
var u=t[0];var su=drop_last_nums(u);if(is_fro(u))su=u.substr("fro".length);
QapAssert(su in units);
strings_for_eval.push(u+"=a2i(["+t[1]+","+t[2]+","+su+".soul,"+su+".cost]);");
unit_dmg_koef_for_next[u]={rod:+t[2+1],frac:+t[2+2]};
});
strings_for_eval=strings_for_eval.map(line_fixer).join("\n");
eval(strings_for_eval);
info[0].split(";").map(e=>{
var t=e.split(",");
var u=t[0];
QapAssert(u in units);
unit_dmg_koef_for_next[u]={rod:+t[1],frac:+t[2]};
});
var get_dmg_koef_for_next_rod=u=>{
QapAssert(u in units);
if(units[u].rod=="unk")return 0;
QapAssert(u in unit_dmg_koef_for_next);
return unit_dmg_koef_for_next[u].rod;
};
var get_dmg_koef_for_next_frac=u=>{
QapAssert(u in units);
if(units[u].frac=="unk")return 0;
if(units[u].frac=="gnom")return 0;
QapAssert(u in unit_dmg_koef_for_next);
return unit_dmg_koef_for_next[u].frac;
};
var unit2rod=(u)=>{
QapAssert(u in units);
QapAssert("rod" in units[u]);
return units[u].rod;
}
var unit2frac=(u)=>{
QapAssert(u in units);
QapAssert("frac" in units[u]);
return units[u].frac;
}
var nextrod=s=>{
var allowed={unk:1};
if(s in allowed)return s;
QapAssert(arr_rod.includes(s));
return arr_rod[(arr_rod.indexOf(s)+3-1)%3];
}
var nextfrac=s=>{
var allowed={unk:1,gnom:1};
if(s in allowed)return s;
QapAssert(arr_frac.includes(s));
return arr_frac[(arr_frac.indexOf(s)+3-1)%3];
}
var the_same_frac=(a,b)=>a==b;
var the_same_rod=(a,b)=>a==b;
//str,peh; peh,peh; 1; to
var get_rod_koef=(from,to)=>{
if(from.name in gnomes){
var er=unit2rod(to.name);
var ers=from.enemy_rods;
return (er in ers)?ers[er]:0;
}
return the_same_rod(nextrod(unit2rod(from.name)),unit2rod(to.name))?get_dmg_koef_for_next_rod(from.name):0.0;
}
var get_frac_koef=(from,to)=>{
var el_dmg=0;
if("att_vs" in from)
{
//QapAssert(0);//throw Error("yup");
QapAssert("frac" in to);
QapAssert("rod" in to);
QapAssert("race" in to);
var att_vs=from.att_vs;
if("race" in att_vs)if(to.race in att_vs.race){
el_dmg+=att_vs.race[to.race];
}
if("frac" in att_vs)if(to.frac in att_vs.frac){
el_dmg+=att_vs.frac[to.frac];
}
if("rod" in att_vs)if(to.rod in att_vs.rod){
el_dmg+=att_vs.rod[to.rod];
}
//QapDebugMsg([from,to,el_dmg,att_vs],"some text");
}
var k=the_same_frac(nextfrac(unit2frac(from.name)),unit2frac(to.name))?get_dmg_koef_for_next_frac(from.name):0.0;
return el_dmg+k;
}
//arb,pir
var get_dmg_koef=(from,to)=>{
QapAssert("name" in from);
QapAssert("name" in to);
return 1+(get_rod_koef(from,to)+get_frac_koef(from,to))/100;
};
/*
a=gig1;an=4;b=pic1;bn=92;nolog=1;env={
a:make_dmg_bons_env("unk,0;mag,15;war,15;ord,20"),
b:make_dmg_bons_env("unk,0;mag,0;war,0;ord,0")
};
*/
//http://warlords.mail.ru/?iref=4672624379
var is_int=v=>(typeof v)=="number";
var sim=(a,an,b,bn,nolog,env)=>{
QapAssert(a);
QapAssert(a.name);
QapAssert(a.name in units);
QapAssert(b);
QapAssert(b.name);
QapAssert(b.name in units);
QapAssert(is_int(an));
if(!is_int(bn))console.log([an,bn]);
QapAssert(is_int(bn));
if(!nolog)var head_line="<b>"+a.name+"</b> * <b>"+an+"</b> vs <b>"+b.name+"</b> * <b>"+bn+"</b>";
//
//a=arb;an=1000;
//b=bur;bn=1;
//
if((typeof env)!=="undefined")
{
var clone=x=>JSON.parse(JSON.stringify(x));
a=clone(a);b=clone(b);
a.hp*=1.0+env.hp.a[unit2frac(a.name)]/100;
b.hp*=1.0+env.hp.b[unit2frac(b.name)]/100;
}
var ahpn=a.hp*an;
var bhpn=b.hp*bn;
var ahpn0=ahpn;var bhpn0=bhpn;
var trunc=x=>Math.trunc(x);
var f=(hpn,hp)=>{
if(hpn<0)return 0;
var ntn=trunc(hpn/hp);
return ntn+(+(ntn*hp!==hpn));
}
var other=a=>a==="a"?"b":"a";
var env_get_att_bons=(typeof env)==="undefined"?()=>0:(u,dmg_src)=>env.att[dmg_src][unit2frac(u.name)]/100;
var env_get_def_bons=(typeof env)==="undefined"?()=>0:(u,dmg_tar)=>env.def[dmg_tar][unit2rod(u.name)];
var dmg=(from,from_n,to,dmg_src)=>{
var def_bon=1.0+env_get_def_bons(to,other(dmg_src))/100;
var base=from.att*from_n*(1-(("def" in to)?to.def/100:0))/def_bon;
if(base!==base)console.log([to,from_n,from]);
QapAssert(from.att==from.att);
QapAssert(from_n==from_n);
QapAssert(def_bon==def_bon);
QapAssert(base==base);
var dmg_koef=get_dmg_koef(from,to);
QapAssert(dmg_koef==dmg_koef);
var att_bons=env_get_att_bons(from,dmg_src);
if(att_bons!=att_bons)console.log(env_get_att_bons.toSource());
QapAssert(att_bons==att_bons);
return base*get_dmg_koef(from,to)+base*env_get_att_bons(from,dmg_src);
};
var log=[];var a_dt=0;var b_dt=0;
var tolog=()=>({iter:i,an:an,"ahpn/ahpn0":FToS(limit0(ahpn*100/ahpn0))+"%",bn:bn,"bhpn/bhpn0":FToS(limit0(bhpn*100/bhpn0))+"%",a_dt:FToS(a_dt),b_dt:FToS(b_dt),ahpn:ahpn,bhpn:bhpn,ahpn});
for(var i=0;;i++){
if(!nolog)log.push(tolog());
if(an<=0||bn<=0||i>=50)break;
QapAssert(is_int(an));
if(!is_int(bn))console.log([i,bn]);
QapAssert(is_int(bn));
a_dt=dmg(b,bn,a,"b");
b_dt=dmg(a,an,b,"a");
if(i>=9){
var is_bur=u=>u.name=="bur"||u.name=="burx";
//bur_do_2x_dmg_after_iter_9
if(is_bur(b))a_dt*=2;
if(is_bur(a))b_dt*=2;
}
QapAssert(a_dt);
QapAssert(b_dt);
ahpn-=a_dt;
bhpn-=b_dt;
an=f(ahpn,a.hp);
bn=f(bhpn,b.hp);
}
if(!nolog)document.body.innerHTML="<pre>"+head_line+"\n"+PrintMyTable(log);
if(nolog)return [i,an,bn,tolog()];
return {iter:i,"ahpn/ahpn0":FToS(limit0(ahpn*100/ahpn0))+"%","bhpn/bhpn0":FToS(limit0(bhpn*100/bhpn0))+"%"};
};
//var ricvskas=mapclone(ric);ricvskas.att*=1.36;
//robja army: ber,540,1300 pic,170,1300 ric,210,700
var sim_pass=(x0,xn,dx,func)=>{for(var x=x0;x<xn;x+=dx)if(func(x))break;return x;}
var g_min_num_of_units_for_win_aft_war=1;
var unit_vs_bur=(unit,bur_u,bur_n,env)=>{
var beg=1;
var end=2<<23;
var dx=2<<20;
var burka=(typeof bur_u)!=="undefined"?bur_u:bur;
if((typeof bur_n)==="undefined")bur_n=1;
var f=x=>{var rv=sim(unit,x,burka,bur_n,1,env);return (rv[2]==0&&rv[1]>=g_min_num_of_units_for_win_aft_war);};
for(;dx>1;dx=dx>>1){
var n=sim_pass(beg,end,dx,f);
beg=n-dx;end=n+dx;
if(beg<0)beg=1;
}
var out=sim_pass(beg,end,1,f);
return [out,sim(unit,out,burka,bur_n,1,env)[3]];
}
/*
// bhpn/bhpn0 table starten when minimum when bur is deaded
var unit=gig;var unit_end=unit_vs_bur(unit);
var out=[];for(var i=0;i<100;i+=10)out.push(sim(bur,1,unit,unit_end+i,1)[3]);
document.body.innerHTML="<pre>"+PrintMyTable(out);
*/
if(false)
{
var bur_u=val6;var bur_n=494;
//var units="kre,pic,arb,ric,ber,pir,val,fan,gig,kas,darkpir,darkkas".split(",");
var tmp_units="pic3,arb3,ric3,ber3,pir2,val2,fan1,gig1,kas".split(",");
var costforn=(u,n)=>("cost" in eval(u))?FToS(eval(u).cost[0]*n/3600)+"h":"...";
var out=tmp_units.map(u=>{
var tmp=unit_vs_bur(eval(u),bur_u,bur_n);
return mapaddfront(tmp[1],{unit:u,n:tmp[0],time2build:costforn(u,tmp[0])})
//return {u:u,n:tmp[0]};
});
document.body.innerHTML="<pre>"+PrintMyTable(out);
}
//s = "mag,15;war,15;ord;20"; (today 2016.10.17 15:33)
var make_dmg_bons_env=s=>{var out={};s.split(";").map(e=>e.split(",")).map(e=>out[e[0]]=+e[1]);return out;}
var units20161025={
//pic3:6061,arb4:16962,ric3:1318,ber3:490,pir2:3443,val2:250,fan1:943,gig1:175,kas1:1166*,gvardpic:9124,darkkas:459
///*pic4:355,arb4:9931,/*ric3:3331,ber3:324,fan1:278,gig1:497,*/kas1:1317,darkfan:735
//pic4:9812,arb4:7818,ric3:580,pir2:2403,val2:973,fan1:250,gig2:1534,kas1:113//,elogn:711
///*pic4:3734,arb4:15769,ric3:1670*//*,ber3:569,pir2:743,*/val2:695/*,gig2:2,kas1:2770*////,elair:112
//pic4:4384,ric4:21361,ber3:822,pir3:7884,val2:1181,fan2:187,gig2:513,kas1:563,skelet_pod:20508
//pic4:6588,
//arb4:9317,ric4:26613,ber3:1276,pir3:7884/*,val2:1129*/,fan2:658/*,gig2:459,kas1:561*/,skelet_pod:19235
pic6:143000,arb6:44000,ric6:231000,ber5:10000,gig4:1246,val4:8812,fan3:3678,pir4:19346,kas3:3434,elogn3:914//,bur:1
};
var env_nobadtits={
units:mapkeys(units20161025).join(","),//"arb4,ric4,ber3,pir3,gig2,kas1,skelet_pod",//mapkeys(units20161025).join(",")+",darkkas,skelet_pod",
hp:{
a:make_dmg_bons_env("unk,0;mag,0;war,0;ord,10;gnom,0"),
b:make_dmg_bons_env("unk,0;mag,0;war,0;ord,0;gnom,0")
},
att:{
a:make_dmg_bons_env("unk,0;mag,25;war,25;ord,35;gnom,0"),
b:make_dmg_bons_env("unk,0;mag,0;war,0;ord,0;gnom,0")
},
def:{
a:{unk:0,peh:15,str:20,cov:25,gnom:0},
b:{unk:0,peh:0,str:0,cov:0,gnom:0}
}
};
var env_titsowner={
units:"pic,arb,ber,pir,val,fan,gig,kas",//",gvardric,bernae,valnae",
att:{
a:make_dmg_bons_env("unk,0;mag,0;war,0;ord,10"),
b:make_dmg_bons_env("unk,0;mag,0;war,0;ord,0")
},
def:{
a:{unk:0,ord:0,war:0,mag:0},
b:{unk:0,ord:0,war:0,mag:0}
}
};
//var env=env_titsowner; env.att.ord=15;// <---------------------- WARNING GOVNOKOD
var env=env_nobadtits;
var cls=()=>document.body.innerHTML="";
var btn=func=>func+" <a href='#' onclick="+JSON.stringify(func)+">exec</a>";
var headmsg='<pre><hr>timeexpr("");<hr>'+btn("cls();sim(kas1,9111111,gnompeh,192,0,env);rest_epta();")+"<hr>"+btn("g_min_num_of_units_for_win_aft_war=0;recalc_epta();")+"<hr>"+btn("g_min_num_of_units_for_win_aft_war=1;recalc_epta();");
var rest_epta=()=>document.body.innerHTML+=headmsg+"<hr>"+"g_min_num_of_units_for_win_aft_war = "+g_min_num_of_units_for_win_aft_war+"<hr>"+outs.join("\n<hr>\n")+"<hr><H1>END</H1><hr>";
var outs=[];var iter1_outs=[];
//var task="pic1,73,110;pic1,71,106;ric1,12,18;pic1,55,82";
var task="val6,329,494;pic7,2509,3764;pir6,510,765";
var task="val6,329,412;pic7,2509,3137;pir6,510,638";// 2016.10.17 20:52
var task="fan5,123,184;arb7,1114,1671;kas4,96,145";// oasis; 2016.10.18 9:36
var task="fan5,123,154;arb7,1114,1393;kas4,96,121";
var task="pic6,1072,1341;fan5,94,118;pir6,252,315;gig5,51,64";// room 6.
var task="rudxih,maxn,854;rudxim,maxn,1051;rudxia,maxn,836;burx,maxn,1";//room 9
var task="fan5,0,121;arb7,0,1183;kas4,0,82"; //room 7
var task="gig5,0,19;ber5,0,133;pir5,0,80;fan5,0,26"; //room 5
var task="gig5,0,165;arb7,0,2479;kas4,0,167"; //room 7
var task="kas4,0,202;gig5,0,169;ric7,0,2053";//room 7
var task="kas4,0,169;gig5,0,141;ric7,0,1711";//room 7
var task="fan5,0,115;elvod,0,34;kas4,0,90;gig5,0,77"; //room 6.
var task="gnompeh,0,223;gnomstr,0,348;gnomcov,0,276;gnompeh,0,267"; //room 8
var task="gnomcov,0,216;gnomcov,0,212;gnompeh,0,243;gnomstr,0,303";//room 8
//var task="val6,0,418;pic7,0,3136;pir6,0,798";//room 7
var task="skelet_pod,0,1370";// ric 1272 to 1104 skelet_pod;
var task="val6,0,394;pic7,0,3025;pir6,0,914"; //room 7
//var task="kas4,0,282;gig5,0,187;ric7,0,2366"; //oasis
//var task="gig5,0,175;arb7,0,2453;kas4,0,149";
//task="val4,0,201;pir4,0,403";
//task="pic5,0,1018;gig3,0,45";task="val4,0,80;pic5,0,622";task="kas2,0,20"; //500k cita
//var task="kas4,121,182;gig5,142,213;ric7,1443,2164"; // bezdna 7
//var task="val6,345,518;pic7,2697,4046;pir6,895,1342"; // oasis 7
var task="frober,0,821;fropir,0,332;frober,0,722;froric,0,1125";
var use_filter=1;
var recalc_epta=()=>{
outs.length=0;
iter1_outs.length=0;
task.split(";").map(k=>{
var t=k.split(",");
QapAssert(t[0] in units);
var bur_u=units[t[0]];var bur_n=+t[2];
var tmp_units=env.units.split(",");
var costforn=(u,n)=>("cost" in eval(u))?FToS(eval(u).cost[0]*n/60)+"m":"...";
var out=tmp_units.map(u=>{
var tmp=unit_vs_bur(eval(u),bur_u,bur_n,env);
return mapaddfront(tmp[1],{res:FToS(units20161025[u]/tmp[0])+"X",unit:u,n:tmp[0],time2build:costforn(u,tmp[0]),time2restore:costforn(u,tmp[0]-tmp[1].an)})
//return {u:u,n:tmp[0]};
});
if(use_filter)out=out.filter(e=>e.n<=units20161025[e.unit]);
out=qapsort(out,e=>e.time2restore.slice(0,-1));
var best=out.slice(-1)[0];var best_u=eval(best.unit);
var make_func_for_iter=target_iter=>{
return x=>{var rv=sim(best_u,x,bur_u,bur_n,1,env);return (rv[2]==0&&rv[1]>0&&rv[0]<=target_iter);};
};
var get_x=f=>{
var dx=1000000;
var x=sim_pass(1,8*dx,dx,f);
x=sim_pass(limit0(x-dx),x+dx,dx/10,f);dx=100000;
x=sim_pass(limit0(x-dx),x+dx,dx/10,f);dx=10000;
x=sim_pass(limit0(x-dx),x+dx,dx/10,f);dx=1000;
x=sim_pass(limit0(x-dx),x+dx,dx/10,f);dx=100;
x=sim_pass(limit0(x-dx),x+dx,dx/10,f);dx=10;
x=sim_pass(limit0(x-dx),x+dx,1,f);
return x;
};
//sim(best,x-1,bur_u,bur_n,2,env);
var iter1_out=tmp_units.map(unit=>{
var u=units[unit];
var target_iter=1;
var ux=get_x(x=>{var rv=sim(u,x,bur_u,bur_n,1,env);return (rv[2]==0&&rv[1]>0&&rv[0]<=target_iter);});
var tmp=sim(u,ux,bur_u,bur_n,1,env);
return {res:FToS(units20161025[unit]/ux)+"X",unit:unit,bef_n:ux,aft_n:tmp[1],iter:tmp[0],time2build:costforn(u,ux),time2restore:costforn(u,ux-tmp[1])}
//return {u:u,n:tmp[0]};
});
//if(use_filter)iter1_out=iter1_out.filter(e=>e.bef_n<=units20161025[e.unit]);
iter1_out=qapsort(iter1_out,e=>e.time2restore.slice(0,-1));
var bs=[];
if(g_min_num_of_units_for_win_aft_war==1)
{
for(var i=1;i<=8;i++)
{
var ux=get_x(make_func_for_iter(i));
if(i+0!=sim(best_u,ux-0,bur_u,bur_n,1,env)[0])break;
bs.push("// iter = "+(i+0)+"; "+btn("cls();sim("+best.unit+","+(ux-0)+","+bur_u.name+","+bur_n+",0,env);rest_epta();"));
if(i+1!=sim(best_u,ux-1,bur_u,bur_n,1,env)[0])break;
bs.push("// iter = "+(i+1)+"; "+btn("cls();sim("+best.unit+","+(ux-1)+","+bur_u.name+","+bur_n+",0,env);rest_epta();"));
}
}
var bn=btn("cls();sim("+best.unit+","+best.n+","+bur_u.name+","+bur_n+",0,env);rest_epta();");
bs.push(bn);
var second_table="<hr>below table with target_iter==1\n"+PrintMyTable(iter1_out);
(()=>{
var bs=[];var best=iter1_out.slice(-1)[0];var best_u=eval(best.unit);best.n=best.bef_n;
var make_func_for_iter=target_iter=>{
return x=>{var rv=sim(best_u,x,bur_u,bur_n,1,env);return (rv[2]==0&&rv[1]>0&&rv[0]<=target_iter);};
};
for(var i=1;i<=8;i++)
{
var ux=get_x(make_func_for_iter(i));
if(i+0!=sim(best_u,ux-0,bur_u,bur_n,1,env)[0])break;
bs.push("// iter = "+(i+0)+"; "+btn("cls();sim("+best.unit+","+(ux-0)+","+bur_u.name+","+bur_n+",0,env);rest_epta();"));
if(i+1!=sim(best_u,ux-1,bur_u,bur_n,1,env)[0])break;
bs.push("// iter = "+(i+1)+"; "+btn("cls();sim("+best.unit+","+(ux-1)+","+bur_u.name+","+bur_n+",0,env);rest_epta();"));
}
var bn=btn("cls();sim("+best.unit+","+best.n+","+bur_u.name+","+bur_n+",0,env);rest_epta();");
bs.push(bn);
second_table+="\n"+bs.join("\n");
})();
//second_table="";
outs.push("unit = "+t[0]+"; n = "+bur_n+"\n"+PrintMyTable(out)+"\n"+bs.join("\n")+second_table);
});
document.body.innerHTML="";rest_epta();
};
//sim(kas1,9111111,gnompeh,192,0,env);
recalc_epta();
var timeexpr=s=>s.split("+").reduce((pv,e)=>{var t=e.split("*");return pv+(+t[1])*eval(t[0]).cost[0];},0);
timeexpr("arb*925+val*162+pic*2076");
//sim(ber,1448,kas4,212)
//sim(ric,1007,gig5,153)
//sim(ric,1,ric7,1797)
//--- +++++ +++ ---///
//sim(ber3,1203,val6,494);//4.68h;12iter
//sim(pir2,1019,pic7,3764);//4.53h;10iter;
//sim(kas,191,pir6,765);//3.82h;4iter;
//--- below old ---//
//sim(ber,1448,kas4,212)
//sim(ric,1007,gig5,153)
//sim(ric,1,ric7,1797)
//bin_search(,x=>sim(bur,1,arb,x,)[1]==0?+1:-1);
//sim(bur,1,arb,50000);
//sim(kas1,179,val6,412,0,env)
//sim(arb3,1281,fan5,154,0,env) //4
//sim(val2,290,arb7,1393,0,env) //4
//sim(arb3,2476,fan5,154,0,env) //2
//sim(val2,641,arb7,1393,0,env) //2
//sim(kas1,137,kas4,121,0,env) //1
//stop cond
/*
var f=x=>{var rv=sim(gig,x,pic6,1072,1,env);return (rv[2]==0&&rv[1]>0&&rv[0]==1);};
var x=sim_pass(1,30000,1,f);
sim(gig,x-1,pic6,1072,0,env);
*/
/*
// USEFUL REQUST: att cost per second
var u2attbon=u=>1+env.att.a[unit2frac(drop_last_nums(u))]/100;env.units.split(",").map(u=>eval(u)).map(u=>u.name+" = "+u2attbon(u.name)*u.att/u.cost[0]).join("\n")
// USEFUL REQUST: hp cost per second
env.units.split(",").map(u=>eval(u)).map(u=>u.name+" = "+u.hp/u.cost[0]).join("\n")
*/
}).toSource().split("\n").slice(1).slice(0,-1);
var QapDebugMsg=(msg,line,obj)=>{
var s="line "+line+":\n "+msg+"\ninfo:\n";
console.error(s,obj);throw new Error("no way!");return;
}
var json=s=>JSON.stringify(s);
var g_preproc=(s,id)=>{
var t=s.split("QapAssert(");
var get_params=t=>t[1].substr(0,t[1].lastIndexOf(");"));
var out=[];
var push=s=>out.push(json(s)+":"+s);
if(t.length!=2||t[0].includes("//")){
t=s.split("QapDebugMsg(");//QapDebugMsg([var_a,var_b],"some text");
if(t.length!=2||t[0].includes("//"))return s;
get_params(t).split("[")[1].split("]")[0].split(",").map(v=>push(v));
if(out.length)info="{"+out.join(",")+"}";
var msg=get_params(t).split("],").slice(1).join("],");
return "QapDebugMsg('debug message: '+"+msg+","+(id+2)+","+info+");";
}
var params=get_params(t);
var info=params;
if(params.split(" in ").length>1){
var t=params.split(" in ");
push(t[0]);push("mapkeys("+t[1]+")");push(t[1]);
}
if(params.split("==").length>1){
var t=params.split("==");
push(t[0]);if(t[0]!=t[1])push(t[1]);
}
if(out.length)info="{"+out.join(",")+"}";
//return "if(!("+params+"))throw new Error()";
return "if(!("+params+"))QapDebugMsg('assertion failed: '+"+json(params)+","+(id+2)+","+info+");";
};
g_code=g_code.map(g_preproc).join("\n");
eval(g_code);"done: "+ new Date();
//cls();sim(kas1,9111111,gnompeh,192,0,env);rest_epta();
//document.body.innerHTML="<pre>"+escapeHtml(g_code)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment