Profile cover photo
Profile photo
Daryl Sawyer
119 followers
119 followers
About
Posts

Post has attachment
I write a thing. For once, it's not about high minded redesign of government at the sovereignty level. It's more of a futuristic practical redesign at the executive level: traffic enforcement for the future.
Add a comment...

Post has attachment
Old buddy of mine took first this year (Comedy) at Otakon!

I finally finished reading Negima. It left me wanting more, which is, I suppose, how this is supposed to work.

So, is the discussion of what name Negi whispered into Asuna's ear over? Or can I still take part? :p

Post has attachment
Just some musings on what "negative interest rates" mean, and how they can and will exist in an anarcho-capitalist context.
Add a comment...

Post has attachment
Add a comment...

I've been messing around with Lua, trying to learn it, and wrote a lua script that generates a randomly rolled sector under MgT rules? It makes worlds and outputs a text file with UWPs, more expanded listings, and all 1 or 2 jump trade routes. The only thing it doesn't do is draw the maps for you.

--[[
How to use this file:
The main use of this file is simply to run sectorFile(). This will create a text file
called "sectorinfo.txt", which will have information about a standard Traveller sector.
The first section has a complete description of each sector (includes info not included in the UWP).
The second section is the UWP list. The final section lists 1-2 jump trade routes.
But I'm sure there's lots of things that can be done by the functions in this file.
]]

-- This is an alternative rolling function, for those don't trust the random function, and would
-- rather rolll the dice themselves. Use comments to activate the desired function
--[[function roll(qty, die)
die = die or 6
qty = qty or 2
print("Roll " .. qty .. "d" .. die .. ": ")
local result = io.read("*n")
return result
end]]

-- This function returns the result of 2d6 by default. With only one argument
-- it returns xd6. With two, it returns xdy
function roll (qty, die)
die = die or 6
qty = qty or 2
local result = 0
for x = 1, qty do result = result + math.random(die) end
return result
end

-- This function returns a numerical value describing the world's atmosphere (Atmosphere table in
-- MGT)
function getAtmosphere(size)
local result = roll() - 7 + size
if result < 0 then return 0 end
if result > 15 then return 15 end
return result
end

-- This function returns a string describing a world's temperature according to
-- Mongoose Traveller rules. It requires atmosphere as its first argument.
-- The second optional argument does nothing unless it equals "hot" or "cold",
-- and describes which edge of the habitable band the world is in.
function getTemp (atmosphere, edge)
local x = roll()
if atmosphere == 2 or atmosphere == 3 then x = x - 2
elseif atmosphere == 3 or atmosphere == 4 or atmosphere == 14 then x = x - 1
elseif atmosphere == 8 or atmosphere == 9 then x = x + 1
elseif atmosphere == 10 or atmosphere == 13 or atmosphere == 15 then x = x + 2
elseif atmosphere == 11 or atmosphere == 12 then x = x + 6
end
if edge == "hot" then x = x + 4
elseif edge == "cold" then x = x - 4 end
if x <= 2 then return "Frozen" end
if x <= 4 then return "Cold" end
if x <= 9 then return "Temperate" end
if x <= 11 then return "Hot" end
if x >= 12 then return "Roasting" end
end

-- This function returns the a numerical value corresponding percentage of the surface of the world
-- covered with water (Hydrographics table on page 172, Mongoose Traveller).
-- Arguments required: size of the world, atmosphere, temperature.
function getHydro (size, atmosphere, temperature)
if size == 0 or size == 1 then return 0 end
local result = roll() - 7 + size
if atmosphere == 0 or atmosphere == 1 or atmosphere >= 10 and atmosphere <= 12
then result = result - 4 end
if atmosphere ~= 13 then
if temperature == "Hot" then result = result - 2
elseif temperature == "Roasting" then result = result - 6
end
end
if result <= 0 then return 0 end
if result >= 10 then return 10 end
return result
end

