\n"); document.write("\n"); } function sortascend(a,b) { var i; for(i = 2; i < a.length; i++) { if( (a[i]-b[i]) != 0 ) { return a[i]-b[i]; } } // Could not distinguish return 0; } function sortdescend(a,b) { return sortascend(b,a); } function arraycmp(a,b,start) { var i; for(i = start; i < a.length; i++) { if(a[i] != b[i]) { return 1; } } return 0; } function updateinit(code,racesort,showvotes) { var rank = 0; for(j = 0; j < numraces; j++) { if( (j==0) || (arraycmp(racesort[j],racesort[j-1],2) != 0) ) { rank++; el(code+"0"+j).innerHTML = ""+rank+"."; } else { el(code+"0"+j).innerHTML = ""; } el(code+"1"+j).innerHTML = races[racesort[j][0]].name; el(code+"2"+j).innerHTML = racesort[j][2]; el(code+"3"+j).innerHTML = racesort[j][3]; if(showvotes) { el(code+"v"+j).innerHTML = racesort[j][1]; } } } function recalc() { var recalcstart = new Date().getTime(); var planetsneutral = 0; var planetcount = new Array(numraces); var planetreses = new Array(numraces); var influence = new Array(numraces); for(j = 0; j < numraces; j++) { planetcount[j] = 0; planetreses[j] = 0; influence[j] = 0; } // Sum up planet information for(i = 0; i < numplanets; i++) { var planet = planets[i]; var txt = " "+planet.res+"/"+planet.inf; if(planet.tech != 0) { txt = txt + " " + techs[planet.tech].icon16img(); } var value = radiovalue("pn"+i); if(value == "n") { planetsneutral++; } for(j = 0; j < numraces; j++) { var elm = el("pno"+i+j); if(j == value) { elm.innerHTML = txt; planetcount[j]++; var sarboost = 0; if(checkvalue("tspy"+j)) { sarboost = 1; } planetreses[j] = planetreses[j] + planet.res + sarboost; influence[j] = influence[j] + planet.inf; } else { elm.innerHTML = ""; } } } // Write planet information var elm2 = el("plcn"); elm2.innerHTML = planetsneutral; var laborlaw = lawpassed("llp"); for(j = 0; j < numraces; j++) { var elm = el("plc"+j); elm.innerHTML = planetcount[j]; var plcredits = el("plr"+j); var plvotes = el("plv"+j); if(laborlaw) { // Labor Law Politics voted in: You get votes for // resources and credits for influence var t = plcredits; plcredits = plvotes; plvotes = t; } plcredits.innerHTML = planetreses[j]; plvotes.innerHTML = influence[j]; } // Enviro compensators var envirocomp = new Array(numraces); for(j = 0; j < numraces; j++) { envirocomp[j] = 0; if(checkvalue("tepy"+j)) { // Has enviro compensators var numdocks = parseInt(selectvalue("nsd"+j)); envirocomp[j] = numdocks; } if(laborlaw) { el("ecv"+j).innerHTML = 0; el("eci"+j).innerHTML = envirocomp[j]; } else { el("ecv"+j).innerHTML = envirocomp[j]; el("eci"+j).innerHTML = 0; } } if(laborlaw) { el("planetvote").innerHTML = "Resources"; el("planetcredit").innerHTML = "Influence"; } else { el("planetcredit").innerHTML = "Resources"; el("planetvote").innerHTML = "Influence"; } // Sum up trade agreement information var racetrades = new Array(numraces); for(i = 0; i < numraces; i++) { racetrades[i] = 0; } var tradecount = 0; var traderest = lawpassed("tr"); var freetrade = lawpassed("ft"); for(i = 0; i < numraces; i++) { for(j = 0; j < i; j++) { var result = checkvalue("tr"+i+j); if(result) { tradecount++; if(traderest) { // Trade restrictions: Only get the benefit // of the lesser numbe of planets. var boost = planetcount[j]; if(boost > planetcount[i]) { boost = planetcount[i]; } racetrades[i] = racetrades[i] + boost; racetrades[j] = racetrades[j] + boost; } else { // Normal trade: get benefit of partner's // planet count. racetrades[i] = racetrades[i] + planetcount[j]; racetrades[j] = racetrades[j] + planetcount[i]; } if(freetrade) { racetrades[i] = racetrades[i] + 5; racetrades[j] = racetrades[j] + 5; } if(checkvalue("tmpy"+i)) { racetrades[i] = racetrades[i] + 3; } if(checkvalue("tmpy"+j)) { racetrades[j] = racetrades[j] + 3; } } } } // Write trade agreement information for(j = 0; j < numraces; j++) { var elm = el("plta"+j); elm.innerHTML = racetrades[j]; } // Calculate tech costs // 1. Race basis, technology tariff law, subsidized study law var techcosts = new Array(numtechs); for(i = 1; i <= numtechs; i++) { techcosts[i] = new Array(numraces); } var rr = 0; if(lawpassed("rr")) { rr = 5; }; var subs = radiovalue("lawss"); var tariff = radiovalue("lawtt"); for(i = 1; i <= numtechs; i++) { var tariffcost = 0; if(i == tariff) { tariffcost = 10; } for(j = 0; j < numraces; j++) { var cost = racetechcost(races[j],i) + rr + tariffcost; if(subs != 0) { if(subs == i) { cost = cost - 5; } else { cost = cost + 3; } } techcosts[i][j] = cost; } } // Calculate tech costs, part ii // bonuses for planet ownership for(i = 0; i < numplanets; i++) { var planowner = radiovalue("pn"+i); if(planowner != "n") { var thetech = planets[i].tech; if(thetech != 0) { var discount = planets[i].res; if(checkvalue("tspy"+planowner)) { // Sarween tools. discount++; } techcosts[thetech][planowner] = techcosts[thetech][planowner] - discount; } } } // Write technology costs for(i = 1; i <= numtechs; i++) { for(j = 0; j < numraces; j++) { var elm = el("tc"+i+j); if(techcosts[i][j] < 0) { techcosts[i][j] = 0; } elm.innerHTML = techcosts[i][j]; } } // Calculate racial influence mods var raceinf = new Array(numraces); for(j = 0; j < numraces; j++) { raceinf[j] = 0; var elm = el("rav"+j); if(races[j].tradeisinf) { // +1 influence per trade agreement in play (Xxcha Kingdom) raceinf[j] = raceinf[j] + tradecount; } if(races[j].humaninf) { // +1 influence per planet owned, excepting homeworlds var i; var count = 0; for(i = 0; i < numplanets; i++) { var value = radiovalue("pn"+i); if(value == j && planets[i].homeworld != j) { count++; } } raceinf[j] = raceinf[j] + count; } } // Write racial influence mods for(j = 0; j < numraces; j++) { var v; var c; if(laborlaw) { c = raceinf[j]; v = 0; } else { v = raceinf[j]; c = 0; } el("rav"+j).innerHTML = v; el("rai"+j).innerHTML = c; } // Calculate and write total income and votes var gtotalvotes = new Array(numraces); var gtotalmoney = new Array(numraces); var gtotalinf = new Array(numraces); var gtotalres = new Array(numraces); for(j = 0; j < numraces; j++) { var planetmoney; var planetvotes; var ecmoney; var ecvotes; var racemoney; var racevotes; if(laborlaw) { // Labor law politics in effect planetvotes = planetreses[j]; planetmoney = influence[j]; racemoney = raceinf[j]; racevotes = 0; ecmoney = envirocomp[j]; ecvotes = 0; } else { planetmoney = planetreses[j]; planetvotes = influence[j]; racemoney = 0; racevotes = raceinf[j]; ecmoney = 0; ecvotes = envirocomp[j]; } var trademoney = racetrades[j]; var totalmoney = planetmoney + racemoney + ecmoney + trademoney; var totalvotes = planetvotes + racevotes + ecvotes; gtotalvotes[j] = totalvotes; gtotalmoney[j] = totalmoney; gtotalinf[j] = influence[j] + raceinf[j] + envirocomp[j]; gtotalres[j] = planetreses[j]; var elm; elm = el("inc"+j); elm.innerHTML = totalmoney;; elm = el("vot"+j); elm.innerHTML = totalvotes; } var racesort = new Array(numraces); for(j = 0; j < numraces; j++) { racesort[j] = new Array(4); racesort[j][0] = j; racesort[j][1] = gtotalvotes[j]; racesort[j][2] = gtotalinf[j]; racesort[j][3] = gtotalres[j]; } racesort.sort(sortascend); updateinit("vo",racesort,1); racesort.sort(sortdescend); updateinit("io",racesort,0); var recalcend = new Date().getTime(); var recalctime = (recalcend - recalcstart)/1000.0; //debugmsg("Recalc took "+recalctime+" seconds."); } function autorecalcnow() { if(checkvalue("autorecalc")) { recalc(); } } var i; var j; //-->

Twilight Imperium Second Edition Calculator

Version 1.0
Software copyright 2005 Alan De Smet
Based on Twilight Imperium Second Edition by Fantasy Flight Games
Updates and more information is here

LawsNot YetForAgainst
Law: Subsidized Studies
Technologies
Enviro Compensator
Sarween Tools
Micro Technology
Planets Owned
Trade Agreements
Totals
Space Docks
Income
    Planetary Resources
    Trade Agreements
    Enviro Compensators
    Racial Benefit
Votes
    Planetary Influence
    Enviro Compensators
    Racial Benefit
Technology Costs