Last active
December 30, 2016 13:35
-
-
Save adler3d/ad48c0f627990e3f34373bfa7e949267 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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