-- This function returns a table of numerical values describing the government and culture on the world
-- (reference Government Table, Mongoose Traveller page 175). Required argument: population.
-- Entry 1 is the official government. Even entries except final entry are factions, following odd entries
-- are the strength of the factions. Final entry references Cultural Differences table, Mongoose
-- Traveller page 177.
function getGovernment (population)
if population == 0 then return {0,99} end
local result = {roll() - 7 + population}
if result[1] < 0 then result[1] = 0
elseif result[1] > 13 then result[1] = 13 end
local i = roll(1,3)
if result[1] == 0 or result[1] == 7 then i = i + 1 end
if result[1] <= 10 then i = i - 1 end
for x = 1, 2 * i, 2 do
result[x + 1] = roll() - 7 + population
if result[x + 1] < 0 then result[x + 1] = 0
elseif result[x + 1] > 13 then result[x + 1] = 13 end
result[x + 2] = roll()
end
result[#result + 1] = roll(1) * 10 + roll(1)
return result
end

function getLaw(gov)
local result = roll() - 7 + gov
if result < 0 then return 0 end
return result
end

-- This function returns a table describing the starport located at a world. It currently requires
-- no arguments, but will optionally use the variant argument once implemented. Entry "class" is a string
-- indicating starport class. Entry "berth" is a numerical value representing the starport's berthing cost.
-- The entries at the end indicate the presence of bases, if any.
-- Values reference Starport tables, Mongoose Traveller, page 178.
function getStarport ()
local x = roll()
local result = {}
if x <= 2 then result.class = "X"
elseif x == 3 or x == 4 then result.class = "E"
elseif x == 5 or x == 6 then result.class = "D"
elseif x == 7 or x == 8 then result.class = "C"
elseif x == 9 or x == 10 then result.class = "B"
elseif x >= 11 then result.class = "A"
end
result.bases = {}
if result.class == "A" then
result.berth = roll(1) * 1000
if roll() >= 8 then result.bases[#result.bases + 1] = "N" end
if roll() >= 10 then result.bases[#result.bases + 1] = "S" end
if roll() >= 8 then result.bases[#result.bases + 1] = "R" end
if roll() >= 4 then result.bases[#result.bases + 1] = "T" end
if roll() >= 6 then result.bases[#result.bases + 1] = "C" end
end
if result.class == "B" then
result.berth = roll(1) * 500
if roll() >= 8 then result.bases[#result.bases + 1] = "N" end
if roll() >= 8 then result.bases[#result.bases + 1] = "S" end
if roll() >= 10 then result.bases[#result.bases + 1] = "R" end
if roll() >= 6 then result.bases[#result.bases + 1] = "T" end
if roll() >= 8 then result.bases[#result.bases + 1] = "C" end
if roll() >= 12 then result.bases[#result.bases + 1] = "P" end
end
if result.class == "C" then
result.berth = roll(1) * 100
if roll() >= 8 then result.bases[#result.bases + 1] = "S" end
if roll() >= 10 then result.bases[#result.bases + 1] = "R" end
if roll() >= 10 then result.bases[#result.bases + 1] = "T" end
if roll() >= 10 then result.bases[#result.bases + 1] = "C" end
if roll() >= 10 then result.bases[#result.bases + 1] = "P" end
end
if result.class == "D" then
result.berth = roll(1) * 10
if roll() >= 7 then result.bases[#result.bases + 1] = "S" end
if roll() >= 12 then result.bases[#result.bases + 1] = "P" end
end
if result.class == "E" then
result.berth = 0
if roll() >= 12 then result.bases[#result.bases + 1] = "P" end
end
if result.class == "X" then result.berth = 0 end
return result
end

-- This function returns a numerical value indicating a world's technology level.
function getTech (starport, size, atmosphere, hydrographics, population, government)
local result = roll()
if starport == "A" then result = result + 6
elseif starport == "B" then result = result + 4
elseif starport == "C" then result = result + 2
elseif starport == "X" then result = result - 4
end
if size >= 0 and size <= 1 then result = result + 2
elseif size >=2 and size <= 4 then result = result + 1
end
if atmosphere <= 3 or atmosphere >= 10 then result = result + 1 end
if hydrographics == 0 or hydrographics == 9 then result = result + 1
elseif hydrographics == 10 then result = result + 2
end
if population >= 1 and population <= 5 or population == 9 then result = result + 1
elseif population == 10 then result = result + 2
elseif population == 11 then result = result + 3
elseif population == 12 then result = result + 4
end
if government == 0 or government == 5 then result = result + 1
elseif government == 7 then result = result + 2
elseif government == 13 or government == 14 then result = result - 2
end
if result < 0 then result = 0 end
return result
end

-- This function returns the appropriate trade codes, table on Mongoose Traveller page 181
function getCodes(system)
result = {}
if system.atmosphere >=4 and system.atmosphere <= 9 and system.hydrographics >=4 and
system.hydrographics <= 8 and system.population >= 5 and system.population <= 7 then
result[#result+1] = "Ag" end
if system.size == 0 and system.atmosphere == 0 and system.hydrographics == 0 then
result[#result+1] = "As" end
if system.population == 0 and system.government == 0 and system.law == 0 then
result[#result+1] = "Ba" end
if system.atmosphere >= 2 and system.hydrographics == 0 then result[#result+1] = "De" end
if system.atmosphere >= 10 and system.hydrographics >= 1 then result[#result+1] = "Fl" end
if system.size >= 5 and system.atmosphere >= 4 and system.atmosphere <= 9 and
system.hydrographics >=4 and system.hydrographics <= 8 then result[#result+1] = "Ga" end
if system.population >= 9 then result[#result+1] = "Hi" end
if system.tech >= 12 then result[#result+1] = "Ht" end
if system.atmosphere >=0 and system.atmosphere <= 1 and system.hydrographics >= 1 then
result[#result+1] = "IC" end
if (system.atmosphere >=0 and system.atmosphere <= 2 or system.atmosphere == 4 or
system.atmosphere == 7 or system.atmosphere == 9) and system.population >=9 then
result[#result+1] = "In" end
if system.population >= 1 and system.population <= 3 then result[#result+1] = "Lo" end
if system.tech <= 5 then result[#result+1] = "Lt" end
if system.atmosphere >= 0 and system.atmosphere <= 3 and system.hydrographics >= 0 and
system.hydrographics <= 3 and system.population >= 6 then result[#result+1] = "Na" end
if system.population >= 4 and system.population <= 6 then result[#result+1] = "NI" end
if system.atmosphere >= 2 and system.atmosphere <= 5 and system.population >= 0 and
system.population <= 3 then result[#result+1] = "Po" end
if (system.atmosphere == 6 or system.atmosphere == 8) and system.population >=6 and
system.population <= 8 then result[#result+1] = "Ri" end
if system.atmosphere == 0 then result[#result+1] = "Va" end
if system.hydrographics == 10 then result[#result+1] = "Wa" end
return result
end

-- This function returns a table containing values that define a star system, using rules from
-- Mongoose Traveller. The "variant" argument is optional, will only function if set to "Space Opera"
-- or "Hard Science" (and isn't yet implemented, anyway). All other values are ignored.
function getSystem (xloc, yloc, variant)
local result = {}
result.x = xloc
result.y=yloc
result.size = roll()
result.atmosphere = getAtmosphere(result.size)
result.temperature = getTemp(result.atmosphere, result.edge)
result.hydrographics = getHydro(result.size, result.atmosphere, result.temperature)
result.population = roll() - 2
result.government = getGovernment(result.population)
result.law = getLaw(result.government[1])
result.starport = getStarport()
result.tech = getTech(result.starport.class, result.size, result.atmosphere, result.hydrographics,
result.population, result.government[1])
result.codes = getCodes(result)
return result
end

-- This function creates either a subsector or a full sector, depending on the argument.
-- Argument should probably be 1 (for a subsector) or 4 (for a full sector).
-- Variant to be implemented later
function getSector(size)
local x = 1
local result = {}
for i = 1, 8 * size do
for j = 1, 10 * size do
if roll(1) > 3 then
result[x] = getSystem(i,j)
x = x + 1
end
end
end
return result
end

-- This function returns a string, the Universal World Profile for a given world (MGT pg. 170)
function UWP(system)
local loc = string.format("%02d%02d", system.x, system.y)
return string.format("%15s%-8s%s%X%X%X%X%X%X%-3d %-6s%-16s%s", system.name or " ", loc,
system.starport.class, system.size, system.atmosphere, system.hydrographics, system.population,
system.government[1], system.law, system.tech, table.concat(system.starport.bases), 
table.concat(system.codes, " "), system.travel or " ", "\n")
end

-- This function returns a string, a full description of a given world.
function fullDesc(system)
local result = UWP(system) .. "\n"
result = result .. "Temperature: " .. system.temperature .. "\n"
result = result .. "Culture: " .. tostring(system.government[#system.government]) .. "\nFactions: "
for x = 3, #system.government, 2 do
result = result .. string.format("%X%X ", system.government[x-1], system.government[x], "\n")
end
return result
end

function sectorUWP(sector)
local result = "UWP List" .. "\n"
for i = 1, #sector do
result = result .. UWP(sector[i]) .. "\n"
end
return result
end

function sectorFull(sector)
local result = "Complete Descriptions \n"
for i = 1, #sector do
result = result .. fullDesc(sector[i]) .. "\n"
end
return result
end

function checkRoutes(sector1, sector2)
if math.abs(sector1.x - sector2.x) < 3 and math.abs(sector1.y - sector2.y) < 3 then
for i = 1, #sector1.codes do
if sector1.codes[i] == "In" or sector1.codes[i] == "Ht" then
for j = 1, #sector2.codes do
if sector2.codes[j] == "As" or sector2.codes[j] == "De" or sector2.codes[j] == "IC" or
sector2.codes[j] == "NI" then return true
end
end
end
if sector1.codes[i] == "Hi" or sector1.codes[i] == "Ri" then
for j = 1, #sector2.codes do
if sector2.codes[j] == "Ag" or sector2.codes[j] == "Ga" or sector2.codes[j] == "Wa" then
return true
end
end
end
end
end
return false
end


function getRoutes(sector)
local result = "Trade routes:" .. "\n"
for i = 1, #sector do
for j = i, #sector do
if checkRoutes(sector[i], sector[j]) then
result = result .. sector[i].x .. sector[i].y .. " - " .. sector[j].x .. sector[j].y .. "\n"
end
end
end
return result
end

function sectorFile()
local x = getSector(4)
local file = io.open("sectorinfo.txt", "w")
file:write("Sectors: \n")
file:write(sectorFull(x) .. "\n")
file:write(sectorUWP(x) .. "\n")
file:write(getRoutes(x) .. "\n")
file:close()
end

I have a question about the Mongoose Traveler rules. In the world generation section, when rolling for temperature, there's a modifier for "hot edge" or "cold edge" of the habitable zone, but nothing preceding which determines which of these should be used.

It feels like a copy/paste error to me, but I could be wrong. If I'm right, does anyone here remember an earlier edition where this modifier was relevant? If I'm wrong, how is this supposed to be used?

As for me, when rolling sectors, I typically house-rule in the occasional double world system. When rolling for world occurrance, instead of rolling 1d6, I roll 2d6. 1-6 is no world, 7-11 indicates the presence of a world, and 12 generates a double world, with each world at the extreme ends of the habitable zone.

Post has attachment
Now we so happy, we do the Dance of Joy!
Photo

If you post a LOT in a short period of time, Google will flag your posts as spam. If I find the spam filter continually clogged with your posts, you will be banned. If you can see this post, it probably doesn't apply to you. :p

Post has attachment
Cool remix of "Mr. Music", and a good video, too.

Song: Mr. Music
Original Production: rerulili, Kagomine-P, Toku-P, Tomodachi Boshuu-P, Live-P, Otawa-P, Kihee, baker, Nem
Remix: GigaP
Voicebanks: IA, Hatsune Miku, Kagamine Rin, Kagamine Len, Megapoid GUMI
Add a comment...
Wait while more posts are being loaded