Skip to content

Repository files navigation

Merge Defense

동일한 레벨의 포탑을 합성해 더 강한 포탑으로 키우고, 몰려오는 적으로부터 성을 지키는 웹 기반 머지 디펜스 게임입니다. 별 등급, 속성, 장비, 스킬, 업그레이드를 조합해 최대한 오래 생존하는 것이 목표입니다.

https://mergedefense.netlify.app/

주요 특징

  • 드래그 앤 드롭 머지: 같은 레벨의 포탑 두 개를 겹치면 한 단계 높은 포탑으로 합성됩니다.
  • 랜덤 성장 요소: 포탑은 생성될 때 별 등급과 속성을 확률적으로 얻고, 적도 생존 시간에 따라 속성을 획득합니다.
  • 전략적인 배치: 포탑을 보드에 배치하면 자동으로 적을 공격하고, 다시 하단 보관함으로 회수할 수 있습니다.
  • 개별/전체 업그레이드: 포탑별 공격 속도, 공격력, 사거리, 최대 체력을 강화하거나 전체 포탑 능력치를 올릴 수 있습니다.
  • 장비 시스템: 적 처치 시 드랍되는 장비를 장착하거나 같은 장비끼리 합성해 효과를 키울 수 있습니다.
  • 속성 구슬 & 대장간: 대기 중인 포탑을 분해해 속성 구슬을 얻고, 대장간에서 구슬 3개씩 조합해 새로운 속성을 만들 수 있습니다. 속성 설명과 실제 전투 효과는 공통 설정을 기준으로 동작합니다.
  • 액티브 스킬: 포격, 빙결파, 골드러시, 응급 수리, 소환 지연으로 위기 상황을 돌파할 수 있습니다.
  • 저장/복원: 개인 플레이와 팀 플레이 모두 새로고침 후 진행 상태를 복원합니다. 게임 중 포기하기를 누르면 저장된 진행 상황을 지우고 종료합니다.
  • 팀 플레이(방 시스템): 초대코드와 선택적 비밀번호로 방을 만들고 참가해, 골드를 제외한 포탑/업그레이드/성 체력/적 웨이브를 함께 공유하는 협동 모드를 즐길 수 있습니다. 관전을 허용한 방은 초대코드 없이 게스트가 구경할 수 있습니다.
  • 랭킹 지원: Supabase 설정 시 생존 시간이 랭킹에 저장되고 시작 화면에서 확인됩니다.

게임 방법

  1. 시작 화면에서 닉네임을 입력하고 start를 누릅니다.
  2. 하단의 생성 버튼으로 포탑을 만듭니다. 생성 비용은 현재 생성 레벨에 따라 증가합니다.
  3. 같은 레벨의 포탑을 드래그해 겹치면 더 높은 레벨의 포탑으로 합성됩니다.
  4. 포탑을 상단 보드로 드래그하면 설치됩니다. 설치된 포탑은 사거리 안의 적을 자동 공격합니다.
  5. 설치된 포탑을 클릭하면 업그레이드, 타게팅 우선순위, 장비 장착을 관리할 수 있습니다.
  6. 하단 create-bar 상단 핸들을 드래그하면 보관함 높이를 조절할 수 있습니다.
  7. 적이 성에 도달하면 성 체력이 감소합니다. 성 체력이 0이 되면 게임이 종료됩니다.

핵심 시스템

포탑

포탑은 레벨, 별 등급, 속성, 장비, 업그레이드 상태를 가집니다.

  • 별 등급은 1성부터 5성까지 있으며, 높은 별일수록 공격력과 체력이 크게 증가합니다.
  • 생성 시 기본 확률로 1~4성이 등장하고, 5성은 타임 재화를 사용한 성급 업그레이드로 도달합니다.
  • 머지할 때 두 재료 중 더 높은 별 등급이 결과 포탑에 계승됩니다.
  • 설치된 포탑은 시간이 지날수록 타임을 얻고, 적 처치 시 추가 타임을 얻습니다.
  • 타임은 포탑 개별 업그레이드와 성급 업그레이드에 사용할 수 있습니다.
  • 타워의 타임은 원하는 수량만큼 1T당 20골드를 지불해 개인 T 보관함으로 회수할 수 있습니다.
  • 개인 T 보관함의 타임은 다른 타워에 원하는 수량만큼 무료로 주입할 수 있습니다.
  • 201레벨 이상의 포탑은 대형 타워가 되어 공격력과 최대 체력이 2배가 되고 화면에서 1.2배 크게 표시됩니다.
  • 포탑을 설치 영역과 대기 보관함 사이에서 이동해도 개별 강화 수치, 타임, 성급, 속성, 장비와 현재 체력이 유지됩니다.
  • 공격 속도 업그레이드는 실제 최소 공격 간격에 도달하면 더 이상 구매할 수 없습니다.

