view scn2k/scn2k_grp.h @ 57:6d9146f56ccf

* Move some opcodes * Merge last changes from xclannad
author Thibaut GIRKA <thib@sitedethib.com>
date Sat, 14 Nov 2009 23:31:51 +0100
parents c7bcc0ec2267
children e16e13d8cd68
line wrap: on
line source

/*
 * 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