view scn2k/scn2k_text.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 0aaa5bb3dde5
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_TEXT_H__
#define __SCN2K_TEXT_H__

#include <vector>
#include <map>
#include <list>

#include "scn2k_cmd.h"

#include "window/event.h"
#include "window/picture.h"
#include "window/widget.h"

#include "font/text.h"

#include "system/system_config.h"

using namespace std;

void dprintf(const char* fmt, ...); //FIXME
void eprintf(const char* fmt, ...); //FIXME

// kanji conv : デバッグ表示用
void kconv(const unsigned char* src, unsigned char* dest);
void kconv_rev(const unsigned char* src, unsigned char* dest);
string kconv(const string& s);
string kconv_rev(const string& s);

/**************************************************************::
**
** TimerAtom
*/

struct TimerAtom {
	int from;
	int to;
	unsigned int start_time;
	unsigned int total_time;
};


/**************************************************************::
**
** BacklogItem
*/

struct BacklogItem {
	enum {SaveSelect = -2};
	int scn, pos;
	int koe;
	std::string face;
	struct TextStream text;
	BacklogItem(void);
	void Clear(void);
	void AddTextPos(Cmd&);
	void DeleteTextPos();
	void SetSavepos(int pos);
	BacklogItem& operator =(const BacklogItem&);
};

/**************************************************************::
**
** TextWindow
*/

struct TextWindow {
/* @@@ : SetWindowColor での surface 再設定に注意 */
	WidText* wid;
	bool name_visible;
	WidLabel* name;
	PicContainer* name_container;
	PicBase* face;
	PicBase* face_pics[8];
	TextWindow(PicContainer& parent, Event::Container& event, int window_no, void* callback);
	~TextWindow();
	Rect WakuSize(PicContainer& pic, int waku_no);
	void MakeWaku(PicContainer& pic, Event::Container& event, int waku_no,int window_no, bool* use_btn, void* callback);
	void show(void);
	void hide(void);
	void ShowFace(const char* path);
	void ResetFace(void);
	void StartText(const TextStream& _stream);
	void SetName(const char* n);
};

/**************************************************************::
**
** SaveFaceHash
*/

struct SaveFaceHash { // バックログセーブ時の顔画像管理を行う
	map<string, int> facetonum;
	typedef pair<string,int> Node;
	typedef list<Node> List;
	List container;
	int id_max;
	static int size_max;
	SaveFaceHash() : id_max(0) {}
	void NewNode(string face, int face_id);
	int Add(string face);
	string Get(int num);
};


/**************************************************************::
**
** Text
*/

class Text : public CommandHandler {
	public:
		Text(Event::Container& _event, PicContainer& _parent);
		~Text();
		void InitWindow(void);
		void Exec(Cmd& cmd);
		bool Wait(unsigned int current_time, Cmd& cmd);
		void SetSkipMode(SkipMode _mode);
		void hide(void);
		void show(void) { show(text_window_number); }
		void show(int num);
		void Save(std::string& str, bool select_save);
		void Load(const char* str);
		void DrawBacklog(BacklogItem& item, Cmd& cmd);

		static void PressFuncSkip(void* pointer, WidButton* from);
		static void PressFuncLoad(void* pointer, WidButton* from);
		static void PressFuncSave(void* pointer, WidButton* from);
		static void PressFuncBacklog(void* pointer, WidButton* from);
		static void PressFuncBacklogFwd(void* pointer, WidButton* from);

	private:
		void SetWindowColor(int r, int g, int b, int a, bool is_transparent);
		void SetTextSpeed(int new_speed);
		void SetTextWait(int new_wait);

		void CreateSelect(Cmd& cmd);
		void CreateSelBG(void);

		void AddText(const char* str);

		static void PressFuncButton(void* pointer, WidButton* from);
		static bool PressFunc(int x, int y, void* pointer);

		void SetCursor(int num);

	public:
		vector<BacklogItem> backlog;
		BacklogItem backlog_item;
		TextWindow* text;
		typedef enum {NORMAL=0, WAIT_TEXT=1, WAIT=2,
			WAIT_CLICK=3, WAIT_ABORT=4, WAIT_CLICK_MOUSEPOS = 5,
			WAIT_CLICK_MOUSEPOSEND_L = 6, WAIT_CLICK_MOUSEPOSEND_R = 7,
			WAIT_SELECT_INBOX = 10, WAIT_SELECT_OUTBOX=11, WAIT_SELECT_VALUE = 12,
			WAIT_EXTRN_MASK = 64, SAVEMASK = 128, LOADMASK = 256, SKIPMASK = 512,
			CLEARSCR_MASK = 1024, STATSAVE_MASK = 2048, CLEARSCR_WAIT_MASK=(1<<12),
			SKIPEND_MASK = (1<<13), BACKLOG_MASK=(1<<14), BACKLOG_MASK_FWD=(1<<15),
			BACKLOG_MASK_KOE=(1<<16), BACKLOG_WAIT_MASK=(1<<17),
			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)
		} Status;
		Status status, status_saved, status_mask;

	private:
		std::string ruby_text;
		bool ruby_text_flag;
		unsigned int wait_time;
		unsigned int old_time;
		unsigned int base_time;
		int text_window_number;
		bool text_parsing;
		TextStream text_stream;
		SkipMode skip_mode;
		int save_selectcount;

		std::map<int, TimerAtom> timer_var;
		std::vector<WidTextButton*> selects;
		std::vector<int> sel_backlog_pos;
		string replace_name[26];
		string replace_name2[26];
		PicContainer* sel_widget;
		PicWidget* backlog_widget;

		BacklogItem cur_backlog_item;
		BacklogItem drawn_backlog_item;

		TextWindow* widgets[32];
		WidTimeCursor* kcursor;
		Surface* sel_bg1;
		Surface* sel_bg2;
		Rect sel_bg_rect;

		VarInfo wait_savedvar[2];

		AyuSysConfig *config;

		Event::Container& event;
		PicContainer& parent;

		//Opcode handling
		void impl_txtClear(Cmd& cmd);
		void impl_logKoe(Cmd& cmd);
		void impl_pause(Cmd& cmd);
		void impl_br(Cmd& cmd);
		void impl_FaceOpen(Cmd& cmd);
		void impl_FaceClear(Cmd& cmd);
		void impl_doRuby(Cmd& cmd);
		void impl_TextWindow(Cmd& cmd);
		void impl_msgClear(Cmd& cmd);
		void impl_FastText(Cmd& cmd);
		void impl_createSelect(Cmd& cmd);
		void impl_ShowBackground(Cmd& cmd);
		void impl_SetSkipMode(Cmd& cmd);
		void impl_Wait(Cmd& cmd);
		void impl_GetClick(Cmd& cmd);
		void impl_ReadFrame(Cmd& cmd);
};

#endif