속성

포탑은 일정 확률로 특수 속성을 얻습니다. 조합법은 README에 공개하지 않지만, 각 속성의 효과는 아래에서 모두 확인할 수 있습니다.

전체 속성 효과 보기
속성 효과
힘 공격력이 2배가 됩니다.
피 공격력이 50% 감소합니다. 준 피해의 10%만큼 성 체력을 회복합니다.
공 공격 속도가 2배 빨라집니다. 타격 시 10% 확률로 적을 3성으로 강화시킵니다.
벽 공격 시 적을 3초간 정지시킵니다. 공격 속도가 2배 느려집니다.
물 공격 시 적의 이동 속도를 3초간 50% 감소시킵니다.
불 공격 시 1초마다 공격력의 25%씩 3회(총 75%) 화상 피해를 입힙니다.
폭탄 공격 시 반경 130 내 적에게 공격력의 70%만큼 피해를 줍니다.
빙결 공격 시 적을 1초간 얼리고, 이후 3초간 이동 속도를 50% 감소시킵니다.
지옥불 공격 시 1초마다 공격력의 38%씩 5회(총 188%) 화상 피해를 입힙니다. 공격 시 5초간 적의 회복 효과를 막습니다.
핵폭발 공격 시 반경 390 내 적에게 공격력의 70%만큼 피해를 줍니다. 공격 속도가 2.5배 느려집니다.
광속 공격 속도가 4배 빨라집니다. 타격 시 10% 확률로 적을 3성으로 강화시킵니다.
거인 공격력이 2.5배가 됩니다. 공격 속도가 1.15배 느려집니다.
감옥 공격 시 적을 1.2초간 정지시킵니다. 둔화/정지 중인 적에게 1.5배 피해를 줍니다.
흡혈귀 공격력이 50% 감소합니다. 준 피해의 25%만큼 성 체력을 회복합니다. 성 체력이 낮을수록 회복량이 최대 2배까지 증가합니다.
증기폭발 공격 시 적의 이동 속도를 2.1초간 35% 감소시킵니다. 공격 시 1초마다 공격력의 10%씩 2회(총 20%) 화상 피해를 입힙니다. 공격 시 반경 91 내 적에게 공격력의 49%만큼 피해를 줍니다.
열탕 공격 시 적의 이동 속도를 3초간 35% 감소시킵니다. 공격 시 1초마다 공격력의 18%씩 3회(총 54%) 화상 피해를 입힙니다. 공격력이 1.7배가 됩니다.
냉각장벽 공격 시 적의 이동 속도를 2.1초간 35% 감소시킵니다. 공격 시 적을 2.1초간 정지시킵니다. 공격 시 1초마다 공격력의 18%씩 3회(총 54%) 화상 피해를 입힙니다. 둔화/정지 중인 적에게만 적용됩니다.
생명증기 공격 시 1초마다 공격력의 18%씩 3회(총 54%) 화상 피해를 입힙니다. 지속 피해의 7%만큼 성 체력을 회복합니다.
물폭풍 공격 시 범위 내 적의 이동 속도를 2.1초간 35% 감소시킵니다. 공격 속도가 1.54배 빨라집니다.
해일 공격 시 적의 이동 속도를 3초간 35% 감소시킵니다. 공격 시 반경 91 내 적에게 공격력의 49%만큼 피해를 줍니다. 공격력이 1.7배가 됩니다.
홍수 공격 시 적의 이동 속도를 2.1초간 35% 감소시킵니다. 공격 시 적을 2.1초간 정지시킵니다.
흡수파도 공격 시 반경 91 내 적에게 공격력의 49%만큼 피해를 줍니다. 준 피해의 7%만큼 성 체력을 회복합니다. 맞은 적 수에 따라 최대 5배까지 증가합니다.
칼날비 공격 시 적의 이동 속도를 1.5초간 25% 감소시킵니다. 공격 속도가 1.54배 빨라집니다. 둔화/정지 중인 적에게 1.35배 피해를 줍니다.
시간감옥 5회 공격마다 공격 시 적을 2.1초간 정지시킵니다. 공격 속도가 1.54배 빨라집니다.
피의 비 공격 시 적의 이동 속도를 2.1초간 35% 감소시킵니다. 공격 속도가 1.54배 빨라집니다. 준 피해의 5%만큼 성 체력을 회복합니다.
빙벽 공격 시 적의 이동 속도를 2.1초간 35% 감소시킵니다. 공격 시 적을 2.1초간 정지시킵니다. 공격력이 1.7배가 됩니다.
냉혈 공격 시 적의 이동 속도를 1.5초간 25% 감소시킵니다. 둔화/정지 추가 피해의 7%만큼 성 체력을 회복합니다. 둔화/정지 중인 적에게 1.35배 피해를 줍니다.
생명의 늪 공격 시 범위 내 적의 이동 속도를 2.1초간 35% 감소시킵니다. 준 피해의 7%만큼 성 체력을 회복합니다. 맞은 적 수에 따라 최대 5배까지 증가합니다.
연쇄폭발 공격 속도가 1.54배 빨라집니다. 처치 시 반경 137에 공격력의 35%만큼 연쇄 폭발 피해를 줍니다.
화산 공격 시 1초마다 공격력의 18%씩 3회(총 54%) 화상 피해를 입힙니다. 공격 시 반경 91 내 적에게 공격력의 49%만큼 피해를 줍니다. 보스(5의 배수 레벨)에게 화상 피해가 1.42배가 됩니다.
지뢰장벽 공격 시 적을 2.1초간 정지시킵니다. 공격 시 1초마다 공격력의 15%씩 3회(총 45%) 화상 피해를 입힙니다. 공격 시 반경 91 내 적에게 공격력의 49%만큼 피해를 줍니다. 둔화/정지 중인 적에게 화상 피해가 1.35배가 됩니다.
피폭발 공격 시 1초마다 공격력의 18%씩 3회(총 54%) 화상 피해를 입힙니다. 공격 시 반경 91 내 적에게 공격력의 49%만큼 피해를 줍니다. 준 피해의 5%만큼 성 체력을 회복합니다. 맞은 적 수에 따라 최대 5배까지 증가합니다.
광전사 공격력이 1.7배가 됩니다. 공격 속도가 1.54배 빨라집니다. 타격 시 10% 확률로 적을 3성으로 강화시킵니다.
화염사슬 35% 확률로 공격 시 적을 2.1초간 정지시킵니다. 공격 시 1초마다 공격력의 15%씩 3회(총 45%) 화상 피해를 입힙니다. 정지된 적에게만 적용됩니다. 공격 속도가 1.54배 빨라집니다.
흡혈화염 공격 시 1초마다 공격력의 18%씩 3회(총 54%) 화상 피해를 입힙니다. 공격 속도가 1.54배 빨라집니다. 지속 피해의 5%만큼 성 체력을 회복합니다.
용암 공격 시 적을 2.1초간 정지시킵니다. 공격 시 1초마다 공격력의 12%씩 3회(총 36%) 화상 피해를 입힙니다. 공격력이 1.7배가 됩니다. 공격 속도가 1.5배 느려집니다.
피의 불꽃 공격 시 1초마다 공격력의 18%씩 3회(총 54%) 화상 피해를 입힙니다. 공격력이 1.7배가 됩니다. 지속 피해의 5%만큼 성 체력을 회복합니다.
제물의 벽 공격 시 적을 2.1초간 정지시킵니다. 공격 시 1초마다 공격력의 18%씩 3회(총 54%) 화상 피해를 입힙니다. 처치 시 적 최대 체력의 4%만큼 성 체력을 회복합니다. 둔화/정지 중인 적 처치 시에만 적용됩니다.
탄막 공격 시 반경 91 내 적에게 공격력의 49%만큼 피해를 줍니다. 공격력이 30% 감소합니다. 공격 속도가 1.54배 빨라집니다.
충격파 30% 확률로 공격 시 적을 1.5초간 정지시킵니다. 공격 시 반경 65 내 적에게 공격력의 40%만큼 피해를 줍니다. 공격 속도가 1.54배 빨라집니다.
피의 파편 공격 시 반경 91 내 적에게 공격력의 49%만큼 피해를 줍니다. 공격 속도가 1.54배 빨라집니다. 준 피해의 5%만큼 성 체력을 회복합니다. 맞은 적 수에 따라 최대 5배까지 증가합니다.
대포 공격 시 적을 0.9초간 정지시킵니다. 공격 시 반경 91 내 적에게 공격력의 49%만큼 피해를 줍니다. 공격력이 1.4배가 됩니다. 공격 속도가 1.7배 느려집니다.
흡혈폭탄 공격 시 반경 91 내 적에게 공격력의 49%만큼 피해를 줍니다. 공격력이 1.7배가 됩니다. 준 피해의 5%만큼 성 체력을 회복합니다.
피의 장벽 공격 시 범위 내 적을 2.1초간 정지시킵니다. 준 피해의 7%만큼 성 체력을 회복합니다. 맞은 적 수에 따라 최대 5배까지 증가합니다.
파쇄 공격 시 적을 0.9초간 정지시킵니다. 공격력이 1.7배가 됩니다. 공격 속도가 1.54배 빨라집니다. 6초 동안 공격 후 25% 확률로 1.5초간 멈춥니다.
사냥꾼 공격력이 1.7배가 됩니다. 공격 속도가 1.54배 빨라집니다. 처치 시 적 최대 체력의 4%만큼 성 체력을 회복합니다.
흡착 공격 시 적을 1.2초간 정지시킵니다. 공격 속도가 1.54배 빨라집니다. 준 피해의 7%만큼 성 체력을 회복합니다. 둔화/정지 중인 적에게만 적용됩니다.
수호자 공격 시 적을 1.8초간 정지시킵니다. 공격력이 1.5배가 됩니다. 공격 속도가 1.7배 느려집니다. 준 피해의 6%만큼 성 체력을 회복합니다.
빙화산포 공격 시 적을 1.8초간 정지시킵니다. 공격 시 1초마다 공격력의 15%씩 4회(총 60%) 화상 피해를 입힙니다. 공격 시 반경 156 내 적에게 공격력의 85%만큼 피해를 줍니다. 공격 속도가 1.6배 느려집니다.
늪지포 공격 시 적의 이동 속도를 1.8초간 30% 감소시킵니다. 공격 시 반경 156 내 적에게 공격력의 85%만큼 피해를 줍니다. 준 피해의 6%만큼 성 체력을 회복합니다. 맞은 적 수에 따라 최대 5배까지 증가합니다.
폭염탄막 공격 시 1초마다 공격력의 15%씩 4회(총 60%) 화상 피해를 입힙니다. 공격 시 반경 78 내 적에게 공격력의 42%만큼 피해를 줍니다. 공격 속도가 1.43배 빨라집니다. 처치 시 반경 234에 공격력의 60%만큼 연쇄 폭발 피해를 줍니다.
절대감옥 공격 시 적을 3.6초간 정지시킵니다. 공격 시 1초마다 공격력의 15%씩 4회(총 60%) 화상 피해를 입힙니다. 공격 속도가 1.6배 느려집니다. 둔화/정지 중인 적에게 1.3배 피해를 줍니다.
암살비 공격 속도가 2.5배 빨라집니다. 체력이 25% 이하인 적에게 1.6배 피해를 줍니다. 처치 시 적 최대 체력의 4%만큼 성 체력을 회복합니다.
혈핵 공격 시 반경 156 내 적에게 공격력의 85%만큼 피해를 줍니다. 공격 속도가 1.6배 느려집니다. 준 피해의 6%만큼 성 체력을 회복합니다. 맞은 적 수에 따라 최대 5배까지 증가합니다.
시간사슬 35% 확률로 공격 시 적을 1.8초간 정지시킵니다. 공격 시 반경 78 내 적에게 공격력의 42%만큼 피해를 줍니다. 정지된 적에게만 피해가 적용됩니다. 공격 속도가 1.43배 빨라집니다.
혈염 공격 시 1초마다 공격력의 30%씩 5회(총 150%) 화상 피해를 입힙니다. 지속 피해의 6%만큼 성 체력을 회복합니다. 같은 적을 계속 공격할수록 피해가 최대 32%까지 누적 증가합니다.
심해 공격 시 적의 이동 속도를 1.8초간 60% 감소시킵니다. 30% 확률로 공격 시 적을 0.9초간 정지시킵니다. 공격 시 반경 117 내 적에게 공격력의 0%만큼 피해를 줍니다. 준 피해의 6%만큼 성 체력을 회복합니다. 맞은 적 수에 따라 최대 5배까지 증가합니다.
파멸포 공격 시 적을 1.8초간 정지시킵니다. 공격 속도가 1.6배 느려집니다. 보스(5의 배수 레벨)에게 1.72배 피해를 줍니다.
광란폭죽 공격 속도가 2.5배 빨라집니다. 타격 시 10% 확률로 적을 3성으로 강화시킵니다. 처치 시 40% 확률로 반경 117에 공격력의 30%만큼 연쇄 폭발 피해를 줍니다.
성역 공격 시 적을 3.6초간 정지시킵니다. 공격력이 40% 감소합니다. 준 피해의 6%만큼 성 체력을 회복합니다.
영구동토 공격 시 적의 이동 속도를 1.7초간 27% 감소시킵니다. 55% 확률로 공격 시 적을 4.1초간 정지시킵니다. 공격력이 40% 감소합니다.
마그마지대 공격 시 적의 이동 속도를 1.7초간 27% 감소시킵니다. 공격 시 1초마다 공격력의 14%씩 4회(총 56%) 화상 피해를 입힙니다. 공격 시 반경 176 내 적에게 공격력의 95%만큼 피해를 줍니다.
폭우검 공격 시 적의 이동 속도를 1.7초간 27% 감소시킵니다. 공격 속도가 3.03배 빨라집니다. 둔화/정지 중인 적에게 1.28배 피해를 줍니다.
포식자 준 피해의 6%만큼 성 체력을 회복합니다. 처치 시 5.4초간 공격력 1.81배로 강화됩니다. 공격 속도는 1.43배가 됩니다. 추가로 적 최대 체력의 8%만큼 회복합니다.
종말 90초마다 화면의 모든 적에게 공격력의 5배 피해를 주고 3초간 정지시킵니다.
과부하 공격 속도가 5배 빨라집니다. 타격 시 6% 확률로 적을 3성으로 강화시킵니다. 8초 동안 공격 후 2초간 멈춥니다.
천공포 공격 시 반경 72 내 적에게 공격력의 39%만큼 피해를 줍니다. 보스(5의 배수 레벨)에게 1.81배 피해를 줍니다.
왕성수호 공격 시 성 근처의 적을 4.1초간 정지시킵니다. 성 체력이 낮을수록 지속 시간이 최대 2배까지 증가합니다. 준 피해의 14%만큼 성 체력을 회복합니다. 성 체력이 낮을수록 회복량이 최대 2배까지 증가합니다.

