Changeset 55:f1a27ee7e03c

Show
Ignore:
Timestamp:
04/22/09 17:01:42 (3 years ago)
Author:
thib
Branch:
default
convert_revision:
svn:d0a2da98-017c-47d2-8c43-22b54484806d/trunk@56
Message:
* started the same changes on scn2k_text.cc
* handle opcodes childObj*. In fact, it was handled (in a strange way, but it worked) before the previous changeset
Location:
scn2k
Files:
4 modified

Legend:

Unmodified
Added
Removed
  • scn2k/command_handler.cc

    r54 r55  
    5454} 
    5555 
     56void CommandHandler::PrintCmd(Cmd& cmd) 
     57{ 
     58        CommandMap::iterator it; 
     59        it = command_map.find(cmd); 
     60 
     61        fprintf(stderr, "%d - %d : ", cmd.scn, cmd.pos); 
     62        if (it == command_map.end()) 
     63                fprintf(stderr, "%02d:%02d:%04d", cmd.cmd1, cmd.cmd2, cmd.cmd3); 
     64        else 
     65                fprintf(stderr, "%s", it->second.descr); 
     66        fprintf(stderr, "[%d] (", cmd.cmd4); 
     67        int i; 
     68        for (i=0; i<cmd.args.size(); i++) { 
     69                VarInfo info = cmd.args[i]; 
     70                if (info.type == TYPE_STR || info.type == TYPE_VARSTR) 
     71                        fprintf(stderr, "\"%s\"", cmd.Str(info)); 
     72                else 
     73                        fprintf(stderr, "%d", info.value); 
     74                if (i < cmd.args.size()-1) 
     75                        fprintf(stderr, ", "); 
     76        } 
     77        fprintf(stderr,");\n"); 
     78} 
     79 
    5680bool CommandHandler::Exec(Cmd &cmd) { 
    5781        CommandMap::iterator it; 
  • scn2k/scn2k.h

    r54 r55  
    226226                void RegisterCommand(int cmd1, int cmd2, int cmd3, const char* descr, CmdImpl func); 
    227227                bool Exec(Cmd& cmd); 
     228                void PrintCmd(Cmd& cmd); 
    228229 
    229230        private: 
  • scn2k/scn2k_grp.cc

    r54 r55  
    5454}; 
    5555 
     56struct GrpObj; 
     57typedef std::map<int, GrpObj> GrpObjMap; 
     58 
    5659struct GrpObj { 
    5760        string name; 
     
    6770        int surface_num; 
    6871 
     72        GrpObjMap children_obj; 
     73 
    6974        string print_moji; 
    7075        int print_size, print_r, print_b, print_g; 
     
    7883        vector<Rect> src_pos; 
    7984        enum GrpType { FILLRECT = 1, FILE = 2, GAN = 3, MOJI = 4, DIGIT = 5} gtype; 
    80         enum Attribute { NONE=0, WIPEON=1, SATURATE=2, HIDDEN=4, HIDDEN_GROUP=8, 
     85        enum Attribute { NONE=0, WIPEON=1, SATURATE=2, HIDDEN=4, 
    8186                UPDATE_PICTURE = 16, UPDATE_POS = 32, UPDATE_ALPHA = 64, UPDATE_SNUM = 128, UPDATE_CLIP = 256, UPDATE_VISIBLE = 512, 
    82                 UPDATE_ALL = (16|32|64|128|256|512), 
     87                UPDATE_ALL = (UPDATE_PICTURE | UPDATE_POS | UPDATE_ALPHA | UPDATE_SNUM | UPDATE_CLIP | UPDATE_VISIBLE), 
    8388                ANM_PLAYSTART = 0x8000, ANM_PLAYING = 0x10000, 
    8489                DIG_ZERO = 0x10000*2, DIG_SIGN = 0x10000*4, DIG_PACK=0x10000*8,DIG_SPACE=0x10000*16 
    8590                }; 
    8691        Attribute attr; 
    87  
    88         GrpImpl* parent_pimpl; 
    8992 
    9093        GrpObj(void); 
     
    106109        void UpdateSurface(void); 
    107110        void ZoomRotate(void); 
     111        void Refresh(GrpObj& parent_obj); 
     112        void _debug_Dump(int, int); 
    108113        void Update(void); 
    109114        void CreateSurface(PicContainer* parent); 
     
    117122*/ 
    118123 
    119  
    120 struct GrpObjMap : std::map<int, GrpObj> { 
    121         typedef pair<const int, GrpObj> value_type; 
    122         class GrpImpl* parent; 
    123         GrpObj& operator[](const int& k) { 
    124                 iterator it = lower_bound(k); 
    125                 if (it == end() || it->first != k) { 
    126                         GrpObj obj; 
    127                         obj.parent_pimpl = parent; 
    128                         it = insert(it, value_type(k, obj)); 
    129                 } 
    130                 return it->second; 
    131         } 
    132         GrpObjMap(class GrpImpl* p) { 
    133                 parent = p; 
    134         } 
    135 }; 
    136  
    137124class GrpImpl : public CommandHandler { 
    138125#define MAXPDT 256 
     
    140127        private: 
    141128                void CreateObj(int number); 
     129                void CreateSubObj(int grp_num, int number); 
    142130                void ZMoveObj(int number); 
    143131                void SetObjChanged(int number); 
    144132                void SwapObj(int a1, int a2); 
    145133                void DeleteObjPic(int num);// object €Î surface €Î€ßºïœü 
     134                void DeleteSubObjPic(int grp_num, int num); 
    146135                void DeleteObj(int num); 
     136                void DeleteSubObj(int grp_num, int num); 
    147137                void RefreshObj(void); 
    148138 
     
    175165                void AbortAnm(void); 
    176166                static bool Pressed(int x, int y, void* pointer); 
     167 
     168                GrpObj* GetGraphicObj(int grp, bool fg=true); 
     169                GrpObj* GetGraphicObj(int grp, int index, bool fg=true); 
     170                GrpObj* GetGraphicObjVarMode(Cmd& cmd, int &base_arg, bool fg=true); 
    177171 
    178172                // Opcode handling 
     
    264258        alpha(255), order(0), surface_num(0), print_moji(""), print_size(0), print_r(-1),print_g(-1),print_b(-1), 
    265259        dig_number(0), dig_digit(0), 
    266         zoom(-1), rotate(-1), attr(GrpObj::HIDDEN), parent_pimpl(NULL) { 
     260        zoom(-1), rotate(-1), attr(GrpObj::HIDDEN) { 
    267261        int i; 
    268262        for (i=0; i<9; i++) { 
     
    272266 
    273267GrpObj::~GrpObj() { 
    274         if (picture) delete picture; 
    275         if (parent_pimpl == NULL) { 
    276                 fprintf(stderr,"\n**************\nFATAL : UNINITIALIZED GrpObj IS FOUND!!! \n**************\n"); 
    277         } 
     268        if (picture != NULL) delete picture; 
    278269} 
    279270 
     
    312303        x = posx[index]; 
    313304        y = posy[index]; 
    314         return; 
    315305} 
    316306 
     
    328318        } 
    329319        attr = Attribute(attr | UPDATE_SNUM); 
    330         return; 
    331320} 
    332321 
     
    336325        clip_area = new_clip; 
    337326        attr = Attribute(attr | UPDATE_CLIP); 
    338         return; 
    339327} 
    340328 
    341329PicBase* GrpObj::DeletePic(void) { 
    342330        PicBase* p = picture; 
    343         anm = 0; 
    344         picture = 0; 
     331        anm = NULL; 
     332        picture = NULL; 
    345333        src_pos.clear(); 
    346         attr = Attribute(attr & (HIDDEN | HIDDEN_GROUP)); 
     334        attr = Attribute(attr & HIDDEN); 
    347335        return p; 
    348336} 
     
    387375        width = src_pos[sn].width(); 
    388376        height = src_pos[sn].height(); 
    389         return; 
    390377} 
    391378 
     
    395382                attr = Attribute( (attr | UPDATE_ALL) & (~UPDATE_PICTURE)); 
    396383        } 
    397         if (picture == 0) return; 
     384        if (picture == NULL) return; 
    398385        if (attr & UPDATE_POS) { 
    399386                if ( (attr & SATURATE) || zoom != -1) { 
     
    710697        attr = Attribute(attr | UPDATE_PICTURE); 
    711698} 
     699 
     700void GrpObj::Refresh(GrpObj& parent_obj) { 
     701        //if (&parent_obj != this) printf("Toto\n"); //FIXME 
     702 
     703        GrpObjMap::iterator it; 
     704 
     705        for (it = children_obj.begin(); it != children_obj.end(); it++) 
     706                it->second.Refresh(parent_obj); 
     707 
     708        if (picture == NULL) return; 
     709        if (alpha == 0 || (attr & GrpObj::HIDDEN) || (parent_obj.attr & GrpObj::HIDDEN)) { 
     710                if (attr & GrpObj::ANM_PLAYING) { 
     711                        attr = GrpObj::Attribute(attr & ~(GrpObj::ANM_PLAYING)); 
     712                        if (anm != NULL) anm->Abort(); 
     713                } 
     714                picture->hide(); 
     715        } else { 
     716                Update(); 
     717                picture->show(); 
     718        } 
     719} 
     720 
     721void GrpObj::_debug_Dump(int id, int indent) 
     722{ 
     723        const char* repr; 
     724 
     725        if (indent == 0) 
     726                repr = "obj %04d(%p): name %10s  pos %d,%d alpha %d (%d/%d/%d)\n"; 
     727        else 
     728                repr = "  * obj %04d(%p): name %10s  pos %d,%d alpha %d (%d/%d/%d)\n"; 
     729 
     730        if (picture != NULL) { 
     731                if (!name.empty()) 
     732                        fprintf(stderr, repr, 
     733                                id, this, name.c_str(), PosX(), PosY(), alpha, attr&GrpObj::HIDDEN ? 1 : 0, 0, 
     734                                picture->IsHidden()); 
     735                else if (!print_moji.empty()) 
     736                        fprintf(stderr, repr, 
     737                                id, this, print_moji.c_str(), PosX(), PosY(), alpha, attr&GrpObj::HIDDEN ? 1 : 0, 
     738                                0, picture->IsHidden()); 
     739                else 
     740                        fprintf(stderr, repr, 
     741                                id, this, "<EMPTY>", PosX(), PosY(), alpha, attr&GrpObj::HIDDEN ? 1 : 0, 0, 
     742                                picture->IsHidden()); 
     743        } 
     744 
     745        GrpObjMap::iterator it; 
     746        for (it = children_obj.begin(); it != children_obj.end(); it++) 
     747                it->second._debug_Dump(it->first, indent+1); 
     748} 
     749 
    712750/****************************************************************** 
    713751** 
     
    800838        status(NORMAL), 
    801839        skip_mode(SKIP_NO), 
    802         cgm_data(_cgm_data), 
    803         grpobj(this), 
    804         bs_obj(this) 
     840        cgm_data(_cgm_data) 
    805841{ 
    806842        int i; 
     
    835871        RegisterCommand(1, 33, 1201, "recFill", (CmdImpl) &GrpImpl::impl_recFill); 
    836872        RegisterCommand(1, 33, 1100, "recCopy", (CmdImpl) &GrpImpl::impl_recCopy); 
     873        RegisterCommand(1, 33, 1101, "recMaskCopy", NULL); //FIXME 
    837874        RegisterCommand(1, 33, 1600, "recAdd", (CmdImpl) &GrpImpl::impl_recAdd); 
    838875        RegisterCommand(1, 33, 406, "grpPan", (CmdImpl) &GrpImpl::impl_grpPan); 
     
    861898        RegisterCommand(1, 71, 1300, "createObjWeaver", (CmdImpl) &GrpImpl::impl_createObj); 
    862899        RegisterCommand(1, 71, 1400, "createObjDigit", (CmdImpl) &GrpImpl::impl_createObj); 
     900 
     901        RegisterCommand(2, 71, 1000, "createSubObjG00", (CmdImpl) &GrpImpl::impl_createObj); 
     902        RegisterCommand(2, 71, 1003, "createSubObjGAN", (CmdImpl) &GrpImpl::impl_createObj); 
     903        RegisterCommand(2, 71, 1100, "createSubObjRect", (CmdImpl) &GrpImpl::impl_createObj); 
     904        RegisterCommand(2, 71, 1200, "createSubObjText", (CmdImpl) &GrpImpl::impl_createObj); 
     905        RegisterCommand(2, 71, 1300, "createSubObjWeaver", (CmdImpl) &GrpImpl::impl_createObj); 
     906        RegisterCommand(2, 71, 1400, "createSubObjDigit", (CmdImpl) &GrpImpl::impl_createObj); 
    863907 
    864908        //I suppose it's the same thing as createObj*, but I didn't see it in action. For now, mark it unhandled. 
     
    869913        RegisterCommand(1, 72, 1300, "createBgObjWeaver", (CmdImpl) &GrpImpl::impl_createObj); 
    870914        RegisterCommand(1, 72, 1400, "createBgObjDigit", (CmdImpl) &GrpImpl::impl_createObj); 
     915 
     916        RegisterCommand(2, 72, 1000, "createBgSubObjG00", NULL);//FIXME 
     917        RegisterCommand(2, 72, 1003, "createBgSubObjGAN", NULL);//FIXME 
     918        RegisterCommand(2, 72, 1100, "createBgSubObjRect", NULL);//FIXME 
     919        RegisterCommand(2, 72, 1200, "createBgSubObjText", NULL);//FIXME 
     920        RegisterCommand(2, 72, 1300, "createBgSubObjWeaver", NULL);//FIXME 
     921        RegisterCommand(2, 72, 1400, "createBgSubObjDigit", NULL);//FIXME 
     922 
    871923 
    872924        RegisterCommand(1, 73, 0, "ganStop?", NULL); //That's what xclannad says, but I'm not sure... 
     
    881933        RegisterCommand(1, 73, 3005, "ganPlayOnce2", (CmdImpl) &GrpImpl::impl_gan); 
    882934 
     935        RegisterCommand(2, 73, 0, "ganSubStop?", NULL); //FIXME 
     936        RegisterCommand(2, 73, 1000, "ganSubStop", NULL); //FIXME 
     937        RegisterCommand(2, 73, 3, "ganSubIsPlaying", NULL); //FIXME 
     938        RegisterCommand(2, 73, 2003, "objSubPlay", NULL); //FIXME 
     939        RegisterCommand(2, 73, 1001, "ganSubLoop", NULL); //FIXME 
     940        RegisterCommand(2, 73, 1003, "ganSubPlay", NULL); //FIXME 
     941        RegisterCommand(2, 73, 1005, "ganSubPlayOnce", NULL); //FIXME 
     942        RegisterCommand(2, 73, 3001, "ganSubLoop2", (CmdImpl) &GrpImpl::impl_gan); //FIXME 
     943        RegisterCommand(2, 73, 3003, "ganSubPlay2", NULL); //FIXME 
     944        RegisterCommand(2, 73, 3005, "ganSubPlayOnce2", NULL); //FIXME 
     945 
     946 
    883947        RegisterCommand(1, 81, 1000, "objMove", (CmdImpl) &GrpImpl::impl_objSetPos); 
    884948        RegisterCommand(1, 82, 1000, "objBgMove", (CmdImpl) &GrpImpl::impl_objSetPos); 
     
    887951        RegisterCommand(1, 81, 1002, "objTop", (CmdImpl) &GrpImpl::impl_objSetPos); 
    888952        RegisterCommand(1, 82, 1002, "objBgTop", (CmdImpl) &GrpImpl::impl_objSetPos); 
    889  
    890953        RegisterCommand(1, 81, 1003, "objAlpha", (CmdImpl) &GrpImpl::impl_objAlpha); 
    891954        RegisterCommand(1, 82, 1003, "objBgAlpha", (CmdImpl) &GrpImpl::impl_objAlpha); 
    892955        RegisterCommand(1, 81, 1004, "objShow", (CmdImpl) &GrpImpl::impl_objShow); 
    893956        RegisterCommand(1, 82, 1004, "objBgShow", (CmdImpl) &GrpImpl::impl_objShow); 
    894  
    895957        RegisterCommand(1, 81, 1005, "objDispArea", NULL); 
    896958        RegisterCommand(1, 82, 1005, "objBgDispArea", NULL); 
     
    913975        RegisterCommand(1, 81, 1020, "objColLevel", NULL); 
    914976        RegisterCommand(1, 82, 1020, "objBgColLevel", NULL); 
    915         RegisterCommand(1, 81, 1021, "objComposite", (CmdImpl) &GrpImpl::impl_objComposite); //FIXME: May be broken 
     977        RegisterCommand(1, 81, 1021, "objComposite", NULL);//(CmdImpl) &GrpImpl::impl_objComposite); //FIXME: May be broken 
    916978        RegisterCommand(1, 82, 1021, "objBgComposite", (CmdImpl) &GrpImpl::impl_objComposite); 
    917979        RegisterCommand(1, 81, 1024, "objSetText", (CmdImpl) &GrpImpl::impl_objSetText); 
     
    936998        RegisterCommand(1, 82, 1049, "objBgRotate", (CmdImpl) &GrpImpl::impl_objRotate); 
    937999 
     1000        RegisterCommand(2, 81, 1000, "childObjMove", (CmdImpl) &GrpImpl::impl_objSetPos); 
     1001        RegisterCommand(2, 82, 1000, "childObjBgMove", (CmdImpl) &GrpImpl::impl_objSetPos); 
     1002        RegisterCommand(2, 81, 1001, "childObjLeft", NULL); 
     1003        RegisterCommand(2, 82, 1001, "childObjBgLeft", NULL); 
     1004        RegisterCommand(2, 81, 1002, "childObjTop", NULL); 
     1005        RegisterCommand(2, 82, 1002, "childObjBgTop", NULL); 
     1006        RegisterCommand(2, 81, 1003, "childObjAlpha", (CmdImpl) &GrpImpl::impl_objAlpha); 
     1007        RegisterCommand(2, 82, 1003, "childObjBgAlpha", (CmdImpl) &GrpImpl::impl_objAlpha); 
     1008        RegisterCommand(2, 81, 1004, "childObjShow", (CmdImpl) &GrpImpl::impl_objShow); 
     1009        RegisterCommand(2, 82, 1004, "childObjBgShow", (CmdImpl) &GrpImpl::impl_objShow); 
     1010        RegisterCommand(2, 81, 1005, "childObjDispArea", NULL); 
     1011        RegisterCommand(2, 82, 1005, "childObjBgDispArea", NULL); 
     1012        RegisterCommand(2, 81, 1006, "childObjAdjust", (CmdImpl) &GrpImpl::impl_objSetPos); 
     1013        RegisterCommand(2, 82, 1006, "childObjBgAdjust", (CmdImpl) &GrpImpl::impl_objSetPos); 
     1014        RegisterCommand(2, 81, 1007, "childObjAdjustX", NULL); 
     1015        RegisterCommand(2, 82, 1007, "childObjBgAdjustX", NULL); 
     1016        RegisterCommand(2, 81, 1008, "childObjAdjustY", NULL); 
     1017        RegisterCommand(2, 82, 1008, "childObjBgAdjustY", NULL); 
     1018        RegisterCommand(2, 81, 2006, "childObjAdjust2?", NULL); 
     1019        RegisterCommand(2, 82, 2006, "childObjBgAdjust2?", NULL); 
     1020        RegisterCommand(2, 81, 1016, "childObjColour", NULL); 
     1021        RegisterCommand(2, 82, 1016, "childObjBgColour", NULL); 
     1022        RegisterCommand(2, 81, 1017, "childObjColR", NULL); 
     1023        RegisterCommand(2, 82, 1017, "childObjBgColR", NULL); 
     1024        RegisterCommand(2, 81, 1018, "childObjColG", NULL); 
     1025        RegisterCommand(2, 82, 1018, "childObjBgColG", NULL); 
     1026        RegisterCommand(2, 81, 1019, "childObjColB", NULL); 
     1027        RegisterCommand(2, 82, 1019, "childObjBgColB", NULL); 
     1028        RegisterCommand(2, 81, 1020, "childObjColLevel", NULL); 
     1029        RegisterCommand(2, 82, 1020, "childObjBgColLevel", NULL); 
     1030        RegisterCommand(2, 81, 1021, "childObjComposite", NULL); 
     1031        RegisterCommand(2, 82, 1021, "childObjBgComposite", NULL); 
     1032        RegisterCommand(2, 81, 1024, "childObjSetText", (CmdImpl) &GrpImpl::impl_objSetText); 
     1033        RegisterCommand(2, 82, 1024, "childObjBgSetText", (CmdImpl) &GrpImpl::impl_objSetText); 
     1034        RegisterCommand(2, 81, 1025, "childObjTextOpts", (CmdImpl) &GrpImpl::impl_objTextOpts); 
     1035        RegisterCommand(2, 82, 1025, "childObjBgTextOpts", (CmdImpl) &GrpImpl::impl_objTextOpts); 
     1036        RegisterCommand(2, 81, 1032, "childObjOrder", NULL); 
     1037        RegisterCommand(2, 82, 1032, "childObjBgOrder", NULL); 
     1038        RegisterCommand(2, 81, 1034, "childObjDispRect", NULL); 
     1039        RegisterCommand(2, 82, 1034, "childObjBgDispRect", NULL); 
     1040        RegisterCommand(2, 81, 1037, "childObjSetDigits", (CmdImpl) &GrpImpl::impl_objSetDigits); 
     1041        RegisterCommand(2, 82, 1037, "childObjBgSetDigits", (CmdImpl) &GrpImpl::impl_objSetDigits); 
     1042        RegisterCommand(2, 81, 1038, "childObjNumOpts", (CmdImpl) &GrpImpl::impl_objNumOpts); 
     1043        RegisterCommand(2, 82, 1038, "childObjBgNumOpts", (CmdImpl) &GrpImpl::impl_objNumOpts); 
     1044        RegisterCommand(2, 81, 1039, "childObjPattNo", (CmdImpl) &GrpImpl::impl_objPattNo); 
     1045        RegisterCommand(2, 82, 1039, "childObjBgPattNo", (CmdImpl) &GrpImpl::impl_objPattNo); 
     1046        RegisterCommand(2, 81, 1046, "childObjScale", (CmdImpl) &GrpImpl::impl_objScale); 
     1047        RegisterCommand(2, 82, 1046, "childObjBgScale", (CmdImpl) &GrpImpl::impl_objScale); 
     1048        RegisterCommand(2, 81, 1047, "childObjWidth", NULL); 
     1049        RegisterCommand(2, 82, 1047, "childObjBgWidth", NULL); 
     1050        RegisterCommand(2, 81, 1049, "childObjRotate", NULL); 
     1051        RegisterCommand(2, 82, 1049, "childObjBgRotate", NULL); 
     1052 
    9381053        RegisterCommand(1, 84, 1000, "objGetPos", (CmdImpl) &GrpImpl::impl_objPosDims); 
    9391054        RegisterCommand(1, 84, 1100, "objGetDims", (CmdImpl) &GrpImpl::impl_objPosDims); 
     1055 
     1056        RegisterCommand(2, 84, 1000, "childObjGetPos", (CmdImpl) &GrpImpl::impl_objPosDims); 
     1057        RegisterCommand(2, 84, 1100, "childObjGetDims", (CmdImpl) &GrpImpl::impl_objPosDims); 
    9401058 
    9411059        RegisterCommand(1, 31, 0, "refresh", (CmdImpl) &GrpImpl::impl_refresh); 
     
    9791097        RegisterCommand(1, 62, 14, "objSwap?", NULL); 
    9801098 
     1099        RegisterCommand(1, 4, 1211, "EnableSyscom", NULL); 
     1100        RegisterCommand(1, 4, 1212, "HideSyscom", NULL); 
     1101        RegisterCommand(1, 4, 1213, "DisableSyscom", NULL); 
     1102 
    9811103        anm1 = NULL; 
    9821104        anm2 = NULL; 
     
    10161138        } 
    10171139        return dsurface[pdt]; 
     1140} 
     1141 
     1142GrpObj* GrpImpl::GetGraphicObj(int grp, bool fg) { 
     1143        if (fg) 
     1144                return &grpobj[grp]; 
     1145        else 
     1146                return &bs_obj[grp]; 
     1147} 
     1148 
     1149GrpObj* GrpImpl::GetGraphicObj(int grp, int index, bool fg) { 
     1150        GrpObj* g = GetGraphicObj(grp, fg); 
     1151        return &g->children_obj[index]; 
     1152} 
     1153 
     1154GrpObj* GrpImpl::GetGraphicObjVarMode(Cmd& cmd, int &base_arg, bool fg) { 
     1155        GrpObj* g; 
     1156        if (cmd.cmd1 == 2) { 
     1157                g = GetGraphicObj(cmd.args[base_arg].value, cmd.args[base_arg+1].value, fg); 
     1158                base_arg += 1; 
     1159        } 
     1160        else 
     1161                g = GetGraphicObj(cmd.args[base_arg].value, fg); 
     1162        return g; 
    10181163} 
    10191164 
     
    11091254                        if (grpobj.find(*it) == grpobj.end()) continue; 
    11101255                        GrpObj& obj = grpobj[*it]; 
    1111                         if (obj.picture == NULL) continue; 
    1112                         if (obj.alpha == 0 || (obj.attr & GrpObj::HIDDEN)) { 
    1113                                 if (obj.attr & GrpObj::ANM_PLAYING) { 
    1114                                         obj.attr = GrpObj::Attribute(obj.attr & ~(GrpObj::ANM_PLAYING)); 
    1115                                         if (obj.anm) obj.anm->Abort(); 
    1116                                 } 
    1117                                 obj.picture->hide(); 
    1118                         } else { 
    1119                                 obj.Update(); 
    1120                                 obj.picture->show(); 
    1121                         } 
     1256                        obj.Refresh(obj); 
    11221257                } 
    11231258                changed_obj.clear(); 
     
    11881323                grpobj[it->first] = it->second; 
    11891324                it->second.DeletePic(); 
    1190                 CreateObj(it->first); 
     1325                CreateObj(it->first);//FIXME: Adapt to groups 
    11911326                GrpObj& g = grpobj[it->first]; 
    11921327                if (g.picture) { 
     
    12881423 
    12891424void GrpImpl::CreateObj(int index) { 
    1290         std::map<int, GrpObj>::iterator cur = grpobj.find(index); 
     1425        GrpObjMap::iterator cur = grpobj.find(index); 
    12911426        if (cur == grpobj.end()) return; 
    12921427        GrpObj& g = grpobj[index]; 
     
    12991434} 
    13001435 
     1436void GrpImpl::CreateSubObj(int grp_index, int index) { 
     1437        GrpObjMap::iterator cur = grpobj.find(grp_index); 
     1438        if (cur == grpobj.end()) return; 
     1439        GrpObj* g = &grpobj[grp_index]; 
     1440        cur = g->children_obj.find(index); 
     1441        if (cur == g->children_obj.end()) return; 
     1442        g = &g->children_obj[index]; 
     1443        g->CreateSurface(&parent); 
     1444        g->order = index; 
     1445        if (g->picture == NULL) return; // ¥š¥é¡Œ¡§surface €¬Âžºß€·€Ê€€ 
     1446        g->picture->hide(); 
     1447        //TODO 
     1448        SetObjChanged(grp_index); 
     1449        /*ZMoveObj(index);*/ 
     1450} 
     1451 
    13011452void GrpImpl::ZMoveObj(int index) { 
    1302         std::map<int, GrpObj>::iterator cur = grpobj.find(index); 
     1453        GrpObjMap::iterator cur = grpobj.find(index); 
    13031454        if (cur == grpobj.end()) return; 
    13041455        GrpObj& g = grpobj[index]; 
     
    13061457        // Œ«Ê¬€è€êÁ°€Ë object €¬€¢€ì€Ð¡¢€œ€ÎÁ°€ËÉœŒš 
    13071458        // €œ€Š€Ç€Ê€±€ì€Ð screen €ÎÁ°€ËÉœŒš 
    1308         std::map<int, GrpObj>::iterator cur_backobj = grpobj.end(); 
    1309         std::map<int, GrpObj>::iterator it; 
     1459        GrpObjMap::iterator cur_backobj = grpobj.end(); 
     1460        GrpObjMap::iterator it; 
    13101461        for (it = grpobj.begin(); it != grpobj.end(); it++) { 
    13111462                if (it == cur) continue; 
     
    15271678        if (grpdump_req) { 
    15281679                grpdump_req = 0; 
    1529                 std::map<int,GrpObj>::iterator it; 
     1680                GrpObjMap::iterator it; 
    15301681                fprintf(stderr,"front %p(%d) / %p(%d)\n",screen,screen->IsHidden(),screen_front,screen_front->IsHidden()); 
    15311682                for (it=grpobj.begin(); it != grpobj.end(); it++) { 
    15321683                        GrpObj& obj = it->second; 
    1533                         if (obj.picture) { 
    1534                                 if (!obj.name.empty()) { 
    1535                                         fprintf(stderr,"obj %06d(%p): name %10s  pos %d,%d alpha %d (%d/%d/%d)\n", 
    1536                                         it->first,obj.picture,obj.name.c_str(), 
    1537                                         obj.PosX(),obj.PosY(),obj.alpha,obj.attr&GrpObj::HIDDEN ? 1 : 0, 0, obj.picture->IsHidden()); 
    1538                                 } else if (!obj.print_moji.empty()) { 
    1539                                         fprintf(stderr,"obj %06d(%p): name %10s  pos %d,%d alpha %d (%d/%d/%d)\n", 
    1540                                         it->first,obj.picture,obj.print_moji.c_str(), 
    1541                                         obj.PosX(),obj.PosY(),obj.alpha,obj.attr&GrpObj::HIDDEN ? 1 : 0, 0, obj.picture->IsHidden()); 
    1542                                 } else { 
    1543                                         fprintf(stderr,"obj %06d(%p): name %10s  pos %d,%d alpha %d (%d/%d/%d)\n", 
    1544                                         it->first,obj.picture,"<EMPTY>", 
    1545                                         obj.PosX(),obj.PosY(),obj.alpha,obj.attr&GrpObj::HIDDEN ? 1 : 0, 0, obj.picture->IsHidden()); 
    1546                                 } 
    1547                         } 
     1684                        obj._debug_Dump(it->first, 0); 
    15481685                } 
    15491686                std::list<PicBase*>::iterator it2; 
     
    16201757} 
    16211758 
     1759void GrpImpl::DeleteSubObjPic(int num_grp, int num) { 
     1760        if (grpobj.find(num_grp) == grpobj.end()) return; 
     1761        if (grpobj[num_grp].children_obj.find(num) == grpobj[num_grp].children_obj.end()) return; 
     1762        deleted_pic.push_back(grpobj[num_grp].children_obj[num].DeletePic()); 
     1763} 
     1764 
    16221765void GrpImpl::DeleteObj(int num) { 
    16231766        if (grpobj.find(num) == grpobj.end()) return; 
    16241767        deleted_pic.push_back(grpobj[num].DeletePic()); 
     1768        GrpObjMap::iterator it; 
     1769        for (it = grpobj[num].children_obj.begin(); it != grpobj[num].children_obj.end(); it++) { 
     1770                deleted_pic.push_back(it->second.DeletePic()); 
     1771        } 
    16251772        grpobj.erase(num); 
     1773} 
     1774 
     1775void GrpImpl::DeleteSubObj(int num_grp, int num) { 
     1776        if (grpobj.find(num_grp) == grpobj.end()) return; 
     1777        if (grpobj[num_grp].children_obj.find(num) == grpobj[num_grp].children_obj.end()) return; 
     1778        deleted_pic.push_back(grpobj[num_grp].children_obj[num].DeletePic()); 
     1779        grpobj[num_grp].children_obj.erase(num); 
    16261780} 
    16271781 
     
    19052059 
    19062060void GrpImpl::impl_objClear(Cmd& cmd) { //FIXME: may be broken (doesn't reflect what Haeleth says) 
    1907         DeleteObj(cmd.args[0].value); 
     2061        if (cmd.cmd1 == 1) 
     2062                DeleteObj(cmd.args[0].value); 
     2063        if (cmd.cmd1 == 2) 
     2064                DeleteSubObj(cmd.args[0].value, cmd.args[1].value); 
    19082065        cmd.clear(); 
    19092066} 
     
    19202077        */ 
    19212078        int base_argc = 0; 
    1922         DeleteObjPic(cmd.args[0].value); // µì¥Õ¥¡¥€¥ëÌŸ€Îsurface€òºïœü 
    1923         if (cmd.cmd2 == 71) 
     2079 
     2080        if (cmd.cmd1 == 1) { // 1: group object 
    19242081                DeleteObjPic(cmd.args[0].value); // µì¥Õ¥¡¥€¥ëÌŸ€Îsurface€òºïœü 
    1925  
    1926         GrpObj& g = (cmd.cmd2 == 71) ? grpobj[cmd.args[0].value] : bs_obj[cmd.args[0].value]; 
     2082                if (cmd.cmd2 == 71) 
     2083                        DeleteObjPic(cmd.args[0].value); // µì¥Õ¥¡¥€¥ëÌŸ€Îsurface€òºïœü 
     2084        } 
     2085        else { // 2: single object in group 
     2086                DeleteSubObjPic(cmd.args[0].value, cmd.args[1].value); // µì¥Õ¥¡¥€¥ëÌŸ€Îsurface€òºïœü 
     2087                if (cmd.cmd2 == 71) 
     2088                        DeleteSubObjPic(cmd.args[0].value, cmd.args[1].value); // µì¥Õ¥¡¥€¥ëÌŸ€Îsurface€òºïœü 
     2089        } 
     2090 
     2091        GrpObj* g = (cmd.cmd2 == 71) ? &grpobj[cmd.args[0].value] : &bs_obj[cmd.args[0].value]; 
     2092        if (cmd.cmd1 == 2) // 2: single object in a group 
     2093                g = &g->children_obj[cmd.args[1].value]; 
     2094 
     2095        if (cmd.cmd1 == 2) 
     2096                base_argc = 1; 
    19272097 
    19282098        if (cmd.cmd3 == 1000) { /* ¥Õ¥¡¥€¥ëÌŸÀßÄê */ 
    1929                 g.gtype = GrpObj::FILE; //FIXME: Strange thing in the main menu 
    1930                 string name = cmd.Str(cmd.args[1]); 
     2099                g->gtype = GrpObj::FILE; //FIXME: Strange thing in the main menu; that happens with objComposite 
     2100                string name = cmd.Str(cmd.args[base_argc + 1]); 
    19312101                if (name.find('?') != -1) { 
     2102                        //Maybe it's for shading or something like that? 
     2103                        printf("Warning: the part after the '?' was removed: '%s'\n", name.c_str()); 
    19322104                        name.erase(name.find('?')); // '?' °Ê¹ß€Î°ÕÌ£€¬€ï€«€é€Ê€€ 
    19332105                } 
    1934                 g.name = name; 
     2106                g->name = name; 
    19352107        } else if (cmd.cmd3 == 1003) { /* ¥Õ¥¡¥€¥ëÌŸÀßÄê(GANŽÞ€à) */ 
    1936                 g.gtype = GrpObj::GAN; 
    1937                 if (cmd.Str(cmd.args[1]) == string("???")) 
    1938                         g.name = cmd.Str(cmd.args[2]); 
     2108                g->gtype = GrpObj::GAN; 
     2109                if (cmd.Str(cmd.args[base_argc + 1]) == string("???")) 
     2110                        g->name = cmd.Str(cmd.args[base_argc + 2]); 
    19392111                else 
    1940                         g.name = cmd.Str(cmd.args[1]); 
    1941                 g.gan_name = cmd.Str(cmd.args[2]); 
    1942                         if (cmd.cmd4 >= 1 && cmd.args[3].value == 0) 
    1943                         g.attr =  GrpObj::Attribute(g.attr | GrpObj::HIDDEN); 
     2112                        g->name = cmd.Str(cmd.args[base_argc + 1]); 
     2113                g->gan_name = cmd.Str(cmd.args[base_argc + 2]); 
     2114 
     2115                if (cmd.cmd4 >= 1 && cmd.args[base_argc + 3].value == 0) 
     2116                        g->attr =  GrpObj::Attribute(g->attr | GrpObj::HIDDEN); 
    19442117                else 
    1945                         g.attr =  GrpObj::Attribute(g.attr & ~(GrpObj::HIDDEN)); 
    1946  
    1947                 if (cmd.argc >= 5) 
    1948                         g.SetPos(1, cmd.args[4].value, -cmd.args[5].value); 
    1949  
    1950                 if (g.name.find('?') != -1) { 
    1951                         g.name.erase(g.name.find('?')); 
    1952                         g.gan_name = cmd.Str(cmd.args[2]); 
     2118                        g->attr =  GrpObj::Attribute(g->attr & ~(GrpObj::HIDDEN)); 
     2119 
     2120                if (cmd.argc >= base_argc + 5) 
     2121                        g->SetPos(1, cmd.args[base_argc + 4].value, -cmd.args[base_argc + 5].value); 
     2122 
     2123                if (g->name.find('?') != -1) { 
     2124                        g->name.erase(g->name.find('?')); 
     2125                        g->gan_name = cmd.Str(cmd.args[base_argc + 2]); 
    19532126                } 
    19542127        } else if (cmd.cmd3 == 1200) { // ²èÁü€òÊž»úÎó€È€·€Æ»ØÄê 
    1955                 g.gtype = GrpObj::MOJI; 
    1956                 g.print_moji = cmd.Str(cmd.args[1]); 
    1957                 g.attr = GrpObj::Attribute(g.attr & (~GrpObj::HIDDEN)); // Ÿï€ËÉœŒš€¬¥Ç¥Õ¥©¥ë¥È¡© 
     2128                g->gtype = GrpObj::MOJI; 
     2129                g->print_moji = cmd.Str(cmd.args[base_argc + 1]); 
     2130                g->attr = GrpObj::Attribute(g->attr & (~GrpObj::HIDDEN)); // Ÿï€ËÉœŒš€¬¥Ç¥Õ¥©¥ë¥È¡© 
    19582131                cmd.clear(); 
    19592132        } else if (cmd.cmd3 == 1400) { // ¿ôÃÍ€ò²èÁü€È€·€ÆÉœŒš 
    1960                 g.gtype = GrpObj::DIGIT; 
    1961                 g.name = cmd.Str(cmd.args[1]); 
    1962         } 
     2133                g->gtype = GrpObj::DIGIT; 
     2134                g->name = cmd.Str(cmd.args[base_argc + 1]); 
     2135        } 
     2136 
    19632137        CreateObj(cmd.args[0].value); 
     2138        if (cmd.cmd1 == 2) 
     2139                CreateSubObj(cmd.args[0].value, cmd.args[1].value); 
     2140 
    19642141        if (cmd.cmd3 == 1000 || cmd.cmd3 == 1003 || cmd.cmd3 == 1200 || cmd.cmd3 == 1400) { 
    19652142                // FILE, GAN, MOJI, DIGIT €Ê€é€ÐºÂÉžÅù€ÎÀßÄê€ò¹Ô€Š 
    19662143                if (cmd.cmd4 >= 1) { 
    19672144                        if (cmd.args[2+base_argc].value == 0) { 
    1968                                 if (cmd.cmd1 == 1) 
    1969                                         g.attr = GrpObj::Attribute(g.attr | GrpObj::HIDDEN | GrpObj::HIDDEN_GROUP); 
    1970                                 else 
    1971                                         g.attr = GrpObj::Attribute(g.attr | GrpObj::HIDDEN); 
     2145                                g->attr = GrpObj::Attribute(g->attr | GrpObj::HIDDEN); 
    19722146                        } else { 
    1973                                 if (cmd.cmd1 == 1) 
    1974                                         g.attr = GrpObj::Attribute(g.attr & (~(GrpObj::HIDDEN | GrpObj::HIDDEN_GROUP))); 
    1975                                 else 
    1976                                         g.attr = GrpObj::Attribute(g.attr & (~GrpObj::HIDDEN)); 
     2147                                g->attr = GrpObj::Attribute(g->attr & (~GrpObj::HIDDEN)); 
    19772148                        } 
    1978                         if (cmd.cmd1 == 1) 
    1979                                 SetObjChanged(cmd.args[0].value); 
     2149                        SetObjChanged(cmd.args[0].value); 
    19802150                } 
    19812151                if (cmd.cmd4 >= 2) { // ºÂÉžÅù€âÀßÄê 
    1982                         g.SetPos(0, cmd.args[3+base_argc].value, cmd.args[4+base_argc].value); 
     2152                        g->SetPos(0, cmd.args[3+base_argc].value, cmd.args[4+base_argc].value); 
    19832153                } 
    19842154                if ( (cmd.cmd3 == 1000 || cmd.cmd3 == 1003) && cmd.cmd4 >= 3) { // pattern ÈÖ¹æ€âÀßÄê 
    1985                         g.SetSurfaceNum(cmd.args[5+base_argc].value); 
     2155                        g->SetSurfaceNum(cmd.args[5+base_argc].value); 
    19862156                        base_argc++; // 1000 (FILE) / 1003 (GAN) €ÎŸì¹ç€Î€ß€³€Î¥ª¥×¥·¥ç¥ó€Ïžºß€¹€ë 
    19872157                } 
     
    19932163 
    19942164void GrpImpl::impl_gan(Cmd& cmd) { 
    1995         GrpObj& g = grpobj[cmd.args[0].value]; 
     2165        int base_arg = 0; 
     2166        GrpObj* g = GetGraphicObjVarMode(cmd, base_arg); 
    19962167 
    19972168        if (cmd.cmd3 == 3) { // ganIsPlaying 
    1998                 if (g.anm == NULL || g.anm->IsEnd()) 
     2169                if (g->anm == NULL || g->anm->IsEnd()) 
    19992170                        cmd.SetSysvar(0); 
    20002171                else 
     
    20022173        } 
    20032174        else if (cmd.cmd3 == 1000) { // ganStop 
    2004                 if (g.anm == NULL || g.anm->IsEnd()) 
    2005                         g.SetSurfaceNum(cmd.args[1].value); 
     2175                if (g->anm == NULL || g->anm->IsEnd()) 
     2176                        g->SetSurfaceNum(cmd.args[1].value); 
    20062177                else { 
    2007                         g.anm->Abort(); 
    2008                         g.SetSurfaceNum(cmd.args[1].value); 
     2178                        g->anm->Abort(); 
     2179                        g->SetSurfaceNum(cmd.args[1].value); 
    20092180                } 
    20102181                SetObjChanged(cmd.args[0].value); 
     
    20122183        } 
    20132184        else if (cmd.cmd3 == 2003) { // objPlay 
    2014                 g.CreateGanSpecial(event, 0, cmd.args[1].value); 
     2185                g->CreateGanSpecial(event, 0, cmd.args[1].value); 
    20152186                // g.attr = GrpObj::Attribute(g.attr & (~GrpObj::HIDDEN)); 
    20162187                SetObjChanged(cmd.args[0].value); 
     
    20192190        else if (cmd.cmd3 == 3001 || cmd.cmd3 == 3003 || cmd.cmd3 == 3005 || 
    20202191                         cmd.cmd3 == 1001 || cmd.cmd3 == 1003 || cmd.cmd3 == 1005) { // ganPlay* 
    2021                 g.CreateGan(event, cmd.args[1].value); 
     2192                g->CreateGan(event, cmd.args[1].value); 
    20222193                // g.attr = GrpObj::Attribute(g.attr & (~GrpObj::HIDDEN)); 
    20232194                SetObjChanged(cmd.args[0].value); 
     
    20282199void GrpImpl::impl_objSetPos(Cmd& cmd) { 
    20292200        //obj or objBg 
    2030         GrpObj& g = (cmd.cmd2 == 0x51) ? grpobj[cmd.args[0].value] : bs_obj[cmd.args[0].value]; 
     2201        int base_arg = 0; 
     2202        GrpObj* g = GetGraphicObjVarMode(cmd, base_arg, (cmd.cmd2 == 0x51)); 
    20312203 
    20322204        int index, x, y; 
    20332205        if (cmd.cmd3 == 1006 || cmd.cmd3 == 2006) { //objAdjust 
    2034                 index = cmd.args[1].value + 1; 
    2035                 x = cmd.args[2].value; 
    2036                 y = cmd.args[3].value; 
     2206                index = cmd.args[1+base_arg].value + 1; 
     2207                x = cmd.args[2+base_arg].value; 
     2208                y = cmd.args[3+base_arg].value; 
    20372209        } 
    20382210        else { 
    20392211                index = 0; 
    20402212                if (cmd.cmd3 == 1000) { 
    2041                         x = cmd.args[1].value; 
    2042                         y = cmd.args[2].value; 
     2213                        x = cmd.args[1+base_arg].value; 
     2214                        y = cmd.args[2+base_arg].value; 
    20432215                } 
    20442216                else { 
    2045                         g.GetPos(index, x, y); 
     2217                        g->GetPos(index, x, y); 
    20462218                        if (cmd.cmd3 == 1001) 
    2047                                 x = cmd.args[1].value; 
     2219                                x = cmd.args[1+base_arg].value; 
    20482220                        else 
    2049                                 y = cmd.args[1].value; 
    2050                 } 
    2051         } 
    2052  
    2053         g.SetPos(index, x, y); 
     2221                                y = cmd.args[1+base_arg].value; 
     2222                } 
     2223        } 
     2224 
     2225        g->SetPos(index, x, y); 
    20542226        cmd.clear(); 
    20552227} 
    20562228 
    20572229void GrpImpl::impl_objAlpha(Cmd& cmd) { 
    2058         GrpObj& g = (cmd.cmd2 == 0x51) ? grpobj[cmd.args[0].value] : bs_obj[cmd.args[0].value]; 
    2059         g.SetAlpha(cmd.args[1].value); 
     2230        int base_arg = 0; 
     2231        GrpObj* g = GetGraphicObjVarMode(cmd, base_arg, (cmd.cmd2 == 0x51)); 
     2232 
     2233        g->SetAlpha(cmd.args[base_arg + 1].value); 
    20602234        cmd.clear(); 
    20612235} 
    20622236 
    20632237void GrpImpl::impl_objShow(Cmd& cmd) { 
    2064         GrpObj& g = (cmd.cmd2 == 0x51) ? grpobj[cmd.args[0].value] : bs_obj[cmd.args[0].value]; 
    2065         if (cmd.cmd1 == 1) { 
    2066                 if (cmd.args[1].value) 
    2067                         g.attr = GrpObj::Attribute(g.attr & (~(GrpObj::HIDDEN | GrpObj::HIDDEN_GROUP))); 
    2068                 else 
    2069                         g.attr = GrpObj::Attribute(g.attr | GrpObj::HIDDEN | GrpObj::HIDDEN_GROUP); 
    2070         } else { 
    2071                 if (cmd.args[1].value) 
    2072                         g.attr = GrpObj::Attribute(g.attr & (~GrpObj::HIDDEN)); 
    2073                 else 
    2074                         g.attr = GrpObj::Attribute(g.attr | GrpObj::HIDDEN); 
    2075         } 
    2076         g.attr = GrpObj::Attribute(g.attr | GrpObj::UPDATE_VISIBLE); 
     2238        int base_arg = 0; 
     2239        GrpObj* g = GetGraphicObjVarMode(cmd, base_arg, (cmd.cmd2 == 0x51)); 
     2240 
     2241        if (cmd.args[base_arg + 1].value) 
     2242                g->attr = GrpObj::Attribute(g->attr & (~GrpObj::HIDDEN)); 
     2243        else 
     2244                g->attr = GrpObj::Attribute(g->attr | GrpObj::HIDDEN); 
     2245 
     2246        g->attr = GrpObj::Attribute(g->attr | GrpObj::UPDATE_VISIBLE); 
    20772247                // ¥°¥ë¡Œ¥×ñ°Ì€ÇŒ¡€Î RefreshObj €ÇÉœŒš¡ŠŸÃµî 
    20782248        if (cmd.cmd2 == 0x51) //not Bg 
     
    20822252 
    20832253void GrpImpl::impl_objColour(Cmd& cmd) { 
    2084         GrpObj& g = (cmd.cmd2 == 0x51) ? grpobj[cmd.args[0].value] : bs_obj[cmd.args[0].value]; 
    2085         g.print_r = cmd.args[1].value; 
    2086         g.print_g = cmd.args[2].value; 
    2087         g.print_b = cmd.args[3].value; 
    2088         g.SetUpdate(); 
    2089         // grpobj[cmd.args[0].value].print_a = cmd.args[4].value; 
    2090         /* args:229,18,minus-1,0,99,255,-1 */ 
    2091         /* args:102,26,minus-1,0,99,0,255 */ 
     2254        int base_arg = 0; 
     2255        GrpObj* g = GetGraphicObjVarMode(cmd, base_arg, (cmd.cmd2 == 0x51)); 
     2256 
     2257        g->print_r = cmd.args[base_arg+1].value; 
     2258        g->print_g = cmd.args[base_arg+2].value; 
     2259        g->print_b = cmd.args[base_arg+3].value; 
     2260        g->SetUpdate(); 
    20922261        cmd.clear(); 
    20932262} 
    20942263 
    2095 void GrpImpl::impl_objComposite(Cmd& cmd) { 
    2096         GrpObj& g = (cmd.cmd2 == 0x51) ? grpobj[cmd.args[0].value] : bs_obj[cmd.args[0].value]; 
    2097         // centering mode €Ê€É€òÀßÄê¡© 
    2098         if (cmd.args[1].value == 1) { 
    2099                 g.attr = GrpObj::Attribute(g.attr | GrpObj::SATURATE); 
     2264void GrpImpl::impl_objComposite(Cmd& cmd) {//FIXME 
     2265        int base_arg = 0; 
     2266        GrpObj* g = GetGraphicObjVarMode(cmd, base_arg, (cmd.cmd2 == 0x51)); 
     2267 
     2268        if (cmd.args[base_arg + 1].value == 1) { 
     2269                g->attr = GrpObj::Attribute(g->attr | GrpObj::SATURATE); 
    21002270                cmd.clear(); 
    2101         } else if (cmd.args[1].value == 0) { 
    2102                 g.attr = GrpObj::Attribute(g.attr & (~GrpObj::SATURATE)); 
     2271        } else if (cmd.args[base_arg + 1].value == 0) { 
     2272                g->attr = GrpObj::Attribute(g->attr & (~GrpObj::SATURATE)); 
    21032273                cmd.clear(); 
    21042274        } 
    2105         g.SetUpdate(); 
     2275        g->SetUpdate(); 
    21062276} 
    21072277 
    21082278void GrpImpl::impl_objSetText(Cmd& cmd) { 
    2109         GrpObj& g = (cmd.cmd2 == 0x51) ? grpobj[cmd.args[0].value] : bs_obj[cmd.args[0].value]; 
    2110  
    2111         g.print_moji = cmd.Str(cmd.args[1]); 
    2112         g.SetUpdate(); 
     2279        int base_arg = 0; 
     2280        GrpObj* g = GetGraphicObjVarMode(cmd, base_arg, (cmd.cmd2 == 0x51)); 
     2281 
     2282        g->print_moji = cmd.Str(cmd.args[base_arg + 1]); 
     2283        g->SetUpdate(); 
    21132284        cmd.clear(); 
    21142285} 
    21152286 
    21162287void GrpImpl::impl_objTextOpts(Cmd& cmd) { 
    2117         GrpObj& g = (cmd.cmd2 == 0x51) ? grpobj[cmd.args[0].value] : bs_obj[cmd.args[0].value]; 
     2288        int base_arg = 0; 
     2289        GrpObj* g = GetGraphicObjVarMode(cmd, base_arg, (cmd.cmd2 == 0x51)); 
     2290 
    21182291        // ²èÁü€òÊž»úÎó€È€·€ÆÀßÄê¡§Êž»ú€ÎÂ瀭€µ€Ê€É 
    2119         g.print_size = cmd.args[1].value; 
     2292        g->print_size = cmd.args[base_arg + 1].value; 
    21202293        /* Á°·Ê¿§€òÆÀ€ë */ 
    21212294        int cr, cg, cb; 
    21222295        char key[17]; 
    2123         sprintf(key, "#COLOR_TABLE.%03d", cmd.args[5].value); 
     2296        sprintf(key, "#COLOR_TABLE.%03d", cmd.args[base_arg + 5].value); 
    21242297        if (config->GetParam(key, 3, &cr, &cg, &cb)) { // color not found 
    21252298                cr = cg = cb = 0; 
    21262299        } 
    2127         g.print_r = cr; 
    2128         g.print_g = cg; 
    2129         g.print_b = cb; 
    2130         g.SetUpdate(); 
     2300        g->print_r = cr; 
     2301        g->print_g = cg; 
     2302        g->print_b = cb; 
     2303        g->SetUpdate(); 
    21312304        cmd.clear(); 
    21322305} 
    21332306 
    21342307void GrpImpl::impl_objOrder(Cmd& cmd) { 
    2135         GrpObj& g = (cmd.cmd2 == 0x51) ? grpobj[cmd.args[0].value] : bs_obj[cmd.args[0].value]; 
    2136         int order = cmd.args[1].value; 
    2137         g.order = order; 
     2308        int base_arg = 0; 
     2309        GrpObj* g = GetGraphicObjVarMode(cmd, base_arg, (cmd.cmd2 == 0x51)); 
     2310 
     2311        int order = cmd.args[base_arg + 1].value; 
     2312        g->order = order; 
    21382313        ZMoveObj(cmd.args[0].value); 
    21392314        cmd.clear(); 
     
    21412316 
    21422317void GrpImpl::impl_objDispArea(Cmd& cmd) { 
    2143         GrpObj& g = (cmd.cmd2 == 0x51) ? grpobj[cmd.args[0].value] : bs_obj[cmd.args[0].value]; 
     2318        int base_arg = 0; 
     2319        GrpObj* g = GetGraphicObjVarMode(cmd, base_arg, (cmd.cmd2 == 0x51)); 
     2320 
    21442321        // ¥ª¥Ö¥ž¥§¥¯¥È€Î€É€ÎÉôʬ€ò²èÌÌ€ËÉœŒš€¹€ë€«¡Ê¥¯¥ê¥Ã¥×Îΰè¡Ë€ÎÀßÄê 
    21452322        int rx, ry, w, h; 
    2146         if (cmd.args.size() == 5) { 
    2147                 int rx = cmd.args[1].value; 
    2148                 int ry = cmd.args[2].value; 
    2149                 int w = cmd.args[3].value; 
    2150                 int h = cmd.args[4].value; 
     2323        if (cmd.args.size() == base_arg + 5) { 
     2324                int rx = cmd.args[base_arg + 1].value; 
     2325                int ry = cmd.args[base_arg + 2].value; 
     2326                int w = cmd.args[base_arg + 3].value; 
     2327                int h = cmd.args[base_arg + 4].value; 
    21512328                if (cmd.cmd3 == 1005) { 
    21522329                        w -= rx; 
     
    21592336                h = screen->Height(); 
    21602337        } 
    2161         g.SetClipArea(rx, ry, w, h); //TODO: case when cmd.args.size() == 1 
     2338        g->SetClipArea(rx, ry, w, h); //TODO: case when cmd.args.size() == 1 
    21622339        cmd.clear(); 
    21632340} 
    21642341 
    21652342void GrpImpl::impl_objSetDigits(Cmd& cmd) { 
    2166         GrpObj& g = (cmd.cmd2 == 0x51) ? grpobj[cmd.args[0].value] : bs_obj[cmd.args[0].value]; 
    2167         g.dig_number = cmd.args[1].value; 
    2168         g.SetUpdate(); 
     2343        int base_arg = 0; 
     2344        GrpObj* g = GetGraphicObjVarMode(cmd, base_arg, (cmd.cmd2 == 0x51)); 
     2345 
     2346        g->dig_number = cmd.args[base_arg + 1].value; 
     2347        g->SetUpdate(); 
    21692348        cmd.clear(); 
    21702349} 
    21712350 
    21722351void GrpImpl::impl_objNumOpts(Cmd& cmd) { 
    2173         GrpObj& g = (cmd.cmd2 == 0x51) ? grpobj[cmd.args[0].value] : bs_obj[cmd.args[0].value]; 
    2174         g.dig_digit = cmd.args[1].value; 
    2175         int attr = g.attr; 
     2352        int base_arg = 0; 
     2353        GrpObj* g = GetGraphicObjVarMode(cmd, base_arg, (cmd.cmd2 == 0x51)); 
     2354 
     2355        g->dig_digit = cmd.args[base_arg + 1].value; 
     2356        int attr = g->attr; 
    21762357        attr &= ~(GrpObj::DIG_ZERO | GrpObj::DIG_SIGN | GrpObj::DIG_PACK); 
    2177         if (cmd.args[2].value) attr |= GrpObj::DIG_ZERO; 
    2178         if (cmd.args[3].value) attr |= GrpObj::DIG_SIGN; 
    2179         if (cmd.args[4].value) attr |= GrpObj::DIG_PACK; 
    2180         g.attr = GrpObj::Attribute(attr); 
    2181         g.SetUpdate(); 
     2358        if (cmd.args[base_arg + 2].value) attr |= GrpObj::DIG_ZERO; 
     2359        if (cmd.args[base_arg + 3].value) attr |= GrpObj::DIG_SIGN; 
     2360        if (cmd.args[base_arg + 4].value) attr |= GrpObj::DIG_PACK; 
     2361        g->attr = GrpObj::Attribute(attr); 
     2362        g->SetUpdate(); 
    21822363        cmd.clear(); 
    21832364} 
    21842365 
    21852366void GrpImpl::impl_objPattNo(Cmd& cmd) { 
    2186         GrpObj& g = (cmd.cmd2 == 0x51) ? grpobj[cmd.args[0].value] : bs_obj[cmd.args[0].value]; 
    2187         g.SetSurfaceNum(cmd.args[1].value); 
     2367        int base_arg = 0; 
     2368        GrpObj* g = GetGraphicObjVarMode(cmd, base_arg, (cmd.cmd2 == 0x51)); 
     2369 
     2370        g->SetSurfaceNum(cmd.args[base_arg + 1].value); 
    21882371        cmd.clear(); 
    21892372} 
    21902373 
    21912374void GrpImpl::impl_objScale(Cmd& cmd) { 
    2192         GrpObj& g = (cmd.cmd2 == 0x51) ? grpobj[cmd.args[0].value] : bs_obj[cmd.args[0].value]; 
    2193         int zoom = (cmd.args[1].value + cmd.args[2].value)/2; //FIXME: eurk 
     2375        int base_arg = 0; 
     2376        GrpObj* g = GetGraphicObjVarMode(cmd, base_arg, (cmd.cmd2 == 0x51)); 
     2377 
     2378        int zoom = (cmd.args[base_arg + 1].value + cmd.args[base_arg + 2].value)/2; //FIXME: eurk 
    21942379        zoom = zoom*256/100; 
    2195         g.SetZoomRotate(zoom, -1); 
     2380        g->SetZoomRotate(zoom, -1); 
    21962381        cmd.clear(); 
    21972382} 
    21982383 
    21992384void GrpImpl::impl_objRotate(Cmd& cmd) { 
    2200         GrpObj& g = (cmd.cmd2 == 0x51) ? grpobj[cmd.args[0].value] : bs_obj[cmd.args[0].value]; 
    2201         int angle = cmd.args[1].value; 
     2385        int base_arg = 0; 
     2386        GrpObj* g = GetGraphicObjVarMode(cmd, base_arg, (cmd.cmd2 == 0x51)); 
     2387 
     2388        int angle = cmd.args[base_arg + 1].value; 
    22022389        angle /= 10; 
    22032390        if (angle < 0) { 
     
    22062393        } 
    22072394        angle %= 360; 
    2208         g.SetZoomRotate(-1, angle); 
     2395        g->SetZoomRotate(-1, angle); 
    22092396        cmd.clear(); 
    22102397} 
    22112398 
    22122399void GrpImpl::impl_objPosDims(Cmd& cmd) { 
    2213         GrpObj& obj = grpobj[cmd.args[0].value]; 
    2214  
    2215         VarInfo arg1 = cmd.args[1]; 
    2216         VarInfo arg2 = cmd.args[2]; 
     2400        int base_arg = 0; 
     2401        GrpObj* g = GetGraphicObjVarMode(cmd, base_arg, true); 
     2402 
     2403        VarInfo arg1 = cmd.args[base_arg + 1]; 
     2404        VarInfo arg2 = cmd.args[base_arg + 2]; 
    22172405 
    22182406        int val1, val2; 
    22192407 
    22202408        if (cmd.cmd3 == 1000) 
    2221                 obj.GetPos(0, val1, val2); 
     2409                g->GetPos(0, val1, val2); 
    22222410        else if (cmd.cmd3 == 1100) 
    2223                 obj.GetSrcGeom(val1, val2); 
     2411                g->GetSrcGeom(val1, val2); 
    22242412 
    22252413        cmd.SetFlagvar(arg1, val1); 
     
    23512539        //TODO: ??? 
    23522540        if ( (cmd.cmd1 == 1 || cmd.cmd1 == 2) && cmd.cmd2 == 0x51) { 
    2353                 GrpObj& g = grpobj[cmd.args[0].value]; 
    2354                 if (g.attr & GrpObj::UPDATE_ALL) { 
     2541                /*GrpObj& g = grpobj[cmd.args[0].value]; 
     2542                int attr; 
     2543                GrpObjMap::iterator it; 
     2544                for (it = g.children_obj.begin(); it != g.children_obj.end(); it++) 
     2545                        attr |= it->second.attr; 
     2546                if (attr & GrpObj::UPDATE_ALL) 
     2547                        SetObjChanged(cmd.args[0].value);*/ 
     2548                GrpObj* g; 
     2549                if (cmd.cmd1 == 2) 
     2550                        g = GetGraphicObj(cmd.args[0].value, cmd.args[1].value); 
     2551                else 
     2552                        g = GetGraphicObj(cmd.args[0].value); 
     2553                if (g->attr & GrpObj::UPDATE_ALL) 
    23552554                        SetObjChanged(cmd.args[0].value); 
    2356                 } 
    23572555        } 
    23582556} 
  • scn2k/scn2k_text.cc

    r53 r55  
    164164}; 
    165165 
    166 class TextImpl { 
    167         public: 
    168                 TextWindow* text; 
    169                 typedef enum {NORMAL=0, WAIT_TEXT=1, WAIT=2, 
    170                         WAIT_CLICK=3, WAIT_ABORT=4, WAIT_CLICK_MOUSEPOS = 5, 
    171                         WAIT_CLICK_MOUSEPOSEND_L = 6, WAIT_CLICK_MOUSEPOSEND_R = 7, 
    172                         WAIT_SELECT_INBOX = 10, WAIT_SELECT_OUTBOX=11, WAIT_SELECT_VALUE = 12, 
    173                         WAIT_EXTRN_MASK = 64, SAVEMASK = 128, LOADMASK = 256, SKIPMASK = 512, 
    174                         CLEARSCR_MASK = 1024, STATSAVE_MASK = 2048, CLEARSCR_WAIT_MASK=(1<<12), 
    175                         SKIPEND_MASK = (1<<13), BACKLOG_MASK=(1<<14), BACKLOG_MASK_FWD=(1<<15), 
    176                         BACKLOG_MASK_KOE=(1<<16), BACKLOG_WAIT_MASK=(1<<17), 
    177                         ALLMASK = (CLEARSCR_MASK | WAIT_EXTRN_MASK | SAVEMASK | LOADMASK | SKIPMASK | BACKLOG_MASK | BACKLOG_MASK_FWD | BACKLOG_MASK_KOE | BACKLOG_WAIT_MASK | STATSAVE_MASK | CLEARSCR_WAIT_MASK | SKIPEND_MASK) 
    178                 } Status; 
    179                 Status status, status_saved, status_mask; 
    180         private: 
    181                 std::string ruby_text; 
    182                 bool ruby_text_flag; 
    183                 unsigned int wait_time; 
    184                 unsigned int old_time; 
    185                 unsigned int base_time; 
    186                 int text_window_number; 
    187                 bool text_parsing; 
    188                 TextStream text_stream; 
    189                 SkipMode skip_mode; 
    190                 int save_selectcount; 
    191  
    192                 std::map<int, TimerAtom> timer_var; 
    193                 std::vector<WidTextButton*> selects; 
    194                 std::vector<int> sel_backlog_pos; 
    195                 string replace_name[26]; 
    196                 string replace_name2[26]; 
    197                 PicContainer* sel_widget; 
    198                 PicWidget* backlog_widget; 
    199  
    200                 vector<BacklogItem>& backlog; 
    201                 BacklogItem& backlog_item; 
    202                 BacklogItem cur_backlog_item; 
    203                 BacklogItem drawn_backlog_item; 
    204  
    205         public: 
    206                 PicContainer& parent; 
    207                 Event::Container& event; 
    208                 AyuSysConfig *config; 
    209         private: 
    210                 TextWindow* widgets[32]; 
    211                 WidTimeCursor* kcursor; 
    212                 Surface* sel_bg1; 
    213                 Surface* sel_bg2; 
    214                 Rect sel_bg_rect; 
    215  
    216                 void SetCursor(int num); 
    217                 VarInfo wait_savedvar[2]; 
    218  
    219         public: 
    220                 void AddText(const char* str); 
    221  
    222                 static void PressFuncSkip(void* pointer, WidButton* from); 
    223                 static void PressFuncLoad(void* pointer, WidButton* from); 
    224                 static void PressFuncSave(void* pointer, WidButton* from); 
    225                 static void PressFuncBacklog(void* pointer, WidButton* from); 
    226                 static void PressFuncBacklogFwd(void* pointer, WidButton* from); 
    227         private: 
    228                 static void PressFuncButton(void* pointer, WidButton* from); 
    229                 static bool PressFunc(int x, int y, void* pointer); 
    230  
     166class TextImpl : public CommandHandler { 
    231167        public: 
    232168                TextImpl(Event::Container& _event, PicContainer& _parent, vector<BacklogItem>& parent_backlog, BacklogItem& parent_backlog_item); 
     
    247183                void SetSkipMode(SkipMode _mode); 
    248184                void CreateSelBG(void); 
     185 
     186                void AddText(const char* str); 
     187 
     188                static void PressFuncSkip(void* pointer, WidButton* from); 
     189                static void PressFuncLoad(void* pointer, WidButton* from); 
     190                static void PressFuncSave(void* pointer, WidButton* from); 
     191                static void PressFuncBacklog(void* pointer, WidButton* from); 
     192                static void PressFuncBacklogFwd(void* pointer, WidButton* from); 
     193 
     194        private: 
     195                static void PressFuncButton(void* pointer, WidButton* from); 
     196                static bool PressFunc(int x, int y, void* pointer); 
     197                void SetCursor(int num); 
     198 
     199        public: 
     200                TextWindow* text; 
     201                typedef enum {NORMAL=0, WAIT_TEXT=1, WAIT=2, 
     202                        WAIT_CLICK=3, WAIT_ABORT=4, WAIT_CLICK_MOUSEPOS = 5, 
     203                        WAIT_CLICK_MOUSEPOSEND_L = 6, WAIT_CLICK_MOUSEPOSEND_R = 7, 
     204                        WAIT_SELECT_INBOX = 10, WAIT_SELECT_OUTBOX=11, WAIT_SELECT_VALUE = 12, 
     205                        WAIT_EXTRN_MASK = 64, SAVEMASK = 128, LOADMASK = 256, SKIPMASK = 512, 
     206                        CLEARSCR_MASK = 1024, STATSAVE_MASK = 2048, CLEARSCR_WAIT_MASK=(1<<12), 
     207                        SKIPEND_MASK = (1<<13), BACKLOG_MASK=(1<<14), BACKLOG_MASK_FWD=(1<<15), 
     208                        BACKLOG_MASK_KOE=(1<<16), BACKLOG_WAIT_MASK=(1<<17), 
     209                        ALLMASK = (CLEARSCR_MASK | WAIT_EXTRN_MASK | SAVEMASK | 
     210                                                LOADMASK | SKIPMASK | BACKLOG_MASK | BACKLOG_MASK_FWD | 
     211                                                BACKLOG_MASK_KOE | BACKLOG_WAIT_MASK | STATSAVE_MASK | 
     212                                                CLEARSCR_WAIT_MASK | SKIPEND_MASK) 
     213                } Status; 
     214                Status status, status_saved, status_mask; 
     215 
     216        private: 
     217                std::string ruby_text; 
     218                bool ruby_text_flag; 
     219                unsigned int wait_time; 
     220                unsigned int old_time; 
     221                unsigned int base_time; 
     222                int text_window_number; 
     223                bool text_parsing; 
     224                TextStream text_stream; 
     225                SkipMode skip_mode; 
     226                int save_selectcount; 
     227 
     228                std::map<int, TimerAtom> timer_var; 
     229                std::vector<WidTextButton*> selects; 
     230                std::vector<int> sel_backlog_pos; 
     231                string replace_name[26]; 
     232                string replace_name2[26]; 
     233                PicContainer* sel_widget; 
     234                PicWidget* backlog_widget; 
     235 
     236                vector<BacklogItem>& backlog; 
     237                BacklogItem& backlog_item; 
     238                BacklogItem cur_backlog_item; 
     239                BacklogItem drawn_backlog_item; 
     240 
     241                TextWindow* widgets[32]; 
     242                WidTimeCursor* kcursor; 
     243                Surface* sel_bg1; 
     244                Surface* sel_bg2; 
     245                Rect sel_bg_rect; 
     246 
     247                VarInfo wait_savedvar[2]; 
     248 
     249                AyuSysConfig *config; 
     250 
     251                Event::Container& event; 
     252                PicContainer& parent; 
     253 
     254                //Opcode handling 
     255                void impl_txtClear(Cmd& cmd); 
     256                void impl_logKoe(Cmd& cmd); 
     257                void impl_pause(Cmd& cmd); 
     258                void impl_br(Cmd& cmd); 
     259                void impl_FaceOpen(Cmd& cmd); 
     260                void impl_FaceClear(Cmd& cmd); 
    249261}; 
    250262 
     
    265277        text_stream.kanji_type = TextStream::sjis; 
    266278        event.RegisterGlobalPressFunc(&PressFunc, (void*)this); 
     279 
     280        RegisterCommand(1, 33, 73, "grpOpenBg", (CmdImpl) &TextImpl::impl_txtClear); 
     281        RegisterCommand(1, 33, 75, "grpMulti", (CmdImpl) &TextImpl::impl_txtClear); 
     282        RegisterCommand(1, 33, 76, "grpOpen", (CmdImpl) &TextImpl::impl_txtClear); 
     283 
     284        RegisterCommand(1, 23, 0, "koePlay", (CmdImpl) &TextImpl::impl_logKoe); 
     285        RegisterCommand(1, 23, 8, "koeDoPlay", (CmdImpl) &TextImpl::impl_logKoe); 
     286 
     287        RegisterCommand(0, 3, 151, "msgHide", (CmdImpl) &TextImpl::impl_txtClear); 
     288        RegisterCommand(0, 3, 17, "pause", (CmdImpl) &TextImpl::impl_pause); 
     289        RegisterCommand(0, 3, 3, "par", (CmdImpl) &TextImpl::impl_br); //FIXME 
     290        RegisterCommand(0, 3, 201, "br", (CmdImpl) &TextImpl::impl_br); 
     291        RegisterCommand(0, 3, 1000, "FaceOpen", (CmdImpl) &TextImpl::impl_FaceOpen); 
     292        RegisterCommand(0, 3, 1001, "FaceClear", (CmdImpl) &TextImpl::impl_FaceClear); 
    267293} 
    268294 
     
    865891} 
    866892 
     893void TextImpl::impl_txtClear(Cmd& cmd) { 
     894        if (text != NULL) { 
     895                text->ResetFace(); 
     896                if (cmd.cmd2 == 3 && cmd.cmd3 == 151) 
     897                        text->wid->Clear(); 
     898        } 
     899        cur_backlog_item.face = ""; 
     900        if (cmd.cmd2 == 3 && cmd.cmd3 == 151) 
     901                text_stream.Clear(); 
     902        hide(); 
     903} 
     904 
     905void TextImpl::impl_logKoe(Cmd& cmd) { 
     906        // PlayKoe ; ÀŒœÐÎÏ¥³¥Þ¥ó¥É€ò¥Á¥§¥Ã¥¯€¹€ë */ 
     907        cur_backlog_item.koe = cmd.args[0].value; 
     908} 
     909 
     910void TextImpl::impl_pause(Cmd& cmd) { 
     911        if (text != NULL) { 
     912                eprintf("start\n"); 
     913                text->StartText(text_stream); 
     914                if (skip_mode & SKIP_TEXT) text->wid->Flush(); 
     915                else if (kcursor) kcursor->show(); 
     916                status = WAIT_TEXT; 
     917                text_parsing = false; 
     918        } 
     919        backlog_item = cur_backlog_item; 
     920        if (cur_backlog_item.scn == 0 && cur_backlog_item.pos == -1) backlog_item.text = text_stream; 
     921        cur_backlog_item.Clear(); 
     922 
     923        cmd.clear(); 
     924        cmd.cmd_type = CMD_WAITFRAMEUPDATE; // ²èÁüÉÁ²è€ËÌá€ë(skip»þ€Ë¥Æ¥­¥¹¥È€¬ÉÁ²è€µ€ì€ä€¹€¯€¹€ë€¿€á) 
     925} 
     926 
     927void TextImpl::impl_br(Cmd& cmd) { 
     928        text_stream.AddReturn(); 
     929        cur_backlog_item.DeleteTextPos(); 
     930        cmd.clear(); 
     931} 
     932 
     933void TextImpl::impl_FaceOpen(Cmd& cmd) { 
     934        if (text == NULL) 
     935                show(); 
     936        string s = cmd.Str(cmd.args[0]); 
     937        s += ".g00"; 
     938        if (text != NULL) 
     939                text->ShowFace(s.c_str()); 
     940        cur_backlog_item.face = s; 
     941        cmd.cmd_type = CMD_SAVECMD_ONCE; 
     942} 
     943 
     944void TextImpl::impl_FaceClear(Cmd& cmd) { 
     945        if (text == NULL) 
     946                show(); 
     947        if (text) 
     948                text->ResetFace(); 
     949        cur_backlog_item.face = ""; 
     950        cmd.cmd_type = CMD_SAVECMD_ONCE; 
     951} 
     952 
    867953void TextImpl::Exec(Cmd& cmd) { 
    868954        if (cmd.cmd_type == CMD_TEXT) { 
     
    889975                return; 
    890976        } 
     977 
    891978        if (cmd.cmd_type != CMD_OTHER) return; 
    892         /* ¥Æ¥­¥¹¥È¥Š¥£¥ó¥É¥Š€òŸÃµî€¹€ë¥³¥Þ¥ó¥ÉÎà€ò¥Á¥§¥Ã¥¯€¹€ë */ 
    893         if (cmd.cmd1 == 1 && cmd.cmd2 == 0x21) { 
    894                 if (cmd.cmd3 == 0x49 || cmd.cmd3 == 0x4b || cmd.cmd3 == 0x4c) { 
    895                         if (text) text->ResetFace(); 
    896                         cur_backlog_item.face = ""; 
    897                         hide(); 
    898                 } 
    899         } 
    900         if (cmd.cmd1 == 1 && cmd.cmd2 == 0x17 && cmd.cmd3 == 0 && cmd.cmd4 == 1) {  
    901                 // PlayKoe ; ÀŒœÐÎÏ¥³¥Þ¥ó¥É€ò¥Á¥§¥Ã¥¯€¹€ë */ 
    902                 cur_backlog_item.koe = cmd.args[0].value; 
    903         } 
    904         if (cmd.cmd1 == 0 && cmd.cmd2 == 3 && cmd.cmd3 == 0x97) { // €€€€€Î€«€Ê¡Œ 
    905                  
    906                 if (text) { 
    907                         text->ResetFace(); 
    908                         text->wid->Clear(); 
    909                 } 
    910                 cur_backlog_item.face = ""; 
    911                 text_stream.Clear(); 
    912                 hide(); 
    913         } 
     979 
     980        CommandHandler::Exec(cmd); 
     981 
    914982        if (cmd.cmd1 == 0 && cmd.cmd2 == 3) { 
    915                 if (cmd.cmd3 == 0x11) { // ¥Æ¥­¥¹¥ÈÉœŒš¡¢¥¯¥ê¥Ã¥¯ÂÔ€Á 
    916                         if (text) { 
    917                                 eprintf("start\n"); 
    918                                 text->StartText(text_stream); 
    919                                 if (skip_mode & SKIP_TEXT) text->wid->Flush(); 
    920                                 else if (kcursor) kcursor->show(); 
    921                                 status = WAIT_TEXT; 
    922                                 text_parsing = false; 
    923                         } 
    924                         backlog_item = cur_backlog_item; 
    925                         if (cur_backlog_item.scn == 0 && cur_backlog_item.pos == -1) backlog_item.text = text_stream; 
    926                         cur_backlog_item.Clear(); 
    927  
    928                         cmd.clear(); 
    929                         cmd.cmd_type = CMD_WAITFRAMEUPDATE; // ²èÁüÉÁ²è€ËÌá€ë(skip»þ€Ë¥Æ¥­¥¹¥È€¬ÉÁ²è€µ€ì€ä€¹€¯€¹€ë€¿€á) 
    930                                 // €³€ì€À€È£±¥Õ¥ì¡Œ¥à£±¥Æ¥­¥¹¥È€·€«ÉœŒš€µ€ì€Ê€¯€Ê€ë€Î€ÇÃí°Õ 
    931                 } else if (cmd.cmd3 == 3 || cmd.cmd3 == 0xc9) { // ¥ê¥¿¡Œ¥óÁÞÆþ 
    932                         text_stream.AddReturn(); 
    933                         cur_backlog_item.DeleteTextPos(); 
    934                         cmd.clear(); 
    935                 } else if (cmd.cmd3 == 0x3e8 || cmd.cmd3 == 0x3e9) { // Žé¥°¥é¥Õ¥£¥Ã¥¯Êѹ¹ 
    936                         if (text == NULL) { 
    937                                 show(); 
    938                         } 
    939                         if (cmd.cmd3 == 0x3e8) { 
    940                                 string s = cmd.Str(cmd.args[0]); 
    941                                 s += ".g00"; 
    942                                 if (text) text->ShowFace(s.c_str()); 
    943                                 cur_backlog_item.face = s; 
    944                                 cmd.cmd_type = CMD_SAVECMD_ONCE; 
    945                         } else if (cmd.cmd3 == 0x3e9) { // Žé¥°¥é¥Õ¥£¥Ã¥¯ŸÃµî 
    946                                 if (text) text->ResetFace(); 
    947                                 cur_backlog_item.face = ""; 
    948                                 cmd.cmd_type = CMD_SAVECMD_ONCE; 
    949                         } 
    950                 } else if (cmd.cmd3 == 0x78) { // ¥ë¥ÓŽØÏ¢ 
     983                if (cmd.cmd3 == 0x78) { // ¥ë¥ÓŽØÏ¢ 
    951984                        if (text == NULL) { 
    952985                                show();