Module:HostStars
From MicrasWiki
Documentation for this module may be created at Module:HostStars/doc
---------------------------------------------------------
-- Module: HostStars_AccurateMap
-- Tries a more "chart-based" star logic for top image,
-- focusing on whether each star is visible at midnight
-- from Vaeringheim (~44°N) on a given day-of-year.
--
-- * Some stars become circumpolar if star-lat >= 46°.
-- * Others have a sine-based season: visible ~ half the year.
---------------------------------------------------------
local p = {}
---------------------------------------------------------
-- 1. dayOfYear (Micras-based):
-- 183-day orbit, epoch = 6 Aug 1999 => day=0
---------------------------------------------------------
local function getDayOfYearForPSSC()
local startDate = os.time({year=1999, month=8, day=6})
local secPerDay = 86400
local daysPerYear = 183
local currentTime = os.time()
local totalDays = math.floor((currentTime - startDate) / secPerDay)
local fracYear = totalDays / daysPerYear
local psscYear= math.floor(fracYear)
local dayOfYear= math.floor((fracYear-psscYear)*daysPerYear) + 1
return dayOfYear
end
---------------------------------------------------------
-- 2. Our star data (N. hemisphere top image).
-- We'll keep a "latitude" (really 'declination'-like).
---------------------------------------------------------
local starDataNorth = {
{ name="Agave", starClass="M", lat=29.5 },
{ name="Amaäz", starClass="K", lat=31 },
{ name="Amáenu", starClass="G", lat=45 },
{ name="Amap", starClass="A", lat=55 },
{ name="Amazä", starClass="F", lat=39 },
{ name="Atämios", starClass="F", lat=56 },
{ name="Aprobelle", starClass="A", lat=59 },
{ name="Azos", starClass="Galaxy", lat=60 },
{ name="Bebeakaus", starClass="K", lat=30.5 },
{ name="Bulhanu", starClass="A", lat=40 },
{ name="Crösacío", starClass="K", lat=17 },
{ name="Danaß", starClass="A", lat=67 },
{ name="Dilëtaz", starClass="G", lat=36 },
{ name="Dranamos", starClass="A", lat=58 },
{ name="Gaht", starClass="G", lat=29 },
{ name="Häpi", starClass="F", lat=78 },
{ name="Hazaméos", starClass="A", lat=72 },
{ name="Liléigos", starClass="F", lat=18 },
{ name="Nyama", starClass="F", lat=64 },
{ name="Ocananus", starClass="F", lat=60.5 },
{ name="Orebele", starClass="F", lat=22 },
{ name="Osiríos", starClass="G", lat=53 },
{ name="Pythe", starClass="A", lat=45 },
{ name="Sanashalo", starClass="G", lat=27 },
{ name="Tä", starClass="F", lat=39.5 },
{ name="Vï", starClass="A", lat=46 },
{ name="Wedíos", starClass="A", lat=54 },
}
---------------------------------------------------------
-- 3. Our location: Vaeringheim ~44°N
---------------------------------------------------------
local observerLat = 44
---------------------------------------------------------
-- 4. Check "circumpolar?"
-- For star-lat >= (90 - observerLat)=46 => circumpolar
---------------------------------------------------------
local function isCircumpolar(starLat)
local limit = 90 - observerLat
return (starLat >= limit)
end
---------------------------------------------------------
-- 5. For non-circumpolar stars, we do a "season window" logic:
-- We'll define star "peak visibility" day = some function of lat.
-- Then we define it visible for ~ half the year around that peak.
---------------------------------------------------------
local function isStarUpAtMidnight(starLat, dayOfYear)
-- let "peak" day = 10 * starLat mod 183 (some made-up formula)
-- or let's do simpler: starLat*2 => wrap mod 183
local peakDay = (starLat*2) % 183
-- we define "visible range" ~ +/- 45 days from peak => 90 days total
-- that means about half the year. Tweak as desired
local halfWindow = 45
-- difference in dayOfYear
local diff = dayOfYear - peakDay
-- wrap around 183 => we want minimal cyc mod 183
diff = (diff + 183) % 183 -- ensures in [0..182]
if diff>91.5 then
diff = 183 - diff -- symmetrical
end
return (diff <= halfWindow)
end
---------------------------------------------------------
-- 6. Build the table
---------------------------------------------------------
function p.starsForMidnight(frame)
local dayOfYear = getDayOfYearForPSSC()
local out = {}
table.insert(out, "=== Stars Visible at Midnight in Vaeringheim (44°N) ===\n")
table.insert(out, string.format("''Day %d of Micras Year (183 days)''\n\n", dayOfYear))
table.insert(out, '{| class="wikitable" style="width:100%; text-align:left;"\n')
table.insert(out, "! Star Name !! Star Class !! Circumpolar? !! Visible at 00:00? !! Note\n")
for _, star in ipairs(starDataNorth) do
local circ = isCircumpolar(star.lat)
local isUp
local note=""
if circ then
isUp = true
note="Circumpolar => always above horizon"
else
local val = isStarUpAtMidnight(star.lat, dayOfYear)
isUp = val
note="Season-based ~ half-year window"
end
local circStr = circ and "Yes" or "No"
local upStr = isUp and "Yes" or "No"
table.insert(out, "|-\n")
table.insert(out, string.format("| %s || %s || %s || %s || %s\n",
star.name, star.starClass, circStr, upStr, note
))
end
table.insert(out, "|}\n")
return table.concat(out)
end
return p