# I'm up for hire: Custom Map Generators and more

I’d prefer a permanent position on a team, but I’ll still do a one time job.
I can create custom map generators, GUI shops, etc …
I can also make things you have made and update them with neater code, transitions and more.

Here is a picture of a map I made for The Hunger Games that was created with my generator

2 Likes

Interested in doing an RTS? I have an RTS named Control that I wouldn’t mind a generator for, if you are able to make one that can afford semi-balanced gameplay, and make unique enough maps that users don’t get bored

I’ve considered making a map generator myself eventually, but it’d almost be a whole other project for me to do, and I have my hands full with Control itself, and don’t wanna spend the time on a side feature

Edit: you would get credit, of course, as well as in-game currency, and R\$ (I currently don’t have too many R\$, but I can always finish a few scripting jobs to get some quick)

1 Like

I couldn’t PM this to Weeve so i’m posting them here

1 Like

My PMs is set to all users, but this is not the first time I’ve gotten that complaint, I changed it to something else, then back to all users, can you message me now?

[quote]
[/spoiler] [/quote]

Felt like writing this up:

``````
local ScaleX = 6
local ScaleY = 128
local ScaleZ = 6

local folder = Instance.new("Folder")

local function noise(...)
return math.noise(...) + 0.5 -- Because [0, 1] makes more sense
end
local function GetHeight(x, z) -- Octaves make it look cool
return
noise(x / 32,  z / 32, 123) / 2 +
noise(x / 16,  z / 16, 234) / 4 +
noise(x / 8,    z / 8, 345) / 8 +
1/8
end

for x = -32, 32 do
for z = -32, 32 do

local y = GetHeight(x, z)

local part = Instance.new("Part", folder)
part.Anchored = true
part.formFactor = 3

if y <= 0.2 then -- Awkward water
y = 0.2
part.Material = Enum.Material.SmoothPlastic
part.BrickColor = BrickColor.new("Deep blue")
elseif y < 0.65 then -- Grass
part.Material = Enum.Material.Grass
part.BrickColor = BrickColor.new("Bright green")
elseif y < 0.85 then -- Rock
part.Material = Enum.Material.Slate
part.BrickColor = BrickColor.new("Dark stone grey")
else -- Snow
part.Material = Enum.Material.Sand
part.BrickColor = BrickColor.new("White")
end

local height = y * ScaleY

part.Size = Vector3.new(ScaleX, height, ScaleZ)
part.CFrame = CFrame.new(x*ScaleX, height / 2, z*ScaleZ)

end
end

folder.Parent = workspace``````

The main problem is you’d need to jump from tile to tile or use a ridiculous number of parts. Have you tried using triangles?

[quote] I couldn’t PM this to Weeve so i’m posting them here

[/quote]

Felt like writing this up:

``````
local ScaleX = 6
local ScaleY = 128
local ScaleZ = 6

local folder = Instance.new("Folder")

local function noise(...)
return math.noise(...) + 0.5 -- Because [0, 1] makes more sense
end
local function GetHeight(x, z) -- Octaves make it look cool
return
noise(x / 32,  z / 32, 123) / 2 +
noise(x / 16,  z / 16, 234) / 4 +
noise(x / 8,    z / 8, 345) / 8 +
1/8
end

for x = -32, 32 do
for z = -32, 32 do

local y = GetHeight(x, z)

local part = Instance.new("Part", folder)
part.Anchored = true
part.formFactor = 3

if y <= 0.2 then -- Awkward water
y = 0.2
part.Material = Enum.Material.SmoothPlastic
part.BrickColor = BrickColor.new("Deep blue")
elseif y < 0.65 then -- Grass
part.Material = Enum.Material.Grass
part.BrickColor = BrickColor.new("Bright green")
elseif y < 0.85 then -- Rock
part.Material = Enum.Material.Slate
part.BrickColor = BrickColor.new("Dark stone grey")
else -- Snow
part.Material = Enum.Material.Sand
part.BrickColor = BrickColor.new("White")
end

local height = y * ScaleY

part.Size = Vector3.new(ScaleX, height, ScaleZ)
part.CFrame = CFrame.new(x*ScaleX, height / 2, z*ScaleZ)

end
end

folder.Parent = workspace``````

The main problem is you’d need to jump from tile to tile or use a ridiculous number of parts. Have you tried using triangles?[/quote]

I haven’t tried triangles, it might be a bit over my head right now. I’m definitely going to try it out.
Excuse my naivety, but would calculus help with that? I am starting that class in a couple months

@Tomarty

I like to write a table that will define the color and material of a part based on altitude.

``````local Coloring = {
{
Height = function(height) return (height <= 0) end;
Color = "Bright blue";
Material = "Plastic";
};
{
Height = function(height) return (height > 0 and height <= 10) end;
Color = "Bright green";
Material = "Grass";
};
{
Height = function(height) return (height > 10 and height <= 20) end;
Color = "Dark green";
Material = "Grass";
};
}

*and then run this and rendering the part*