머지 시 공 속성이 가장 우선 계승됩니다. 그 외에는 속성이 있는 포탑의 속성이 이어지고, 둘 다 속성이 있으면 드래그한 포탑의 속성이 우선됩니다.

속성 설명은 attribute-effects.js의 효과 설정에서 생성되므로, 설명에 적힌 수치와 실제 전투 효과가 같은 설정을 사용합니다.

적

적은 오른쪽에서 등장해 왼쪽 성을 향해 이동합니다.

  • 시간이 지날수록 등장 가능한 적 레벨이 높아집니다.
  • 4의 배수 레벨 적은 더 빠르게 이동합니다.
  • 5의 배수 레벨 적은 보스이며 체력이 높고 자연 회복합니다.
  • 3의 배수 레벨 적은 근처 포탑을 공격할 수 있습니다.
  • 보스는 주변 포탑에 광역 피해와 기절을 줄 수 있습니다.
  • 7의 배수 레벨 적은 살아있는 동안 10초마다 자기 주변 100px 안에 1~3레벨 낮은 적을 소환합니다.
  • 11의 배수 레벨 적은 체력이 절반이지만 공격력이 2배이고, 흡혈/재생/보스 회복량이 4배입니다.
  • 17의 배수 레벨 적은 체력 계산의 기본값이 해당 레벨 수치로 크게 낮아지지만, 별 등급, 보스, 속성, 고레벨 및 11의 배수 체력 배율은 정상 적용됩니다. 타워 공격 피해는 공격한 타워의 성급과 같은 수치로 고정되며, 대형 타워는 이 피해가 2배가 됩니다. 타워가 원인이 아닌 스킬 피해는 1로 고정됩니다.
  • 생존 시간이 길어질수록 적에게 무작위 속성이 붙을 확률이 높아집니다.
  • 적 처치 시 골드를 얻고, 일정 확률로 장비가 드랍됩니다.

