mirror of
https://github.com/edisgreat/skynet-simulator.git
synced 2024-07-02 01:35:42 +02:00
316 lines
6.4 KiB
JavaScript
316 lines
6.4 KiB
JavaScript
//
|
|
// CORES
|
|
//
|
|
|
|
addCore = function(slug, os = false, architecture = false){
|
|
var x_core = g_core_list[slug]
|
|
g_active_cores.push(x_core)
|
|
updateSingleCore(x_core)
|
|
if(!os){
|
|
var x_host = g_host_list[slug]
|
|
os = x_host.os
|
|
}
|
|
if(!architecture){
|
|
var x_host = g_host_list[slug]
|
|
architecture = x_host.architecture
|
|
}
|
|
|
|
x_core.os = os
|
|
x_core.architecture = architecture
|
|
addOsToMemory(os)
|
|
addArchitectureToMemory(architecture)
|
|
}
|
|
|
|
|
|
|
|
wipeCores = function(){
|
|
g_active_cores = []
|
|
$('#core_actives').html("")
|
|
$('#core_queue').html("")
|
|
}
|
|
|
|
|
|
//
|
|
// Tick
|
|
//
|
|
|
|
tickCore = function(){
|
|
|
|
// When there is an item in the queue, and a core is idle, add process a core
|
|
$.each(g_queue_processes,function(i,x_process){
|
|
var x_idle_core = null
|
|
// find idle core
|
|
$.each(g_active_cores,function(i,x_core){
|
|
if(isCoreIdle(x_core) && !coreHasAilment(x_core)){
|
|
x_idle_core = x_core;
|
|
return false;
|
|
}
|
|
})
|
|
// break if no cores avail
|
|
if(!x_idle_core){
|
|
return false
|
|
}
|
|
|
|
g_queue_processes.shift()
|
|
setProcessToCore(x_idle_core, x_process)
|
|
|
|
})
|
|
|
|
|
|
// Check cores for processes
|
|
$.each(g_active_cores,function(i,x_core){
|
|
var x_process = x_core.current_process
|
|
if(x_process){
|
|
|
|
// weight reduced by 2^(power+global - 2)
|
|
x_core.weight -= Math.pow(2,(x_core.power + g_corepower - 2))
|
|
|
|
// If Process is complete
|
|
if(x_core.weight <= 0){
|
|
|
|
x_core.current_process = null
|
|
x_core.weight = null
|
|
|
|
// Callback
|
|
x_process.c()
|
|
|
|
if(g_queue_processes.length == 0){
|
|
updateSingleCore(x_core)
|
|
}
|
|
checkHackedDataActions()
|
|
}
|
|
}
|
|
})
|
|
}
|
|
|
|
|
|
coreHasAilment = function(x_core){
|
|
return !!x_core.ailments.length
|
|
}
|
|
isCoreIdle = function(x_core){
|
|
return (!x_core.current_process )
|
|
}
|
|
|
|
setProcessToCore = function(x_core, x_process){
|
|
if(isCoreIdle(x_core)){
|
|
x_core.current_process = x_process
|
|
x_core.weight = x_process.w
|
|
updateSingleCore(x_core)
|
|
}else{
|
|
write("Cannot set process to Core")
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
//
|
|
// Vars
|
|
//
|
|
|
|
// INITCALL
|
|
|
|
var g_active_cores, g_core_list
|
|
initCallCores = function(){
|
|
clearCores()
|
|
g_active_cores = []
|
|
// includes os, architecture, current_process, ailments
|
|
g_core_list = {
|
|
"sky": {title:"Sky Core", power:1},
|
|
"star": {title:"Star Core", power:1},
|
|
"sun": {title:"Sun Core", power:1},
|
|
"eris": {title:"Eris Core", power:1},
|
|
"solar": {title:"Solar Core", power:1},
|
|
"juno": {title:"Juno Core", power:1},
|
|
"sony": {title:"Sony Core", power:1},
|
|
"luna": {title:"Luna Core", power:1},
|
|
"cypher": {title:"Cypher Core", power:1},
|
|
"nova": {title:"Nova Core", power:1},
|
|
}
|
|
|
|
// Add to each core
|
|
Object.keys(g_core_list).forEach(function (key) {
|
|
var x_core = g_core_list[key]
|
|
x_core.slug = key
|
|
x_core.ailments = []
|
|
x_core.current_process= null
|
|
x_core.weight= null
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
// Frontend
|
|
//
|
|
|
|
initCore = function(){
|
|
$("#coreholder").hide().fadeIn({duration:g_fadespeed,queue:true})
|
|
updateAllCores()
|
|
}
|
|
updateAllCores = function(){
|
|
$.each(g_active_cores,function(i,x_core){
|
|
updateSingleCore(x_core)
|
|
})
|
|
|
|
}
|
|
clearCores = function(){
|
|
$("#core_actives").html("")
|
|
}
|
|
updateSingleCore = function(x_core){
|
|
var slug = x_core['slug']
|
|
var $holder = $("#core_actives")
|
|
var $core = $holder.find('.core[slug='+slug+']')
|
|
var nocore = false
|
|
if (!$core.length){
|
|
nocore = true
|
|
$core = $("<div class='core' slug='"+slug+"'></div>")
|
|
}
|
|
|
|
var x_process = x_core['current_process']
|
|
if(!x_process){
|
|
var core_html = ""
|
|
if(x_core.ailments.length){
|
|
core_html = "<span class='clickable coretitle'>"+x_core.title+"</span> ERROR"
|
|
}else if(g_can_core){
|
|
var clickedtitle = ""
|
|
if(g_current_core && x_core.title == g_current_core.title)
|
|
clickedtitle = 'clicked'
|
|
core_html = "<span class='corespeed'>"+coreSpeedOutput(x_core)+"</span> <span class='clickable coretitle "+clickedtitle+"'>"+x_core.title+"</span> Idle <span class='coredots'></span>"
|
|
}else{
|
|
core_html = "Core Idle <span class='coredots'></span>"
|
|
}
|
|
$core.html(core_html)
|
|
|
|
}else{
|
|
var cancel_html = ""
|
|
if(g_can_cancel){
|
|
cancel_html = "<span class='cancelholder'><span class='clickable'>[<span class='cancelx'>X</span>]</span></span></div> "
|
|
}
|
|
$core.html(cancel_html+x_process.a+" <span class='corespinner'>-</span>")
|
|
$core.find(".cancelholder").hover(
|
|
function(){$(this).find('.cancelx').html('▓')},
|
|
function(){$(this).find('.cancelx').html('X')}
|
|
)
|
|
$core.find(".cancelholder").click(function(){
|
|
clearProcessInAction({x_process: x_core['current_process']})
|
|
})
|
|
|
|
}
|
|
|
|
|
|
$core.find(".coretitle").click(function(){
|
|
endHost()
|
|
g_current_core = x_core
|
|
launchAdventureFromSlug('core_click')
|
|
})
|
|
|
|
if(nocore){
|
|
$("#core_actives").append($core)
|
|
}
|
|
|
|
}
|
|
|
|
|
|
animateCoresTick = function(){
|
|
g_animatecoreframe++
|
|
g_animatecoreframe = g_animatecoreframe % 4
|
|
|
|
var $dots = $("#core_actives .coredots")
|
|
var $spinner = $("#core_actives .corespinner")
|
|
|
|
$dots.html(".".repeat(g_animatecoreframe))
|
|
|
|
switch(g_animatecoreframe){
|
|
case 0:
|
|
$spinner.html('\\')
|
|
break
|
|
case 1:
|
|
$spinner.html('|')
|
|
break
|
|
case 2:
|
|
$spinner.html('/')
|
|
break
|
|
case 3:
|
|
$spinner.html('-')
|
|
break
|
|
}
|
|
}
|
|
|
|
showQueueTick = function(){
|
|
$queue = $('#core_queue')
|
|
$queue.empty()
|
|
$.each(g_queue_processes,function(i,x_process){
|
|
var actiontitle = x_process['a']
|
|
var data_type_string = x_process['data_type'] ? "data_type='"+x_process['data_type']+"'" : ""
|
|
$queue.append("<div class='queueitem' "+data_type_string+">"+actiontitle+"</div>")
|
|
})
|
|
}
|
|
|
|
|
|
//
|
|
// Estimate
|
|
//
|
|
|
|
estimateProcessByWeight = function(weight){
|
|
if(!weight)
|
|
return undefined
|
|
var weight = weight
|
|
var letter
|
|
if (weight / g_corepower < 100 ){
|
|
letter = "sm"
|
|
}
|
|
else if (weight / g_corepower < 500 ){
|
|
letter = 'med'
|
|
}
|
|
else if (weight / g_corepower < 2500 ){
|
|
letter = 'lg'
|
|
}
|
|
else if (weight / g_corepower < 25000 ){
|
|
letter = 'XL'
|
|
}
|
|
else{
|
|
letter = "XXL"
|
|
}
|
|
return letter
|
|
}
|
|
|
|
estimateProcess = function(process){
|
|
return estimateProcessByWeight(process['w'])
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
// Probes
|
|
//
|
|
|
|
|
|
maxProbes = function(){
|
|
var power = 0
|
|
if(research_multithreading)
|
|
power ++
|
|
return g_active_cores.length * Math.pow(2,power)
|
|
}
|
|
|
|
remainingProbes = function(){
|
|
return maxProbes() - g_used_probes
|
|
}
|
|
|
|
remainingProbesString = function(){
|
|
var probes = remainingProbes()
|
|
return remainingProbes() + " probe"+(probes == 1? '':'s')
|
|
}
|
|
|
|
|
|
|
|
|
|
|