diff --git a/maps/pirates/ai.lua b/maps/pirates/ai.lua
index fb8e0f9b..1ee52f7d 100644
--- a/maps/pirates/ai.lua
+++ b/maps/pirates/ai.lua
@@ -14,7 +14,7 @@ local _inspect = require 'utils.inspect'.inspect
 local Boats = require 'maps.pirates.structures.boats.boats'
 local Surfaces = require 'maps.pirates.surfaces.surfaces'
 local Islands = require 'maps.pirates.surfaces.islands.islands'
-local IslandsCommon = require 'maps.pirates.surfaces.islands.common'
+local IslandEnum = require 'maps.pirates.surfaces.islands.island_enum'
 -- local Sea = require 'maps.pirates.surfaces.sea.sea'
 -- local Crew = require 'maps.pirates.crew'
 -- local Quest = require 'maps.pirates.quest'
@@ -61,7 +61,7 @@ function Public.Tick_actions(tickinterval)
 	end
 
 
-    -- if destination.subtype and destination.subtype == Islands.enum.RED_DESERT then return end -- This was a hack to stop biter boats causing attacks, but, it has the even worse effect of stopping all floating_pollution gathering.
+    -- if destination.subtype and destination.subtype == IslandEnum.enum.RED_DESERT then return end -- This was a hack to stop biter boats causing attacks, but, it has the even worse effect of stopping all floating_pollution gathering.
 
 
     local minute_cycle = {-- warning: use even seconds only
@@ -114,7 +114,7 @@ function Public.eat_up_fraction_of_all_pollution(surface, fraction_of_global_pol
 
         surface.pollute(p, - pollution_to_eat)
 		-- Radioactive world doesn't absorb map pollution:
-		if not (Common.current_destination().subtype and Common.current_destination().subtype == Islands.enum.RADIOACTIVE) then
+		if not (Common.current_destination().subtype and Common.current_destination().subtype == IslandEnum.enum.RADIOACTIVE) then
 			pollution_available = pollution_available + pollution_to_eat
 		end
     end
@@ -411,7 +411,7 @@ function Public.try_spawner_spend_fraction_of_available_pollution_on_biters(spaw
 		if initial_spawner_count > 0 then
 			local spawnerscount = Common.spawner_count(surface)
 			if spawnerscount > 0 then
-				-- if Common.current_destination().subtype and Common.current_destination().subtype == Islands.enum.RADIOACTIVE then
+				-- if Common.current_destination().subtype and Common.current_destination().subtype == IslandEnum.enum.RADIOACTIVE then
 				-- 	-- destroying spawners doesn't do quite as much here:
 				-- 	base_pollution_cost_multiplier = (initial_spawner_count/spawnerscount)^(1/3)
 				-- else
@@ -439,11 +439,11 @@ function Public.try_spawner_spend_fraction_of_available_pollution_on_biters(spaw
 
 	map_pollution_cost_multiplier = map_pollution_cost_multiplier * base_scripted_biters_pollution_cost_multiplier
 
-	if destination.subtype and destination.subtype == IslandsCommon.enum.SWAMP then
+	if destination.subtype and destination.subtype == IslandEnum.enum.SWAMP then
 		map_pollution_cost_multiplier = map_pollution_cost_multiplier * 0.95 --biters 5% more aggressive
 	end
 
-	-- if destination.subtype and destination.subtype == IslandsCommon.enum.MAZE then
+	-- if destination.subtype and destination.subtype == IslandEnum.enum.MAZE then
 	-- 	base_pollution_cost_multiplier = base_pollution_cost_multiplier * 1.2 --biters 20% less aggressive
 	-- end
 
diff --git a/maps/pirates/api_events.lua b/maps/pirates/api_events.lua
index 1daba961..bdb7fe8c 100644
--- a/maps/pirates/api_events.lua
+++ b/maps/pirates/api_events.lua
@@ -14,7 +14,7 @@ local Ai = require 'maps.pirates.ai'
 local Boats = require 'maps.pirates.structures.boats.boats'
 local Surfaces = require 'maps.pirates.surfaces.surfaces'
 -- local Progression = require 'maps.pirates.progression'
-local Islands = require 'maps.pirates.surfaces.islands.islands'
+local IslandEnum = require 'maps.pirates.surfaces.islands.island_enum'
 local Roles = require 'maps.pirates.roles.roles'
 local Gui = require 'maps.pirates.gui.gui'
 -- local Sea = require 'maps.pirates.surfaces.sea.sea'
@@ -109,7 +109,7 @@ local function biters_chew_stuff_faster(event)
 
 	if (event.entity.force.index == 3 or event.entity.force.name == 'environment') then
 		event.entity.health = event.entity.health - event.final_damage_amount * 5
-		if destination and destination.type and destination.subtype and destination.type == Surfaces.enum.ISLAND and destination.subtype == Islands.enum.MAZE then
+		if destination and destination.type and destination.subtype and destination.type == Surfaces.enum.ISLAND and destination.subtype == IslandEnum.enum.MAZE then
 			event.entity.health = event.entity.health - event.final_damage_amount * 10
 		end
 	elseif event.entity.name == 'pipe' then
@@ -528,7 +528,7 @@ local function swamp_resist_poison(event)
 	if not (event.damage_type.name and event.damage_type.name == 'poison') then return end
 
 	local destination = Common.current_destination()
-	if not (destination and destination.subtype and destination.subtype == Islands.enum.SWAMP) then return end
+	if not (destination and destination.subtype and destination.subtype == IslandEnum.enum.SWAMP) then return end
 
 	if not (destination.surface_name == entity.surface.name) then return end
 
@@ -546,7 +546,7 @@ local function maze_walls_resistance(event)
 	if not entity.valid then return end
 
 	local destination = Common.current_destination()
-	if not (destination and destination.subtype and destination.subtype == Islands.enum.MAZE) then return end
+	if not (destination and destination.subtype and destination.subtype == IslandEnum.enum.MAZE) then return end
 
 	if not (destination.surface_name == entity.surface.name) then return end
 
@@ -773,7 +773,7 @@ local function event_on_player_mined_entity(event)
 
 		if available and destination.type == Surfaces.enum.ISLAND then
 
-			if destination and destination.subtype and destination.subtype == Islands.enum.MAZE then
+			if destination and destination.subtype and destination.subtype == IslandEnum.enum.MAZE then
 				if Math.random(1, 38) == 1 then
 					tick_tack_trap(memory.enemy_force_name, entity.surface, entity.position)
 					return
@@ -916,12 +916,12 @@ local function event_on_player_mined_entity(event)
 		-- local starting = destination.static_params.starting_rock_material
 
 		if available and destination.type == Surfaces.enum.ISLAND then
-			if destination.subtype == Islands.enum.MAZE then
+			if destination.subtype == IslandEnum.enum.MAZE then
 				if Math.random(1, 35) == 1 then
 					tick_tack_trap(memory.enemy_force_name, entity.surface, entity.position)
 				end
 
-			elseif destination.subtype == Islands.enum.CAVE then
+			elseif destination.subtype == IslandEnum.enum.CAVE then
 				Ores.try_give_ore(player, entity.position, entity.name)
 
 				if Math.random(1, 35) == 1 then
@@ -1037,7 +1037,7 @@ local function base_kill_rewards(event)
 
 
 	-- no worm loot in the maze except for chefs:
-	local maze = (destination.subtype and destination.subtype == Islands.enum.MAZE)
+	local maze = (destination.subtype and destination.subtype == IslandEnum.enum.MAZE)
 	if maze and not (entity_name == 'biter-spawner' or entity_name == 'spitter-spawner') and not (class_is_chef) then return end
 
 	local iron_amount
diff --git a/maps/pirates/api_on_tick.lua b/maps/pirates/api_on_tick.lua
index b49fb692..4dee1a4b 100644
--- a/maps/pirates/api_on_tick.lua
+++ b/maps/pirates/api_on_tick.lua
@@ -9,7 +9,7 @@ local Ai = require 'maps.pirates.ai'
 local Structures = require 'maps.pirates.structures.structures'
 local Boats = require 'maps.pirates.structures.boats.boats'
 local Islands = require 'maps.pirates.surfaces.islands.islands'
-local IslandsCommon = require 'maps.pirates.surfaces.islands.common'
+local IslandEnum = require 'maps.pirates.surfaces.islands.island_enum'
 local Surfaces = require 'maps.pirates.surfaces.surfaces'
 local PiratesApiEvents = require 'maps.pirates.api_events'
 local Roles = require 'maps.pirates.roles.roles'
@@ -134,7 +134,7 @@ function Public.check_all_spawners_dead(tickinterval)
 	local destination = Common.current_destination()
 	local boat = memory.boat
 
-	if destination.static_params and destination.static_params.base_cost_to_undock and (not (destination.subtype and destination.subtype == Islands.enum.RED_DESERT)) then
+	if destination.static_params and destination.static_params.base_cost_to_undock and (not (destination.subtype and destination.subtype == IslandEnum.enum.RED_DESERT)) then
 		if boat and boat.surface_name and boat.surface_name == destination.surface_name then
 			local surface = game.surfaces[destination.surface_name]
 			if not (surface and surface.valid) then return end
@@ -310,7 +310,7 @@ function Public.periodic_free_resources(tickinterval)
 
 	Common.give_items_to_crew(Balance.periodic_free_resources_per_destination_5_seconds())
 
-	if game.tick % (300*30) == 0 and (destination and destination.subtype and destination.subtype == Islands.enum.RADIOACTIVE) then -- every 150 seconds
+	if game.tick % (300*30) == 0 and (destination and destination.subtype and destination.subtype == IslandEnum.enum.RADIOACTIVE) then -- every 150 seconds
 		local count = 2
 		Common.give_items_to_crew{{name = 'sulfuric-acid-barrel', count = count}}
 		local force = memory.force
@@ -1033,7 +1033,7 @@ function Public.loading_update(tickinterval)
 			local total = Common.map_loading_ticks_atsea
 			if currentdestination.type == Surfaces.enum.DOCK then
 				total = Common.map_loading_ticks_atsea_dock
-			elseif currentdestination.type == Surfaces.enum.ISLAND and currentdestination.subtype == Surfaces.Island.enum.MAZE then
+			elseif currentdestination.type == Surfaces.enum.ISLAND and currentdestination.subtype == IslandEnum.enum.MAZE then
 				total = Common.map_loading_ticks_atsea_maze
 			end
 
@@ -1053,7 +1053,7 @@ function Public.loading_update(tickinterval)
 					memory.loadingticks = 0
 				else
 					PiratesApiEvents.load_some_map_chunks_random_order(surface, currentdestination, fraction) --random order is good for maze world
-					if currentdestination.subtype == Surfaces.Island.enum.CAVE then
+					if currentdestination.subtype == IslandEnum.enum.CAVE then
 						PiratesApiEvents.load_some_map_chunks_random_order(currentdestination.dynamic_data.cave_miner.cave_surface, currentdestination, fraction)
 					end
 				end
@@ -1192,7 +1192,7 @@ function Public.slower_boat_tick(tickinterval)
 	end
 
 	local p = memory.boat.position
-	if p and (not (destination.subtype and destination.subtype == IslandsCommon.enum.RADIOACTIVE)) and destination.surface_name and game.surfaces[destination.surface_name] and game.surfaces[destination.surface_name].valid then --no locomotive pollute on radioactive islands
+	if p and (not (destination.subtype and destination.subtype == IslandEnum.enum.RADIOACTIVE)) and destination.surface_name and game.surfaces[destination.surface_name] and game.surfaces[destination.surface_name].valid then --no locomotive pollute on radioactive islands
 		local pollution = Balance.boat_passive_pollution_per_minute(destination.dynamic_data.timer) / 3600 * tickinterval
 
 		game.surfaces[destination.surface_name].pollute(p, pollution)
@@ -1240,7 +1240,7 @@ function Public.minimap_jam(tickinterval)
 
 	if memory.overworldx == Common.maze_minimap_jam_league and memory.boat and memory.boat.state == Boats.enum_state.LANDED then
 		local destination = Common.current_destination()
-		if destination.type == Surfaces.enum.ISLAND and destination.subtype == Surfaces.Island.enum.MAZE then
+		if destination.type == Surfaces.enum.ISLAND and destination.subtype == IslandEnum.enum.MAZE then
 			if not destination.surface_name then return end
 			local surface = game.surfaces[destination.surface_name]
 			local force = memory.force
diff --git a/maps/pirates/crew.lua b/maps/pirates/crew.lua
index 5a15d0d1..914e9945 100644
--- a/maps/pirates/crew.lua
+++ b/maps/pirates/crew.lua
@@ -12,6 +12,7 @@ local Server = require 'utils.server'
 local Utils = require 'maps.pirates.utils_local'
 local Surfaces = require 'maps.pirates.surfaces.surfaces'
 local Islands = require 'maps.pirates.surfaces.islands.islands'
+local IslandEnum = require 'maps.pirates.surfaces.islands.island_enum'
 -- local Structures = require 'maps.pirates.structures.structures'
 local Boats = require 'maps.pirates.structures.boats.boats'
 local Crowsnest = require 'maps.pirates.surfaces.crowsnest'
@@ -594,7 +595,7 @@ function Public.disband_crew(donotprint)
 			game.delete_surface(game.surfaces[destination.surface_name])
 		end
 
-		Islands[Islands.enum.CAVE].cleanup_cave_surface(destination)
+		Islands[IslandEnum.enum.CAVE].cleanup_cave_surface(destination)
 	end
 
 	global_memory.crew_memories[id] = nil
diff --git a/maps/pirates/gui/gui.lua b/maps/pirates/gui/gui.lua
index 279829b5..12726444 100644
--- a/maps/pirates/gui/gui.lua
+++ b/maps/pirates/gui/gui.lua
@@ -26,6 +26,7 @@ local Surfaces = require 'maps.pirates.surfaces.surfaces'
 local Roles = require 'maps.pirates.roles.roles'
 local Event = require 'utils.event'
 local CustomEvents = require 'maps.pirates.custom_events'
+local IslandEnum = require 'maps.pirates.surfaces.islands.island_enum'
 
 local ComfyGui = require 'utils.gui'
 ComfyGui.set_disabled_tab('Scoreboard', true)
@@ -565,7 +566,7 @@ function Public.process_etaframe_update(player, flow1, bools)
 			local total = Common.map_loading_ticks_atsea
 			if destination.type == Surfaces.enum.DOCK then
 				total = Common.map_loading_ticks_atsea_dock
-			elseif destination.type == Surfaces.enum.ISLAND and destination.subtype == Surfaces.Island.enum.MAZE then
+			elseif destination.type == Surfaces.enum.ISLAND and destination.subtype == IslandEnum.enum.MAZE then
 				total = Common.map_loading_ticks_atsea_maze
 			end
 
diff --git a/maps/pirates/overworld.lua b/maps/pirates/overworld.lua
index c36a29af..0d6720fa 100644
--- a/maps/pirates/overworld.lua
+++ b/maps/pirates/overworld.lua
@@ -30,20 +30,21 @@ local Upgrades = require 'maps.pirates.boat_upgrades'
 local Kraken = require 'maps.pirates.surfaces.sea.kraken'
 local Highscore = require 'maps.pirates.highscore'
 local CustomEvents = require 'maps.pirates.custom_events'
+local IslandEnum = require 'maps.pirates.surfaces.islands.island_enum'
 
 
 local NIL = 'none'
 local DOCK = 'dock'
-local FIRST = Surfaces.Island.enum.FIRST
-local RED_DESERT = Surfaces.Island.enum.RED_DESERT
-local SWAMP = Surfaces.Island.enum.SWAMP
-local STANDARD = Surfaces.Island.enum.STANDARD
-local WALKWAYS = Surfaces.Island.enum.WALKWAYS
-local MAZE = Surfaces.Island.enum.MAZE
-local RADIOACTIVE = Surfaces.Island.enum.RADIOACTIVE
-local HORSESHOE = Surfaces.Island.enum.HORSESHOE
-local STANDARD_VARIANT = Surfaces.Island.enum.STANDARD_VARIANT
-local CAVE = Surfaces.Island.enum.CAVE
+local FIRST = IslandEnum.enum.FIRST
+local RED_DESERT = IslandEnum.enum.RED_DESERT
+local SWAMP = IslandEnum.enum.SWAMP
+local STANDARD = IslandEnum.enum.STANDARD
+local WALKWAYS = IslandEnum.enum.WALKWAYS
+local MAZE = IslandEnum.enum.MAZE
+local RADIOACTIVE = IslandEnum.enum.RADIOACTIVE
+local HORSESHOE = IslandEnum.enum.HORSESHOE
+local STANDARD_VARIANT = IslandEnum.enum.STANDARD_VARIANT
+local CAVE = IslandEnum.enum.CAVE
 
 local A = {STANDARD_VARIANT, RED_DESERT, HORSESHOE, WALKWAYS}
 local B = {NIL, NIL, NIL, STANDARD, STANDARD_VARIANT, RED_DESERT, HORSESHOE, WALKWAYS, CAVE}
@@ -226,7 +227,7 @@ function Public.generate_destination_base_cost_to_undock(p, subtype)
 		end
 	end
 	-- override:
-	if subtype == Surfaces.Island.enum.RADIOACTIVE then
+	if subtype == IslandEnum.enum.RADIOACTIVE then
 		base_cost_to_undock = {
 			['uranium-235'] = Math.ceil(Math.ceil(80 + (macro_p.x - 1))),
 			-- ['uranium-235'] = Math.ceil(Math.ceil(80 + (macro_p.x)/2)), --tried adding beacons instead of this
@@ -599,7 +600,7 @@ function Public.cleanup_old_destination_data() --we do actually access destinati
 	local memory = Memory.get_crew_memory()
 	for i, destination_data in pairs(memory.destinations) do
 		if destination_data.overworld_position.x < memory.overworldx then
-			Islands[Islands.enum.CAVE].cleanup_cave_surface(memory.destinations[i])
+			Islands[IslandEnum.enum.CAVE].cleanup_cave_surface(memory.destinations[i])
 
 			memory.destinations[i] = nil
 		end
diff --git a/maps/pirates/quest.lua b/maps/pirates/quest.lua
index 1c90285c..a497fb5b 100644
--- a/maps/pirates/quest.lua
+++ b/maps/pirates/quest.lua
@@ -9,6 +9,7 @@ local Math = require 'maps.pirates.math'
 local Raffle = require 'maps.pirates.raffle'
 -- local Loot = require 'maps.pirates.loot'
 local CoreData = require 'maps.pirates.coredata'
+local IslandEnum = require 'maps.pirates.surfaces.islands.island_enum'
 local _inspect = require 'utils.inspect'.inspect
 
 
@@ -113,8 +114,7 @@ end
 function Public.initialise_find_quest()
 	local destination = Common.current_destination()
 
-	-- @FIXME: Magic numbers
-	if destination.subtype and destination.subtype == '1' or destination.subtype == '5' or destination.subtype == '6' then
+	if destination.subtype == IslandEnum.enum.STANDARD or destination.subtype == IslandEnum.enum.RADIOACTIVE or destination.subtype == IslandEnum.enum.STANDARD_VARIANT then
 
 		destination.dynamic_data.quest_type = enum.FIND
 		destination.dynamic_data.quest_reward = Public.quest_reward()
@@ -136,6 +136,7 @@ end
 function Public.initialise_nodamage_quest()
 	local destination = Common.current_destination()
 
+	-- @FIXME: this if check looks ill-formed when destination is nil
 	if not destination and destination.dynamic_data and destination.dynamic_data.rocketsilomaxhp then return false end
 
 	destination.dynamic_data.quest_type = enum.NODAMAGE
diff --git a/maps/pirates/shop/covered.lua b/maps/pirates/shop/covered.lua
index a8f22b0b..031d340f 100644
--- a/maps/pirates/shop/covered.lua
+++ b/maps/pirates/shop/covered.lua
@@ -17,6 +17,7 @@ local _inspect = require 'utils.inspect'.inspect
 
 local Public = {}
 
+-- What is this even for?
 local enum = {
 	TIME = 'Time',
 }
diff --git a/maps/pirates/structures/quest_structures/quest_structures.lua b/maps/pirates/structures/quest_structures/quest_structures.lua
index e5142310..323a3e9f 100644
--- a/maps/pirates/structures/quest_structures/quest_structures.lua
+++ b/maps/pirates/structures/quest_structures/quest_structures.lua
@@ -9,7 +9,7 @@ local CoreData = require 'maps.pirates.coredata'
 local Utils = require 'maps.pirates.utils_local'
 local _inspect = require 'utils.inspect'.inspect
 -- local CustomEvents = require 'maps.pirates.custom_events'
-local IslandsCommon = require 'maps.pirates.surfaces.islands.common'
+local IslandEnum = require 'maps.pirates.surfaces.islands.island_enum'
 -- local Raffle = require 'maps.pirates.raffle'
 -- local ShopCovered = require 'maps.pirates.shop.covered'
 -- local Classes = require 'maps.pirates.roles.classes'
@@ -33,7 +33,7 @@ function Public.choose_quest_structure_type()
 
 	local rng = Math.random(3)
 
-	if rng == 1 or subtype and subtype == IslandsCommon.enum.WALKWAYS then
+	if rng == 1 or subtype and subtype == IslandEnum.enum.WALKWAYS then
 		return enum.MARKET1
 	else
 
diff --git a/maps/pirates/surfaces/islands/cave/cave.lua b/maps/pirates/surfaces/islands/cave/cave.lua
index 4b383bac..5cd06fe8 100644
--- a/maps/pirates/surfaces/islands/cave/cave.lua
+++ b/maps/pirates/surfaces/islands/cave/cave.lua
@@ -8,6 +8,7 @@ local Utils = require 'maps.pirates.utils_local'
 local SurfacesCommon = require 'maps.pirates.surfaces.common'
 local BoatData = require 'maps.pirates.structures.boats.sloop.data'
 local Event = require 'utils.event'
+local IslandEnum = require 'maps.pirates.surfaces.islands.island_enum'
 
 local Public = {}
 Public.Data = require 'maps.pirates.surfaces.islands.cave.data'
@@ -123,8 +124,7 @@ function Public.roll_source_surface(destination_data)
     local cave_miner = destination_data.dynamic_data.cave_miner
 
     local island_surface_name = SurfacesCommon.decode_surface_name(destination_data.surface_name)
-    -- @FIXME: magic number (cave source island enum)
-    local cave_surface_name = SurfacesCommon.encode_surface_name(island_surface_name.crewid, island_surface_name.destination_index, island_surface_name.type, '11')
+    local cave_surface_name = SurfacesCommon.encode_surface_name(island_surface_name.crewid, island_surface_name.destination_index, island_surface_name.type, IslandEnum.enum.CAVE_SOURCE)
 
     cave_miner.cave_surface = game.create_surface(cave_surface_name, map_gen_settings)
     cave_miner.cave_surface.request_to_generate_chunks({x = 0, y = 0}, 2)
@@ -211,8 +211,7 @@ local function on_player_changed_position(event)
     local destination_data = Common.current_destination()
     if destination_data.surface_name ~= player.surface.name then return end
 
-    -- @FIXME: magic number (cave island enum)
-    if not (destination_data and destination_data.subtype == '10') then return end
+    if not (destination_data and destination_data.subtype == IslandEnum.enum.CAVE) then return end
 
     local cave_miner = destination_data.dynamic_data.cave_miner
 
diff --git a/maps/pirates/surfaces/islands/common.lua b/maps/pirates/surfaces/islands/common.lua
index 80df93d9..95344a2a 100644
--- a/maps/pirates/surfaces/islands/common.lua
+++ b/maps/pirates/surfaces/islands/common.lua
@@ -8,24 +8,13 @@ local Structures = require 'maps.pirates.structures.structures'
 local Common = require 'maps.pirates.common'
 -- local Utils = require 'maps.pirates.utils_local'
 -- local Ores = require 'maps.pirates.ores'
+local IslandEnum = require 'maps.pirates.surfaces.islands.island_enum'
 local _inspect = require 'utils.inspect'.inspect
 
+
 local Public = {}
 
-local enum = {
-	STANDARD = '1',
-	FIRST = '2',
-	WALKWAYS = '3',
-	RED_DESERT = '4',
-	RADIOACTIVE = '5',
-	STANDARD_VARIANT = '6',
-	HORSESHOE = '7',
-	SWAMP = '8',
-	MAZE = '9',
-	CAVE = '10',
-	CAVE_SOURCE = '11', -- Used as extra layer for cave island
-}
-Public.enum = enum
+Public.enum = IslandEnum.enum
 
 function Public.place_water_tile(args)
 
diff --git a/maps/pirates/surfaces/islands/island_enum.lua b/maps/pirates/surfaces/islands/island_enum.lua
new file mode 100644
index 00000000..ec64700c
--- /dev/null
+++ b/maps/pirates/surfaces/islands/island_enum.lua
@@ -0,0 +1,18 @@
+local Public = {}
+
+local enum = {
+	STANDARD = '1',
+	FIRST = '2',
+	WALKWAYS = '3',
+	RED_DESERT = '4',
+	RADIOACTIVE = '5',
+	STANDARD_VARIANT = '6',
+	HORSESHOE = '7',
+	SWAMP = '8',
+	MAZE = '9',
+	CAVE = '10',
+	CAVE_SOURCE = '11', -- Used as extra layer for cave island
+}
+Public.enum = enum
+
+return Public
\ No newline at end of file
diff --git a/maps/pirates/surfaces/islands/islands.lua b/maps/pirates/surfaces/islands/islands.lua
index 1c474b00..055402bd 100644
--- a/maps/pirates/surfaces/islands/islands.lua
+++ b/maps/pirates/surfaces/islands/islands.lua
@@ -9,7 +9,6 @@ local Boats = require 'maps.pirates.structures.boats.boats'
 local Common = require 'maps.pirates.common'
 local CoreData = require 'maps.pirates.coredata'
 local Utils = require 'maps.pirates.utils_local'
-local IslandsCommon = require 'maps.pirates.surfaces.islands.common'
 local Hunt = require 'maps.pirates.surfaces.islands.hunt'
 local Ores = require 'maps.pirates.ores'
 local Quest = require 'maps.pirates.quest'
@@ -17,10 +16,10 @@ local _inspect = require 'utils.inspect'.inspect
 local Token = require 'utils.token'
 local Task = require 'utils.task'
 local QuestStructures = require 'maps.pirates.structures.quest_structures.quest_structures'
+local IslandEnum = require 'maps.pirates.surfaces.islands.island_enum'
 
 local Public = {}
-local enum = IslandsCommon.enum
-Public.enum = enum
+local enum = IslandEnum.enum
 
 Public[enum.FIRST] = require 'maps.pirates.surfaces.islands.first.first'
 Public[enum.STANDARD] = require 'maps.pirates.surfaces.islands.standard.standard'
diff --git a/maps/pirates/surfaces/islands/radioactive/radioactive.lua b/maps/pirates/surfaces/islands/radioactive/radioactive.lua
index 2a9f4410..55aaa34f 100644
--- a/maps/pirates/surfaces/islands/radioactive/radioactive.lua
+++ b/maps/pirates/surfaces/islands/radioactive/radioactive.lua
@@ -12,6 +12,7 @@ local Utils = require 'maps.pirates.utils_local'
 local _inspect = require 'utils.inspect'.inspect
 -- local Ores = require 'maps.pirates.ores'
 local IslandsCommon = require 'maps.pirates.surfaces.islands.common'
+local IslandEnum = require 'maps.pirates.surfaces.islands.island_enum'
 -- local Hunt = require 'maps.pirates.surfaces.islands.hunt'
 
 local Public = {}
@@ -269,7 +270,7 @@ local function radioactive_tick()
 
 		local tickinterval = 60
 
-		if destination.subtype == IslandsCommon.enum.RADIOACTIVE then
+		if destination.subtype == IslandEnum.enum.RADIOACTIVE then
 			-- faster evo (doesn't need difficulty scaling as higher difficulties have higher base evo):
 			local extra_evo = 0.22 * tickinterval/60 / Balance.expected_time_on_island()
 			Common.increment_evo(extra_evo)
diff --git a/maps/pirates/surfaces/islands/red_desert/red_desert.lua b/maps/pirates/surfaces/islands/red_desert/red_desert.lua
index bbc6c4c7..153c8414 100644
--- a/maps/pirates/surfaces/islands/red_desert/red_desert.lua
+++ b/maps/pirates/surfaces/islands/red_desert/red_desert.lua
@@ -12,6 +12,7 @@ local Utils = require 'maps.pirates.utils_local'
 local _inspect = require 'utils.inspect'.inspect
 -- local Ores = require 'maps.pirates.ores'
 local IslandsCommon = require 'maps.pirates.surfaces.islands.common'
+local IslandEnum = require 'maps.pirates.surfaces.islands.island_enum'
 local Hunt = require 'maps.pirates.surfaces.islands.hunt'
 
 local Public = {}
@@ -226,7 +227,7 @@ local function red_desert_tick()
 		local memory = Memory.get_crew_memory()
 		local destination = Common.current_destination()
 
-		if destination.subtype == IslandsCommon.enum.RED_DESERT then
+		if destination.subtype == IslandEnum.enum.RED_DESERT then
 			if memory.boat and memory.boat.surface_name and memory.boat.surface_name == destination.surface_name then
 
 				Public.underground_worms_ai()
diff --git a/maps/pirates/surfaces/islands/swamp/swamp.lua b/maps/pirates/surfaces/islands/swamp/swamp.lua
index 338a52ce..964316f0 100644
--- a/maps/pirates/surfaces/islands/swamp/swamp.lua
+++ b/maps/pirates/surfaces/islands/swamp/swamp.lua
@@ -10,6 +10,7 @@ local Common = require 'maps.pirates.common'
 local _inspect = require 'utils.inspect'.inspect
 local Ores = require 'maps.pirates.ores'
 local IslandsCommon = require 'maps.pirates.surfaces.islands.common'
+local IslandEnum = require 'maps.pirates.surfaces.islands.island_enum'
 local Hunt = require 'maps.pirates.surfaces.islands.hunt'
 
 local Public = {}
@@ -187,7 +188,7 @@ local function swamp_tick()
 		local memory = Memory.get_crew_memory()
 		local destination = Common.current_destination()
 
-		if destination.subtype and destination.subtype == IslandsCommon.enum.SWAMP then
+		if destination.subtype == IslandEnum.enum.SWAMP then
 			if memory.boat and memory.boat.surface_name and memory.boat.surface_name == destination.surface_name then
 				local surface = game.surfaces[destination.surface_name]
 				if not (surface and surface.valid) then return end
diff --git a/maps/pirates/surfaces/islands/walkways/walkways.lua b/maps/pirates/surfaces/islands/walkways/walkways.lua
index bc3c11fc..c6a3a47c 100644
--- a/maps/pirates/surfaces/islands/walkways/walkways.lua
+++ b/maps/pirates/surfaces/islands/walkways/walkways.lua
@@ -12,6 +12,7 @@ local _inspect = require 'utils.inspect'.inspect
 -- local Data = require 'maps.pirates.surfaces.islands.walkways.data'
 local Ores = require 'maps.pirates.ores'
 local IslandsCommon = require 'maps.pirates.surfaces.islands.common'
+local IslandEnum = require 'maps.pirates.surfaces.islands.island_enum'
 local Hunt = require 'maps.pirates.surfaces.islands.hunt'
 
 local Public = {}
@@ -144,7 +145,7 @@ local function walkways_tick()
 		local memory = Memory.get_crew_memory()
 		local destination = Common.current_destination()
 
-		if destination.subtype and destination.subtype == IslandsCommon.enum.WALKWAYS then
+		if destination.subtype == IslandEnum.enum.WALKWAYS then
 			for _, player in pairs(game.connected_players) do
 				if player.force.name == memory.force_name and player.surface == game.surfaces[destination.surface_name] and player.character and player.character.valid and game.surfaces[destination.surface_name].get_tile(player.position).name == 'water-shallow' then
 					player.character.damage(12, game.forces['environment'], 'fire')
diff --git a/maps/pirates/surfaces/surfaces.lua b/maps/pirates/surfaces/surfaces.lua
index befa2780..30f85cb0 100644
--- a/maps/pirates/surfaces/surfaces.lua
+++ b/maps/pirates/surfaces/surfaces.lua
@@ -22,6 +22,7 @@ local ShopMerchants = require 'maps.pirates.shop.merchants'
 local SurfacesCommon = require 'maps.pirates.surfaces.common'
 -- local Roles = require 'maps.pirates.roles.roles'
 local Classes = require 'maps.pirates.roles.classes'
+local IslandEnum = require 'maps.pirates.surfaces.islands.island_enum'
 
 local Server = require 'utils.server'
 
@@ -116,16 +117,16 @@ function Public.on_surface_generation(destination)
 		destination.dynamic_data.silocharged = false
 		destination.dynamic_data.rocketlaunched = false
 
-		if subtype ~= Islands.enum.STANDARD and subtype ~= Islands.enum.STANDARD_VARIANT and subtype ~= Islands.enum.RADIOACTIVE and subtype ~= Islands.enum.RED_DESERT then
+		if subtype ~= IslandEnum.enum.STANDARD and subtype ~= IslandEnum.enum.STANDARD_VARIANT and subtype ~= IslandEnum.enum.RADIOACTIVE and subtype ~= IslandEnum.enum.RED_DESERT then
 			destination.dynamic_data.hidden_ore_remaining_abstract = Utils.deepcopy(destination.static_params.abstract_ore_amounts)
 		end
 
-		if subtype == Islands.enum.CAVE then
+		if subtype == IslandEnum.enum.CAVE then
 			if not destination.dynamic_data.cave_miner then
 				destination.dynamic_data.cave_miner = {}
 				destination.dynamic_data.cave_miner.reveal_queue = {}
 				destination.dynamic_data.cave_miner.cave_surface = nil
-				Islands[Islands.enum.CAVE].roll_source_surface(destination)
+				Islands[IslandEnum.enum.CAVE].roll_source_surface(destination)
 			end
 		end
 
@@ -172,10 +173,10 @@ function Public.destination_on_collide(destination)
 
 
 
-		if destination.subtype == Islands.enum.RADIOACTIVE then
+		if destination.subtype == IslandEnum.enum.RADIOACTIVE then
 			Common.parrot_speak(memory.force, {'pirates.parrot_radioactive_tip_1'})
 
-		elseif destination.subtype == Islands.enum.CAVE then
+		elseif destination.subtype == IslandEnum.enum.CAVE then
 			Common.parrot_speak(memory.force, {'pirates.parrot_cave_tip_1'})
 
 		else
@@ -207,7 +208,7 @@ function Public.destination_on_collide(destination)
 
 
 			-- Currently biter boats don't spawn properly for cave island, so disabling it for now
-			if destination.subtype ~= Islands.enum.CAVE then
+			if destination.subtype ~= IslandEnum.enum.CAVE then
 				if memory.overworldx > 200 then
 					scheduled_raft_raids = {}
 					local times = {600, 360, 215, 210, 120, 30, 10, 5}
@@ -272,17 +273,17 @@ function Public.destination_on_arrival(destination)
 		destination.dynamic_data.rocketsiloenergyneeded = Balance.silo_energy_needed_MJ() * 1000000
 		destination.dynamic_data.rocketcoalreward = Balance.rocket_launch_fuel_reward()
 
-		if destination.subtype == Islands.enum.RADIOACTIVE then
+		if destination.subtype == IslandEnum.enum.RADIOACTIVE then
 			destination.dynamic_data.time_remaining = -1
-		elseif destination.subtype == Islands.enum.MAZE then --more time
+		elseif destination.subtype == IslandEnum.enum.MAZE then --more time
 			destination.dynamic_data.time_remaining = Math.ceil(1.05 * Balance.max_time_on_island())
 		else
 			destination.dynamic_data.time_remaining = Math.ceil(Balance.max_time_on_island())
 		end
 
-		if destination.subtype ~= Islands.enum.FIRST and destination.subtype ~= Islands.enum.RADIOACTIVE and destination.destination_index ~= 2 then
+		if destination.subtype ~= IslandEnum.enum.FIRST and destination.subtype ~= IslandEnum.enum.RADIOACTIVE and destination.destination_index ~= 2 then
 			-- if not destination.overworld_position.x ~= Common.first_cost_to_leave_macrox * 40 then
-			if destination.subtype == Islands.enum.CAVE then
+			if destination.subtype == IslandEnum.enum.CAVE then
 				Quest.initialise_random_cave_island_quest()
 			else
 				Quest.initialise_random_quest()
@@ -298,12 +299,12 @@ function Public.destination_on_arrival(destination)
 		Common.set_evo(base_evo)
 		destination.dynamic_data.evolution_accrued_leagues = base_evo
 		destination.dynamic_data.evolution_accrued_time = 0
-		if destination.subtype == Islands.enum.RED_DESERT then
+		if destination.subtype == IslandEnum.enum.RED_DESERT then
 			destination.dynamic_data.evolution_accrued_sandwurms = 0
 		else
 			destination.dynamic_data.evolution_accrued_nests = 0
 		end
-		if destination.subtype ~= Islands.enum.RADIOACTIVE then
+		if destination.subtype ~= IslandEnum.enum.RADIOACTIVE then
 			destination.dynamic_data.evolution_accrued_silo = 0
 		end
 
@@ -311,8 +312,8 @@ function Public.destination_on_arrival(destination)
 		memory.scripted_unit_groups = {}
 		memory.floating_pollution = 0
 
-		if destination.subtype == Islands.enum.RADIOACTIVE then
-			Islands[Islands.enum.RADIOACTIVE].spawn_structures()
+		if destination.subtype == IslandEnum.enum.RADIOACTIVE then
+			Islands[IslandEnum.enum.RADIOACTIVE].spawn_structures()
 		end
 		-- -- invulnerable bases on islands 21-25
 		-- if memory.overworldx >= 21 and memory.overworldx < 25 then
@@ -369,18 +370,18 @@ function Public.destination_on_arrival(destination)
 			end
 		end
 
-		if (memory.overworldx >= Balance.quest_structures_first_appear_at and destination.subtype ~= Islands.enum.RADIOACTIVE) or _DEBUG then
+		if (memory.overworldx >= Balance.quest_structures_first_appear_at and destination.subtype ~= IslandEnum.enum.RADIOACTIVE) or _DEBUG then
 			local class_for_sale = Classes.generate_class_for_sale()
 			destination.static_params.class_for_sale = class_for_sale
 		end
 
 		-- Caves won't have these fancy things for now, because starting place for this island is so small, weird stuff happens (like quest structure spawning on ship)
-		if destination.subtype == Islands.enum.CAVE then
+		if destination.subtype == IslandEnum.enum.CAVE then
 			return
 		end
 
 		-- game.print('spawning silo')
-		if destination.subtype ~= Islands.enum.RADIOACTIVE then
+		if destination.subtype ~= IslandEnum.enum.RADIOACTIVE then
 			local silo_position = Islands.spawn_silo_setup(points_to_avoid)
 			if silo_position then
 				points_to_avoid[#points_to_avoid + 1] = {x = silo_position.x, y = silo_position.y, r = 22}
@@ -389,7 +390,7 @@ function Public.destination_on_arrival(destination)
 
 		Islands.spawn_ores_on_arrival(destination, points_to_avoid)
 
-		if (memory.overworldx >= Balance.quest_structures_first_appear_at and destination.subtype ~= Islands.enum.RADIOACTIVE) or _DEBUG then
+		if (memory.overworldx >= Balance.quest_structures_first_appear_at and destination.subtype ~= IslandEnum.enum.RADIOACTIVE) or _DEBUG then
 			local covered = Islands.spawn_quest_structure(destination, points_to_avoid)
 			if covered then
 				points_to_avoid[#points_to_avoid + 1] = {x = covered.x, y = covered.y, r = 25}
@@ -399,7 +400,7 @@ function Public.destination_on_arrival(destination)
 		Islands.spawn_treasure_maps(destination, points_to_avoid)
 		Islands.spawn_ghosts(destination, points_to_avoid)
 
-		if destination.subtype == Islands.enum.MAZE then
+		if destination.subtype == IslandEnum.enum.MAZE then
 			local force = memory.force
 			force.manual_mining_speed_modifier = 1
 		end
@@ -416,7 +417,7 @@ function Public.destination_on_departure(destination)
 		Common.parrot_speak(memory.force, {'pirates.parrot_kraken_warning'})
 	end
 
-	if destination.subtype and destination.subtype == Islands.enum.MAZE then
+	if destination.subtype and destination.subtype == IslandEnum.enum.MAZE then
 		local force = memory.force
 		force.manual_mining_speed_modifier = 3 --put back to normal
 	end
@@ -445,7 +446,7 @@ function Public.destination_on_crewboat_hits_shore(destination)
 			Common.parrot_speak(memory.force, {'pirates.parrot_night_warning'})
 		end
 
-		if destination.subtype == Islands.enum.RADIOACTIVE then
+		if destination.subtype == IslandEnum.enum.RADIOACTIVE then
 			-- replace all miners, so that they sit on uranium properly:
 			local surface = game.surfaces[destination.surface_name]
 			local miners = surface.find_entities_filtered({name = 'electric-mining-drill'})
@@ -457,11 +458,11 @@ function Public.destination_on_crewboat_hits_shore(destination)
 			end
 
 			Common.parrot_speak(memory.force, {'pirates.parrot_radioactive_tip_2'})
-		elseif destination.subtype == Islands.enum.MAZE and memory.overworldx == Common.maze_minimap_jam_league then
+		elseif destination.subtype == IslandEnum.enum.MAZE and memory.overworldx == Common.maze_minimap_jam_league then
 			Common.parrot_speak(memory.force, {'pirates.parrot_maze_tip_1'})
 		end
 
-		if (memory.merchant_ships_unlocked or _DEBUG) and destination.subtype ~= Islands.enum.CAVE then
+		if (memory.merchant_ships_unlocked or _DEBUG) and destination.subtype ~= IslandEnum.enum.CAVE then
 			Islands.spawn_merchant_ship(destination)
 
 			ShopMerchants.generate_merchant_trades(destination.dynamic_data.merchant_market)
@@ -758,7 +759,7 @@ function Public.clean_up(destination)
 		end
 	end
 
-	Islands[Islands.enum.CAVE].cleanup_cave_surface(destination)
+	Islands[IslandEnum.enum.CAVE].cleanup_cave_surface(destination)
 
 	destination.dynamic_data = {}