고레벨 적 체력 배율

적의 기본 체력에는 레벨 구간에 따라 다음 배율이 추가로 적용됩니다.

적 레벨 체력 배율
1~24 1배
25~49 2배
50~74 4배
75~99 8배
100~149 32배
150 이상 128배

이 배율은 별 등급, 보스, 적 속성에 따른 체력 배율과 함께 곱해집니다. 11의 배수 레벨 적은 위 배율까지 적용된 체력에서 다시 절반으로 감소합니다.

적 속성 등장 확률

생존 시간 무속성 속성
0~29초 100% 0%
30~99초 80% 20%
100~599초 60% 40%
600초 이후 5% 95%

30초 이후에는 공중, 고스트, 골렘, 번개가 균일 확률로 등장합니다. 100초 이후에는 재생, 방패, 분열, 암살자, 중갑, 마법저항이 추가됩니다. 600초 이후에는 모든 적 속성이 균일 확률로 등장합니다.

적 속성 효과

적 속성 효과
공중 일반 지상 공격 피해를 크게 줄이고, 공/번개 계열 대응 속성에 더 큰 피해를 받습니다.
고스트 일반 공격을 일정 확률로 회피하며, 벽 계열 정지 공격에 약합니다.
골렘 체력이 높고 이동이 느리며 둔화/정지 효과를 덜 받습니다. 힘/폭탄 계열 피해에 약합니다.
번개 이동 속도가 빠르고 일정 주기마다 짧게 순간이동합니다. 물/벽 계열에 약합니다.
얼음 둔화와 정지 효과를 크게 줄입니다. 불 계열 피해에 약합니다.
화염 지속 피해를 덜 받습니다. 물 계열에 약합니다.
재생 시간이 지나면 체력을 회복합니다. 불 지속 피해나 폭탄 피해에 약합니다.
방패 앞에서 받는 일반 피해를 줄입니다. 폭탄 범위 피해나 뒤쪽 공격에 약합니다.
분열 죽으면 작은 무속성 적으로 나뉩니다. 폭탄 피해로 처치하면 분열하지 않고 더 큰 피해를 받습니다.
광폭 체력이 낮아지면 이동 속도가 빨라집니다. 벽/물 계열 제어가 중요합니다.
흡혈 성에 닿으면 성 피해량이 높고 자신의 체력을 회복합니다. 힘/폭탄 계열에 약합니다.
마법저항 불, 물, 피 같은 특수 속성 피해를 덜 받습니다. 힘/공 계열 기본 피해에 약합니다.
중갑 일반 공격 피해를 줄입니다. 지속 피해와 폭탄 피해에 약합니다.
암살자 매우 빠르고 성 피해가 높지만 체력이 낮습니다.
보스 5의 배수 레벨 적에게 붙는 별도 특성입니다. 자연 회복하고 상태이상 시간이 짧게 적용됩니다.

