1. DiceRoller

  • 01학번 이선호
  • 01학번 이재성

1.1. 제작동기

  • 주사위의잔영 - 소프트맥스의 온라인 커뮤니티 4LEAF에서 서비스중인 게임이다.
  • 주사위를 굴려서 골까지 가는 게임으로 게임을 종료하면 소정의 GP를 얻을 수 있다.
  • 그러나 이 GP를 얻기가 매우 귀찮은(ㅡㅡ;) 관계로 자동 롤러를 구상중에 있다. 거기에 시간제한까지 있어서 타이머도 붙이게 되었다.
  • 윈도우즈 메세지와 창의 인스턴스/핸들 등을 공부하기에 좋은 것 같다. (창의 계층같은것도..?)

1.2. 제작 일지


1.2.1. 04월 10일 ver 0.8

현재 상태
  • 타이머를 분리하여.. 타이머는 항상 작동.
  • 스타트/레디 버튼도 분리.
  • 유저 인터페이스의 개선. 조금 더 편해졌다.
  • DOA, 감옥에 걸렸을 때에도 Roll
  • 맵의 추가 : 워프게이트, 한반도(좌/우) 추가.
  • 채팅이 가능하다.ㅡ.ㅡa
  • 게임 중에 카드를 쓰는 것이 가능해 졌다. ( 예 : 크루거와 만났을 때 발창 쓰기 )
  • EXIT버튼 누르기 : Shift+Enter를 Roll로 사용하지 않았기 때문에 종료시 빠져나가는 루틴이 필요하다. 그래픽대조를 통해 Exit버튼을 누르자.

    추가/고쳐야 할 점
  • Shift+Enter가 안된다. -> 원래 불가능 하다는 결론..(발생시킬수는 있어도 창을 끌러올려야 한다.)
  • 그러나.. 그래픽 대조를 하였는데 그래픽 카드별로 색이 틀리다. (대략 두가지 정도로 압축.)
  • 자동 복구 루틴(방이 깨졌을 경우에)를 구현한다.
  • 새로운 의뢰가 들어왔다. 키보드를 눌렀을 때 그에 상응하는 마우스 좌표를 클릭하는 것. (이것..은 보류)
  • 프로젝트를 하나로 합쳐야 할 것 같다. 목적이 같지만 서로 관심분야가 달라서 결국 프로그램이 서로 달라지고 있다.
  • 프로그램을 키고 오래 사용하면 스타트/레디 부분이 실행되지 않는다.
  • 창을 내린 상태에서 주사위를 굴릴 때, 이동, 전투 이외에는 모든 상황에서 오토롤이 되버린다.
  • 게임이 끝나고 나갈 때 가끔식 이유를 알수 없는 오류가 발생하곤 한다. 아마도 창을 찾은 상태에서 실제로는 없는 게 되버려서 그런 것 같다.

1.2.2. 04월 25일 ver 0.55

현재 상태

  • VS.NET을 새로 깔고 다시 제작에 들어갔다
  • 전에 있던 코드를 좀 뜯어 고쳐서..ㅡ.ㅡ 어케어케 만들고는 있지만..
  • 타이머는 항상 작동
  • 숙원사업 HOTKEY를 도입(이제 아무렇게나 눌러도 된다..>.<);

    추가/고쳐야 할점
  • Shift+Enter 어떻게든 넣고 말겠다.
  • 그래픽 대조루틴을 통한 카드의 자동사용
  • Start / Ready의 자동 Click

  • 1.2.3. 05월 01일 ver 0.63

    또 여러가지를 고치며 레벨 업!! 아하하.. 이제 완성이 얼마 남지 않았다.

    개선한 점은 History.txt를 만들며 남겨놓고 있다.

    앞으로 고칠 점은 >.<

  • SHIFT+ENTER : 이상하게 그 창에서만 듣지 않는다.. 무언가 문제가 있는듯.. Direct Input를 사용해 볼까 고려중이다.
  • ㅡ.ㅡ 위의 문제를 해결하면 자동으로 해결되는 DOA와 감옥.
  • 혹시 메모리상의 값을 얻어와서 해결 할 수 있지 않을까를 생각해 보고 있다. 메모리에 접근 하는 방법은 없을까..ㅡ.ㅡ?

  • 1.2.4. 05월 08일 Nightmare Ver 0.05

    현재 상태

    결국 프로젝트(?)를 합쳐버렸다. 후훗. MSN 을 통해 노가다를 하고는 있지만 결국 한 자리에서 해야할듯 하다.

    물론 합치는 과정에서 이름이 새로 나왔다.

    가장 기본적인 것들은 해결. 카드 쓰는 부분은 전혀 구현되지 않았지만 그래도 대충은 돌아간다.


    앞으로 고칠 점

  • SHIFT+ENTER 가 실질적으로 구현은 되지만 쓸모가 없다는 점이 발견되면서 그 쪽은 아예 보류. (화면을 보면서 Shift + Enter 는 쓸모가 없단 말이닷!)

  • 역시나 카드 쓰는 걸 해결하면 일단은 거의 완성이다. (누워서 아무것도 안하고 게임을 할수 있을 정도다)

  • 메모리상의 값을 얻어와서 해결할 방법은 아직은 먼 훗날의 이야기인 듯 하지만, 만약 가능하다면 모든 문제들이 해결되다시피한다.

  • 즉, 메모리 상의 값을 얻어와서 해결할 방법을 알게 되는 순간 여태까지 해온 우리의 노가다는 모조리 꽝.

  • 메모리 상의 값을 얻을 방법을 알게 된다면, 주사위를 예측하는 것도 가능할 것 같다. (완전 게임핵이로구만)


  • 1.3. 배운 점들

    1. 윈도우의 메세지 체계를 조금 더 알 수 있었다.
    2. SPY++를 조금 더 잘 사용할 수 있게 되었다.
    3. 윈도우의 구조(메인프레임 -> 차일드 윈도우) 에 대해서 조금 더 공부할 수 있었다.
    4. 현재는 윈도우 메세지 Hooking에 대해서 보고 있다. // 이건 좀 보류..ㅡ.ㅡ;;

    1.4. 필요한 Source

    프로세스와 주소를 알때 그 주소의 값을 얻어오는 함수
    ~cpp 
    HWND hWnd = FindWindow("My Process Caption Name", NULL);
            
    if(hWnd)
    {
        DWORD ProcessId;
    
        GetWindowThreadProcessId(hWnd, &ProcessId); // hWnd로 프로세스 ID를 얻음..
    
        HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessId);
    
        if(hProcess)
        {
            DWORD ReadBytes;
            char buffer[100];
    
            ReadProcessMemory(hProcess, (LPCVOID)0x400000, buffer, 100, &ReadBytes);
            // WriteProcessMemory를 이용하면 쓰기...
    
            CloseHandle(hProcess);
        }
    }
    
    
    buffer부분에 char형태로 저장이 된다. atoi 함수로 정수로 컨버전하자.


    오.. 재밌는거 하고 있네~ 근데 주사위의 잔영을 제대로 안봐서 그런데, 창 모드로 게임이 실행되나 보지? DirectX 를 쓴다면 일반 윈도우 메세지 방식으로 처리하기 힘들지 않을까 함. (근데 해당 기능들 잘 되는 것 보니까 뭐.. 별 문제 없는 듯 하군~) --석천

    ㅡㅡ; 전체화면이구요 DX쓰는거 맞아요.. 그래도 잘 먹히는 기능은 잘 먹히네요.^^ -- 선호

    Retrieved from http://wiki.zeropage.org/wiki.php/DiceRoller
    last modified 2021-02-07 05:23:08