diff scn2k/scn2k_text.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 6d9146f56ccf
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/scn2k/scn2k_text.h
@@ -0,0 +1,246 @@
+/*
+ * 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);
+};
+
+#endif