장비

장비는 하단 보관함의 아이템 탭에서 확인할 수 있습니다. 설치된 포탑을 클릭한 뒤 장비 슬롯으로 드래그하면 장착됩니다.

장비 효과
기름 공격 속도 증가
조준경 공격 범위 증가
화약 공격력 증가
무게추 폭탄 범위 증가
바늘 치명타 확률 증가
망치 치명타 피해 증가
방패 최대 체력 증가

같은 종류의 장비끼리는 드래그 앤 드롭으로 합성할 수 있습니다. 두 장비의 수치를 기준으로 더 강한 장비가 생성됩니다.

대기 포탑 관리

하단 보관함에서 아직 설치하지 않은(대기 중인) 포탑을 클릭하면 작은 메뉴가 뜹니다.

동작 설명
삭제 포탑 레벨의 제곱(lv²)만큼 골드를 소모해 포탑을 없앱니다. 골드가 부족하면 버튼이 비활성화됩니다.
분해 포탑을 없애고 그 포탑의 속성을 속성 구슬 1개로 바꿉니다. 속성이 없는 포탑은 분해할 수 없습니다.
융합 보유한 속성 구슬 하나를 소모해 그 포탑의 속성을 바꿉니다.
취소 메뉴를 닫습니다.

속성 구슬과 대장간

