다시 좌충우돌하면서 제미나이를 써보려고합니다

이번에 로그라이크 만들면서 도구가 3가지가 늘었습니다
웹/gemini cli / antigravity
작업은 주로 안티 그래비티에서 작업하며 여기에 웹과 대화하고 아이디어를 안티그래비티로 옮겼습니다
토큰소모 끝나면 다른 모드로 옮겨가면서 작업했죠
제미나이 cli는 빈도가 점점 줄었습니다

## :counterclockwise_arrows_button: 안티그래비티 개발 워크플로우 (운영 전략)
단계 환경 주요 역할 API/토큰 활용 전략
**Plan** 웹 (Web) 무제한 대화로 설계 및 로직 확정 웹 세션의 넉넉한 토큰 활용
**Commit** CLI `GEMINI.md` 업데이트 및 파일 쓰기 짧은 메시지로 API 사용 최소화
**Verify** 로컬/CLI 코드 실행 및 에러 로그 수집 샌드박스 환경에서 자동 검증 수행

:light_bulb: 운영 가이드

  1. 관심사의 분리:
    • 웹(Web)은 프로젝트의 **‘뇌’**입니다. 복잡한 로직 설계와 맥락 유지는 여기서 수행합니다.
    • CLI는 프로젝트의 **‘손’**입니다. 웹에서 확정된 최종안을 로컬 파일에 물리적으로 반영할 때만 호출합니다.
  2. 토큰 절약:
    • 웹에서 길게 나눈 대화 과정을 CLI에 반복하지 않습니다. 오직 '결론’과 '수정할 코드’만 CLI에 던져 API 소모를 방지합니다.
  3. 지식 축적:
    • 작업 중 발생한 에러나 AI가 고쳐야 할 행동 양식은 즉시 CLI를 통해 GEMINI.md에 기록하여 다음 세션의 ‘재시작(Reload)’ 효율을 높입니다.
  4. 검증 루프:
    • 로컬 터미널에서 main.py 실행 시 발생하는 모든 이슈는 캡처하여 다시 Plan(웹) 단계로 가져가 해결책을 도출합니다.
      대충 워크플로를 이렇게 돌리려고합니다
      제미나이 cli는2.5 플랜모드로
      웹은 사고 모드로 작업합니다
      이걸 기반으로 해서 오리지널 둠을터미널에서 아스키모드로 옮겨보려고합니다
      wad파일 컨버팅하고 사운드 그대로 쓰면 어떻게든 될거 같아요
      마우스없이 그냥 키보드만으로 플레이 가능하게 구현해보려고요
      취미로 하는거라 시간은 좀 걸리겠지만 재미있을거 가타요
1개의 좋아요

:rocket: DooM for AntigravitY: Final Blueprint

:milky_way: 1. Project Identity

  • Title: DooM for AntigravitY

  • Concept: Classic Doom Resources + Quake Physics + Zero-G Mechanics.

  • Platform: Linux / WSL (Windows Subsystem for Linux).

  • Environment: GNOME Terminal / Windows Terminal (Recommended).

  • Constraint:

    • Zero-Dependency: Python 3.8+ Standard Library Only (No pygame, numpy, etc).

    • Keyboard Only: No Mouse Support.

    • ASCII Rendering: 100x40 Text Grid Resolution.

:open_file_folder: 2. Project File Structure

​디펜던시 제로 원칙을 지키며 모듈화를 극대화한 구조입니다.

DooM-AntigravitY/
├── assets/ # 외부 리소스
│ ├── DOOM.WAD # 오리지널 둠 WAD 파일 (Shareware or Full)
│ └── config.json # 사용자 설정 (키매핑, 감도, 사운드볼륨)
├── saves/ # 세이브 데이터
│ └── save_slot_1.json # 직렬화된 ECS 상태 덤프
├── src/ # 소스 코드
│ ├── init.py
│ ├── engine.py # 메인 루프 및 터미널 제어 (Entry Point)
│ ├── ecs/ # Entity Component System 코어
│ │ ├── world.py # 엔티티 매니저
│ │ └── components.py # 데이터 클래스 모음 (Pos, Vel, Stats…)
│ ├── systems/ # 게임 로직
│ │ ├── input_sys.py # termios 비차단 입력
│ │ ├── physics_sys.py # 중력, 관성, 충돌 처리
│ │ ├── render_sys.py # 레이캐스팅 및 아스키 버퍼링
│ │ ├── combat_sys.py # 투사체, 대미지, 파괴
│ │ └── sound_sys.py # aplay 프로세스 호출
│ └── utils/ # 유틸리티
│ ├── wad_loader.py # WAD 바이너리 파서 & Scaler
│ └── math_core.py # 삼각함수 및 벡터 연산
├── docs/ # 문서
│ └── GEMINI.md # 본 설계 문서
└── main.py # 실행 스크립트 (src.engine 호출)

