고착생물을 집으로, 생물은 해양동물만
거품돌·해초·산호·켈프·관벌레는 물고기가 깃드는 자리지 그 자체가 일꾼이 아니다. 실제로 물고기는 바위 틈과 해초 사이를 보금자리로 삼는다. 전부 집으로 옮기고, 생물에는 움직이는 해양동물만 남겼다. - 집이 자연 서식지(rock/plant)와 지어 올린 것(vessel/wreck/pillar) 두 갈래가 되면서 정원에 폭이 생겼다. 거품돌 1, 해초·산호 2, 켈프·관벌레 4, 지어 올린 것은 표준 3. - 빈 자리를 메우려 게·해마·새우를 넣어 층마다 생물 둘을 맞췄다. 소라게·해마·열수구 새우. 형태도 셋 새로 그렸다. - 형태 계통이 그대로 경계가 된다. 생물 fish/glow/crab/seahorse/shrimp, 집 rock/plant/vessel/wreck/pillar. 겹치지 않는 것을 테스트가 지킨다. - 예전에 생물로 사 둔 돌·해초는 같은 id의 집으로 그만큼 지어 준다. 그냥 버리면 사 둔 것이 조용히 사라진다. 버그 둘 _fish_area/_orbit_center가 생물 자리를 grid_rect(화면 테두리)로 잘랐다. 가로로 이어 스크롤하던 시절에는 화면 = 바다여서 맞았지만, 층이 옆으로 늘어선 지금은 뒤쪽 층 생물이 전부 첫 층 오른쪽 끝으로 끌려와 제 층에서 사라졌다. _home_bounds()가 그 집이 속한 층의 테두리를 돌려준다. _make_fish가 fish와 glow만 궤도에 올려, 새로 넣은 게·해마·새우가 제자리에 굳어 있었다. 고착생물이 전부 집으로 갔으므로 가드를 걷어냈다. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -463,10 +463,8 @@ func _make_fish(entry: Dictionary) -> void:
|
||||
items.add_child(node)
|
||||
node.setup(d, "producer", -1, _fish_area(home, cell, slot), cell, _rng)
|
||||
|
||||
# 헤엄치는 것만 집 둘레를 돈다. 해초나 거품돌은 제자리에 붙어 있어야 한다.
|
||||
var shape := String(d.get("shape", "rock"))
|
||||
if shape != "fish" and shape != "glow":
|
||||
return
|
||||
# 생물은 모두 집 둘레를 돈다. 고착생물(해초·거품돌)은 이제 집 쪽으로 옮겼으므로
|
||||
# 여기 들어오는 것은 전부 헤엄치거나 걷는 해양동물이다.
|
||||
var house_index := int(entry.house)
|
||||
var cap: int = maxi(Catalog.capacity_of(String(GameState.houses[house_index].id)), 1)
|
||||
# 집마다 도는 방향을 바꿔 여러 채가 한 화면에 있어도 단조롭지 않게 한다.
|
||||
@@ -525,13 +523,23 @@ func _orbit_radius(home: Rect2, cell: Vector2) -> Vector2:
|
||||
## 중심을 옮기지 않고 매 프레임 위치만 자르면 물고기가 벽에 붙어 멈춘 것처럼 보인다.
|
||||
func _orbit_center(home: Rect2, cell: Vector2) -> Vector2:
|
||||
var r := _orbit_radius(home, cell)
|
||||
var g := grid_rect()
|
||||
var g := _home_bounds(home, cell)
|
||||
return Vector2(
|
||||
_squeeze(home.position.x + home.size.x * 0.5, g.position.x + r.x, g.end.x - r.x),
|
||||
_squeeze(home.end.y - cell.y * 0.10,
|
||||
g.position.y + cell.y * 0.9 + r.y, g.end.y - r.y))
|
||||
|
||||
|
||||
## 그 집이 속한 층의 테두리. 생물을 여기 안에 가둔다.
|
||||
## 예전에는 화면(grid_rect)에 맞춰 잘랐는데, 층이 옆으로 늘어선 지금 그렇게 하면
|
||||
## 뒤쪽 층의 생물이 전부 첫 층 오른쪽 끝으로 끌려와 제 층에서 사라진다.
|
||||
func _home_bounds(home: Rect2, cell: Vector2) -> Rect2:
|
||||
var z := Catalog.zone_of_column(int(floor(home.position.x / maxf(cell.x, 1.0))))
|
||||
var g := grid_rect()
|
||||
var width := Catalog.ZONE_COLUMNS * cell.x
|
||||
return Rect2(Vector2(z * width, g.position.y), Vector2(width, g.size.y))
|
||||
|
||||
|
||||
## 범위가 뒤집힐 만큼 좁으면(작은 창) 가운데로 보낸다. clampf는 그때 엉뚱한 값을 준다.
|
||||
func _squeeze(value: float, lo: float, hi: float) -> float:
|
||||
if lo > hi:
|
||||
@@ -552,8 +560,8 @@ func _fish_area(home: Rect2, cell: Vector2, slot: int) -> Rect2:
|
||||
var x := cx + spot.x * (home.size.x + cell.x * 0.9) + ring * cell.x * 0.28
|
||||
var base := home.end.y + spot.y * cell.y + ring * cell.y * 0.22
|
||||
|
||||
# 바다 밖으로 새어 나가지 않게 잡아둔다.
|
||||
var g := grid_rect()
|
||||
# 제 층 밖으로 새어 나가지 않게 잡아둔다.
|
||||
var g := _home_bounds(home, cell)
|
||||
x = clampf(x, g.position.x + cell.x * 0.5, g.end.x - cell.x * 0.5)
|
||||
base = clampf(base, g.position.y + cell.y * 0.6, g.end.y)
|
||||
return Rect2(Vector2(x - cell.x * 0.5, base - cell.y), cell)
|
||||
|
||||
Reference in New Issue
Block a user