포탑을 분해하면 속성 구슬을 얻습니다. 하단 탭의 대장장 버튼을 누르면 대장간 창이 뜨고, 동시에 보관함이 보유 중인 조합서 목록으로 전환됩니다.

대장간에서는 구슬 3개를 골라 새로운 속성 구슬을 합성할 수 있습니다. 정해진 조합표에 있는 정확한 3개 조합일 때만 결과가 표시되며, 표에 없는 조합은 합성 버튼이 비활성화된 채 아무 결과도 나오지 않습니다. 조합법은 게임 안에서 발견하는 요소로 두기 위해 README에는 공개하지 않습니다.

각 속성 구슬은 이름과 수치가 포함된 효과 설명을 함께 표시하며, 설명은 실제 적용되는 효과 설정을 기준으로 생성됩니다.

조합서

같은 레벨의 포탑을 합성할 때마다 20% 확률로 조합서를 하나 얻습니다. 조합서는 게임 안에서 조합 단서를 발견하는 수집형 아이템이며, 이미 가지고 있는 조합서를 다시 얻으면 중복 없이 그냥 사라집니다. 조합서는 하단 보관함의 대장장 탭에서 확인할 수 있습니다.

스킬

보드 왼쪽의 스킬 버튼으로 전투를 보조할 수 있습니다.