:building_construction: 3. ECS Architecture

​데이터(Component)와 로직(System)의 완전한 분리.

:puzzle_piece: Components (Data)

  • Transform: x, y, z, angle (위치)

  • Motion: vx, vy, vz (속도), ax, ay, az (가속도), friction (마찰계수)

  • Body: radius, height (충돌 박스)

  • Stats: hp, armor, ammo, fuel (생존 수치)

  • PhysicsMode: NORMAL | ZERO_G | INVERTED (현재 적용된 물리 법칙)

  • Render: sprite_char (스프라이트), texture_id (벽 텍스처)

:gear: Systems (Logic)

  1. InputSystem: 키보드 입력을 가속도 벡터로 변환.

  2. GravitySystem: PhysicsMode에 따라 중력 가속도(g) 방향 결정.

  3. PhysicsSystem:

    • ​위치 업데이트 (P = P + V).

    • ​벽/천장/바닥 충돌 처리 (반사 벡터 계산).

  4. CombatSystem: 투사체 이동, 피격 판정, 벽 파괴.

  5. RenderSystem: 3D 뷰포트 생성 및 HUD 합성.

:video_game: 4. Gameplay Mechanics

:joystick: Physics Modes (The Core)

  1. Normal Mode:

    • ​g = -9.8. 바닥 마찰력 높음.

    • ​Space 누를 시 부스트 상승.

  2. Zero-G Mode:

    • ​g = 0. 마찰력 거의 없음(0.99).

    • ​벽 충돌 시 튕겨 나감(Bounce). 360도 전방향 이동.

  3. Inverted Mode:

    • ​g = +9.8. 천장이 바닥이 됨.

    • ​렌더링 화면 상하 반전 (Upside Down).

:person_running: Movement Tech

  • Inertia: 즉시 멈추지 않고 미끄러짐. Shift로 달리기 시 관성 증가.

  • Hovering: 부스트(Space)를 짧게 끊어 눌러 고도 유지.

  • Wall Kick: 무중력 상태에서 벽을 차고 반대 방향으로 급가속.

:crossed_swords: Combat & Destruction

  • Ballistics: 투사체 궤적이 중력 모드에 따라 휘어짐 (직선/포물선/역포물선).

  • Targeting: 우하단 발사 → 중앙 조준점 수렴 (Parallax).

  • Strategic Destruction: ‘약한 벽’ 파괴 시 통로 개척 및 파편(Debris) 생성.

:desktop_computer: 5. Engine Specs

:brick: WAD Integration (No Editor Needed)

  • Binary Parsing: struct 모듈로 오리지널 WAD 직접 해석.

  • Auto-Scaling: 맵 로딩 시 모든 섹터의 Ceiling Height에 x2.5 배율 적용.

    • 이유: 오리지널 둠 맵은 낮아서 부스트팩 사용 시 머리를 박기 때문.
  • Texture Mapping: WAD의 텍스처 이름을 아스키 패턴(@%#…)으로 변환.

:artist_palette: Rendering Pipeline

  1. Raycasting: DDA 알고리즘. 수직 시야각(Pitch) 대신 Z-Shearing(Y축 밀기) 기법 사용.

  2. Post-Processing:

    • Shading: 거리별 10단계 명암 (ASCII_RAMP).

    • View Flip: Inverted 모드 시 버퍼 배열 역순 출력.

  3. Double Buffering: 화면 깜빡임 제거를 위한 프레임 버퍼 스와핑.

:speaker_high_volume: Sound

  • Tech: Linux aplay (ALSA) 활용.

  • Implementation: subprocess.Popen을 이용한 Non-blocking(비차단) 사운드 재생.

:white_check_mark: 6. Development Roadmap (Sprint 1)

​1단계: 인프라 구축

  • ​[ ] 100x40 터미널 강제 설정 및 더블 버퍼링 출력.

  • ​[ ] ECS 기본 클래스(World, Entity) 구현.

​2단계: 렌더링 (The Eye)

  • ​[ ] 더미 맵(Python List)을 이용한 레이캐스팅 구현.

  • ​[ ] 2.5배 수직 스케일링 수식 적용 테스트.

​3단계: 물리 (The Body)

  • ​[ ] termios 키보드 입력 처리.

  • ​[ ] 관성 이동 및 부스트 물리 구현.

  • ​[ ] 중력 반전 시 화면 뒤집기 테스트.

몇시간동안 제미나이와 이야기하면서 GEMINI.md를 만들었습니다

바닐라둠에서 제공하는 wad를 컨버팅해서 사용할 생각입니다

이건 이거대로 문제가 될 수 있겠네요

1개의 좋아요