Quick Planner

opaw

Elite medlem
Reaktionsscore
0
Af en eller anden grund mangler min quick Planner her, selv om jeg er sikker på at jeg har lagt den ind.

Det er et simpelt script til at beregne rejsetider, og hvornår tropperne skal sendes afsted fra de forskellige byer får at være der til et bestemt tidspunkt.

Scriptet kan bruges til at planlægge angreb med, men det er en smagssag om man kan lide det til det. Der hvor scriptet for alvor har sin styrke er når man vil snippe et adeltog eller backtime et angreb. Her skal det ofte gå stærkt, og det er en fordel at der er så lidt der skal skrives ind for at beregne hvornår man skal snippe eller backtime.

Kode:
javascript:
  var win = (window.frames.length>0)?window.main:window;
  
  function isWindow(frame, tab) {
    return win.game_data.screen==frame;
  }
  
  function getTab() {
    var res = null;
    if(!(res=win.document.getElementById( 'combined_table'))){
      res = win.document.getElementById( 'production_table' );
    }
    return res;
  }
  
  function ajaxRequest(url,sendMethod,params,type){
    var error=null,payload=null;
    win.$.ajax(
      {"async":false,
      "url":url,
      "data":params,
      "dataType":type,
      "type":String(sendMethod||"GET").toUpperCase(),
      "error":function(req,status,err){
	error="ajax: "+status},
	"success":function(data,status,req){
	  payload=data;
	}
      }
    );
    if(error){
      throw(error);
    }
    return payload;
  }
  
  function getUnitConfig(){
    return win.$(ajaxRequest("/interface.php","GET",{"func":"get_unit_info"},"xml")).find("config")
  }
  
  function getUnitSpeeds() {
    var unitConfig=getUnitConfig();
    var config=[];
    win.$(unitConfig).children().each(
      function(i,e){
	config.push("\""+e.nodeName+"\":"+win.$(e).find("speed").text())
      }
    );
    var res = [config.length];
    for(i=0;i<config.length;i++){
      res[i] = { 
	name:config[i].substring(1,config[i].indexOf('\":')),
	speed:parseFloat( config[i].substring( config[i].indexOf(':')+1, config[i].length, 10 ) )
      }
    }
    return res;
  }
  
  function getCoords(str) {
    coordstr = str.split('|');
    l = coordstr.length;
    if(l>1){
      rstr=coordstr[l-2]+'|'+coordstr[l-1];
      p=rstr.indexOf('|');
      rstr=rstr.substring(p-3,p+4);
    }
    return rstr;
  }
  
  function TWdate(date){
    d = date.getDate()+'.'+(date.getMonth()+1)+'.'+(date.getYear()+1900);
    t = date.getHours()+':'+date.getMinutes()+':'+date.getSeconds();
    p = d+' '+t;
    b = d+' [b]<b>'+t+'</b>[/b]';
    return {
      date:d,
      time:t,
      plain:p,
      bold:b
    }
  }

  function setDate(iDate,iTime){
    var date=iDate.split('.');
    var rDate=new Date(parseInt(date[2]),parseInt(date[1])-1,parseInt(date[0]));
    var time=iTime.split(':');
    rDate.setHours(parseInt(time[0]));
    rDate.setMinutes(parseInt(time[1]));
    rDate.setSeconds(parseInt(time[2]));
    return rDate
  }


  function travelTime( time ) {
    var tDate = new Date( time );
    var s = '(';
    if((day=Math.floor(time/86400000))>0) { s = s+day+'d '; }
    s=s+(tDate.getHours()-1)+':'+tDate.getMinutes()+':'+tDate.getSeconds()+')';
    return s;
  }

  function getDist(b1,b2){
    var dest=0;
    if(b2.indexOf('err')==-1){
      var b1=b1.split('|');
      b2=b2.split('|');
      var dx=parseInt(b1[0])-parseInt(b2[0]);
      var dy=parseInt(b1[1])-parseInt(b2[1]);
      dest=Math.sqrt(dx*dx+dy*dy);
    }
    return dest;
  }

  function getSpeed( unit ) {
    for(i=0;i<unitSpeed.length;i++){
      if(unit.indexOf(unitSpeed[i].name)!=-1){
        return unitSpeed[i].speed;
      }
    }
    return null;
  }
  
  function getAttack( source, target, unit, date, time ) {
    tt = getDist( source, target )*getSpeed(unit)*60000;
    ht = setDate( date, time );
    lt = new Date( ht.getTime()-tt );
    tr = '[*]'+TWdate(lt).bold+'[|][coord]'+source+'[/coord][|][unit]'+unit+'[/unit][|][coord]'
	  +target+'[/coord][|]'+TWdate(ht).plain+'[|]'+travelTime(tt);
    return {
      source:source,
      target:target,
      unit:unit,
      travleTime: tt,
      hitTime:ht,
      launchTime:lt,
      tableRow:tr
    }
  }
  
  function before( first, last ) {
    return (first.launchTime.getTime()-last.launchTime.getTime());
  }
  
  var text = '';
    
  var tab=getTab();
  var unitSpeed = getUnitSpeeds();
  if(isWindow('overview_villages')&&tab) {
    var optionsList='Units:\n\t';
    for(i=0;i<unitSpeed.length;i++){
      optionsList=optionsList+unitSpeed[i].name+', ';
    }
    optionsList=optionsList+'\n\nCoords unit time';
    cmd = prompt( optionsList, '499|499 ram '+TWdate(new Date()).plain ).split(' ');
    
    var villages = tab.getElementsByTagName('tr');
    var attacks = [villages.length-1];
    for(v=1;v<villages.length;v++){
      attacks[v-1] = getAttack( 
		      getCoords(villages[v].getElementsByTagName('a')[0].innerHTML), 
		      getCoords(cmd[0]), cmd[1], cmd[2], cmd[3] );
      
    }
    attacks.sort(
      function(a,b){
	if(a.launchTime) {
	  return a.launchTime.getTime()>b.launchTime.getTime();
	}
	else{
	  return false;
	}
      }
    );
    var outcode ='<h1>Quick Planner</h1><p>[table]'
      +'[**]Launch Time[||]From[||]unit[||]At[||]Hit Time[||]Travel Time[/**]</p>\n';
    for(i=0;i<attacks.length;i++) {
      outcode+=attacks[i].tableRow;
    }
    outcode+='<p>[/table]</p>';
    var out = window.open();
    out.document.write( outcode );
    out.document.close();
  }
  else {
   alert( 'Gå til oversigt og vælg \"Kombineret\" eller \"Produktion\"' );
  }
  void(0);
[SPOILER="User Guide]
Det første man skal gøre er at lave sig nogen grupper der passer til scriptet, f.x offensiv, defensiv og adel, og lægge byerne ind under disse grupper.

Dernæst viser man den gruppe af byer, som har den slags enheder man ønsker at sende i oversigten, og aktivere scriptet.

Nu vil man blive spurgt om koordinaterne til den by man vil sende til. Hvilken slags enheder man vil sende og hvornår tropperne skal ankomme til målet. Herefter vil der åbne et nyt faneblad med bb-code, som man kan kopiere ind i sin notesbog.
Så vil man få en tabel der viser, hvornår tropperne skal sende fra de forskellige byer i gruppen og hvor lang rejsetiden er fra de forskellige byer.

Enhederne angives med deres genetiske navn:
spear, sword, axe, archer, spy, light, marcher, heavy, ram, catapult, snob, knight
[/SPOILER]
Jeg har en ticket, der godkender scriptet.
 
Top