diff --git a/scripts/gaydar.lua b/scripts/gaydar.lua new file mode 100644 index 000000000..f4eb7d67f --- /dev/null +++ b/scripts/gaydar.lua @@ -0,0 +1,190 @@ +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 \ No newline at end of file