| 1 | /* |
|---|
| 2 | * Copyright (c) 2009 Thibaut GIRKA |
|---|
| 3 | * Copyright (c) 2004-2006 Kazunori "jagarl" Ueno |
|---|
| 4 | * All rights reserved. |
|---|
| 5 | * |
|---|
| 6 | * Redistribution and use in source and binary forms, with or without |
|---|
| 7 | * modification, are permitted provided that the following conditions |
|---|
| 8 | * are met: |
|---|
| 9 | * 1. Redistributions of source code must retain the above copyright |
|---|
| 10 | * notice, this list of conditions and the following disclaimer. |
|---|
| 11 | * 2. Redistributions in binary form must reproduce the above copyright |
|---|
| 12 | * notice, this list of conditions and the following disclaimer in the |
|---|
| 13 | * documentation and/or other materials provided with the distribution. |
|---|
| 14 | * 3. The name of the author may not be used to endorse or promote products |
|---|
| 15 | * derived from this software without specific prior written permission. |
|---|
| 16 | * |
|---|
| 17 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
|---|
| 18 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
|---|
| 19 | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
|---|
| 20 | * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
|---|
| 21 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
|---|
| 22 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
|---|
| 23 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
|---|
| 24 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|---|
| 25 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
|---|
| 26 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|---|
| 27 | */ |
|---|
| 28 | |
|---|
| 29 | #ifndef __SCN2K_GRP_H__ |
|---|
| 30 | #define __SCN2K_GRP_H__ |
|---|
| 31 | |
|---|
| 32 | #include <set> |
|---|
| 33 | |
|---|
| 34 | #include "scn2k_cmd.h" |
|---|
| 35 | #include "window/widget.h" |
|---|
| 36 | |
|---|
| 37 | using namespace std; |
|---|
| 38 | |
|---|
| 39 | void dprintf(const char* fmt, ...); //FIXME |
|---|
| 40 | void eprintf(const char* fmt, ...); //FIXME |
|---|
| 41 | |
|---|
| 42 | struct SEL { |
|---|
| 43 | Rect from; |
|---|
| 44 | Rect to; |
|---|
| 45 | int time; |
|---|
| 46 | int sel_no; |
|---|
| 47 | int args[8]; |
|---|
| 48 | SEL() : from(0,0), to(0,0) {} |
|---|
| 49 | }; |
|---|
| 50 | |
|---|
| 51 | struct GrpObj; |
|---|
| 52 | typedef std::map<int, GrpObj> GrpObjMap; |
|---|
| 53 | |
|---|
| 54 | /******************************************************************* |
|---|
| 55 | ** GrpObj(interface) |
|---|
| 56 | */ |
|---|
| 57 | |
|---|
| 58 | struct GrpObj { |
|---|
| 59 | string name; |
|---|
| 60 | string gan_name; |
|---|
| 61 | PicContainer* pic_parent; |
|---|
| 62 | PicBase* picture; |
|---|
| 63 | WidAnmTime* anm; |
|---|
| 64 | int _posx, _posy; |
|---|
| 65 | int posx[9], posy[9]; |
|---|
| 66 | Rect clip_area; |
|---|
| 67 | unsigned char alpha; |
|---|
| 68 | int order; |
|---|
| 69 | int surface_num; |
|---|
| 70 | |
|---|
| 71 | GrpObjMap children_obj; |
|---|
| 72 | |
|---|
| 73 | string print_moji; |
|---|
| 74 | int print_size, print_r, print_b, print_g; |
|---|
| 75 | |
|---|
| 76 | int dig_number, dig_digit; |
|---|
| 77 | |
|---|
| 78 | // zoom / rotate é¢ä¿ |
|---|
| 79 | int zoom; // 256 ã§ 1 å |
|---|
| 80 | int rotate; // 0-360床 |
|---|
| 81 | |
|---|
| 82 | vector<Rect> src_pos; |
|---|
| 83 | enum GrpType { FILLRECT = 1, FILE = 2, GAN = 3, MOJI = 4, DIGIT = 5} gtype; |
|---|
| 84 | enum Attribute { NONE=0, WIPEON=1, BLIT_ADD=2, HIDDEN=4, |
|---|
| 85 | UPDATE_PICTURE = 16, UPDATE_POS = 32, UPDATE_ALPHA = 64, UPDATE_SNUM = 128, UPDATE_CLIP = 256, UPDATE_VISIBLE = 512, |
|---|
| 86 | UPDATE_ALL = (UPDATE_PICTURE | UPDATE_POS | UPDATE_ALPHA | UPDATE_SNUM | UPDATE_CLIP | UPDATE_VISIBLE), |
|---|
| 87 | ANM_PLAYSTART = 0x8000, ANM_PLAYING = 0x10000, |
|---|
| 88 | DIG_ZERO = 0x10000*2, DIG_SIGN = 0x10000*4, DIG_PACK=0x10000*8,DIG_SPACE=0x10000*16 |
|---|
| 89 | }; |
|---|
| 90 | Attribute attr; |
|---|
| 91 | |
|---|
| 92 | GrpObj(void); |
|---|
| 93 | ~GrpObj(void); |
|---|
| 94 | |
|---|
| 95 | void SetPos(int index, int x, int y); |
|---|
| 96 | void GetPos(int index, int& x, int& y); |
|---|
| 97 | int PosX(void); |
|---|
| 98 | int PosY(void); |
|---|
| 99 | void SetAlpha(void); |
|---|
| 100 | void SetAlpha(int alpha); |
|---|
| 101 | void SetSurfaceNum(int num = -1); |
|---|
| 102 | void SetZoomRotate(int zoom=-1, int rotate=-1); |
|---|
| 103 | void SetClipArea(int x, int y, int width, int height); |
|---|
| 104 | void GetSrcGeom(int& width, int& height); |
|---|
| 105 | void SetUpdate(void); |
|---|
| 106 | void UpdateMoji(void); |
|---|
| 107 | void UpdateDigit(void); |
|---|
| 108 | void UpdateSurface(void); |
|---|
| 109 | void ZoomRotate(void); |
|---|
| 110 | void Refresh(GrpObj& parent_obj); |
|---|
| 111 | void _debug_Dump(int, int); |
|---|
| 112 | void Update(void); |
|---|
| 113 | void CreateSurface(PicContainer* parent); |
|---|
| 114 | void CreateGan(Event::Container& event, int event_number); |
|---|
| 115 | void CreateGanSpecial(Event::Container& event, int event_number, int time); |
|---|
| 116 | PicBase* DeletePic(void); |
|---|
| 117 | }; |
|---|
| 118 | |
|---|
| 119 | |
|---|
| 120 | /******************************************************************* |
|---|
| 121 | ** Grp |
|---|
| 122 | */ |
|---|
| 123 | |
|---|
| 124 | class Grp : public CommandHandler { |
|---|
| 125 | #define MAXPDT 256 |
|---|
| 126 | #define WORKPDT 255 |
|---|
| 127 | private: |
|---|
| 128 | void CreateObj(int number); |
|---|
| 129 | void CreateSubObj(int grp_num, int number); |
|---|
| 130 | void ZMoveObj(int number); |
|---|
| 131 | void SetObjChanged(int number); |
|---|
| 132 | void SwapObj(int a1, int a2); |
|---|
| 133 | void DeleteObjPic(int num);// object ã® surface ã®ã¿åé€ |
|---|
| 134 | void DeleteSubObjPic(int grp_num, int num); |
|---|
| 135 | void DeleteObj(int num); |
|---|
| 136 | void DeleteSubObj(int grp_num, int num); |
|---|
| 137 | void RefreshObj(void); |
|---|
| 138 | |
|---|
| 139 | Surface* Dsurface(int pdt); |
|---|
| 140 | Surface* Ssurface(int pdt); |
|---|
| 141 | |
|---|
| 142 | // cgmode çšç»ååŠçé¢é£ |
|---|
| 143 | void LoadCgm(void); |
|---|
| 144 | |
|---|
| 145 | public: |
|---|
| 146 | Grp(Event::Container& _event, PicContainer& _parent, const Flags& _flag, set<int>& _cgm_data); |
|---|
| 147 | ~Grp(); |
|---|
| 148 | bool Wait(unsigned int current_time, Cmd& cmd); |
|---|
| 149 | void Exec(Cmd& cmd); |
|---|
| 150 | void InitSel(void); |
|---|
| 151 | void Save(std::string& str); |
|---|
| 152 | void Load(const char* str); |
|---|
| 153 | void SaveSys(std::string& str); |
|---|
| 154 | void LoadSys(const char* str); |
|---|
| 155 | void SetSkipMode(SkipMode _mode); |
|---|
| 156 | void LoadSurface(const char* str, int pdt); |
|---|
| 157 | |
|---|
| 158 | private: |
|---|
| 159 | void LoadSurface(const char* str); |
|---|
| 160 | void LoadSurface(void); |
|---|
| 161 | void AddSurface(const char* str); |
|---|
| 162 | |
|---|
| 163 | void StartAnm(int type); |
|---|
| 164 | void StartShake(int total, const int* pattern); |
|---|
| 165 | void AbortAnm(void); |
|---|
| 166 | 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); |
|---|
| 171 | |
|---|
| 172 | // Opcode handling |
|---|
| 173 | void impl_stackClear(Cmd& cmd); |
|---|
| 174 | void impl_grpBuffer(Cmd& cmd); |
|---|
| 175 | void impl_grpMulti(Cmd &cmd); |
|---|
| 176 | void impl_grpOpen(Cmd &cmd); |
|---|
| 177 | void impl_shake(Cmd &cmd); |
|---|
| 178 | void impl_grpCopy(Cmd &cmd); |
|---|
| 179 | void impl_recFill(Cmd &cmd); |
|---|
| 180 | void impl_recCopy(Cmd &cmd); |
|---|
| 181 | void impl_recAdd(Cmd &cmd); |
|---|
| 182 | void impl_grpPan(Cmd &cmd); |
|---|
| 183 | void impl_snmPlay(Cmd &cmd); |
|---|
| 184 | void impl_snmBgScroll(Cmd &cmd); |
|---|
| 185 | void impl_cgGet(Cmd &cmd); |
|---|
| 186 | void impl_cgStatus(Cmd &cmd); |
|---|
| 187 | void impl_objClear(Cmd &cmd); |
|---|
| 188 | void impl_createObj(Cmd &cmd); |
|---|
| 189 | void impl_gan(Cmd &cmd); |
|---|
| 190 | void impl_objSetPos(Cmd &cmd); |
|---|
| 191 | void impl_objAlpha(Cmd &cmd); |
|---|
| 192 | void impl_objShow(Cmd &cmd); |
|---|
| 193 | void impl_objColour(Cmd &cmd); |
|---|
| 194 | void impl_objComposite(Cmd &cmd); |
|---|
| 195 | void impl_objSetText(Cmd &cmd); |
|---|
| 196 | void impl_objTextOpts(Cmd &cmd); |
|---|
| 197 | void impl_objOrder(Cmd &cmd); |
|---|
| 198 | void impl_objDispArea(Cmd &cmd); |
|---|
| 199 | void impl_objSetDigits(Cmd &cmd); |
|---|
| 200 | void impl_objNumOpts(Cmd &cmd); |
|---|
| 201 | void impl_objPattNo(Cmd &cmd); |
|---|
| 202 | void impl_objScale(Cmd &cmd); |
|---|
| 203 | void impl_objRotate(Cmd &cmd); |
|---|
| 204 | void impl_objPosDims(Cmd &cmd); |
|---|
| 205 | void impl_refresh(Cmd &cmd); |
|---|
| 206 | void impl_bgmLoop(Cmd &cmd); |
|---|
| 207 | void impl_bgmStop(Cmd &cmd); |
|---|
| 208 | void impl_playWav(Cmd &cmd); |
|---|
| 209 | void impl_playSE(Cmd &cmd); |
|---|
| 210 | void impl_stopWav(Cmd &cmd); |
|---|
| 211 | void impl_SetVolMod(Cmd &cmd); |
|---|
| 212 | void impl_GetVolMod(Cmd &cmd); |
|---|
| 213 | void impl_koePlay(Cmd &cmd); |
|---|
| 214 | void impl_movPlay(Cmd &cmd); |
|---|
| 215 | |
|---|
| 216 | public: |
|---|
| 217 | class AyuSysConfig *config; |
|---|
| 218 | |
|---|
| 219 | private: |
|---|
| 220 | Event::Container& event; |
|---|
| 221 | const Flags& flags; |
|---|
| 222 | PicBase* screen; |
|---|
| 223 | PicBase* screen_front; |
|---|
| 224 | Surface* surface, *surface_update; |
|---|
| 225 | |
|---|
| 226 | Surface* dsurface[MAXPDT]; // æžã蟌ã¿å¯èœãª Surface |
|---|
| 227 | Surface* ssurface[MAXPDT]; // ãã¡ã€ã«ã®å
容çãèªã¿èŸŒã¿ã®ã¿å¯èœãªç¶æ
ã® Surface |
|---|
| 228 | PicContainer& parent; |
|---|
| 229 | |
|---|
| 230 | // ç»å广ã®ä¿åçš |
|---|
| 231 | WidAnmTime* anm1, *anm2; |
|---|
| 232 | typedef enum { NORMAL, WAIT_ANM, WAIT_SHAKE, WAIT_SE, WAIT_MOVIE} Status; |
|---|
| 233 | Status status; |
|---|
| 234 | SkipMode skip_mode; |
|---|
| 235 | |
|---|
| 236 | std::string bg_name; |
|---|
| 237 | std::map<int, SEL> anmtype; |
|---|
| 238 | GrpObjMap grpobj; |
|---|
| 239 | GrpObjMap bs_obj; |
|---|
| 240 | |
|---|
| 241 | std::map<std::string, int> cgm_info; |
|---|
| 242 | set<int>& cgm_data; |
|---|
| 243 | int cgm_size; |
|---|
| 244 | |
|---|
| 245 | class MuSys *music; |
|---|
| 246 | |
|---|
| 247 | std::set<int> changed_obj; |
|---|
| 248 | string reserved_load_surface0; |
|---|
| 249 | vector<PicBase*> deleted_pic; |
|---|
| 250 | }; |
|---|
| 251 | |
|---|
| 252 | |
|---|
| 253 | /****************************************************************** |
|---|
| 254 | ** |
|---|
| 255 | ** class ScnGrp* |
|---|
| 256 | */ |
|---|
| 257 | /* Princess Bride: èæ¯ç»ã®äžéšã®ã¿ç§»åãã®å®è£
*/ |
|---|
| 258 | |
|---|
| 259 | struct ScnGrpMove : public WidAnmTime { |
|---|
| 260 | Surface* dest; |
|---|
| 261 | Surface* src; |
|---|
| 262 | PicRoot& root; |
|---|
| 263 | Rect dest_r, from, to; |
|---|
| 264 | ScnGrpMove(Event::Container& container, PicBase* _pic, PicRoot& root, Surface* dest, const Rect& _dest_r, Surface* src, const Rect& from, const Rect& to, int total_time); |
|---|
| 265 | void Exec(int count); |
|---|
| 266 | }; |
|---|
| 267 | |
|---|
| 268 | /* Princess Bride: ã«ãŒãããã¡ãã¢ãã¡ãŒã·ã§ã³ */ |
|---|
| 269 | |
|---|
| 270 | struct ScnGrpAnmAtom { |
|---|
| 271 | string name; |
|---|
| 272 | int time; |
|---|
| 273 | ScnGrpAnmAtom(const char* _n, int _t) : name(_n), time(_t) {} |
|---|
| 274 | }; |
|---|
| 275 | |
|---|
| 276 | struct ScnGrpAnm : public WidAnmTime, vector<ScnGrpAnmAtom> { |
|---|
| 277 | Grp& owner; |
|---|
| 278 | ScnGrpAnm(Event::Container& container, PicBase* _pic, Grp& _owner) : |
|---|
| 279 | WidAnmTime(container, _pic, 0), owner(_owner) { |
|---|
| 280 | } |
|---|
| 281 | void CalcTotal(void); |
|---|
| 282 | void Exec(int count); |
|---|
| 283 | }; |
|---|
| 284 | |
|---|
| 285 | #endif |
|---|