Autolabor: improve (hopefully) the functionality for mapping jobs to labors. Still some gaps to fill, but not many.

develop
Kelly Martin 2012-12-01 02:26:06 -06:00
parent d2ec52fa0b
commit afb6d8ef79
1 changed files with 980 additions and 493 deletions

@ -45,7 +45,11 @@
#include <df/general_ref_unit_workerst.h>
#include <df/general_ref_building_holderst.h>
#include <df/building_workshopst.h>
#include <df/building_furnacest.h>
#include <df/building_def.h>
#include <df/reaction.h>
#include <df/job_item.h>
#include <df/job_item_ref.h>
#include <MiscUtils.h>
@ -536,6 +540,99 @@ struct dwarf_info_t
}
};
static df::unit_labor hauling_labor_map[] =
{
df::unit_labor::HAUL_ITEM, /* BAR */
df::unit_labor::HAUL_ITEM, /* SMALLGEM */
df::unit_labor::HAUL_ITEM, /* BLOCKS */
df::unit_labor::HAUL_ITEM, /* ROUGH */
df::unit_labor::HAUL_STONE, /* BOULDER */
df::unit_labor::HAUL_WOOD, /* WOOD */
df::unit_labor::HAUL_FURNITURE, /* DOOR */
df::unit_labor::HAUL_FURNITURE, /* FLOODGATE */
df::unit_labor::HAUL_FURNITURE, /* BED */
df::unit_labor::HAUL_FURNITURE, /* CHAIR */
df::unit_labor::HAUL_ITEM, /* CHAIN */
df::unit_labor::HAUL_ITEM, /* FLASK */
df::unit_labor::HAUL_ITEM, /* GOBLET */
df::unit_labor::HAUL_ITEM, /* INSTRUMENT */
df::unit_labor::HAUL_ITEM, /* TOY */
df::unit_labor::HAUL_FURNITURE, /* WINDOW */
df::unit_labor::HAUL_ANIMAL, /* CAGE */
df::unit_labor::HAUL_ITEM, /* BARREL */
df::unit_labor::HAUL_ITEM, /* BUCKET */
df::unit_labor::HAUL_ANIMAL, /* ANIMALTRAP */
df::unit_labor::HAUL_FURNITURE, /* TABLE */
df::unit_labor::HAUL_FURNITURE, /* COFFIN */
df::unit_labor::HAUL_FURNITURE, /* STATUE */
df::unit_labor::HAUL_BODY, /* CORPSE */
df::unit_labor::HAUL_ITEM, /* WEAPON */
df::unit_labor::HAUL_ITEM, /* ARMOR */
df::unit_labor::HAUL_ITEM, /* SHOES */
df::unit_labor::HAUL_ITEM, /* SHIELD */
df::unit_labor::HAUL_ITEM, /* HELM */
df::unit_labor::HAUL_ITEM, /* GLOVES */
df::unit_labor::HAUL_FURNITURE, /* BOX */
df::unit_labor::HAUL_ITEM, /* BIN */
df::unit_labor::HAUL_FURNITURE, /* ARMORSTAND */
df::unit_labor::HAUL_FURNITURE, /* WEAPONRACK */
df::unit_labor::HAUL_FURNITURE, /* CABINET */
df::unit_labor::HAUL_ITEM, /* FIGURINE */
df::unit_labor::HAUL_ITEM, /* AMULET */
df::unit_labor::HAUL_ITEM, /* SCEPTER */
df::unit_labor::HAUL_ITEM, /* AMMO */
df::unit_labor::HAUL_ITEM, /* CROWN */
df::unit_labor::HAUL_ITEM, /* RING */
df::unit_labor::HAUL_ITEM, /* EARRING */
df::unit_labor::HAUL_ITEM, /* BRACELET */
df::unit_labor::HAUL_ITEM, /* GEM */
df::unit_labor::HAUL_FURNITURE, /* ANVIL */
df::unit_labor::HAUL_BODY, /* CORPSEPIECE */
df::unit_labor::HAUL_REFUSE, /* REMAINS */
df::unit_labor::HAUL_FOOD, /* MEAT */
df::unit_labor::HAUL_FOOD, /* FISH */
df::unit_labor::HAUL_FOOD, /* FISH_RAW */
df::unit_labor::HAUL_REFUSE, /* VERMIN */
df::unit_labor::HAUL_ITEM, /* PET */
df::unit_labor::HAUL_FOOD, /* SEEDS */
df::unit_labor::HAUL_FOOD, /* PLANT */
df::unit_labor::HAUL_ITEM, /* SKIN_TANNED */
df::unit_labor::HAUL_FOOD, /* LEAVES */
df::unit_labor::HAUL_ITEM, /* THREAD */
df::unit_labor::HAUL_ITEM, /* CLOTH */
df::unit_labor::HAUL_ITEM, /* TOTEM */
df::unit_labor::HAUL_ITEM, /* PANTS */
df::unit_labor::HAUL_ITEM, /* BACKPACK */
df::unit_labor::HAUL_ITEM, /* QUIVER */
df::unit_labor::HAUL_FURNITURE, /* CATAPULTPARTS */
df::unit_labor::HAUL_FURNITURE, /* BALLISTAPARTS */
df::unit_labor::HAUL_FURNITURE, /* SIEGEAMMO */
df::unit_labor::HAUL_FURNITURE, /* BALLISTAARROWHEAD */
df::unit_labor::HAUL_FURNITURE, /* TRAPPARTS */
df::unit_labor::HAUL_FURNITURE, /* TRAPCOMP */
df::unit_labor::HAUL_FOOD, /* DRINK */
df::unit_labor::HAUL_FOOD, /* POWDER_MISC */
df::unit_labor::HAUL_FOOD, /* CHEESE */
df::unit_labor::HAUL_FOOD, /* FOOD */
df::unit_labor::HAUL_FOOD, /* LIQUID_MISC */
df::unit_labor::HAUL_ITEM, /* COIN */
df::unit_labor::HAUL_FOOD, /* GLOB */
df::unit_labor::HAUL_STONE, /* ROCK */
df::unit_labor::HAUL_FURNITURE, /* PIPE_SECTION */
df::unit_labor::HAUL_FURNITURE, /* HATCH_COVER */
df::unit_labor::HAUL_FURNITURE, /* GRATE */
df::unit_labor::HAUL_FURNITURE, /* QUERN */
df::unit_labor::HAUL_FURNITURE, /* MILLSTONE */
df::unit_labor::HAUL_ITEM, /* SPLINT */
df::unit_labor::HAUL_ITEM, /* CRUTCH */
df::unit_labor::HAUL_FURNITURE, /* TRACTION_BENCH */
df::unit_labor::HAUL_ITEM, /* ORTHOPEDIC_CAST */
df::unit_labor::HAUL_ITEM, /* TOOL */
df::unit_labor::HAUL_FURNITURE, /* SLAB */
df::unit_labor::HAUL_FOOD, /* EGG */
df::unit_labor::HAUL_ITEM, /* BOOK */
};
static bool isOptionEnabled(unsigned flag)
{
return config.isValid() && (config.ival(0) & flag) != 0;
@ -736,81 +833,471 @@ static df::building* get_building_from_job(df::job* j)
return 0;
}
static df::job_skill workshop_build_labor[] =
{
/* Carpenters */ df::job_skill::CARPENTRY,
/* Farmers */ df::job_skill::PROCESSPLANTS,
/* Masons */ df::job_skill::MASONRY,
/* Craftsdwarfs */ df::job_skill::STONECRAFT,
/* Jewelers */ df::job_skill::CUTGEM,
/* MetalsmithsForge */ df::job_skill::METALCRAFT,
/* MagmaForge */ df::job_skill::METALCRAFT,
/* Bowyers */ df::job_skill::BOWYER,
/* Mechanics */ df::job_skill::MECHANICS,
/* Siege */ df::job_skill::SIEGECRAFT,
/* Butchers */ df::job_skill::BUTCHER,
/* Leatherworks */ df::job_skill::LEATHERWORK,
/* Tanners */ df::job_skill::TANNER,
/* Clothiers */ df::job_skill::CLOTHESMAKING,
/* Fishery */ df::job_skill::FISH,
/* Still */ df::job_skill::BREWING,
/* Loom */ df::job_skill::WEAVING,
/* Quern */ df::job_skill::MILLING,
/* Kennels */ df::job_skill::ANIMALTRAIN,
/* Kitchen */ df::job_skill::COOK,
/* Ashery */ df::job_skill::LYE_MAKING,
/* Dyers */ df::job_skill::DYER,
/* Millstone */ df::job_skill::MILLING,
/* Custom */ (df::job_skill) -1,
/* Tool */ (df::job_skill) -1
static df::unit_labor workshop_build_labor[] =
{
/* Carpenters */ df::unit_labor::CARPENTER,
/* Farmers */ df::unit_labor::HERBALIST,
/* Masons */ df::unit_labor::MASON,
/* Craftsdwarfs */ df::unit_labor::STONE_CRAFT,
/* Jewelers */ df::unit_labor::CUT_GEM,
/* MetalsmithsForge */ df::unit_labor::METAL_CRAFT,
/* MagmaForge */ df::unit_labor::METAL_CRAFT,
/* Bowyers */ df::unit_labor::BOWYER,
/* Mechanics */ df::unit_labor::MECHANIC,
/* Siege */ df::unit_labor::SIEGECRAFT,
/* Butchers */ df::unit_labor::BUTCHER,
/* Leatherworks */ df::unit_labor::LEATHER,
/* Tanners */ df::unit_labor::TANNER,
/* Clothiers */ df::unit_labor::CLOTHESMAKER,
/* Fishery */ df::unit_labor::FISH,
/* Still */ df::unit_labor::BREWER,
/* Loom */ df::unit_labor::WEAVER,
/* Quern */ df::unit_labor::MILLER,
/* Kennels */ df::unit_labor::ANIMALTRAIN,
/* Kitchen */ df::unit_labor::COOK,
/* Ashery */ df::unit_labor::LYE_MAKING,
/* Dyers */ df::unit_labor::DYER,
/* Millstone */ df::unit_labor::MILLER,
/* Custom */ df::unit_labor::NONE,
/* Tool */ df::unit_labor::NONE
};
static df::unit_labor find_job_labor(df::job* j)
class jlfunc
{
df::job_skill skill;
public:
virtual df::unit_labor get_labor(df::job* j) = 0;
};
class jlfunc_const : public jlfunc
{
private:
df::unit_labor labor;
public:
df::unit_labor get_labor(df::job* j)
{
return labor;
}
jlfunc_const(df::unit_labor l) : labor(l) {};
};
labor = df::unit_labor::NONE;
class jlfunc_hauling : public jlfunc
{
public:
df::unit_labor get_labor(df::job* j)
{
df::item* item = j->items[0]->item;
return hauling_labor_map[item->getType()];
}
jlfunc_hauling() {};
};
switch (j->job_type)
class jlfunc_construct_bld : public jlfunc
{
case df::job_type::ConstructBuilding:
case df::job_type::DestroyBuilding:
public:
df::unit_labor get_labor(df::job* j)
{
df::building* bld = get_building_from_job (j);
switch (bld->getType())
{
case df::building_type::Workshop:
df::building_workshopst* ws = (df::building_workshopst*) bld;
skill = workshop_build_labor[ws->type];
if (ws->type == df::workshop_type::Custom)
{
df::building_def* def = df::building_def::find(ws->custom_type);
return def->build_labors[0];
}
else
return workshop_build_labor[ws->type];
break;
}
// FIXME
return df::unit_labor::NONE;
}
break;
jlfunc_construct_bld() {}
};
class jlfunc_destroy_bld : public jlfunc
{
public:
df::unit_labor get_labor(df::job* j)
{
df::building* bld = get_building_from_job (j);
df::building_type type = bld->getType();
// FIXME
return df::unit_labor::NONE;
}
jlfunc_destroy_bld() {}
};
case df::job_type::CustomReaction:
class jlfunc_make : public jlfunc
{
private:
df::unit_labor metaltype;
public:
df::unit_labor get_labor(df::job* j)
{
df::building* bld = get_building_from_job(j);
if (bld->getType() == df::building_type::Workshop)
{
df::workshop_type type = ((df::building_workshopst*)(bld))->type;
switch (type)
{
case df::workshop_type::Craftsdwarfs:
{
df::item_type jobitem = j->job_items[0]->item_type;
switch (jobitem)
{
case df::item_type::BOULDER:
return df::unit_labor::STONE_CRAFT;
case df::item_type::NONE:
if (j->material_category.bits.bone)
return df::unit_labor::BONE_CARVE;
else
return df::unit_labor::NONE; //FIXME
default:
return df::unit_labor::NONE; //FIXME
}
}
case df::workshop_type::Masons:
return df::unit_labor::MASON;
case df::workshop_type::Carpenters:
return df::unit_labor::CARPENTER;
case df::workshop_type::Leatherworks:
return df::unit_labor::LEATHER;
case df::workshop_type::Clothiers:
return df::unit_labor::CLOTHESMAKER;
case df::workshop_type::MagmaForge:
case df::workshop_type::MetalsmithsForge:
return metaltype;
default:
return df::unit_labor::NONE; // FIXME
}
}
else if (bld->getType() == df::building_type::Furnace)
{
df::furnace_type type = ((df::building_furnacest*)(bld))->type;
switch (type)
{
case df::furnace_type::MagmaGlassFurnace:
case df::furnace_type::GlassFurnace:
return df::unit_labor::GLASSMAKER;
default:
return df::unit_labor::NONE; // FIXME
}
}
return df::unit_labor::NONE; // FIXME
}
jlfunc_make (df::unit_labor mt) : metaltype(mt) {}
};
class jlfunc_custom : public jlfunc
{
public:
df::unit_labor get_labor(df::job* j)
{
for (auto r = world->raws.reactions.begin(); r != world->raws.reactions.end(); r++)
{
if ((*r)->code == j->reaction_name)
{
skill = (*r)->skill;
break;
df::job_skill skill = (*r)->skill;
df::unit_labor labor = ENUM_ATTR(job_skill, labor, skill);
return labor;
}
}
break;
default:
skill = ENUM_ATTR(job_type, skill, j->job_type);
return df::unit_labor::NONE;
}
jlfunc_custom() {}
};
if (skill != df::job_skill::NONE)
labor = ENUM_ATTR(job_skill, labor, skill);
static map<df::unit_labor, jlfunc*> jlf_cache;
jlfunc* jlf_const(df::unit_labor l) {
jlfunc* jlf;
if (jlf_cache.count(l) == 0)
{
jlf = jlf_const(l);
jlf_cache[l] = jlf;
}
else
jlf = jlf_cache[l];
return jlf;
}
static jlfunc* jlf_no_labor = jlf_const(df::unit_labor::NONE);
static jlfunc* jlf_hauling = new jlfunc_hauling();
static jlfunc* jlf_make_furniture = new jlfunc_make(df::unit_labor::FORGE_FURNITURE);
static jlfunc* jlf_make_object = new jlfunc_make(df::unit_labor::METAL_CRAFT);
static jlfunc* jlf_make_armor = new jlfunc_make(df::unit_labor::FORGE_ARMOR);
static jlfunc* jlf_make_weapon = new jlfunc_make(df::unit_labor::FORGE_WEAPON);
static jlfunc* job_to_labor_table[] = {
jlf_const(df::unit_labor::DETAIL) /* CarveFortification */,
jlf_const(df::unit_labor::DETAIL) /* DetailWall */,
jlf_const(df::unit_labor::DETAIL) /* DetailFloor */,
jlf_const(df::unit_labor::MINE) /* Dig */,
jlf_const(df::unit_labor::MINE) /* CarveUpwardStaircase */,
jlf_const(df::unit_labor::MINE) /* CarveDownwardStaircase */,
jlf_const(df::unit_labor::MINE) /* CarveUpDownStaircase */,
jlf_const(df::unit_labor::MINE) /* CarveRamp */,
jlf_const(df::unit_labor::MINE) /* DigChannel */,
jlf_const(df::unit_labor::CUTWOOD) /* FellTree */,
jlf_const(df::unit_labor::HERBALIST) /* GatherPlants */,
jlf_no_labor /* RemoveConstruction */,
jlf_const(df::unit_labor::WEAVER) /* CollectWebs */,
jlf_no_labor /* BringItemToDepot */,
jlf_no_labor /* BringItemToShop */,
jlf_no_labor /* Eat */,
jlf_no_labor /* GetProvisions */,
jlf_no_labor /* Drink */,
jlf_no_labor /* Drink2 */,
jlf_no_labor /* FillWaterskin */,
jlf_no_labor /* FillWaterskin2 */,
jlf_no_labor /* Sleep */,
jlf_const(df::unit_labor::GLASSMAKER) /* CollectSand */,
jlf_const(df::unit_labor::FISH) /* Fish */,
jlf_const(df::unit_labor::HUNT) /* Hunt */,
jlf_no_labor /* HuntVermin */,
jlf_no_labor /* Kidnap */,
jlf_no_labor /* BeatCriminal */,
jlf_no_labor /* StartingFistFight */,
jlf_no_labor /* CollectTaxes */,
jlf_no_labor /* GuardTaxCollector */,
jlf_const(df::unit_labor::HUNT) /* CatchLiveLandAnimal */,
jlf_const(df::unit_labor::FISH) /* CatchLiveFish */,
jlf_no_labor /* ReturnKill */,
jlf_no_labor /* CheckChest */,
jlf_no_labor /* StoreOwnedItem */,
jlf_const(df::unit_labor::HAUL_BODY) /* PlaceItemInTomb */,
jlf_hauling /* StoreItemInStockpile */,
jlf_hauling /* StoreItemInBag */,
jlf_hauling /* StoreItemInHospital */,
jlf_hauling /* StoreItemInChest */,
jlf_hauling /* StoreItemInCabinet */,
jlf_hauling /* StoreWeapon */,
jlf_hauling /* StoreArmor */,
jlf_hauling /* StoreItemInBarrel */,
jlf_hauling /* StoreItemInBin */,
jlf_no_labor /* SeekArtifact */,
jlf_no_labor /* SeekInfant */,
jlf_no_labor /* AttendParty */,
jlf_no_labor /* GoShopping */,
jlf_no_labor /* GoShopping2 */,
jlf_const(df::unit_labor::CLEAN) /* Clean */,
jlf_no_labor /* Rest */,
jlf_no_labor /* PickupEquipment */,
jlf_hauling /* DumpItem */,
jlf_no_labor /* StrangeMoodCrafter */,
jlf_no_labor /* StrangeMoodJeweller */,
jlf_no_labor /* StrangeMoodForge */,
jlf_no_labor /* StrangeMoodMagmaForge */,
jlf_no_labor /* StrangeMoodBrooding */,
jlf_no_labor /* StrangeMoodFell */,
jlf_no_labor /* StrangeMoodCarpenter */,
jlf_no_labor /* StrangeMoodMason */,
jlf_no_labor /* StrangeMoodBowyer */,
jlf_no_labor /* StrangeMoodTanner */,
jlf_no_labor /* StrangeMoodWeaver */,
jlf_no_labor /* StrangeMoodGlassmaker */,
jlf_no_labor /* StrangeMoodMechanics */,
new jlfunc_construct_bld() /* ConstructBuilding */,
jlf_make_furniture /* ConstructDoor */,
jlf_make_furniture /* ConstructFloodgate */,
jlf_make_furniture /* ConstructBed */,
jlf_make_furniture /* ConstructThrone */,
jlf_make_furniture /* ConstructCoffin */,
jlf_make_furniture /* ConstructTable */,
jlf_make_furniture /* ConstructChest */,
jlf_make_furniture /* ConstructBin */,
jlf_make_furniture /* ConstructArmorStand */,
jlf_make_furniture /* ConstructWeaponRack */,
jlf_make_furniture /* ConstructCabinet */,
jlf_make_furniture /* ConstructStatue */,
jlf_make_furniture /* ConstructBlocks */,
jlf_const(df::unit_labor::GLASSMAKER) /* MakeRawGlass */,
jlf_make_object /* MakeCrafts */,
jlf_const(df::unit_labor::METAL_CRAFT) /* MintCoins */,
jlf_const(df::unit_labor::CUT_GEM) /* CutGems */,
jlf_const(df::unit_labor::CUT_GEM) /* CutGlass */,
jlf_const(df::unit_labor::ENCRUST_GEM) /* EncrustWithGems */,
jlf_const(df::unit_labor::ENCRUST_GEM) /* EncrustWithGlass */,
new jlfunc_destroy_bld() /* DestroyBuilding */,
jlf_const(df::unit_labor::SMELT) /* SmeltOre */,
jlf_const(df::unit_labor::SMELT) /* MeltMetalObject */,
jlf_const(df::unit_labor::EXTRACT_STRAND) /* ExtractMetalStrands */,
jlf_const(df::unit_labor::PLANT) /* PlantSeeds */,
jlf_const(df::unit_labor::PLANT) /* HarvestPlants */,
jlf_const(df::unit_labor::ANIMALTRAIN) /* TrainHuntingAnimal */,
jlf_const(df::unit_labor::ANIMALTRAIN) /* TrainWarAnimal */,
jlf_make_weapon /* MakeWeapon */,
jlf_make_furniture /* ForgeAnvil */,
jlf_const(df::unit_labor::SIEGECRAFT) /* ConstructCatapultParts */,
jlf_const(df::unit_labor::SIEGECRAFT) /* ConstructBallistaParts */,
jlf_make_armor /* MakeArmor */,
jlf_make_armor /* MakeHelm */,
jlf_make_armor /* MakePants */,
jlf_make_object /* StudWith */,
jlf_const(df::unit_labor::BUTCHER) /* ButcherAnimal */,
jlf_const(df::unit_labor::CLEAN_FISH) /* PrepareRawFish */,
jlf_const(df::unit_labor::MILLER) /* MillPlants */,
jlf_const(df::unit_labor::TRAPPER) /* BaitTrap */,
jlf_const(df::unit_labor::MILK) /* MilkCreature */,
jlf_const(df::unit_labor::MAKE_CHEESE) /* MakeCheese */,
jlf_const(df::unit_labor::PROCESS_PLANT) /* ProcessPlants */,
jlf_const(df::unit_labor::PROCESS_PLANT) /* ProcessPlantsBag */,
jlf_const(df::unit_labor::PROCESS_PLANT) /* ProcessPlantsVial */,
jlf_const(df::unit_labor::PROCESS_PLANT) /* ProcessPlantsBarrel */,
jlf_const(df::unit_labor::COOK) /* PrepareMeal */,
jlf_const(df::unit_labor::WEAVER) /* WeaveCloth */,
jlf_make_armor /* MakeGloves */,
jlf_make_armor /* MakeShoes */,
jlf_make_armor /* MakeShield */,
jlf_make_furniture /* MakeCage */,
jlf_make_object /* MakeChain */,
jlf_make_object /* MakeFlask */,
jlf_make_object /* MakeGoblet */,
jlf_make_object/* MakeInstrument */,
jlf_make_object/* MakeToy */,
jlf_const(df::unit_labor::TRAPPER) /* MakeAnimalTrap */,
jlf_make_furniture /* MakeBarrel */,
jlf_make_furniture /* MakeBucket */,
jlf_make_furniture /* MakeWindow */,
jlf_const(df::unit_labor::BONE_CARVE) /* MakeTotem */,
jlf_make_weapon /* MakeAmmo */,
jlf_make_object /* DecorateWith */,
jlf_make_object /* MakeBackpack */,
jlf_make_armor /* MakeQuiver */,
jlf_make_weapon /* MakeBallistaArrowHead */,
jlf_const(df::unit_labor::SIEGECRAFT) /* AssembleSiegeAmmo */,
jlf_const(df::unit_labor::SIEGEOPERATE) /* LoadCatapult */,
jlf_const(df::unit_labor::SIEGEOPERATE) /* LoadBallista */,
jlf_const(df::unit_labor::SIEGEOPERATE) /* FireCatapult */,
jlf_const(df::unit_labor::SIEGEOPERATE) /* FireBallista */,
jlf_const(df::unit_labor::MECHANIC) /* ConstructMechanisms */,
jlf_const(df::unit_labor::MECHANIC) /* MakeTrapComponent */,
jlf_const(df::unit_labor::MECHANIC) /* LoadCageTrap */,
jlf_const(df::unit_labor::MECHANIC) /* LoadStoneTrap */,
jlf_const(df::unit_labor::MECHANIC) /* LoadWeaponTrap */,
jlf_const(df::unit_labor::MECHANIC) /* CleanTrap */,
jlf_no_labor /* CastSpell */,
jlf_const(df::unit_labor::MECHANIC) /* LinkBuildingToTrigger */,
jlf_no_labor /* PullLever */,
jlf_const(df::unit_labor::BREWER) /* BrewDrink */,
jlf_const(df::unit_labor::HERBALIST) /* ExtractFromPlants */,
jlf_const(df::unit_labor::DISSECT_FISH) /* ExtractFromRawFish */,
jlf_const(df::unit_labor::DISSECT_VERMIN) /* ExtractFromLandAnimal */,
jlf_const(df::unit_labor::ANIMALTRAIN) /* TameVermin */,
jlf_const(df::unit_labor::ANIMALTRAIN) /* TameAnimal */,
jlf_no_labor /* ChainAnimal */,
jlf_no_labor /* UnchainAnimal */,
jlf_no_labor /* UnchainPet */,
jlf_no_labor /* ReleaseLargeCreature */,
jlf_no_labor /* ReleasePet */,
jlf_no_labor /* ReleaseSmallCreature */,
jlf_no_labor /* HandleSmallCreature */,
jlf_no_labor /* HandleLargeCreature */,
jlf_no_labor /* CageLargeCreature */,
jlf_no_labor /* CageSmallCreature */,
jlf_const(df::unit_labor::RECOVER_WOUNDED) /* RecoverWounded */,
jlf_const(df::unit_labor::DIAGNOSE) /* DiagnosePatient */,
jlf_const(df::unit_labor::BONE_SETTING) /* ImmobilizeBreak */,
jlf_const(df::unit_labor::DRESSING_WOUNDS) /* DressWound */,
jlf_const(df::unit_labor::CLEAN) /* CleanPatient */,
jlf_const(df::unit_labor::SURGERY) /* Surgery */,
jlf_const(df::unit_labor::SUTURING) /* Suture */,
jlf_const(df::unit_labor::BONE_SETTING) /* SetBone */,
jlf_const(df::unit_labor::BONE_SETTING) /* PlaceInTraction */,
jlf_no_labor /* DrainAquarium */,
jlf_no_labor /* FillAquarium */,
jlf_no_labor /* FillPond */,
jlf_const(df::unit_labor::FEED_WATER_CIVILIANS) /* GiveWater */,
jlf_const(df::unit_labor::FEED_WATER_CIVILIANS) /* GiveFood */,
jlf_no_labor /* GiveWater2 */,
jlf_no_labor /* GiveFood2 */,
jlf_no_labor /* RecoverPet */,
jlf_no_labor /* PitLargeAnimal */,
jlf_no_labor /* PitSmallAnimal */,
jlf_const(df::unit_labor::BUTCHER) /* SlaughterAnimal */,
jlf_const(df::unit_labor::BURN_WOOD) /* MakeCharcoal */,
jlf_const(df::unit_labor::BURN_WOOD) /* MakeAsh */,
jlf_const(df::unit_labor::LYE_MAKING) /* MakeLye */,
jlf_const(df::unit_labor::POTASH_MAKING) /* MakePotashFromLye */,
jlf_const(df::unit_labor::PLANT) /* FertilizeField */,
jlf_const(df::unit_labor::POTASH_MAKING) /* MakePotashFromAsh */,
jlf_const(df::unit_labor::DYER) /* DyeThread */,
jlf_const(df::unit_labor::DYER) /* DyeCloth */,
jlf_make_object /* SewImage */,
jlf_make_furniture /* MakePipeSection */,
jlf_const(df::unit_labor::OPERATE_PUMP) /* OperatePump */,
jlf_no_labor /* ManageWorkOrders */,
jlf_no_labor /* UpdateStockpileRecords */,
jlf_no_labor /* TradeAtDepot */,
jlf_make_furniture /* ConstructHatchCover */,
jlf_make_furniture /* ConstructGrate */,
jlf_const(df::unit_labor::MINE) /* RemoveStairs */,
jlf_make_furniture /* ConstructQuern */,
jlf_make_furniture /* ConstructMillstone */,
jlf_make_object /* ConstructSplint */,
jlf_make_object /* ConstructCrutch */,
jlf_const(df::unit_labor::MECHANIC) /* ConstructTractionBench */,
jlf_no_labor /* CleanSelf */,
jlf_no_labor /* BringCrutch */,
jlf_const(df::unit_labor::BONE_SETTING) /* ApplyCast */,
new jlfunc_custom() /* CustomReaction */,
jlf_make_furniture /* ConstructSlab */,
jlf_const(df::unit_labor::STONE_CRAFT) /* EngraveSlab */,
jlf_const(df::unit_labor::SHEARER) /* ShearCreature */,
jlf_const(df::unit_labor::SPINNER) /* SpinThread */,
jlf_no_labor /* PenLargeAnimal */,
jlf_no_labor /* PenSmallAnimal */,
jlf_make_furniture /* MakeTool */,
jlf_const(df::unit_labor::POTTERY) /* CollectClay */,
jlf_const(df::unit_labor::BEEKEEPING) /* InstallColonyInHive */,
jlf_const(df::unit_labor::BEEKEEPING) /* CollectHiveProducts */,
jlf_no_labor /* CauseTrouble */,
jlf_no_labor /* DrinkBlood */,
jlf_no_labor /* ReportCrime */,
jlf_no_labor /* ExecuteCriminal */,
jlf_const(df::unit_labor::ANIMALTRAIN) /* TrainAnimal */,
jlf_const(df::unit_labor::DETAIL) /* CarveTrack */,
jlf_const(df::unit_labor::PUSH_HAUL_VEHICLE) /* PushTrackVehicle */,
jlf_const(df::unit_labor::PUSH_HAUL_VEHICLE) /* PlaceTrackVehicle */,
jlf_const(df::unit_labor::PUSH_HAUL_VEHICLE) /* StoreItemInVehicle */
};
if (labor == df::unit_labor::NONE)
labor = ENUM_ATTR(job_type, labor, j->job_type);
if (labor == -1)
static df::unit_labor find_job_labor(df::job* j)
{
if (j->job_type == df::job_type::CustomReaction)
{
for (auto r = world->raws.reactions.begin(); r != world->raws.reactions.end(); r++)
{
if ((*r)->code == j->reaction_name)
{
df::job_skill skill = (*r)->skill;
return ENUM_ATTR(job_skill, labor, skill);
}
}
return df::unit_labor::NONE;
}
df::job_skill skill;
df::unit_labor labor;
skill = ENUM_ATTR(job_type, skill, j->job_type);
if (skill != df::job_skill::NONE)
labor = ENUM_ATTR(job_skill, labor, skill);
else
labor = ENUM_ATTR(job_type, labor, j->job_type);
if (labor == df::unit_labor::NONE)
labor = job_to_labor_table[j->job_type]->get_labor(j);
return labor;
}