diff scn2k/scn2k_grp.h @ 56:c7bcc0ec2267

* replaced Grp and Text classes by the TextImpl and GrpImpl ones * splitted scn2k.h into smaller header files * moved some definitions from scn2k_*.cc to the header files * moved opcode implementation to scn2k_*impl.cc
author thib
date Thu, 30 Apr 2009 19:05:09 +0000
parents
children e16e13d8cd68
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/scn2k/scn2k_grp.h
@@ -0,0 +1,285 @@
+/*
+ * Copyright (c) 2009 Thibaut GIRKA
+ * Copyright (c) 2004-2006  Kazunori "jagarl" Ueno
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ *    derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __SCN2K_GRP_H__
+#define __SCN2K_GRP_H__
+
+#include <set>
+
+#include "scn2k_cmd.h"
+#include "window/widget.h"
+
+using namespace std;
+
+void dprintf(const char* fmt, ...); //FIXME
+void eprintf(const char* fmt, ...); //FIXME
+
+struct SEL {
+	Rect from;
+	Rect to;
+	int time;
+	int sel_no;
+	int args[8];
+	SEL() : from(0,0), to(0,0) {}
+};
+
+struct GrpObj;
+typedef std::map<int, GrpObj> GrpObjMap;
+
+/*******************************************************************
+** GrpObj(interface)
+*/
+
+struct GrpObj {
+	string name;
+	string gan_name;
+	PicContainer* pic_parent;
+	PicBase* picture;
+	WidAnmTime* anm;
+	int _posx, _posy;
+	int posx[9], posy[9];
+	Rect clip_area;
+	unsigned char alpha;
+	int order;
+	int surface_num;
+
+	GrpObjMap children_obj;
+
+	string print_moji;
+	int print_size, print_r, print_b, print_g;
+
+	int dig_number, dig_digit;
+
+	// zoom / rotate 関係
+	int zoom; // 256 で 1 倍
+	int rotate; // 0-360度
+
+	vector<Rect> src_pos;
+	enum GrpType { FILLRECT = 1, FILE = 2, GAN = 3, MOJI = 4, DIGIT = 5} gtype;
+	enum Attribute { NONE=0, WIPEON=1, SATURATE=2, HIDDEN=4,
+		UPDATE_PICTURE = 16, UPDATE_POS = 32, UPDATE_ALPHA = 64, UPDATE_SNUM = 128, UPDATE_CLIP = 256, UPDATE_VISIBLE = 512,
+		UPDATE_ALL = (UPDATE_PICTURE | UPDATE_POS | UPDATE_ALPHA | UPDATE_SNUM | UPDATE_CLIP | UPDATE_VISIBLE),
+		ANM_PLAYSTART = 0x8000, ANM_PLAYING = 0x10000,
+		DIG_ZERO = 0x10000*2, DIG_SIGN = 0x10000*4, DIG_PACK=0x10000*8,DIG_SPACE=0x10000*16
+		};
+	Attribute attr;
+
+	GrpObj(void);
+	~GrpObj(void);
+
+	void SetPos(int index, int x, int y);
+	void GetPos(int index, int& x, int& y);
+	int PosX(void);
+	int PosY(void);
+	void SetAlpha(void);
+	void SetAlpha(int alpha);
+	void SetSurfaceNum(int num = -1);
+	void SetZoomRotate(int zoom=-1, int rotate=-1);
+	void SetClipArea(int x, int y, int width, int height);
+	void GetSrcGeom(int& width, int& height);
+	void SetUpdate(void);
+	void UpdateMoji(void);
+	void UpdateDigit(void);
+	void UpdateSurface(void);
+	void ZoomRotate(void);
+	void Refresh(GrpObj& parent_obj);
+	void _debug_Dump(int, int);
+	void Update(void);
+	void CreateSurface(PicContainer* parent);
+	void CreateGan(Event::Container& event, int event_number);
+	void CreateGanSpecial(Event::Container& event, int event_number, int time);
+	PicBase* DeletePic(void);
+};
+
+
+/*******************************************************************
+** Grp
+*/
+
+class Grp : public CommandHandler {
+#define MAXPDT 256
+#define WORKPDT 255
+	private:
+		void CreateObj(int number);
+		void CreateSubObj(int grp_num, int number);
+		void ZMoveObj(int number);
+		void SetObjChanged(int number);
+		void SwapObj(int a1, int a2);
+		void DeleteObjPic(int num);// object の surface のみ削除
+		void DeleteSubObjPic(int grp_num, int num);
+		void DeleteObj(int num);
+		void DeleteSubObj(int grp_num, int num);
+		void RefreshObj(void);
+
+		Surface* Dsurface(int pdt);
+		Surface* Ssurface(int pdt);
+
+		// cgmode 用画像処理関連
+		void LoadCgm(void);
+
+	public:
+		Grp(Event::Container& _event, PicContainer& _parent, const Flags& _flag, set<int>& _cgm_data);
+		~Grp();
+		bool Wait(unsigned int current_time, Cmd& cmd);
+		void Exec(Cmd& cmd);
+		void InitSel(void);
+		void Save(std::string& str);
+		void Load(const char* str);
+		void SaveSys(std::string& str);
+		void LoadSys(const char* str);
+		void SetSkipMode(SkipMode _mode);
+		void LoadSurface(const char* str, int pdt);
+
+	private:
+		void LoadSurface(const char* str);
+		void LoadSurface(void);
+		void AddSurface(const char* str);
+
+		void StartAnm(int type);
+		void StartShake(int total, const int* pattern);
+		void AbortAnm(void);
+		static bool Pressed(int x, int y, void* pointer);
+
+		GrpObj* GetGraphicObj(int grp, bool fg=true);
+		GrpObj* GetGraphicObj(int grp, int index, bool fg=true);
+		GrpObj* GetGraphicObjVarMode(Cmd& cmd, int &base_arg, bool fg=true);
+
+		// Opcode handling
+		void impl_stackClear(Cmd& cmd);
+		void impl_grpBuffer(Cmd& cmd);
+		void impl_grpMulti(Cmd &cmd);
+		void impl_grpOpen(Cmd &cmd);
+		void impl_shake(Cmd &cmd);
+		void impl_grpCopy(Cmd &cmd);
+		void impl_recFill(Cmd &cmd);
+		void impl_recCopy(Cmd &cmd);
+		void impl_recAdd(Cmd &cmd);
+		void impl_grpPan(Cmd &cmd);
+		void impl_snmPlay(Cmd &cmd);
+		void impl_snmBgScroll(Cmd &cmd);
+		void impl_cgGet(Cmd &cmd);
+		void impl_cgStatus(Cmd &cmd);
+		void impl_objClear(Cmd &cmd);
+		void impl_createObj(Cmd &cmd);
+		void impl_gan(Cmd &cmd);
+		void impl_objSetPos(Cmd &cmd);
+		void impl_objAlpha(Cmd &cmd);
+		void impl_objShow(Cmd &cmd);
+		void impl_objColour(Cmd &cmd);
+		void impl_objComposite(Cmd &cmd);
+		void impl_objSetText(Cmd &cmd);
+		void impl_objTextOpts(Cmd &cmd);
+		void impl_objOrder(Cmd &cmd);
+		void impl_objDispArea(Cmd &cmd);
+		void impl_objSetDigits(Cmd &cmd);
+		void impl_objNumOpts(Cmd &cmd);
+		void impl_objPattNo(Cmd &cmd);
+		void impl_objScale(Cmd &cmd);
+		void impl_objRotate(Cmd &cmd);
+		void impl_objPosDims(Cmd &cmd);
+		void impl_refresh(Cmd &cmd);
+		void impl_bgmLoop(Cmd &cmd);
+		void impl_bgmStop(Cmd &cmd);
+		void impl_playWav(Cmd &cmd);
+		void impl_playSE(Cmd &cmd);
+		void impl_stopWav(Cmd &cmd);
+		void impl_SetVolMod(Cmd &cmd);
+		void impl_GetVolMod(Cmd &cmd);
+		void impl_koePlay(Cmd &cmd);
+		void impl_movPlay(Cmd &cmd);
+
+	public:
+		class AyuSysConfig *config;
+
+	private:
+		Event::Container& event;
+		const Flags& flags;
+		PicBase* screen;
+		PicBase* screen_front;
+		Surface* surface, *surface_update;
+
+		Surface* dsurface[MAXPDT]; // 書き込み可能な Surface
+		Surface* ssurface[MAXPDT]; // ファイルの内容等、読み込みのみ可能な状態の Surface
+		PicContainer& parent;
+
+		// 画像効果の保存用
+		WidAnmTime* anm1, *anm2;
+		typedef enum { NORMAL, WAIT_ANM, WAIT_SHAKE, WAIT_SE, WAIT_MOVIE} Status;
+		Status status;
+		SkipMode skip_mode;
+
+		std::string bg_name;
+		std::map<int, SEL> anmtype;
+		GrpObjMap grpobj;
+		GrpObjMap bs_obj;
+
+		std::map<std::string, int> cgm_info;
+		set<int>& cgm_data;
+		int cgm_size;
+
+		class MuSys *music;
+
+		std::set<int> changed_obj;
+		string reserved_load_surface0;
+		vector<PicBase*> deleted_pic;
+};
+
+
+/******************************************************************
+**
+**	class ScnGrp*
+*/
+/* Princess Bride: 背景画の一部のみ移動、の実装 */
+
+struct ScnGrpMove : public WidAnmTime {
+	Surface* dest;
+	Surface* src;
+	PicRoot& root;
+	Rect dest_r, from, to;
+	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);
+	void Exec(int count);
+};
+
+/* Princess Bride: カードがおちるアニメーション */
+
+struct ScnGrpAnmAtom {
+	string name;
+	int time;
+	ScnGrpAnmAtom(const char* _n, int _t) : name(_n), time(_t) {}
+};
+
+struct ScnGrpAnm : public WidAnmTime, vector<ScnGrpAnmAtom> {
+	Grp& owner;
+	ScnGrpAnm(Event::Container& container, PicBase* _pic, Grp& _owner) :
+		WidAnmTime(container, _pic, 0), owner(_owner) {
+	}
+	void CalcTotal(void);
+	void Exec(int count);
+};
+
+#endif