스킬 효과 쿨다운
포격 모든 적에게 현재 체력의 30%만큼 피해를 줍니다. 20초
빙결파 모든 적을 4초 동안 둔화시킵니다. 15초
골드러시 즉시 골드를 획득합니다. (max(20, floor(40 × 생성레벨^1.5))) 25초
응급 수리 성 체력을 최대 체력의 20%, 설치된 모든 포탑의 체력을 각 포탑 최대 체력의 20%만큼 회복합니다. 30초
소환 지연 10초 동안 적 생성 간격을 2배 느리게 만듭니다. 45초

스킬 쿨다운은 실제 시간 기준으로 계산됩니다. 배속을 바꿔도 쿨다운을 줄이는 꼼수는 적용되지 않습니다.

업그레이드

  • 생성 단계 향상: 새로 생성되는 포탑의 기본 레벨을 올립니다.
  • 개별 업그레이드: 설치된 포탑의 공격 속도, 공격력, 사거리, 최대 체력을 올립니다.
  • 전체 업그레이드: 모든 포탑의 공격 속도, 공격력, 사거리를 올립니다.
  • 치명타 업그레이드: 치명타 확률과 치명타 피해량을 강화합니다.
  • 성 체력 향상: 성의 최대 체력을 늘리고 즉시 일부 회복합니다.
  • 설치 최대치 +1: 동시에 설치 가능한 포탑 수를 늘립니다.
  • 배속: 1배속, 2배속, 5배속, 0배속(정지)을 전환합니다.

업그레이드 버튼에는 x1, x10, x100 선택 버튼이 붙어 있어 여러 번의 업그레이드를 한 번에 구매할 수 있습니다. 모든 주요 숫자는 3자리마다 쉼표가 들어간 형식으로 표시됩니다.

팀 플레이 (방 시스템)

시작 화면의 팀 플레이 버튼으로 room.html 로비에 입장합니다.

  • 방 만들기: 방 이름, 선택적 비밀번호, 최대 인원(2/3/4/6인), 관전 허용 여부를 지정해 방을 만듭니다. 관전 허용은 기본값이 켜짐이며, 6자리 초대코드가 자동 발급됩니다.
  • 참가하기: 초대코드와 (설정된 경우) 비밀번호를 입력해 참가합니다. 열린 방 목록에서 방을 눌러 코드를 자동으로 채울 수도 있습니다.
  • 관전하기: 관전을 허용한 진행 중 방은 방 목록에 관전 버튼이 표시됩니다. 게스트는 게임 화면을 볼 수 있지만 포탑 생성, 업그레이드, 스킬 사용, 마우스 포인터 공유 같은 행동은 할 수 없습니다.
  • 대기실: 참가자 목록이 실시간으로 표시됩니다. 호스트만 게임 시작, 방 삭제 버튼을 볼 수 있습니다. 누구나 나가기로 방을 떠날 수 있습니다.
  • 게임 진행 방식: 각 플레이어의 골드와 개인 T 보관함은 개인별로 관리되고, 포탑 배치/포탑 체력/포탑에 남아 있는 타임/장비/속성 구슬/전역 업그레이드/성 체력/배속/적 웨이브는 방 전체가 공유됩니다. 한 플레이어가 포탑을 만들거나 배치, 업그레이드하면 모든 플레이어 화면에 같은 상태로 반영됩니다.
  • 마우스 포인터 공유: 게임 중 각 플레이어의 마우스 위치가 다른 팀원의 화면에 색이 있는 원과 닉네임으로 실시간 표시됩니다. 업그레이드 창 등 모달이 열려 있으면 항상 포인터보다 위에 표시됩니다.
  • 호스트 권한: 적 스폰, 이동, 전투 판정, 성 체력 자연 회복, 보스 자연 회복, 포탑 타임 증가는 호스트 클라이언트가 계산해 나머지 참가자에게 실시간 브로드캐스트합니다. 원래 호스트가 나가면 접속 중인 플레이어 한 명이 임시 호스트로 자동 선출되고, 원래 호스트가 돌아오면 권한이 복원됩니다.
  • 알려진 한계 (v1): 방 비밀번호는 SHA-256 해시로 저장되지만 별도 인증 서버 없이 클라이언트에서 비교하는 방식이라 완전한 보안은 아닙니다. 진행 중인 방에는 중간 참가가 불가능합니다.

실행 방법

이 프로젝트는 별도 빌드 과정이 없는 정적 웹 프로젝트입니다.

python3 -m http.server 8000

브라우저에서 아래 주소로 접속합니다.

http://localhost:8000

파일을 직접 열어도 동작할 수 있지만, 랭킹 API 요청과 브라우저 보안 정책을 고려하면 로컬 서버 실행을 권장합니다.

Supabase 랭킹 설정

js/supabase-config.js에 Supabase REST API 정보를 입력하면 랭킹 저장과 조회가 활성화됩니다.

