diff --git a/ai/actions/fisher/go_fish_action.lua b/ai/actions/fisher/go_fish_action.lua
index d4edcb2..ca88d95 100644
--- a/ai/actions/fisher/go_fish_action.lua
+++ b/ai/actions/fisher/go_fish_action.lua
@@ -1,7 +1,6 @@
---I do not give consent to copy this
local GoFish = class()
-GoFish.name = 'go to a dock to fish'
+GoFish.name = 'go to a fishing_spot to fish'
GoFish.does = 'archipelago_biome:go_fish'
GoFish.status_text_key = 'archipelago_biome:ai.actions.status_text.fishing'
GoFish.args = { }
@@ -21,6 +20,7 @@ function find_a_fishing_spot(ai_entity)
end
local function rate_fishing_spot(entity)
+ --take entity type (zone, boat or dock) and distance into consideration
local rng = _radiant.math.get_default_rng()
return rng:get_real(0, 1)
end
@@ -42,7 +42,7 @@ return ai:create_compound_action(GoFish)
:execute('stonehearth:find_best_reachable_entity_by_type', {
filter_fn = ai.CALL(find_a_fishing_spot, ai.ENTITY),
rating_fn = rate_fishing_spot,
- description = 'find a dock'
+ description = 'find a fishing_spot'
})
:execute('stonehearth:goto_entity', {
entity = ai.PREV.item
diff --git a/ai/actions/fisher/turn_to_face_water_action.lua b/ai/actions/fisher/turn_to_face_water_action.lua
index 9b2919e..84ffd12 100644
--- a/ai/actions/fisher/turn_to_face_water_action.lua
+++ b/ai/actions/fisher/turn_to_face_water_action.lua
@@ -1,17 +1,30 @@
local Entity = _radiant.om.Entity
local TurnToFaceWater = class()
+local rng = _radiant.math.get_default_rng()
TurnToFaceWater.name = 'correct rotation facing the water'
TurnToFaceWater.does = 'archipelago_biome:turn_to_face_water'
TurnToFaceWater.args = {
-dock = Entity
+ dock = Entity
}
TurnToFaceWater.version = 2
TurnToFaceWater.priority = 1
function TurnToFaceWater:run(ai, entity, args)
- local face = radiant.entities.get_facing(args.dock)
- radiant.entities.turn_to(entity, face)
+ if radiant.entities.get_posture(entity) == "stonehearth:in_boat" then
+ radiant.entities.turn_to(entity, rng:get_int(0,360))
+ else
+ local face = 0
+ local fisher_field_component = args.dock:get_component("archipelago_biome:fisher_field")
+ if fisher_field_component then
+ local water_location = fisher_field_component:get_water_direction(radiant.entities.get_world_grid_location(entity))
+ entity:get_component('mob'):turn_to_face_point(water_location)
+ face = radiant.entities.get_facing(entity)
+ else
+ face = radiant.entities.get_facing(args.dock)
+ end
+ radiant.entities.turn_to(entity, face+rng:get_int(-35,35))
+ end
end
return TurnToFaceWater
\ No newline at end of file
diff --git a/archipelago_biome_server.lua b/archipelago_biome_server.lua
index 14fe5e6..b3b9ac2 100644
--- a/archipelago_biome_server.lua
+++ b/archipelago_biome_server.lua
@@ -1,13 +1,13 @@
archipelago_biome = {}
-print("Archipelago Biome Mod version 22.6.13")
+print("Archipelago Biome Mod version 22.7.4")
--[[
+fisher village
+
spawn whale, maybe from turtle rig. or as a fancy and decorated landmark
wave effect for storm weather
-fish anywhere near water, docks will be just a prefered place
-
rework pirate hat
Bugs:
diff --git a/call_handlers/fishing_call_handler.lua b/call_handlers/fishing_call_handler.lua
new file mode 100644
index 0000000..ab3fe13
--- /dev/null
+++ b/call_handlers/fishing_call_handler.lua
@@ -0,0 +1,137 @@
+local Color4 = _radiant.csg.Color4
+local Point3 = _radiant.csg.Point3
+local Cube3 = _radiant.csg.Cube3
+
+local validator = radiant.validator
+
+local FishingCallHandler = class()
+
+function FishingCallHandler._custom_is_valid_location(self_variable, brick)
+ --i had to hack into this stupid function because it was the only way to make it work 😡
+ if not brick then
+ return false
+ end
+
+ if radiant.terrain.is_blocked(brick) then
+ return false
+ end
+ if not radiant.terrain.is_supported(brick) then
+ return false
+ end
+ local entities = radiant.terrain.get_entities_at_point(brick)
+ for _, entity in pairs(entities) do
+ if not self_variable._can_contain_entity_filter_fn(entity, self_variable) then
+ return false
+ end
+ end
+ return FishingCallHandler.has_water_below(brick)
+end
+
+function FishingCallHandler:choose_new_fish_location(session, response)
+ stonehearth.selection:select_xz_region("fish_zone")
+ :use_designation_marquee(Color4(129, 192, 165, 255))
+ :set_cursor('archipelago_biome:cursors:zone_fish')
+ :set_invalid_cursor('archipelago_biome:cursors:zone_fish_invalid')
+ :require_unblocked(true)
+ :require_supported(true)
+ :allow_unselectable_support_entities(true)
+ :set_can_contain_entity_filter(function(entity)
+ if radiant.entities.get_entity_data(entity, 'stonehearth:designation') then
+ return false
+ end
+ if entity:get_component('terrain') then
+ return false
+ end
+ return true
+ end)
+ :set_find_support_filter(function(result, select_xz_region)
+ select_xz_region._is_valid_location = FishingCallHandler._custom_is_valid_location
+
+ local entity = result.entity
+ if not entity then
+ return stonehearth.selection.FILTER_IGNORE
+ end
+ local rcs = entity:get_component('region_collision_shape')
+ local region_collision_type = rcs and rcs:get_region_collision_type()
+ if region_collision_type == _radiant.om.RegionCollisionShape.NONE then
+ return stonehearth.selection.FILTER_IGNORE
+ end
+
+ if result.brick then
+ return true
+ end
+ return stonehearth.selection.FILTER_IGNORE
+ end)
+
+ :done(function(selector, box)
+ local size = {
+ x = box.max.x - box.min.x,
+ y = box.max.z - box.min.z,
+ }
+ _radiant.call('archipelago_biome:create_new_field', box.min, size)
+ :done(function(r)
+ response:resolve({ field = r.field })
+ end)
+ :always(function()
+ selector:destroy()
+ end)
+ end)
+ :fail(function(selector)
+ selector:destroy()
+ response:reject('no region')
+ end)
+ :go()
+end
+
+function FishingCallHandler.has_water_below(origin)
+ return
+ FishingCallHandler._get_water_below(origin-Point3.unit_z) or
+ FishingCallHandler._get_water_below(origin+Point3.unit_z) or
+ FishingCallHandler._get_water_below(origin-Point3.unit_x) or
+ FishingCallHandler._get_water_below(origin+Point3.unit_x)
+end
+
+function FishingCallHandler._get_water_below(neighbor_point)
+ local ground_point = radiant.terrain.get_standable_point(neighbor_point)
+ local entities_present = radiant.terrain.get_entities_at_point(ground_point)
+
+ for id, entity in pairs(entities_present) do
+ local water_component = entity:get_component('stonehearth:water')
+ if water_component then
+ return true
+ end
+ end
+ return false
+end
+
+function FishingCallHandler:create_new_field(session, response, location, size)
+ validator.expect_argument_types({'Point3', 'table'}, location, size)
+
+ local entity = radiant.entities.create_entity('archipelago_biome:fisher:field', { owner = session.player_id })
+ radiant.terrain.place_entity(entity, location)
+
+ local shape = Cube3(Point3.zero, Point3(size.x, 1, size.y))
+ entity:add_component('region_collision_shape')
+ :set_region_collision_type(_radiant.om.RegionCollisionShape.NONE)
+ :set_region(_radiant.sim.alloc_region3())
+ :get_region():modify(function(cursor)
+ cursor:add_unique_cube(shape)
+ end)
+ entity:add_component('destination')
+ :set_region(_radiant.sim.alloc_region3())
+ :get_region():modify(function(cursor)
+ cursor:add_unique_cube(shape)
+ end)
+ entity:get_component('destination')
+ :set_adjacent(_radiant.sim.alloc_region3())
+ :get_adjacent():modify(function(cursor)
+ cursor:add_unique_cube(shape)
+ end)
+
+ local fisher_field = entity:get_component('archipelago_biome:fisher_field')
+ fisher_field:set_size(size.x,size.y)
+
+ return { field = entity }
+end
+
+return FishingCallHandler
\ No newline at end of file
diff --git a/components/boat_dock/boat_dock.lua b/components/boat_dock/boat_dock.lua
index 1cc4dbb..7919187 100644
--- a/components/boat_dock/boat_dock.lua
+++ b/components/boat_dock/boat_dock.lua
@@ -18,6 +18,7 @@ end
function ArchipelagoBoatDock:initialize()
self._sv.platform = nil
self._sv.other_dock = nil
+ self._sv.dock_spots = {}
self._sv._effect_overlay = nil
end
@@ -26,6 +27,7 @@ function ArchipelagoBoatDock:activate()
self._removed_from_world_listener = radiant.events.listen(self._entity, 'stonehearth:on_removed_from_world', function()
self:destroy_platform()
self:destroy_other_dock()
+ self:destroy_fishing_spot()
if self._sv._effect_overlay then
self._sv._effect_overlay:stop()
self._sv._effect_overlay = nil
@@ -54,12 +56,29 @@ function ArchipelagoBoatDock:create_connections()
if other_side then
self:create_platform(other_side)
self:create_destination_dock(other_side)
+ self:create_fishing_spot(radiant.entities.get_world_grid_location(self._entity), other_side)
else
self._sv._effect_overlay = radiant.effects.run_effect(self._entity, "archipelago_biome:effects:overlay:no_connection", nil, nil, { playerColor = radiant.entities.get_player_color(self._entity) })
end
end
end
+function ArchipelagoBoatDock:create_fishing_spot(this_side, other_side)
+ local total_distance = this_side:distance_to(other_side)
+ if total_distance > 15 then
+ local middle_point = (this_side+other_side)/2
+ local dock_spot = radiant.entities.create_entity("archipelago_biome:decoration:dock_spot",
+ {owner = self._entity:get_player_id()})
+ radiant.terrain.place_entity_at_exact_location(dock_spot,
+ middle_point +Point3.unit_y*2)
+
+ table.insert(self._sv.dock_spots, dock_spot)
+
+ self:create_fishing_spot(middle_point, this_side)
+ self:create_fishing_spot(middle_point, other_side)
+ end
+end
+
function ArchipelagoBoatDock:find_other_side()
local mob = self._entity:get_component('mob')
local facing = mob:get_facing()
@@ -153,9 +172,21 @@ function ArchipelagoBoatDock:destroy_other_dock()
end
end
+function ArchipelagoBoatDock:destroy_fishing_spot()
+ if self._sv.dock_spots then
+ for i, dock_spot in ipairs(self._sv.dock_spots) do
+ if dock_spot and dock_spot:is_valid() then
+ radiant.entities.destroy_entity(dock_spot)
+ end
+ end
+ self._sv.dock_spots = {}
+ end
+end
+
function ArchipelagoBoatDock:destroy()
self:destroy_platform()
self:destroy_other_dock()
+ self:destroy_fishing_spot()
if self._sensor_trace then
self._sensor_trace:destroy()
diff --git a/components/fisher_field/fisher_field.lua b/components/fisher_field/fisher_field.lua
new file mode 100644
index 0000000..57d6e18
--- /dev/null
+++ b/components/fisher_field/fisher_field.lua
@@ -0,0 +1,39 @@
+local FisherFieldComponent = class()
+local Point2 = _radiant.csg.Point2
+local Point3 = _radiant.csg.Point3
+
+function FisherFieldComponent:initialize()
+ self._sv.size = nil
+end
+
+function FisherFieldComponent:create()
+ self._sv.size = Point2.zero
+end
+
+function FisherFieldComponent:set_size(x, z)
+ self._sv.size = Point2(x, z)
+ self.__saved_variables:mark_changed()
+end
+
+function FisherFieldComponent:get_water_direction(origin)
+ return
+ FisherFieldComponent:_get_water_below(origin-Point3.unit_z) or
+ FisherFieldComponent:_get_water_below(origin+Point3.unit_z) or
+ FisherFieldComponent:_get_water_below(origin-Point3.unit_x) or
+ FisherFieldComponent:_get_water_below(origin+Point3.unit_x)
+end
+
+function FisherFieldComponent:_get_water_below(neighbor_point)
+ local ground_point = radiant.terrain.get_standable_point(neighbor_point)
+ local entities_present = radiant.terrain.get_entities_at_point(ground_point)
+
+ for id, entity in pairs(entities_present) do
+ local water_component = entity:get_component('stonehearth:water')
+ if water_component then
+ return neighbor_point
+ end
+ end
+ return false
+end
+
+return FisherFieldComponent
\ No newline at end of file
diff --git a/data/commands/archer_arrows/fish_arrows.png b/data/commands/archer_arrows/fish_arrows.png
index 60a59e3..67aaf17 100644
Binary files a/data/commands/archer_arrows/fish_arrows.png and b/data/commands/archer_arrows/fish_arrows.png differ
diff --git a/data/cursors/zone_fish.cur b/data/cursors/zone_fish.cur
new file mode 100644
index 0000000..1b71b3e
Binary files /dev/null and b/data/cursors/zone_fish.cur differ
diff --git a/data/cursors/zone_fish_invalid.cur b/data/cursors/zone_fish_invalid.cur
new file mode 100644
index 0000000..fc09a28
Binary files /dev/null and b/data/cursors/zone_fish_invalid.cur differ
diff --git a/data/fishing/fishing.json b/data/fishing/fishing.json
index e245d6f..281b189 100644
--- a/data/fishing/fishing.json
+++ b/data/fishing/fishing.json
@@ -253,15 +253,6 @@
"effort":100,
"xp":10
},
- "ice_cube":{
- "alias":"archipelago_biome:resources:ice_cube",
- "weight":1,
- "is_biome":[
- "stonehearth:biome:arctic"
- ],
- "effort":10,
- "xp":1
- },
"tropical_fish":{
"alias":"archipelago_biome:food:tropical_fish",
"weight":20,
diff --git a/data/traits/passion_fisher/passion_fisher_trait.png b/data/traits/passion_fisher/passion_fisher_trait.png
index 0aa631a..28cefb9 100644
Binary files a/data/traits/passion_fisher/passion_fisher_trait.png and b/data/traits/passion_fisher/passion_fisher_trait.png differ
diff --git a/data/ui/start_menu.json b/data/ui/start_menu.json
index 74a71bd..890971f 100644
--- a/data/ui/start_menu.json
+++ b/data/ui/start_menu.json
@@ -14,5 +14,19 @@
"hotkey": ""
}
}
+ },
+ "zone_menu": {
+ "items": {
+ "create_fish": {
+ "name": "i18n(archipelago_biome:ui.game.menu.zone_menu.items.create_fish.display_name)",
+ "description": "i18n(archipelago_biome:ui.game.menu.zone_menu.items.create_fish.description)",
+ "required_job": "archipelago_biome:jobs:fisher",
+ "required_job_text": "i18n(archipelago_biome:ui.game.menu.zone_menu.items.create_fish.required_job_text)",
+ "class": "button",
+ "icon": "/archipelago_biome/ui/game/start_menu/images/zone_fish.png",
+ "sticky": true,
+ "hotkey_action": "zone:fish"
+ }
+ }
}
}
\ No newline at end of file
diff --git a/jobs/archer/archer_buffs/fish_in_face.png b/jobs/archer/archer_buffs/fish_in_face.png
index 55928eb..94ae843 100644
Binary files a/jobs/archer/archer_buffs/fish_in_face.png and b/jobs/archer/archer_buffs/fish_in_face.png differ
diff --git a/jobs/fisher/field/field.json b/jobs/fisher/field/field.json
new file mode 100644
index 0000000..aa1d389
--- /dev/null
+++ b/jobs/fisher/field/field.json
@@ -0,0 +1,25 @@
+{
+ "type": "entity",
+ "components": {
+ "stonehearth:defense_zone": {},
+ "archipelago_biome:fisher_field": {},
+ "stonehearth:commands": {
+ "commands": [
+ "stonehearth:commands:destroy_item"
+ ]
+ }
+ },
+ "entity_data": {
+ "archipelago_biome:fishing_spot":{},
+ "stonehearth:designation": {
+ "allow_placed_items": false
+ },
+ "stonehearth:item": {
+ "clearable": false
+ },
+ "stonehearth:catalog": {
+ "display_name": "i18n(archipelago_biome:jobs.fisher.field.display_name)",
+ "description": "i18n(archipelago_biome:jobs.fisher.field.description)"
+ }
+ }
+}
\ No newline at end of file
diff --git a/jobs/fisher/fisher.lua b/jobs/fisher/fisher.lua
index c78653e..4289de7 100644
--- a/jobs/fisher/fisher.lua
+++ b/jobs/fisher/fisher.lua
@@ -112,7 +112,15 @@ function FisherClass:chose_random_fish()
end
local fish_key = weighted_set:choose_random()
self.current_fish_key = fish_key
- return self.fishing_data[level][fish_key]
+ local boat_effort = 1
+ if radiant.entities.get_posture(self._sv._entity) == "stonehearth:in_boat" then
+ boat_effort = 0.8
+ end
+ local to_AI = {
+ effort = self.fishing_data[level][fish_key].effort * boat_effort,
+ alias = self.fishing_data[level][fish_key].alias
+ }
+ return to_AI
end
function FisherClass:_is_valid_X(is_X, is_not_X, X_alias)
diff --git a/jobs/fisher/images/faster_fishing_perk.png b/jobs/fisher/images/faster_fishing_perk.png
index 0ec20f4..7d10c2e 100644
Binary files a/jobs/fisher/images/faster_fishing_perk.png and b/jobs/fisher/images/faster_fishing_perk.png differ
diff --git a/jobs/fisher/recipes/food/fish_cooked_recipe.json b/jobs/fisher/recipes/food/fish_cooked_recipe.json
index 3478324..7a95be0 100644
--- a/jobs/fisher/recipes/food/fish_cooked_recipe.json
+++ b/jobs/fisher/recipes/food/fish_cooked_recipe.json
@@ -6,7 +6,7 @@
"description": "i18n(archipelago_biome:entities.food.fish_cooked.recipe.description)",
"flavor": "i18n(archipelago_biome:entities.food.fish_cooked.recipe.flavor)",
"portrait" : "/archipelago_biome/entities/food/fish_cooked/fish_cooked.png",
- "level_requirement": 2,
+ "level_requirement": 3,
"workshop": "archipelago_biome:fisher:firepit",
"ingredients": [
{
diff --git a/locales/en.json b/locales/en.json
index 06ff6b2..5577136 100644
--- a/locales/en.json
+++ b/locales/en.json
@@ -659,6 +659,10 @@
}
},
"fisher": {
+ "field": {
+ "display_name":"Fishing Area",
+ "description":"Fishers can stop here to fish"
+ },
"fisher_description": {
"display_name": "Fisher",
"description": "Will capture crabs, harvest pearls, and do other water related works",
@@ -874,6 +878,17 @@
"required_job_text": "Requires a fisher"
}
}
+ },
+ "zone_menu": {
+ "items": {
+ "create_fish": {
+ "display_name": "Fishing Spot",
+ "description": "Marks a place to fish",
+ "required_job_text": "Requires a fisher",
+ "tip_title": "Click and drag to mark as a fishing spot",
+ "tip_description": "The zone area will be considered a valid fishing spot that fishers can go to fish.
Right click to exit this mode"
+ }
+ }
}
},
"zones_mode": {
diff --git a/locales/pt-BR.json b/locales/pt-BR.json
index 84d23ab..7039f9c 100644
--- a/locales/pt-BR.json
+++ b/locales/pt-BR.json
@@ -659,6 +659,10 @@
}
},
"fisher": {
+ "field": {
+ "display_name":"Área de Pesca",
+ "description":"Pescadores podem vir aqui para pescar"
+ },
"fisher_description": {
"display_name": "Pescador",
"description": "Irá pegar caranguejos, colher pérolas, e fazer outras tarefas relacionadas a água",
@@ -874,6 +878,17 @@
"required_job_text": "Requer um pescador"
}
}
+ },
+ "zone_menu": {
+ "items": {
+ "create_fish": {
+ "display_name": "Ponto de Pesca",
+ "description": "Marca um lugar para pescar",
+ "required_job_text": "Requer um pescador",
+ "tip_title": "Clique e arraste para marcar como local de pesca",
+ "tip_description": "A área será considerada um local de pesca que os pescadores podem ir para pescar.
Clique com o botão direito para sair deste modo"
+ }
+ }
}
},
"zones_mode": {
diff --git a/manifest.json b/manifest.json
index d5c2f74..f63d82f 100644
--- a/manifest.json
+++ b/manifest.json
@@ -72,6 +72,9 @@
"crops:palm_tree_crop": "file(entities/crops/palm_tree_crop)",
+ "cursors:zone_fish": "file(data/cursors/zone_fish.cur)",
+ "cursors:zone_fish_invalid":"file(data/cursors/zone_fish_invalid.cur)",
+
"data:fishing": "file(data/fishing)",
"data:gm_index": "file(data/gm/gm_index.json)",
@@ -169,6 +172,7 @@
"fisher:talisman": "file(jobs/fisher/fisher_bucket/fisher_bucket_talisman.json)",
"fisher:workbench": "file(jobs/fisher/fisher_workbench)",
"fisher:firepit": "file(jobs/fisher/fisher_firepit)",
+ "fisher:field": "file(jobs/fisher/field)",
"kingdoms:atlanteans": "file(data/atlanteans_population.json)",
"atlantean_male": "file(entities/atlanteans/male)",
@@ -509,28 +513,43 @@
"class:fisher": "file(jobs/fisher/fisher.lua)",
"game_master:util:choose_water_location_outside_town": "file(services/server/game_master/controllers/util/choose_water_location_outside_town.lua)"
},
+ "functions": {
+ "choose_new_fish_location": {
+ "controller": "file(call_handlers/fishing_call_handler.lua)",
+ "endpoint": "client"
+ },
+ "create_new_field": {
+ "controller": "file(call_handlers/fishing_call_handler.lua)",
+ "endpoint": "server"
+ }
+ },
"components": {
"boat_dock": "file(components/boat_dock/boat_dock.lua)",
"cave": "file(components/cave/cave.lua)",
"crab_spawner": "file(components/crab_spawner/crab_spawner.lua)",
"dock": "file(components/dock/dock.lua)",
"explosive": "file(components/explosive/explosive.lua)",
+ "fisher_field": "file(components/fisher_field/fisher_field.lua)",
"need_water": "file(components/need_water/need_water.lua)",
"trojan": "file(components/trojan/trojan.lua)",
"wave": "file(components/wave/wave.lua)"
},
+ "component_renderers":{
+ "fisher_field": "file(renderers/fisher_field/fisher_field.lua)"
+ },
"ui":{
"html":[
"file(ui/game/bulletin/bulletin_dialog/fisher_bulletin_dialog/fisher_bulletin_dialog.html)"
],
"js":[
- "file(ui/shell/select_settlement/map.js)",
- "file(ui/game/bulletin/bulletin_dialog/fisher_bulletin_dialog/fisher_bulletin_dialog.js)"
+ "file(ui/game/bulletin/bulletin_dialog/fisher_bulletin_dialog/fisher_bulletin_dialog.js)",
+ "file(ui/game/start_menu/start_menu.js)",
+ "file(ui/shell/select_settlement/map.js)"
],
"less":[
"file(jobs/fisher/skin/workshop.less)",
- "file(ui/shell/select_settlement/select_settlement.less)",
- "file(ui/game/bulletin/bulletin_dialog/fisher_bulletin_dialog/fisher_bulletin_dialog.less)"
+ "file(ui/game/bulletin/bulletin_dialog/fisher_bulletin_dialog/fisher_bulletin_dialog.less)",
+ "file(ui/shell/select_settlement/select_settlement.less)"
]
}
}
\ No newline at end of file
diff --git a/renderers/fisher_field/fisher_field.lua b/renderers/fisher_field/fisher_field.lua
new file mode 100644
index 0000000..e62b43b
--- /dev/null
+++ b/renderers/fisher_field/fisher_field.lua
@@ -0,0 +1,41 @@
+local ZoneRenderer = require 'stonehearth.renderers.zone_renderer'
+local Color4 = _radiant.csg.Color4
+local Point2 = _radiant.csg.Point2
+
+local FisherFieldRenderer = class()
+
+function FisherFieldRenderer:initialize(render_entity, datastore)
+ self._datastore = datastore
+
+ self._zone_renderer = ZoneRenderer(render_entity)
+ :set_designation_colors(Color4(129, 192, 165, 255), Color4(129, 192, 165, 255))
+ :set_ground_colors(Color4(77, 62, 38, 10), Color4(77, 62, 38, 30))
+
+ self._datastore_trace = self._datastore:trace_data('rendering fisher field')
+ :on_changed(
+ function()
+ self:_update()
+ end
+ )
+ :push_object_state()
+end
+
+function FisherFieldRenderer:destroy()
+ if self._datastore_trace then
+ self._datastore_trace:destroy()
+ self._datastore_trace = nil
+ end
+
+ self._zone_renderer:destroy()
+end
+
+function FisherFieldRenderer:_update()
+ local data = self._datastore:get_data()
+ local size = data.size
+ local items = {}
+
+ self._zone_renderer:set_size(size)
+ self._zone_renderer:set_current_items(items)
+end
+
+return FisherFieldRenderer
\ No newline at end of file
diff --git a/ui/game/start_menu/images/zone_fish.png b/ui/game/start_menu/images/zone_fish.png
new file mode 100644
index 0000000..37adc94
Binary files /dev/null and b/ui/game/start_menu/images/zone_fish.png differ
diff --git a/ui/game/start_menu/start_menu.js b/ui/game/start_menu/start_menu.js
new file mode 100644
index 0000000..559f13e
--- /dev/null
+++ b/ui/game/start_menu/start_menu.js
@@ -0,0 +1,31 @@
+App.StonehearthStartMenuView.reopen({
+ init: function() {
+ var self = this;
+
+ self.menuActions.create_fish = function() {
+ self.createFish();
+ }
+
+ self._super();
+ },
+
+ createFish: function() {
+ var self = this;
+
+ App.setGameMode('zones');
+ var tip = App.stonehearthClient.showTip('archipelago_biome:ui.game.menu.zone_menu.items.create_fish.tip_title',
+ 'archipelago_biome:ui.game.menu.zone_menu.items.create_fish.tip_description', { i18n: true });
+
+ return App.stonehearthClient._callTool('createFish', function(){
+ return radiant.call('archipelago_biome:choose_new_fish_location')
+ .done(function(response) {
+ radiant.call('radiant:play_sound', {'track' : 'stonehearth:sounds:place_structure'} );
+ radiant.call('stonehearth:select_entity', response.field);
+ self.createFish();
+ })
+ .fail(function(response) {
+ App.stonehearthClient.hideTip(tip);
+ });
+ });
+ }
+});
\ No newline at end of file
diff --git a/ui/shell/select_settlement/images/wildlife.png b/ui/shell/select_settlement/images/wildlife.png
index 7395428..e42463c 100644
Binary files a/ui/shell/select_settlement/images/wildlife.png and b/ui/shell/select_settlement/images/wildlife.png differ
diff --git a/ui/shell/select_settlement/images/wildlife_empty.png b/ui/shell/select_settlement/images/wildlife_empty.png
index 9a2c6ae..7b6f006 100644
Binary files a/ui/shell/select_settlement/images/wildlife_empty.png and b/ui/shell/select_settlement/images/wildlife_empty.png differ
diff --git a/update_log.txt b/update_log.txt
index 44145c7..8ccb0d9 100644
--- a/update_log.txt
+++ b/update_log.txt
@@ -1,12 +1,12 @@
Additions:
-Jellyfish enemies
-Seaweed seeds, so you can grow more of it (drop from seaweed or crafted by herbalist)
+Fishing zones. Draw it at the water edge and the fisher will be able to fish there.
Changes:
+With boat docks, fisher can go fish with boats on those paths
+Updated old fish images with a new fish design
Changes for ACE:
Fixes:
-(for ACE mod)
-Fixed bug with seed crafting while ACE auto craft is on.
\ No newline at end of file
+(for ACE mod)
\ No newline at end of file