이번에 좀 많은 업데이트를 했다. 요즘에 무기력에 빠져있었는데 이 프로젝트를 하면서 뭐라도 하고 많이 위로를 받을 수 있었다.
다시 돌아보면 이상하게 파이썬은 좋고 프론트엔드에 그렇게 겁먹지 않아도 될것 같다는 생각이 든다.
## 포켓몬 확장
이전 버전에서는 포켓몬은 1세대만을 대상으로 모으는 방식이였다. 총 150여개쯤 되었는데 다 모으려면 대략 15000CP 정도가 필요했다.
하지만 나는 정작 1세대 포켓몬 게임들을 해본 경험이 적어서 그리 정감이 가질 않았다.
그래서 이번 업데이트에선 포켓몬을 4세대까지(아르세우스까지) 확장했다. 총 개수로는 대략 500개에 약간 못 미치는 수준이다.
굳이 4세대까지로 정한 이유는 포켓몬이 양옆으로 움직이는 스프라이트는 하트골드를 기반으로 구하고 있기 때문에 그렇게 정했다.
게다가 좀 더 올라갈수록 메가 포켓몬이 나오는데 난 그쪽은 잘 모른다.
이전 버전에서는 정말 개발 개고수 쌉너드라서 15000CP를 다 모았다고 해도 150개로 컬렉션이 그리 지져분하지 않다. (사실 약간 어지럽다)
근데 4세대까지 확장한다면.. 500개… 아예 렌더링을 하는 것에서 이슈가 생길것만 같았다.
그래서 진화 시스템을 도입했다.
## 포켓몬 진화
진화를 안하는 포켓몬을 포함해서 최종 진화 형태인 포켓몬을 세어보았더니 대략 180개쯤 되었다.
그렇다면 이전에 제공했던 포켓몬은 다시 주지 않고 진화를 시키면 개수를 조절할 수 있을 것 같다.
(물론 이브이처럼 최종 진화 형태가 여러개인 포켓몬은 여러번 준다)
그래서 진화 시스템을 착착 구현하다보니 레벨 시스템이 당연히 들어가게 되었고, 성별이나, 폼, 친밀도 등도 같이 들어갔다.
특히 성별은 성별에 따라 다르게 진화하는 넘들이 있다보니 좀 복잡했지만 잘 구현해냈다.
이전처럼 100CP 마다 포켓몬을 준다면 만렙까지는 아주 오래걸릴것 같아서 50CP 당 주는 것으로 정했고,
레벨은 2CP 마다 랜덤 포켓몬에게 주는 것으로 했다. (친밀도는 확정된 방식이 없어서 비밀 XD)
## 아이템
어떤 포켓몬은 진화할때 아이템을 사용한다. 그래서 아이템도 넣기 시작했다.
아이템을 지닌 상태로 레벨업 할때 진화하는 포켓몬도 아이템을 사용하는 것으로 간주해서 코드를 작성했다.
강철톤 처럼 교환할때 진화하는 포켓몬도 연결의 끈이라는 아이템을 사용하는 것으로 했는데,
이건 레전드 아르세우스의 방식을 채용한 것이고 도트 이미지는 포켓로그의 것을 조금 수정했다.
아이템을 받는 기준은 프론트 웹 페이지에 방문하면 일일 아이템을 매일 하나씩 받을 수 있다.
일일 아이템이 맘에 들지 않으면 이상한 사탕으로도 받을 수 있다.
아이템 사용은 프론트엔드 페이지에서 할 수 있게 해뒀다.
## 프론트
프론트 엔드는 리엑트로 개발했는데 저번 풍선 프로젝트를 만들때 유용하게 사용했던 MUI를 바로 도입했다.
덕분에 잘 만들 수 있었다. 폰트는 콜렉션에서 사용하던 것을 그대로 사용했는데 느낌이 좋다.
여기서 프론트 페이지를 볼 수 있다.
이번에도 netlify에서 배포중이다.
피그마로 배경이나 로고, 포켓볼을 만들었는데 꽤 재밌었다.
대략 이렇게 생겼다.
## 하드 리셋과 보상
데이터베이스 스키마를 많이 수정해야 하고 기존 큰 틀이 변경되었기 때문에 때문에 기존 유저들의 포켓몬을 몽땅 날리기로 했다.
그래도 보상으로 사탕 20개씩 줬다.
## 백엔드 프로젝트 구조
이제 백엔드 코드를 좀 언급하자면 repository 패턴을 도입했다.
save 함수를 만들어 model 객체를 flush한 후 refresh하는데, 이 함수는 유용하게 사용했다.
(자꾸만 jpa가 생각난다.)
대충 아래처럼 만들었고 특수한 쿼리는 상속해서 만들었다. (find_by_id 같은거)
class BaseRepository:
def __init__(self, session: AsyncSession) -> None:
self._session = session
async def save(self, *models: SQLModel):
self._session.add_all(models)
await self._session.flush(models)
for model in models:
await self._session.refresh(model)
또, 원래 User Model 에 다른 연관객체를 주렁주렁 join으로 eager loading 하게 해서 불러왔는데 이것때문에 오버헤드가 너무 심했다.
때문에 자주사용하는 User에 다른 연관 객체를 붙이지 않고 연관객체에 User를 붙여서 사용했다.
참.. 비동기를 orm과 잘 사용하기 어려운 것 같다.
'프로그래밍 > Github Pokemon Collection' 카테고리의 다른 글
# 6 유저이름에 대한 문제 (0) | 2024.07.30 |
---|---|
# 5 봇들아 가라~ 재미없다~ (0) | 2024.07.26 |
# 4 이제는 배경을 넣을때 (1) | 2024.07.13 |
# 3 서버를 고치다 (0) | 2024.07.11 |
# 2 업데이트 했음 (0) | 2024.06.01 |