Skip to content

Commit

Permalink
autofarm: minor tweaks
Browse files Browse the repository at this point in the history
  • Loading branch information
jjyg committed Mar 16, 2013
1 parent f74bd47 commit 34f8884
Showing 1 changed file with 44 additions and 33 deletions.
77 changes: 44 additions & 33 deletions autofarm.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,24 @@ def initialize
end

def setthreshold(id, v)
if df.world.raws.plants.all.find { |r| r.id == id }
@thresholds[id] = v.to_i
list = df.world.raws.plants.all.find_all { |plt| plt.flags[:SEED] }.map { |plt| plt.id }
if tok = df.match_rawname(id, list)
@thresholds[tok] = v.to_i
else
puts "No plant with id #{id}"
puts "No plant with id #{id}, try one of " +
list.map { |w| w =~ /[^\w]/ ? w.inspect : w }.sort.join(' ')
end
end

def setdefault(v)
@thresholds.default = v.to_i
end

def is_plantable (plant)
def is_plantable(plant)
has_seed = plant.flags[:SEED]
season = df.cur_season
harvest = df.cur_season_tick + plant.growdur * 10
will_finish = harvest < 10080
will_finish = harvest < 10080
can_plant = has_seed && plant.flags[season]
can_plant = can_plant && (will_finish || plant.flags[(season+1)%4])
can_plant
Expand All @@ -36,7 +38,7 @@ def find_plantable_plants
!i.flags.hostile && !i.flags.on_fire && !i.flags.rotten &&
!i.flags.trader && !i.flags.in_building && !i.flags.construction &&
!i.flags.artifact)
counts[i.mat_index] = counts[i.mat_index] + i.stack_size
counts[i.mat_index] += i.stack_size
end
}

Expand All @@ -53,49 +55,44 @@ def find_plantable_plants
return plantable
end

def set_farms( plants, farms)
def set_farms(plants, farms)
return if farms.length == 0
if plants.length == 0
plants = [-1]
end

season = df.cur_season

idx = 0

farms.each { |f|
f.plant_id[season] = plants[idx]
idx = (idx + 1) % plants.length
farms.each_with_index { |f, idx|
f.plant_id[season] = plants[idx % plants.length]
}
end

def process
return false unless @running

plantable = find_plantable_plants
counts = Hash.new(0)
@lastcounts = Hash.new(0)

df.world.items.other[:PLANT].each { |i|
if (!i.flags.dump && !i.flags.forbid && !i.flags.garbage_collect &&
!i.flags.hostile && !i.flags.on_fire && !i.flags.rotten &&
!i.flags.trader && !i.flags.in_building && !i.flags.construction &&
!i.flags.artifact && plantable.has_key?(i.mat_index))
counts[i.mat_index] = counts[i.mat_index] + i.stack_size
id = df.world.raws.plants.all[i.mat_index].id
@lastcounts[id] += i.stack_size
end
}

return unless @running

plants_s = []
plants_u = []

@lastcounts.clear

plantable.each_key { |k|
plant = df.world.raws.plants.all[k]
if (counts[k] < @thresholds[plant.id])
if (@lastcounts[plant.id] < @thresholds[plant.id])
plants_s.push(k) if plantable[k] == :Surface
plants_u.push(k) if plantable[k] == :Underground
end
@lastcounts[plant.id] = counts[k]
}

farms_s = []
Expand All @@ -110,11 +107,11 @@ def process

set_farms(plants_s, farms_s)
set_farms(plants_u, farms_u)

end

def start
@onupdate = df.onupdate_register('autofarm', 100) { process }
return if @running
@onupdate = df.onupdate_register('autofarm', 1200) { process }
@running = true
end

Expand All @@ -125,23 +122,28 @@ def stop

def status
stat = @running ? "Running." : "Stopped."
@lastcounts.each { |k,v|
stat << "\n#{k} limit #{@thresholds.fetch(k, 'default')} current #{v}"
}
@thresholds.each { |k,v|
stat += "\n#{k} limit #{v} current #{@lastcounts[k]}"
stat << "\n#{k} limit #{v} current 0" unless @lastcounts.has_key?(k)
}
stat += "\nDefault: #{@thresholds.default}"
stat << "\nDefault: #{@thresholds.default}"
stat
end

end

$AutoFarm = AutoFarm.new unless $AutoFarm
$AutoFarm ||= AutoFarm.new

case $script_args[0]
when 'start'
$AutoFarm.start
$AutoFarm.start
puts $AutoFarm.status

when 'end', 'stop'
$AutoFarm.stop
when 'end', 'stop', 'disable'
$AutoFarm.stop
puts 'Stopped.'

when 'default'
$AutoFarm.setdefault($script_args[1])
Expand All @@ -156,10 +158,19 @@ def status
$AutoFarm.stop
$AutoFarm = nil

when 'help', '?'
puts <<EOS
Automatically handle crop selection in farm plots based on current plant stocks.
Selects a crop for planting if current stock is below a threshold.
Selected crops are dispatched on all farmplots.
Usage:
autofarm start
autofarm default 30
autofarm threshold 150 helmet_plump tail_pig
EOS

else
if $AutoFarm
puts $AutoFarm.status
else
puts "AI not started"
end
$AutoFarm.process
puts $AutoFarm.status
end

0 comments on commit 34f8884

Please sign in to comment.