window.SUPABASE_CONFIG = {
  url: 'https://YOUR_PROJECT.supabase.co',
  publicKey: 'YOUR_SUPABASE_PUBLISHABLE_KEY',
  rankingsTable: 'rankings',
  teamRankingsTable: 'team_rankings'
};

필요한 테이블 예시는 다음과 같습니다.

create table rankings (
  id bigint generated by default as identity primary key,
  name text not null,
  survival_time integer not null,
  created_at timestamptz not null default now()
);

팀 플레이 랭킹은 supabase-team-rankings.sql을 Supabase SQL Editor에서 실행해 추가합니다. 팀 기록은 게임이 끝날 때 방 ID당 한 번만 저장됩니다.

Supabase를 설정하지 않으면 게임은 정상 실행되지만 랭킹 저장과 조회는 비활성화됩니다.

Supabase 팀 플레이(방 시스템) 설정

방 시스템을 사용하려면 Supabase SQL Editor에서 아래 테이블을 추가로 생성해야 합니다. 랭킹 테이블과 마찬가지로 별도 인증 없이 publishable key로 접근하는 구조이므로 RLS는 비활성 상태(기본값)로 둡니다.

create table rooms (
  id bigint generated by default as identity primary key,
  code text not null unique,
  name text not null,
  password_hash text,
  host_client_id text not null,
  max_players int not null default 4,
  allow_spectators boolean not null default true,
  status text not null default 'waiting',
  castle_max_hp numeric not null default 1000,
  castle_hp numeric not null default 1000,
  created_at timestamptz not null default now(),
  updated_at timestamptz not null default now()
);

create table room_players (
  id bigint generated by default as identity primary key,
  room_id bigint not null references rooms(id) on delete cascade,
  client_id text not null,
  name text not null,
  is_host boolean not null default false,
  joined_at timestamptz not null default now(),
  unique (room_id, client_id)
);

또한 Supabase 프로젝트의 Realtime 기능(Broadcast/Presence)이 활성화되어 있어야 하며, room-<roomId>라는 이름의 공개 채널에 대해 별도 Realtime Authorization 정책을 추가하지 않은 기본 설정을 가정합니다. 프로젝트가 비공개 채널(private) 정책으로 전환되어 있다면 realtime.messages에 대한 RLS 정책을 추가로 구성해야 합니다.

프로젝트 구조

mergedefense/
├── index.html          # 시작 화면, 랭킹 목록, 팀 플레이 진입
├── index.css            # index.html 전용 스타일
├── main.html            # 메인 게임 화면
├── style.css             # main.html 전용 스타일
├── js/                   # JavaScript 파일
│   ├── index.js          # 로그인, 랭킹 로딩/렌더링
│   ├── room.js           # 방 CRUD·초대코드·대기실 로직
│   ├── fail.js           # 팀 결과 요약, 재시작 버튼
│   ├── team.js           # 팀 플레이 실시간 동기화 어댑터 (main.html에서 로드)
│   ├── supabase-config.js # Supabase 연결 설정
│   ├── format.js         # 숫자 표시 포맷 유틸리티
│   ├── config.js         # 상수, DOM 참조, 전역 상태
│   ├── towers.js         # 타워 생성/스탯/생성비용
│   ├── enemies.js        # 적 생성/이동/특수 레벨 규칙
│   ├── equipment.js      # 장비 생성/장착/해제
│   ├── combat.js         # 공격 루프, 총알, 데미지, 회복 루프
│   ├── upgrade-modal.js  # 타워 업그레이드 모달, 전역 업그레이드
│   ├── inventory.js      # 드래그앤드롭, 인벤토리 뷰
│   ├── attribute-effects.js # 속성 효과 설정/적용/설명 생성
│   ├── attribute-orbs.js # 대기 포탑 삭제/분해/융합 + 대장간
│   ├── skills.js         # 스킬바
│   ├── persistence.js    # 개인/팀 플레이 저장·복원
│   └── game.js           # 게임 루프/인터벌, 랭킹 저장, 이벤트 바인딩
├── room.html             # 팀 플레이 방 생성/참가/대기실
├── room.css              # room.html 전용 스타일
├── fail.html             # 게임 오버 화면 (팀 결과 요약 포함)
├── fail.css              # fail.html 전용 스타일
├── defense.png           # 성 이미지
├── img/                  # 포탑 이미지
└── enemyImg/             # 적 이미지

사용 기술

  • HTML5
  • CSS3
  • Vanilla JavaScript
  • Supabase REST API
  • Supabase Realtime (Broadcast/Presence, 팀 플레이용)

라이선스

MIT License

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages