#ifndef GGAFDXCORE_GGAFDXSTRINGSPRITEACTOR_H_
#define GGAFDXCORE_GGAFDXSTRINGSPRITEACTOR_H_
#include "jp/ggaf/dxcore/actor/GgafDxSpriteSetActor.h"

namespace GgafDxCore {

/**
 * 暥帤昞帵僋儔僗 .
 * GgafDxSpriteSetActor 傪宲彸偟丄暥帤僙僢僩僥僋僗僠儍乕偐傜
 * 暥帤昞帵婡擻傪捛壛偟偨傾僋僞乕偱偡丅<BR>
 * 師偺傛偆側僥僋僗僠儍偱偁傞偙偲偑慜採丅乮仸幚嵺偺夋憸偼宺慄柍偟偱偡乯<BR>
 * <code><pre>
 * 劇劅劍劅劍劅劍劅劍劅劍劅劍劅劍劅劉
 * 劆丂劆両劆乭劆仈劆亹劆亾劆仌劆乫劆
 * 劌劅劑劅劑劅劑劅劑劅劑劅劑劅劑劅劎
 * 劆乮劆乯劆仏劆亄劆丆劆亅劆丏劆乛劆
 * 劌劅劑劅劑劅劑劅劑劅劑劅劑劅劑劅劎
 * 劆侽劆侾劆俀劆俁劆係劆俆劆俇劆俈劆
 * 劌劅劑劅劑劅劑劅劑劅劑劅劑劅劑劅劎
 * 劆俉劆俋劆丗劆丟劆亙劆亖劆亜劆丠劆
 * 劌劅劑劅劑劅劑劅劑劅劑劅劑劅劑劅劎
 * 劆仐劆俙劆俛劆俠劆俢劆俤劆俥劆俧劆
 * 劌劅劑劅劑劅劑劅劑劅劑劅劑劅劑劅劎
 * 劆俫劆俬劆俰劆俲劆俴劆俵劆俶劆俷劆
 * 劌劅劑劅劑劅劑劅劑劅劑劅劑劅劑劅劎
 * 劆俹劆俻劆俼劆俽劆俿劆倀劆倁劆倂劆
 * 劌劅劑劅劑劅劑劅劑劅劑劅劑劅劑劅劎
 * 劆倃劆倄劆倅劆乵劆乢劆乶劆丱劆丵劆
 * 劋劅劏劅劏劅劏劅劏劅劏劅劏劅劏劅劊
 * </pre></code>
 * 暥帤昞帵偲尵偭偰傕UV傪愗傝懼偊偰楢懕昞帵傞偩偗丅
 * TODO:GgafDxStringBoardActor偲嫟捠壔偟偨偄丒丒丒
 * @version 1.00
 * @since 2009/04/09
 * @author Masatoshi Tsuge
 */
class GgafDxStringSpriteActor : public GgafDxSpriteSetActor {

public:
    /** [r/w]僷僞乕儞斣崋0偲偡傞暥帤 */
    int _chr_ptn_zero;
    /** [r]昤夋暥帤楍 */
    int* _draw_string;
    /** [r]暥帤僶僢僼傽(256屌掕) */
    int* _buf;
    /** [r]暥帤楍挿 */
    int _len;
    /** [r/w]儀乕僗偺侾暥帤暆(px) */
    pixcoord _chr_width_px;
    /** [r/w]儀乕僗偺侾暥帤崅偝(px) */
    pixcoord _chr_height_px;
    /** [r/w]奺暥帤娫妘(px) */
    pixcoord _aWidthPx[256];
    /** [r]暥帤僶僢僼傽偺峴扨埵偺暆(px) */
    pixcoord _aWidth_line_px[256];
    /** [r]暥帤僶僢僼傽夵峴悢 */
    int _nn;

public:
    /**
     * 僐儞僗僩儔僋僞 .
     * @param prm_name
     * @param prm_model 暥帤僙僢僩僥僋僗僠儍偺儌僨儖掕媊ID
     * @return
     */
    GgafDxStringSpriteActor(const char* prm_name, const char* prm_model, GgafCore::GgafStatus* prm_pStat);

    virtual void onCreateModel() override;

    virtual void processDraw() override;

    virtual bool processHitChkLogic(GgafCore::GgafActor* prm_pOtherActor) {
        return false;
    }

    virtual void onHit(GgafCore::GgafActor* prm_pOtherActor) {
    }
    /**
     * 昤夋暥帤傪峏怴愝掕 .
     * @param X X嵗昗
     * @param Y Y嵗昗
     * @param prm_str 昤夋暥帤楍
     */
    virtual void update(coord X, coord Y, const char* prm_str);
    /**
     * 昤夋暥帤傪峏怴愝掕  .
     * @param X X嵗昗
     * @param Y Y嵗昗
     * @param prm_str 昤夋暥帤楍
     */
    virtual void update(coord X, coord Y, char* prm_str);

    /**
     * 昤夋暥帤傪峏怴愝掕  .
     * @param X X嵗昗
     * @param Y Y嵗昗
     * @param Z Z嵗昗
     * @param prm_str 昤夋暥帤楍
     */
    virtual void update(coord X, coord Y, coord Z, const char* prm_str);
    /**
     * 昤夋暥帤傪峏怴愝掕  .
     * @param X X嵗昗
     * @param Y Y嵗昗
     * @param Z Z嵗昗
     * @param prm_str 昤夋暥帤楍
     */
    virtual void update(coord X, coord Y, coord Z, char* prm_str);
    /**
     * 昤夋暥帤傪峏怴愝掕  .
     * @param prm_str 昤夋暥帤楍
     */
    virtual void update(const char* prm_str);
    /**
     * 昤夋暥帤傪峏怴愝掕  .
     * @param prm_str 昤夋暥帤楍
     */
    virtual void update(char* prm_str);

    /**
     * 昤夋暥帤傪峏怴愝掕 .
     * @param X X嵗昗
     * @param Y Y嵗昗
     * @param prm_str 昤夋暥帤楍
     * @param prm_align ALIGN_LEFT:X嵗昗偼暥帤楍偺嵍抂乛ALIGN_CENTER:X嵗昗偼暥帤楍偺暆偺拞揰乛ALIGN_RIGHT:X嵗昗偼暥帤楍偺塃抂
     * @param prm_valign VALIGN_TOP:Y嵗昗偼暥帤楍偺崅偝偺忋曈乛VALIGN_MIDDLE:Y嵗昗偼暥帤楍偺崅偝偺恀傫拞乛VALIGN_BOTTOM:Y嵗昗偼暥帤楍偺崅偝偺掙曈
     */
    virtual void update(coord X, coord Y, const char* prm_str,
                        GgafDxAlign prm_align,
                        GgafDxValign prm_valign);
    /**
     * 昤夋暥帤傪峏怴愝掕  .
     * @param X X嵗昗
     * @param Y Y嵗昗
     * @param prm_str 昤夋暥帤楍
     * @param prm_align ALIGN_LEFT:X嵗昗偼暥帤楍偺嵍抂乛ALIGN_CENTER:X嵗昗偼暥帤楍偺暆偺拞揰乛ALIGN_RIGHT:X嵗昗偼暥帤楍偺塃抂
     * @param prm_valign VALIGN_TOP:Y嵗昗偼暥帤楍偺崅偝偺忋曈乛VALIGN_MIDDLE:Y嵗昗偼暥帤楍偺崅偝偺恀傫拞乛VALIGN_BOTTOM:Y嵗昗偼暥帤楍偺崅偝偺掙曈
     */
    virtual void update(coord X, coord Y, char* prm_str,
                        GgafDxAlign prm_align,
                        GgafDxValign prm_valign);

    /**
     * 昤夋暥帤傪峏怴愝掕  .
     * @param X X嵗昗
     * @param Y Y嵗昗
     * @param Z Z嵗昗
     * @param prm_str 昤夋暥帤楍
     * @param prm_align ALIGN_LEFT:X嵗昗偼暥帤楍偺嵍抂乛ALIGN_CENTER:X嵗昗偼暥帤楍偺暆偺拞揰乛ALIGN_RIGHT:X嵗昗偼暥帤楍偺塃抂
     * @param prm_valign VALIGN_TOP:Y嵗昗偼暥帤楍偺崅偝偺忋曈乛VALIGN_MIDDLE:Y嵗昗偼暥帤楍偺崅偝偺恀傫拞乛VALIGN_BOTTOM:Y嵗昗偼暥帤楍偺崅偝偺掙曈
     */
    virtual void update(coord X, coord Y, coord Z, const char* prm_str,
                        GgafDxAlign prm_align,
                        GgafDxValign prm_valign);
    /**
     * 昤夋暥帤傪峏怴愝掕  .
     * @param X X嵗昗
     * @param Y Y嵗昗
     * @param Z Z嵗昗
     * @param prm_str 昤夋暥帤楍
     * @param prm_align ALIGN_LEFT:X嵗昗偼暥帤楍偺嵍抂乛ALIGN_CENTER:X嵗昗偼暥帤楍偺暆偺拞揰乛ALIGN_RIGHT:X嵗昗偼暥帤楍偺塃抂
     * @param prm_valign VALIGN_TOP:Y嵗昗偼暥帤楍偺崅偝偺忋曈乛VALIGN_MIDDLE:Y嵗昗偼暥帤楍偺崅偝偺恀傫拞乛VALIGN_BOTTOM:Y嵗昗偼暥帤楍偺崅偝偺掙曈
     */
    virtual void update(coord X, coord Y, coord Z, char* prm_str,
                        GgafDxAlign prm_align,
                        GgafDxValign prm_valign);
    /**
     * 昤夋暥帤傪峏怴愝掕  .
     * @param prm_str 昤夋暥帤楍
     * @param prm_align ALIGN_LEFT:X嵗昗偼暥帤楍偺嵍抂乛ALIGN_CENTER:X嵗昗偼暥帤楍偺暆偺拞揰乛ALIGN_RIGHT:X嵗昗偼暥帤楍偺塃抂
     * @param prm_valign VALIGN_TOP:Y嵗昗偼暥帤楍偺崅偝偺忋曈乛VALIGN_MIDDLE:Y嵗昗偼暥帤楍偺崅偝偺恀傫拞乛VALIGN_BOTTOM:Y嵗昗偼暥帤楍偺崅偝偺掙曈
     */
    virtual void update(const char* prm_str,
                        GgafDxAlign prm_align,
                        GgafDxValign prm_valign);
    /**
     * 昤夋暥帤傪峏怴愝掕  .
     * @param prm_str 昤夋暥帤楍
     * @param prm_align ALIGN_LEFT:X嵗昗偼暥帤楍偺嵍抂乛ALIGN_CENTER:X嵗昗偼暥帤楍偺暆偺拞揰乛ALIGN_RIGHT:X嵗昗偼暥帤楍偺塃抂
     * @param prm_valign VALIGN_TOP:Y嵗昗偼暥帤楍偺崅偝偺忋曈乛VALIGN_MIDDLE:Y嵗昗偼暥帤楍偺崅偝偺恀傫拞乛VALIGN_BOTTOM:Y嵗昗偼暥帤楍偺崅偝偺掙曈
     */
    virtual void update(char* prm_str,
                        GgafDxAlign prm_align,
                        GgafDxValign prm_valign);

    inline void getDrawString(char* out_paCh) {
        int len = _len;
        for (int i = 0; i < len; i++) {
            out_paCh[i] = _draw_string[i];
        }
        out_paCh[len] = '\0';
    }

    virtual ~GgafDxStringSpriteActor();

};

}
#endif /*GGAFDXCORE_GGAFDXSTRINGSPRITEACTOR_H_*/