for a, color in pairs(Coloring) do
if color.Height(HeightBonus) then
Piece.BrickColor = BrickColor.new(color.Color)
Piece.Material = color.Material
end
end``````
``````local Coloring = { -- You're experienced enough to customize this without me :)
{
Height = function(height) return (height <= 0) end;
Color = "Bright blue";
Material = "Plastic";
};
{
Height = function(height) return (height > 0 and height <= 10) end;
Color = "Bright green";
Material = "Grass";
};
{
Height = function(height) return (height > 10 and height <= 20) end;
Color = "Dark green";
Material = "Grass";
};
}

*and then run this and rendering the part*

for a, color in pairs(Coloring) do
if color.Height(HeightBonus) then
Piece.BrickColor = BrickColor.new(color.Color)
Piece.Material = color.Material
end
end``````

[quote] [quote=“Terratronic” post=167212]I couldn’t PM this to Weeve so i’m posting them here

[/quote]

Felt like writing this up:

``````
local ScaleX = 6
local ScaleY = 128
local ScaleZ = 6

local folder = Instance.new("Folder")

local function noise(...)
return math.noise(...) + 0.5 -- Because [0, 1] makes more sense
end
local function GetHeight(x, z) -- Octaves make it look cool
return
noise(x / 32,  z / 32, 123) / 2 +
noise(x / 16,  z / 16, 234) / 4 +
noise(x / 8,    z / 8, 345) / 8 +
1/8
end

for x = -32, 32 do
for z = -32, 32 do

local y = GetHeight(x, z)

local part = Instance.new("Part", folder)
part.Anchored = true
part.formFactor = 3

if y <= 0.2 then -- Awkward water
y = 0.2
part.Material = Enum.Material.SmoothPlastic
part.BrickColor = BrickColor.new("Deep blue")
elseif y < 0.65 then -- Grass
part.Material = Enum.Material.Grass
part.BrickColor = BrickColor.new("Bright green")
elseif y < 0.85 then -- Rock
part.Material = Enum.Material.Slate
part.BrickColor = BrickColor.new("Dark stone grey")
else -- Snow
part.Material = Enum.Material.Sand
part.BrickColor = BrickColor.new("White")
end

local height = y * ScaleY

part.Size = Vector3.new(ScaleX, height, ScaleZ)
part.CFrame = CFrame.new(x*ScaleX, height / 2, z*ScaleZ)

end
end

folder.Parent = workspace``````

The main problem is you’d need to jump from tile to tile or use a ridiculous number of parts. Have you tried using triangles?[/quote]

I haven’t tried triangles, it might be a bit over my head right now. I’m definitely going to try it out.
Excuse my naivety, but would calculus help with that? I am starting that class in a couple months[/quote]

The triangle drawing itself uses geometry/vector algebra, but you can probably find one in free models. You could use calculus to generate the path of a river down a hill.

[quote] @Tomarty

I like to write a table that will define the color and material of a part based on altitude.

[code]
local Coloring = {
{
Height = function(height) return (height <= 0) end;
Color = “Bright blue”;
Material = “Plastic”;
};
{
Height = function(height) return (height > 0 and height <= 10) end;
Color = “Bright green”;
Material = “Grass”;
};
{
Height = function(height) return (height > 10 and height <= 20) end;
Color = “Dark green”;
Material = “Grass”;
};
}

and then run this and rendering the part

for a, color in pairs(Coloring) do
if color.Height(HeightBonus) then
Piece.BrickColor = BrickColor.new(color.Color)
Piece.Material = color.Material
end
end
[/code] [/quote]
Cool, I used to have elseif-chain-ophobia, it really depends how many cases there are and how lazy I am if you potentially want diverse biomes and stuff, tables are the way to go
When I use triangles I like to use the surface normal (a vector that points out of the ground in the direction the triangle is facing) to determine color so that cliffs/cave ceilings aren’t grassy
You can use “marching squares” to generate triangle stuff with overhangs.

You could get even fancier by using perlin noise to generate biomes

Ooh smooth terrain would be fun to mess around with!

I have triangle drawing functions if you want them, I’m the one who made the .obj file loader in roblox that was popular a little while ago I’m super good at math

@Tomarty
Thanks for making me aware of Perlin Noise!
My new generator produces a random and neat looking map every time!

Here is so art I was able to make with it!

[quote] @Tomarty
Thanks for making me aware of Perlin Noise!
My new generator produces a random and neat looking map every time!

Here is so art I was able to make with it!

[spoiler]

[/spoiler] [/quote]

I know it’s great I don’t think it works with intellisense yet

I spent a crapton of time programming something minimalist that does almost exactly what math.noise does I’m not sure why math.noise(integer, integer, integer) always returns 0 though :? The algorithm I made generates a psuedorandom height for the nearby integer points and clerps between them. Don’t get me wrong it’s hella nice to have something more efficient
I think math.noise should be different for 1d, 2d, 3d, 4d, 5d, etc. currently it’s just 3d packed into one function.
Does anyone know when math.noise was added? I learned about it a week or two ago

[quote] @Tomarty
Thanks for making me aware of Perlin Noise!
My new generator produces a random and neat looking map every time!

Here is so art I was able to make with it!

I will say math.noise() is amazing.

I will say math.noise() is amazing.

@Tomarty
I think i’m going to cry … this is so beautiful