파랜드 택틱스2 아이템 구조

Posted at 2011/01/11 02:18 // in Note/Farland Tactics // by drDorothy
// 아이템 사용자
#define ITEM_KARIN		((unsigned short) (0x0001))
#define ITEM_AL			((unsigned short) (0x0002))
#define ITEM_ARIS		((unsigned short) (0x0004))
#define ITEM_SARAH		((unsigned short) (0x0008))
#define ITEM_RADITSU	((unsigned short) (0x0010))
#define ITEM_SOPHIA		((unsigned short) (0x0020))
#define ITEM_RURU		((unsigned short) (0x0040))
#define ITEM_JOHN		((unsigned short) (0x0080))
#define ITEM_SON		((unsigned short) (0x0100))

// 아이템 특수효과
enum ItemEffect
{
	ItemEffectNone=0,			// 없음
	ItemEffectResurrection,		// 부활
	ItemEffectPoision,			// 중독
	ItemEffectSleep,			// 수면
	ItemEffectPetro,			// 석화
	ItemEffectFreeze,			// 동결
	ItemEffectSilence,			// 침묵
	ItemEffectTemptation,		// 매료
	ItemEffectParalyze,			// 마비
	ItemEffectUnknown1,			// ????
	ItemEffectMove,				// 이동Up
	ItemEffectFly,				// 비행
	ItemEffectUnknown2			// ????
};

// 아이템 타입
enum ItemType { ItemTypeWeapon=0, ItemTypeArmor, ItemTypeAccessory, ItemTypeUsable };

// 공격 타입 (아이템 타입이 무기인 경우만, 방어구 타입이면 언제나 0)
enum ItemActionType {
	ItemActionTypeNormal=0,		// 일반 형태의 단일 타겟 공격
	ItemActionTypePierce,		// 관통 공격
	ItemActionTypeRange,		// 자신을 중심으로 범위공격
	ItemActionTypeUnknown		// ??
};

// 아이콘 모양
enum ItemIconType {
	ItemIconTypeArmor=0,
	ItemIconTypeBBottle,
	ItemIconTypeRing,
	ItemIconTypeYFlower,
	ItemIconTypeBFlower,
	ItemIconTypeNuts,
	ItemIconTypeBag,
	ItemIconTypeRFlower,
	ItemIconTypeGBottle,
	ItemIconTypeOBottle,
	ItemIconTypeMushroom,
	ItemIconTypeRedBall,
	ItemIconTypeJewel,
	ItemIconTypeNecklace,
	ItemIconTypeBook,
	ItemIconTypeBracelet
};

#pragma pack(1)
typedef struct _FT2ITEM
{
	char Name[20];				// 아이템 명칭
	unsigned short Price;		// 아이템 가격
	unsigned short RestoreHp;	// HP 회복량
	unsigned short RestoreMp;	// MP 회복량
	short Atk;					// 공격력
	short Def;					// 방어력
	short Int;					// 지력
	short Mgd;					// 항마력
	short Agi;					// 민첩성

	// 속성(음수는 반대속성)
	short Fire;
	short Wind;
	short Light;

	short MinRange;				// 최소 사용 범위 (이 범위 이상부터 사용 가능)
	short MaxRange;				// 최대 사용 범위 (이 범위 까지 사용 가능)
	short Type;					// (0:무기,1:방어구,2:악세서리,3:소모아이템)
	short ActionNo;				// 액션 번호
	short ActionType;			// 공격 형태 or 아이콘 모양
	short Effect;				// 특수효과
	short ItemUser;				// 아이템 사용자

} FT2ITEM, *PFT2ITEM;
#pragma pack()


※ 주의 : 케릭터에 따른 엑션번호가 존재하는지 언제나 체크해야함
2011/01/11 02:18 2011/01/11 02:18

파랜드 택틱스2 마법 구조

Posted at 2011/01/11 02:15 // in Note/Farland Tactics // by drDorothy
#define SPELL_KARIN		((unsigned short) (0x0001))
#define SPELL_AL		((unsigned short) (0x0002))
#define SPELL_ARIS		((unsigned short) (0x0004))
#define SPELL_SARAH		((unsigned short) (0x0008))
#define SPELL_RADITSU	((unsigned short) (0x0010))
#define SPELL_SOPHIA	((unsigned short) (0x0020))
#define SPELL_RURU		((unsigned short) (0x0040))
#define SPELL_SON		((unsigned short) (0x0080))
#define SPELL_ENEMY		((unsigned short) (0x0100))

// 공격 대상
enum MagicTarget {
	MagicTargetEnemy=0,				// 적에게 적용
	MagicTargetTeam,				// 같은 팀
	MagicTargetAll					// 사일런스와 같은 마법
};

// 공격 범위
enum MagicRangeType {
	MagicRangeTypeSingle=0,			// 단일 타겟
	MagicRangeTypeLevel,			// 레벨에 따라 범위 증가
	MagicRangeTypeLine,				// 일직선
	MagicRangeTypeCenter,			// 전체마법 (자신을 중심으로)
	MagicRangeTypeAll				// 사일런스와 같은 모든 케릭터를 타겟
};

#pragma pack(1)
typedef struct _FT2MAGIC
{
	char Name[20];					// 마법 명칭
	unsigned short Level;			// 사용 레벨
	short Mp;						// 소모 MP

	// 속성 (음수는 반대속성)
	short Fire;
	short Wind;
	short Light;

	// 마법 범위
	unsigned short MinRange;		// 최소 마법 범위
									// (0: 자신, 1: 자기 제외, 2: 자기로부터 한칸 ...)
	unsigned short MaxRange;		// 최대 범위 (중심기준 공격인 경우 피해범위가 됨)

	// 마법 이펙트 관련
	char EffectName[12];			// 이펙트 명칭(APD 파일)
	unsigned short EffectSound;		// 이펙트 소리 번호

	unsigned short Target;			// 0:적, 1:아군, 2:전체
	unsigned short RangeType;		// MagicRangeType 참고
	unsigned short SpellUser;		// 스펠 사용자

	char Description[10];			// 마법 설명

} FT2MAGIC, *PFT2MAGIC;
#pragma pack()


※ 주의 : 전체마법과 같은 초기 특수효과가 들어가는 마법은 충돌이 있음
2011/01/11 02:15 2011/01/11 02:15

CHtmlView에 Multi-Thread로 접근해서 Html 코드 바로 출력하기

Posted at 2010/10/29 12:59 // in Note/Windows // by drDorothy
이번에 프로그램 만들면서 보고서 형식의 출력을 만드는 과정에서,
직접 뷰를 하나씩 디자인하는게 너무 힘들어서 처음으로 CHtmlView를 써봤다.

작업중 몇가지 난관이 있었는데,
  1. HTML Page가 아닌 HTML Code를 직접 출력하는 방법
  2. Multi-Thread에서 접근시 에러
위의 2가지를 해결하는데 자료가 많지 않아서 힘들었다.
특히 멀티 스레드 문제는 COM+를 시작으로 별 희안한게 다 나와서 편법(?)으로 처리했다.

그럼 하나씩 해결방법을 살펴보자!!

HTML 코드 직접 출력하는건 구글에서 비슷한 코드를 찾아서 문제가 없었다.
단지 내가 쓰기 편하게 커스터마이징 했다.
따로 함수를 만들어서 HTML 코드를 넘기면 화면에 보여주는 형식으로 만들었다.

   40 // HTML코드를 출력하는 부분

   41 DWORD CHtmlViewView::DoShowHtml(BSTR html)

   42 {

   43     HRESULT ret;

   44 

   45     // 최소한의 포인터검사

   46     if (html == NULL)

   47         return FALSE;

   48 

   49     // 현재 도큐먼트자체에 대한 인스턴스획득

   50     LPDISPATCH pIDispatch = GetHtmlDocument();

   51     if (pIDispatch == NULL)

   52         return FALSE;

   53 

   54     // 실제 HTML트리를 가져와서

   55     IHTMLDocument2* pIHTMLDocument2;

   56     ret = pIDispatch->QueryInterface(IID_IHTMLDocument2, (void**) &pIHTMLDocument2);

   57     if (!SUCCEEDED(ret) || pIHTMLDocument2 == NULL)

   58         goto DoShowHtml_fail1;

   59 

   60     // <BODY> 객체를 가져옴 (이곳에 동적으로 코드를 삽입)

   61     IHTMLElement *pIHTMLElement;

   62     ret = pIHTMLDocument2->get_body(&pIHTMLElement);

   63     if (!SUCCEEDED(ret) || pIHTMLElement == NULL)

   64         goto DoShowHtml_fail2;

   65 

   66     // HTML 코드를 반영

   67     ret = pIHTMLElement->put_innerHTML(html);

   68     if (!SUCCEEDED(ret))

   69         goto DoShowHtml_fail3;

   70 

   71     // 사용한거 반환

   72     pIHTMLElement->Release();

   73     pIHTMLDocument2->Release();

   74     pIDispatch->Release();

   75     return TRUE;

   76 

   77     // 에러시의 리턴설정

   78 DoShowHtml_fail3: pIHTMLElement->Release();

   79 DoShowHtml_fail2: pIHTMLDocument2->Release();

   80 DoShowHtml_fail1: pIDispatch->Release();

   81     return FALSE;

   82 }


이제 이 함수를 호출하면 단일 스레드 환경에서는 아무런 문제가 없이 작동한다.

하지만 자료 처리부와 UI의 스레드를 분리해서 작업하는게 버릇이라,

아무런 생각없이 스레드를 나눠서 작업을 했더니 계속 에러를 내뱉었다.

디버깅을 하면 GetHtmlDocument()의 반환값이 NULL이 나왔다.

잠깐의 구글링을 통해서 위의 코드를 멀티 스레드에서 사용하기 위해서는

이상한(?) 작업이 필요하다는 것을 알게 되었고,

COM+ 어쩌고가 난무하면서 머리가 아파오자 그냥 때려쳤다.

하지만 확실한건 멀티 스레드라도 자신의 스레드에서 호출하면 이상없이 돌아가기에,

편법으로 처리했더니 잘 돌아갔다.

그 방법은
  1. 새로운 유져 메세지를 만든다
  2. 윈도우 프로시져에 방금만든 메세지를 처리하는 코드를 넣는다
  3. 프로시져가 위의 HTML 출력함수를 호출한다
이렇게 하면 윈도우프로시져는 항상 오리지날 스레드에서 돌기 때문에,
호출하는 부분이 자연스럽게 오리지날 스레드로 위임된다.
(별 탈없이 자신의 스레드에서 HTML 출력을 요청한게 된다!!)

   83 

   84 // WindowProc에 HTML출력함수를 호출하는 메세지를 추가 (멀티스레드 우회)

   85 #define WM_USER_SHOWHTML (WM_USER+1)

   86 LRESULT CHtmlViewView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)

   87 {

   88     if (message == WM_USER_SHOWHTML)

   89     {

   90         // Free를 여기서해야 실제로 화면에 출력할 코드를 모두 반영한 다음 해제함

   91         BSTR bstr = (BSTR) lParam;

   92         DoShowHtml(bstr);        // 실제 출력함수 호출

   93         ::SysFreeString(bstr);    // 사용한 시스템스트링 해제

   94     }

   95 

   96     return CHtmlView::WindowProc(message, wParam, lParam);

   97 }

   98 

   99 // 외부에서 접근시 사용되는 엔트리포인트

  100 DWORD CHtmlViewView::ShowHtml(TCHAR* html)

  101 {

  102     USES_CONVERSION;

  103     BSTR bstr = ::SysAllocString(T2COLE(html));    // 해제는 메세지처리부에서 알아서 해줌

  104     if (bstr == NULL)

  105         return FALSE;

  106 

  107     // 실제 인스턴스를 가진 스레드로 전달

  108     SendMessage(WM_USER_SHOWHTML, NULL, (LPARAM) bstr);

  109     return TRUE;

  110 }


이렇게 하니 간단히 해결되었다.

위의 방식에서 <BODY>에  html코드를 바꾸기 때문에,

Navigate2(_T("about:blank"),NULL,NULL); 같이 빈 페이지로 이동하기 보다는,

미리 HTML 더미페이지를 만들고 미리 <STYLE>을 정의해두면 편리하게쓸수 있다.

첨부파일 설명

실제로 내용이 추가된 파일:
HtmlViewView.cpp, HtmlViewView.h, HtmlViewDoc.cpp, HtmlViewDoc.h

Doc의 경우 메뉴의 테스트코드 포함
2010/10/29 12:59 2010/10/29 12:59

Boost

Posted at 2010/04/25 21:14 // in Note/ETC // by drDorothy

Boost를 설치하려면 먼저 다운부터 받아야죠. [http://www.boost.org/]

무엇을 받아야 할까요? Boost 자체가 필요하고 빌드를 위한 Boost Jam입니다.

아무튼 두 개 다 받은 다음, 압축을 푸시고 Boost Jam안에 가보세요.

build.bat 라는 파일이 있답니다.

더블클릭해서 실행 하시면 뭔가 작업을 수행한 다음 끝날꺼에요.

다시 Jam 폴더를 보면 bin.ntx86 이라는 새로운 폴더가 만들어 지고, 그 안에 보면 bjam.exe 이 있을 거에요.

이제 bjam.exe을 복사하셔서 위에서 받은 Boost 폴더에 넣어 주세요.

이것으로 컴파일 할 준비는 끝입니다.

(취향에 따라 ICU나 Python을 깔아 두면, 해당 라이브러리도 함께 컴파일 된답니다.)

이제 cmd창을 띄우고 압축을 풀어둔 Boost 폴더로 이동하세요.

그리고 아래와 비슷하게 취향껏 입력 해 줍니다.

bjam --build-dir="C:\Library\boost_1_42_0" -sICU_PATH="C:\Library\icu" --without-mpi --build-type=complete stage --toolset=msvc

sICU_PATH는 정규식 라이브러리의 유니코드 사용 시 추가적으로 필요한 라이브러리입니다.

이렇게 입력하시고 실행을 시키면, 몇 시간 동안 컴파일이 진행됩니다....

resize_image

컴파일이 완료되면 C:\boost_1_42_0 를 인클루드 패스에 등록하시고, C:\boost_1_42_0\stage\lib 를 라이브러리 패스에 등록하면 끝!!

p.s. 가끔은 ICU를 뺀 버젼도 필요하니까..
bjam toolset=msvc-9.0 variant=release threading=multi link=static define=_SECURE_SCL=0 define=_HAS_ITERATOR_DEBUGGING=0
bjam toolset=msvc-9.0 variant=debug threading=multi link=static

2010/04/25 21:14 2010/04/25 21:14

파랜드 택틱스1 마법 구조

Posted at 2010/01/26 02:32 // in Note/Farland Tactics // by drDorothy

    4 #pragma pack(1)

    5 struct magic

    6 {

    7     char name[20];

    8     short level; // 습득레벨

    9     short mp; // 요구 mp

   10 

   11     // 속성 (음수는 반대속성)

   12     short fire;

   13     short wind;

   14     short light;

   15 

   16     short min_range; // 최소 마법 범위 (이 범위 이상부터 적용)

   17     short max_range; // 최대 마법 범위

   18     char Ename[12];

   19     short sound;

   20     short target; // 0:적, 1:아군, 2:전체

   21     short range; // 0: 한칸, 1: 일반, 2:직선1, 3:중심, 4:전체, 5:직선2

   22     short spell_user; // 비트 조합방식 (마법 습득자 설정)

   23     // 0   - 아이템 & 기본속성

   24     // 1   - 레온

   25     // 2   - 랄프

   26     // 4   - 카린

   27     // 8   - 브라이언

   28     // 16  - 마시아

   29     // 32  - 팜

   30     // 64  - 리안

   31     // 128 - 오필리아

   32     // 256 - T.T

   33     // 512 - 적

   34 };

   35 #pragma pack()


※ 주의 : 케릭터당 최대 마법 개수는 10개
2010/01/26 02:32 2010/01/26 02:32