파랜드 택틱스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

Code Lab 개편중

Posted at 2011/01/11 01:51 // in Old Data (자료 정리중) // by drDorothy
일관성이 없어서 모든 글을 수정 중.

카테고리, 글 내용, 저질 게시물 삭제 등 예정.
2011/01/11 01:51 2011/01/11 01:51

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

홍대 성적 분석 프로그램

Posted at 2010/10/25 13:24 // in Release // by drDorothy
resize_image

[메뉴] 누르면 Classnet 로그인 화면이 있음.

주 용도는 전공학점 계산이나 다음학기 성적 예측.

학생이라면 누구나 가지고 있는 Excel로 된 자기 성적 관리 파일 대용.


2010/10/25 13:24 2010/10/25 13:24