Created
December 1, 2012 03:56
-
-
Save ab9rf/4180480 to your computer and use it in GitHub Desktop.
autolabor in ruby. haha.
This file contains 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
class JobInfo | |
def get_bld (job) | |
id = job.references.find { |r| r.kind_of?(DFHack::GeneralRefBuildingHolderst) } | |
bld = df.world.buildings.all.binsearch(id.building_id) if id | |
bld | |
end | |
def self.const_labor (l) | |
lambda {|job| return l} | |
end | |
no_labor = const_labor(:NONE) | |
hauling_labor = lambda {|job| | |
item = job.items[0].item | |
case item.class | |
when DFHack::ItemRoughst.class then :HAUL_ITEM | |
else | |
puts "Hauling: #{item.class}" | |
nil # FIXME | |
end | |
} | |
construct_building = lambda {|job| | |
bld = get_bld(job) | |
case bld.class | |
when DFHack::BuildingTrapst.class then :MECHANIC | |
else | |
puts "ConstructBuilding: #{bld.class}" | |
nil # FIXME | |
end | |
} | |
destroy_building = lambda {|job| | |
nil # FIXME | |
} | |
def self.make_generator (metaltype) | |
lambda {|job| | |
bld = get_bld(job) | |
case bld.type | |
when :Craftsdwarfs | |
jobitem = job.job_items[0].item_type | |
case jobitem | |
when :BOULDER then :STONE_CRAFT | |
when :NONE | |
if job.material_category.bone then :BONE_CARVE | |
else | |
puts "make_generator: job item type #{jobitem}" | |
nil | |
end | |
else | |
puts "make_generator: job item type #{jobitem}" | |
nil | |
end | |
when :Masons then :MASON | |
when :Carpenters then :CARPENTER | |
when :Leatherworks then :LEATHER | |
when :Clothiers then :CLOTHESMAKING | |
when :MagmaForge, :MetalsmithForge then metaltype | |
when :MagmaGlassFurnace, :GlassFurnace then :GLASSMAKER | |
else | |
puts "make_generator: workshop type #{bld.type}" | |
nil | |
end | |
} | |
end | |
make_furniture = make_generator (:FORGE_FURNITURE) | |
make_object = make_generator (:METAL_CRAFT) | |
make_armor = make_generator (:FORGE_ARMOR) | |
make_weapon = make_generator (:FORGE_WEAPON) | |
custom_reaction = lambda {|job| | |
react = df.world.raws.reactions.find { |r| r.code == job.reaction_name } | |
skill = react.skill | |
labor = DFHack::JobSkill::Labor[skill] | |
labor | |
} | |
@@job_to_labor = Hash.new | |
@@job_to_labor[:CarveFortification] = const_labor(:DETAIL) | |
@@job_to_labor[:DetailWall] = const_labor(:DETAIL) | |
@@job_to_labor[:DetailFloor] = const_labor(:DETAIL) | |
@@job_to_labor[:Dig] = const_labor(:DIG) | |
@@job_to_labor[:CarveUpwardStaircase] = const_labor(:DIG) | |
@@job_to_labor[:CarveDownwardStaircase] = const_labor(:DIG) | |
@@job_to_labor[:CarveUpDownStaircase] = const_labor(:DIG) | |
@@job_to_labor[:CarveRamp] = const_labor(:DIG) | |
@@job_to_labor[:DigChannel] = const_labor(:DIG) | |
@@job_to_labor[:FellTree] = const_labor(:CUTWOOD) | |
@@job_to_labor[:GatherPlants] = const_labor(:HERBALIST) | |
@@job_to_labor[:RemoveConstruction] = no_labor | |
@@job_to_labor[:CollectWebs] = const_labor(:WEAVER) | |
@@job_to_labor[:BringItemToDepot] = no_labor | |
@@job_to_labor[:BringItemToShop] = no_labor | |
@@job_to_labor[:Eat] = no_labor | |
@@job_to_labor[:GetProvisions] = no_labor | |
@@job_to_labor[:Drink] = no_labor | |
@@job_to_labor[:Drink2] = no_labor | |
@@job_to_labor[:FillWaterskin] = no_labor | |
@@job_to_labor[:FillWaterskin2] = no_labor | |
@@job_to_labor[:Sleep] = no_labor | |
@@job_to_labor[:CollectSand] = const_labor(:GLASSMAKER) | |
@@job_to_labor[:Fish] = const_labor(:FISH) | |
@@job_to_labor[:Hunt] = const_labor(:HUNT) | |
@@job_to_labor[:HuntVermin] = no_labor | |
@@job_to_labor[:Kidnap] = no_labor | |
@@job_to_labor[:BeatCriminal] = no_labor | |
@@job_to_labor[:StartingFistFight] = no_labor | |
@@job_to_labor[:CollectTaxes] = no_labor | |
@@job_to_labor[:GuardTaxCollector] = no_labor | |
@@job_to_labor[:CatchLiveLandAnimal] = const_labor(:HUNT) | |
@@job_to_labor[:CatchLiveFish] = const_labor(:FISH) | |
@@job_to_labor[:ReturnKill] = no_labor | |
@@job_to_labor[:CheckChest] = no_labor | |
@@job_to_labor[:StoreOwnedItem] = no_labor | |
@@job_to_labor[:PlaceItemInTomb] = const_labor(:HAUL_BODY) | |
@@job_to_labor[:StoreItemInStockpile] = hauling_labor | |
@@job_to_labor[:StoreItemInBag] = hauling_labor | |
@@job_to_labor[:StoreItemInHospital] = hauling_labor | |
@@job_to_labor[:StoreItemInChest] = hauling_labor | |
@@job_to_labor[:StoreItemInCabinet] = hauling_labor | |
@@job_to_labor[:StoreWeapon] = hauling_labor | |
@@job_to_labor[:StoreArmor] = hauling_labor | |
@@job_to_labor[:StoreItemInBarrel] = hauling_labor | |
@@job_to_labor[:StoreItemInBin] = hauling_labor | |
@@job_to_labor[:SeekArtifact] = no_labor | |
@@job_to_labor[:SeekInfant] = no_labor | |
@@job_to_labor[:AttendParty] = no_labor | |
@@job_to_labor[:GoShopping] = no_labor | |
@@job_to_labor[:GoShopping2] = no_labor | |
@@job_to_labor[:Clean] = const_labor(:CLEAN) | |
@@job_to_labor[:Rest] = no_labor | |
@@job_to_labor[:PickupEquipment] = no_labor | |
@@job_to_labor[:DumpItem] = hauling_labor | |
@@job_to_labor[:StrangeMoodCrafter] = no_labor | |
@@job_to_labor[:StrangeMoodJeweller] = no_labor | |
@@job_to_labor[:StrangeMoodForge] = no_labor | |
@@job_to_labor[:StrangeMoodMagmaForge] = no_labor | |
@@job_to_labor[:StrangeMoodBrooding] = no_labor | |
@@job_to_labor[:StrangeMoodFell] = no_labor | |
@@job_to_labor[:StrangeMoodCarpenter] = no_labor | |
@@job_to_labor[:StrangeMoodMason] = no_labor | |
@@job_to_labor[:StrangeMoodBowyer] = no_labor | |
@@job_to_labor[:StrangeMoodTanner] = no_labor | |
@@job_to_labor[:StrangeMoodWeaver] = no_labor | |
@@job_to_labor[:StrangeMoodGlassmaker] = no_labor | |
@@job_to_labor[:StrangeMoodMechanics] = no_labor | |
@@job_to_labor[:ConstructBuilding] = construct_building | |
@@job_to_labor[:ConstructDoor] = make_furniture | |
@@job_to_labor[:ConstructFloodgate] = make_furniture | |
@@job_to_labor[:ConstructBed] = make_furniture | |
@@job_to_labor[:ConstructThrone] = make_furniture | |
@@job_to_labor[:ConstructCoffin] = make_furniture | |
@@job_to_labor[:ConstructTable] = make_furniture | |
@@job_to_labor[:ConstructChest] = make_furniture | |
@@job_to_labor[:ConstructBin] = make_furniture | |
@@job_to_labor[:ConstructArmorStand] = make_furniture | |
@@job_to_labor[:ConstructWeaponRack] = make_furniture | |
@@job_to_labor[:ConstructCabinet] = make_furniture | |
@@job_to_labor[:ConstructStatue] = make_furniture | |
@@job_to_labor[:ConstructBlocks] = make_furniture | |
@@job_to_labor[:MakeRawGlass] = const_labor(:GLASSMAKER) | |
@@job_to_labor[:MakeCrafts] = make_object | |
@@job_to_labor[:MintCoins] = const_labor(:METAL_CRAFT) | |
@@job_to_labor[:CutGems] = const_labor(:CUT_GEM) | |
@@job_to_labor[:CutGlass] = const_labor(:CUT_GEM) | |
@@job_to_labor[:EncrustWithGems] = const_labor(:ENCRUST_GEM) | |
@@job_to_labor[:EncrustWithGlass] = const_labor(:ENCRUST_GEM) | |
@@job_to_labor[:DestroyBuilding] = destroy_building | |
@@job_to_labor[:SmeltOre] = const_labor(:SMELT) | |
@@job_to_labor[:MeltMetalObject] = const_labor(:SMELT) | |
@@job_to_labor[:ExtractMetalStrands] = const_labor(:EXTRACT_STRAND) | |
@@job_to_labor[:PlantSeeds] = const_labor(:PLANT) | |
@@job_to_labor[:HarvestPlants] = const_labor(:PLANT) | |
@@job_to_labor[:TrainHuntingAnimal] = const_labor(:ANIMALTRAIN) | |
@@job_to_labor[:TrainWarAnimal] = const_labor(:ANIMALTRAIN) | |
@@job_to_labor[:MakeWeapon] = make_weapon | |
@@job_to_labor[:ForgeAnvil] = make_furniture | |
@@job_to_labor[:ConstructCatapultParts] = const_labor(:SIEGECRAFT) | |
@@job_to_labor[:ConstructBallistaParts] = const_labor(:SIEGECRAFT) | |
@@job_to_labor[:MakeArmor] = make_armor | |
@@job_to_labor[:MakeHelm] = make_armor | |
@@job_to_labor[:MakePants] = make_armor | |
@@job_to_labor[:StudWith] = make_object | |
@@job_to_labor[:ButcherAnimal] = const_labor(:BUTCHER) | |
@@job_to_labor[:PrepareRawFish] = const_labor(:CLEAN_FISH) | |
@@job_to_labor[:MillPlants] = const_labor(:MILLER) | |
@@job_to_labor[:BaitTrap] = const_labor(:TRAPPER) | |
@@job_to_labor[:MilkCreature] = const_labor(:MILK) | |
@@job_to_labor[:MakeCheese] = const_labor(:MAKE_CHEESE) | |
@@job_to_labor[:ProcessPlants] = const_labor(:PROCESS_PLANT) | |
@@job_to_labor[:ProcessPlantsBag] = const_labor(:PROCESS_PLANT) | |
@@job_to_labor[:ProcessPlantsVial] = const_labor(:PROCESS_PLANT) | |
@@job_to_labor[:ProcessPlantsBarrel] = const_labor(:PROCESS_PLANT) | |
@@job_to_labor[:PrepareMeal] = const_labor(:COOK) | |
@@job_to_labor[:WeaveCloth] = const_labor(:CLOTHESMAKER) | |
@@job_to_labor[:MakeGloves] = make_armor | |
@@job_to_labor[:MakeShoes] = make_armor | |
@@job_to_labor[:MakeShield] = make_armor | |
@@job_to_labor[:MakeCage] = make_furniture | |
@@job_to_labor[:MakeChain] = make_object | |
@@job_to_labor[:MakeFlask] = make_object | |
@@job_to_labor[:MakeGoblet] = make_object | |
@@job_to_labor[:MakeInstrument] = make_object | |
@@job_to_labor[:MakeToy] = make_object | |
@@job_to_labor[:MakeAnimalTrap] = const_labor(:TRAPPER) | |
@@job_to_labor[:MakeBarrel] = make_furniture | |
@@job_to_labor[:MakeBucket] = make_furniture | |
@@job_to_labor[:MakeWindow] = make_furniture | |
@@job_to_labor[:MakeTotem] = const_labor(:BONE_CARVE) | |
@@job_to_labor[:MakeAmmo] = make_weapon | |
@@job_to_labor[:DecorateWith] = make_object | |
@@job_to_labor[:MakeBackpack] = make_object | |
@@job_to_labor[:MakeQuiver] = make_armor | |
@@job_to_labor[:MakeBallistaArrowHead] = make_weapon | |
@@job_to_labor[:AssembleSiegeAmmo] = const_labor(:SIEGECRAFT) | |
@@job_to_labor[:LoadCatapult] = const_labor(:SIEGEOPERATE) | |
@@job_to_labor[:LoadBallista] = const_labor(:SIEGEOPERATE) | |
@@job_to_labor[:FireCatapult] = const_labor(:SIEGEOPERATE) | |
@@job_to_labor[:FireBallista] = const_labor(:SIEGEOPERATE) | |
@@job_to_labor[:ConstructMechanisms] = const_labor(:MECHANIC) | |
@@job_to_labor[:MakeTrapComponent] = make_weapon | |
@@job_to_labor[:LoadCageTrap] = const_labor(:MECHANIC) | |
@@job_to_labor[:LoadStoneTrap] = const_labor(:MECHANIC) | |
@@job_to_labor[:LoadWeaponTrap] = const_labor(:MECHANIC) | |
@@job_to_labor[:CleanTrap] = const_labor(:MECHANIC) | |
@@job_to_labor[:CastSpell] = no_labor | |
@@job_to_labor[:LinkBuildingToTrigger] = const_labor(:MECHANIC) | |
@@job_to_labor[:PullLever] = no_labor | |
@@job_to_labor[:BrewDrink] = const_labor(:BREWER) | |
@@job_to_labor[:ExtractFromPlants] = const_labor(:HERBALIST) | |
@@job_to_labor[:ExtractFromRawFish] = const_labor(:FISH_DISSECTOR) | |
@@job_to_labor[:ExtractFromLandAnimal] = const_labor(:DISSECT_VERMIN) | |
@@job_to_labor[:TameVermin] = const_labor(:ANIMALTRAIN) | |
@@job_to_labor[:TameAnimal] = const_labor(:ANIMALTRAIN) | |
@@job_to_labor[:ChainAnimal] = no_labor | |
@@job_to_labor[:UnchainAnimal] = no_labor | |
@@job_to_labor[:UnchainPet] = no_labor | |
@@job_to_labor[:ReleaseLargeCreature] = no_labor | |
@@job_to_labor[:ReleasePet] = no_labor | |
@@job_to_labor[:ReleaseSmallCreature] = no_labor | |
@@job_to_labor[:HandleSmallCreature] = no_labor | |
@@job_to_labor[:HandleLargeCreature] = no_labor | |
@@job_to_labor[:CageLargeCreature] = no_labor | |
@@job_to_labor[:CageSmallCreature] = no_labor | |
@@job_to_labor[:RecoverWounded] = const_labor(:RECOVER_WOUNDED) | |
@@job_to_labor[:DiagnosePatient] = const_labor(:DIAGNOSE) | |
@@job_to_labor[:ImmobilizeBreak] = const_labor(:BONE_SETTING) | |
@@job_to_labor[:DressWound] = const_labor(:DRESSING_WOUNDS) | |
@@job_to_labor[:CleanPatient] = const_labor(:CLEAN) | |
@@job_to_labor[:Surgery] = const_labor(:SURGERY) | |
@@job_to_labor[:Suture] = const_labor(:SUTURING) | |
@@job_to_labor[:SetBone] = const_labor(:BONE_SETTING) | |
@@job_to_labor[:PlaceInTraction] = const_labor(:BONE_SETTING) | |
@@job_to_labor[:DrainAquarium] = no_labor | |
@@job_to_labor[:FillAquarium] = no_labor | |
@@job_to_labor[:FillPond] = no_labor | |
@@job_to_labor[:GiveWater] = const_labor(:FEED_WATER_CIVILIANS) | |
@@job_to_labor[:GiveFood] = const_labor(:FEED_WATER_CIVILIANS) | |
@@job_to_labor[:GiveWater2] = no_labor | |
@@job_to_labor[:GiveFood2] = no_labor | |
@@job_to_labor[:RecoverPet] = no_labor | |
@@job_to_labor[:PitLargeAnimal] = no_labor | |
@@job_to_labor[:PitSmallAnimal] = no_labor | |
@@job_to_labor[:SlaughterAnimal] = const_labor(:BUTCHER) | |
@@job_to_labor[:MakeCharcoal] = const_labor(:BURN_WOOD) | |
@@job_to_labor[:MakeAsh] = const_labor(:BURN_WOOD) | |
@@job_to_labor[:MakeLye] = const_labor(:LYE_MAKING) | |
@@job_to_labor[:MakePotashFromLye] = const_labor(:POTASH_MAKING) | |
@@job_to_labor[:FertilizeField] = const_labor(:PLANT) | |
@@job_to_labor[:MakePotashFromAsh] = const_labor(:POTASH_MAKING) | |
@@job_to_labor[:DyeThread] = const_labor(:DYER) | |
@@job_to_labor[:DyeCloth] = const_labor(:DYER) | |
@@job_to_labor[:SewImage] = make_object | |
@@job_to_labor[:MakePipeSection] = make_furniture | |
@@job_to_labor[:OperatePump] = const_labor(:OPERATE_PUMP) | |
@@job_to_labor[:ManageWorkOrders] = no_labor | |
@@job_to_labor[:UpdateStockpileRecords] = no_labor | |
@@job_to_labor[:TradeAtDepot] = no_labor | |
@@job_to_labor[:ConstructHatchCover] = make_furniture | |
@@job_to_labor[:ConstructGrate] = make_furniture | |
@@job_to_labor[:RemoveStairs] = const_labor(:DIG) | |
@@job_to_labor[:ConstructQuern] = make_furniture | |
@@job_to_labor[:ConstructMillstone] = make_furniture | |
@@job_to_labor[:ConstructSplint] = make_object | |
@@job_to_labor[:ConstructCrutch] = make_object | |
@@job_to_labor[:ConstructTractionBench] = const_labor(:MECHANIC) | |
@@job_to_labor[:CleanSelf] = no_labor | |
@@job_to_labor[:BringCrutch] = no_labor | |
@@job_to_labor[:ApplyCast] = const_labor(:BONE_SETTING) | |
@@job_to_labor[:CustomReaction] = custom_reaction | |
@@job_to_labor[:ConstructSlab] = make_furniture | |
@@job_to_labor[:EngraveSlab] = const_labor(:STONE_CRAFT) | |
@@job_to_labor[:ShearCreature] = const_labor(:SHEARER) | |
@@job_to_labor[:SpinThread] = const_labor(:SPINNER) | |
@@job_to_labor[:PenLargeAnimal] = no_labor | |
@@job_to_labor[:PenSmallAnimal] = no_labor | |
@@job_to_labor[:MakeTool] = make_furniture | |
@@job_to_labor[:CollectClay] = const_labor(:POTTERY) | |
@@job_to_labor[:InstallColonyInHive] = const_labor(:BEEKEEPING) | |
@@job_to_labor[:CollectHiveProducts] = const_labor(:BEEKEEPING) | |
@@job_to_labor[:CauseTrouble] = no_labor | |
@@job_to_labor[:DrinkBlood] = no_labor | |
@@job_to_labor[:ReportCrime] = no_labor | |
@@job_to_labor[:ExecuteCriminal] = no_labor | |
@@job_to_labor[:TrainAnimal] = const_labor(:ANIMALTRAIN) | |
@@job_to_labor[:CarveTrack] = const_labor(:DETAIL) | |
@@job_to_labor[:PushTrackVehicle] = const_labor(:PUSH_HAUL_VEHICLE) | |
@@job_to_labor[:PlaceTrackVehicle] = const_labor(:PUSH_HAUL_VEHICLE) | |
@@job_to_labor[:StoreItemInVehicle] = const_labor(:PUSH_HAUL_VEHICLE) | |
@@labor_to_skill = Hash.new | |
DFHack::JobSkill::Labor.each { |s,l| @@labor_to_skill[l] = s } | |
def self.get_job_labor (job) | |
if (job.job_type == :CustomReaction) | |
react = df.world.raws.reactions.find { |r| r.code == job.reaction_name } | |
skill = react.skill | |
else | |
skill = DFHack::JobType::Skill[job.job_type] | |
end | |
labor = DFHack::JobSkill::Labor[skill] if skill and skill != :NONE | |
if not labor then | |
l = @@job_to_labor[job.job_type] | |
labor = l.call(job) | |
end | |
return labor | |
end | |
def self.laborskill (l) | |
@@labor_to_skill[l] | |
end | |
def laborskill (l) | |
JobInfo::laborskill (l) | |
end | |
def analyze_jobs | |
race = df.ui.race_id | |
civ = df.ui.civ_id | |
has_butchers = has_fishery = trader_requested = false | |
df.world.buildings.all.each { |b| | |
case b.getType() | |
when :Workshop | |
case b.getSubType() | |
when :Butchers then has_butchers = true | |
when :Fishery then has_fishery = true | |
end | |
when :TradeDepot | |
trader_requested = b.trade_flags.trader_request | |
end | |
} | |
dwarfs = Array.new | |
df.world.units.active.each { |cre| | |
if Units::unit_iscitizen(cre) | |
next if cre.burrows | |
dwarfs << cre | |
end | |
} | |
return unless dwarfs; | |
joblist = df.world.job_list.next | |
dwarfs = df.world. | |
labor_count = Hash.new | |
while joblist | |
job = joblist.item | |
joblist = joblist.next | |
next if job.flags.suspend | |
dwarfref = job.references.find {|r| r.kind_of? DFHack::GeneralRefUnitWorkerst} | |
next if dwarfref | |
jobtype = job.job_type | |
joblabor = JobInfo::get_job_labor(job) | |
if (not joblabor) then | |
puts "#{jobtype} #{job.inspect}" | |
df.pause_state = true | |
break | |
end | |
labor_count[joblabor] = labor_count[joblabor].to_i + 1 | |
end | |
# labor_count.each {|k,v| puts "#{k} (#{laborskill(k)}): #{v}"} | |
false | |
end | |
def initialize | |
@onupdate_handles = Array.new | |
end | |
def start | |
@onupdate_handles << df.onupdate_register (100, 10) { analyze_jobs } | |
@running = true | |
end | |
def stop | |
@onupdate_handles.each { |h| df.onupdate_unregister(h) } | |
@running = false | |
end | |
def status | |
@running ? "Running." : "Loaded." | |
end | |
end | |
case $script_args[0] | |
when 'start' | |
$ai = JobInfo.new | |
$ai.start | |
when 'end', 'stop' | |
$ai.stop | |
else | |
if $ai | |
puts $ai.status | |
else | |
puts "AI not started" | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment