Last active
August 29, 2015 14:04
-
-
Save Putnam3145/77492ae79ca54fbf8af3 to your computer and use it in GitHub Desktop.
Determines the orientation of a citizen, your citizens, everyone on the map or all named units.
This file contains hidden or 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
local utils = require('utils') | |
validArgs = utils.invert({ | |
'all', | |
'citizens', | |
'named', | |
'notStraight', | |
'gayOnly', | |
'biOnly', | |
'straightOnly', | |
'asexualOnly', | |
'help' | |
}) | |
local args = utils.processArgs({...}, validArgs) | |
if args.help then | |
print( | |
[[gaydar.lua | |
arguments: | |
-help | |
print this help message | |
unit filters: | |
-all | |
shows orientation of every creature | |
-citizens | |
shows only orientation of citizens in fort mode | |
-named | |
shows orientation of all named units on map | |
orientation filters: | |
-notStraight | |
shows only creatures who are not strictly straight | |
-gayOnly | |
shows only creatures who are strictly gayOnly | |
-biOnly | |
shows only creatures who can get into romances with | |
both sexes | |
-straightOnly | |
shows only creatures who are strictly straight. | |
-asexualOnly | |
shows only creatures who are strictly asexual. | |
No argument will show the orientation of the unit | |
under the cursor. | |
]]) | |
return | |
end | |
function getSexString(sex) | |
local sexStr | |
if sex==0 then | |
sexStr=string.char(12) | |
elseif sex==1 then | |
sexStr=string.char(11) | |
else | |
return "" | |
end | |
return string.char(40)..sexStr..string.char(41) | |
end | |
local function determineorientation(unit) | |
if unit.sex~=-1 then | |
local return_string='' | |
local orientation=unit.status.current_soul.orientation_flags | |
local male_interested,asexual=false,true | |
if orientation.romance_male then | |
return_string=return_string..' likes males' | |
male_interested=true | |
asexual=false | |
elseif orientation.marry_male then | |
return_string=return_string..' will marry males' | |
male_interested=true | |
asexual=false | |
end | |
if orientation.romance_female then | |
if male_interested then | |
return_string=return_string..' and likes females' | |
else | |
return_string=return_string..' likes females' | |
end | |
asexual=false | |
elseif orientation.marry_female then | |
if male_interested then | |
return_string=return_string..' and will marry females' | |
else | |
return_string=return_string..' will marry females' | |
end | |
asexual=false | |
end | |
if asexual then | |
return_string=' is asexual' | |
end | |
return return_string | |
else | |
return "is not biologically capable of sex" | |
end | |
end | |
local function nameOrSpeciesAndNumber(unit) | |
if unit.name.has_name then | |
return dfhack.TranslateName(dfhack.units.getVisibleName(unit))..' '..getSexString(unit.sex),true | |
else | |
return 'Unit #'..unit.id..' ('..df.creature_raw.find(unit.race).caste[unit.caste].caste_name[0]..' '..getSexString(unit.sex)..')',false | |
end | |
end | |
local orientations={} | |
if args.citizens then | |
for k,v in ipairs(df.global.world.units.active) do | |
if dfhack.units.isCitizen(v) then | |
table.insert(orientations,nameOrSpeciesAndNumber(v) .. determineorientation(v)) | |
end | |
end | |
elseif args.all then | |
for k,v in ipairs(df.global.world.units.active) do | |
table.insert(orientations,nameOrSpeciesAndNumber(v)..determineorientation(v)) | |
end | |
elseif args.named then | |
for k,v in ipairs(df.global.world.units.active) do | |
local name,ok=nameOrSpeciesAndNumber(v) | |
if ok then | |
table.insert(orientations,name..determineorientation(v)) | |
end | |
end | |
else | |
local unit=dfhack.gui.getSelectedUnit(true) | |
local name,ok=nameOrSpeciesAndNumber(unit) | |
print(name..determineorientation(unit)) | |
return | |
end | |
function isNotStraight(v) | |
if v:find(string.char(12)) and v:find(' female') then return true end | |
if v:find(string.char(11)) and v:find(' male') then return true end | |
if v:find('asexual') then return true end | |
return false | |
end | |
function isGay(v) | |
if v:find('asexual') then return false end | |
if v:find(string.char(12)) and not v:find(' male') then return true end | |
if v:find(string.char(11)) and not v:find(' female') then return true end | |
return false | |
end | |
function isAsexual(v) | |
if v:find('asexual') then return true else return false end | |
end | |
function isBi(v) | |
if v:find(' female') and v:find(' male') then return true else return false end | |
end | |
if args.notStraight then | |
local totalNotShown=0 | |
for k,v in ipairs(orientations) do | |
if isNotStraight(v) then print(v) else totalNotShown=totalNotShown+1 end | |
end | |
print('Total not shown: '..totalNotShown) | |
elseif args.gayOnly then | |
local totalNotShown=0 | |
for k,v in ipairs(orientations) do | |
if isGay(v) then print(v) else totalNotShown=totalNotShown+1 end | |
end | |
print('Total not shown: '..totalNotShown) | |
elseif args.asexualOnly then | |
local totalNotShown=0 | |
for k,v in ipairs(orientations) do | |
if isAsexual(v) then print(v) else totalNotShown=totalNotShown+1 end | |
end | |
print('Total not shown: '..totalNotShown) | |
elseif args.straightOnly then | |
local totalNotShown=0 | |
for k,v in ipairs(orientations) do | |
if not isNotStraight(v) then print(v) else totalNotShown=totalNotShown+1 end | |
end | |
print('Total not shown: '..totalNotShown) | |
elseif args.biOnly then | |
local totalNotShown=0 | |
for k,v in ipairs(orientations) do | |
if isBi(v) then print(v) else totalNotShown=totalNotShown+1 end | |
end | |
print('Total not shown: '..totalNotShown) | |
else | |
for k,v in ipairs(orientations) do | |
print(v) | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment