[Scummvm-cvs-logs] SF.net SVN: scummvm:[41335] tools/trunk

eriktorbjorn at users.sourceforge.net eriktorbjorn at users.sourceforge.net
Sun Jun 7 15:05:07 CEST 2009


Revision: 41335
          http://scummvm.svn.sourceforge.net/scummvm/?rev=41335&view=rev
Author:   eriktorbjorn
Date:     2009-06-07 13:05:06 +0000 (Sun, 07 Jun 2009)

Log Message:
-----------
Added my old Broken Sword 2 resource... thingy. At one point, I had big ideas
about being able to study the Broken Sword 2 data files, but all it does is to
present a tree view of their types and names. (This has been sitting in the
patch tracker for ages, and sev asked me to commit it.)

Modified Paths:
--------------
    tools/trunk/Makefile

Added Paths:
-----------
    tools/trunk/sword2_clue.cpp

Modified: tools/trunk/Makefile
===================================================================
--- tools/trunk/Makefile	2009-06-07 13:04:16 UTC (rev 41334)
+++ tools/trunk/Makefile	2009-06-07 13:05:06 UTC (rev 41335)
@@ -207,6 +207,8 @@
 tools_gui$(EXEEXT): tools_gui.o
 	$(CXX) $(LDFLAGS) -o $@ $+ `wx-config --libs`
 
+sword2_clue$(EXEEXT): sword2_clue.o util.o
+	$(CXX) $(LDFLAGS) -o $@ $+ `pkg-config --libs gtk+-2.0`
 
 clean:
 	rm -f *.o utils/*.o $(TARGETS)
@@ -214,6 +216,8 @@
 tools_gui.o: tools_gui.cpp tools_gui.h
 	$(CXX) $(CXXFLAGS) $(CPPFLAGS) `wx-config --cxxflags` -c tools_gui.cpp -o tools_gui.o
 
+sword2_clue.o: sword2_clue.cpp
+	$(CXX) $(CXXFLAGS) $(CPPFLAGS) `pkg-config --cflags gtk+-2.0` -c sword2_clue.cpp
 
 ######################################################################
 # The build rules follow - normally you should have no need to

Added: tools/trunk/sword2_clue.cpp
===================================================================
--- tools/trunk/sword2_clue.cpp	                        (rev 0)
+++ tools/trunk/sword2_clue.cpp	2009-06-07 13:05:06 UTC (rev 41335)
@@ -0,0 +1,420 @@
+/* clue - Extremely primitive "CLUster Explorer" for Broken Sword 2
+ * Copyright (C) 2006 The ScummVM project
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#include <gtk/gtk.h>
+
+#include "util.h"
+
+// The following cluster files are - to some extent - understood:
+//
+// carib1.clu
+//    247 ANIMATION_FILE resources
+//      7 SCREEN_FILE resources
+//     11 WALK_GRID_FILE resources
+//      7 RUN_LIST resources
+//     24 WAV_FILE resources
+// carib2.clu
+//    133 ANIMATION_FILE resources
+//     11 SCREEN_FILE resources
+//     13 WALK_GRID_FILE resources
+//     11 RUN_LIST resources
+//     30 WAV_FILE resources
+// carib3.clu
+//    174 ANIMATION_FILE resources
+//      5 SCREEN_FILE resources
+//      4 WALK_GRID_FILE resources
+//      5 RUN_LIST resources
+//     31 WAV_FILE resources
+// docks.clu
+//    216 ANIMATION_FILE resources
+//      4 SCREEN_FILE resources
+//      3 WALK_GRID_FILE resources
+//      4 RUN_LIST resources
+//     47 WAV_FILE resources
+//      1 PALETTE_FILE resource
+// general.clu
+//     62 ANIMATION_FILE resources
+//      7 SCREEN_FILE resources
+//      1 WALK_GRID_FILE resource
+//     89 MOUSE_FILE resources
+//      1 WAV_FILE resource
+//    159 ICON_FILE resources
+//      1 PALETTE_FILE resource
+// jungle.clu
+//    137 ANIMATION_FILE resources
+//      4 SCREEN_FILE resources
+//      6 WALK_GRID_FILE resources
+//      4 RUN_LIST resources
+//     10 WAV_FILE resources
+// paris.clu
+//    223 ANIMATION_FILE resources
+//      9 SCREEN_FILE resources
+//      8 WALK_GRID_FILE resources
+//      9 RUN_LIST resources
+//     44 WAV_FILE resources
+// players.clu
+//    143 ANIMATION_FILE resources
+//      2 RUN_LIST resources
+// pyramid1.clu
+//    189 ANIMATION_FILE resources
+//      4 SCREEN_FILE resources
+//     10 WALK_GRID_FILE resources
+//      4 RUN_LIST resources
+//     14 WAV_FILE resources
+//     30 PALETTE_FILE resources
+// pyramid2.clu
+//    124 ANIMATION_FILE resources
+//      6 SCREEN_FILE resources
+//      5 WALK_GRID_FILE resources
+//      6 RUN_LIST resources
+//     35 WAV_FILE resources
+//    130 PALETTE_FILE resources
+// quaramon.clu
+//    288 ANIMATION_FILE resources
+//      5 SCREEN_FILE resources
+//     16 WALK_GRID_FILE resources
+//      5 RUN_LIST resources
+//     23 WAV_FILE resources
+// scripts.clu
+//    905 GAME_OBJECT resources
+//      1 GLOBAL_VAR_FILE resource
+//     68 SCREEN_MANAGER resources
+// text.clu
+//    112 TEXT_FILE resources
+// warehous.clu
+//    174 ANIMATION_FILE resources
+//      5 SCREEN_FILE resources
+//      7 WALK_GRID_FILE resources
+//      5 RUN_LIST resources
+//     41 WAV_FILE resources
+//
+// The following files are NOT understood:
+//
+// credits.clu     - This is a text file, with some formatting information
+// font.clu        - Credits font?
+// music1.clu      - See compress_sword2.c
+// music2.clu      - See compress_sword2.c
+// speech1.clu     - See compress_sword2.c
+// speech2.clu     - See compress_sword2.c
+
+enum {
+	NAME_COLUMN,
+	SIZE_COLUMN,
+	TYPE_COLUMN,
+	POSITION_COLUMN,
+	LENGTH_COLUMN,
+	N_COLUMNS
+};
+
+enum {
+	ANIMATION_FILE		= 1,
+	SCREEN_FILE		= 2,
+	GAME_OBJECT		= 3,
+	WALK_GRID_FILE		= 4,
+	GLOBAL_VAR_FILE		= 5,
+	PARALLAX_FILE_null	= 6,
+	RUN_LIST		= 7,
+	TEXT_FILE		= 8,
+	SCREEN_MANAGER		= 9,
+	MOUSE_FILE		= 10,
+	WAV_FILE		= 11,
+	ICON_FILE		= 12,
+	PALETTE_FILE		= 13
+};
+
+void open_screen_file(char *filename, uint32 pos, uint32 len) {
+	g_message("Would open a screen file here");
+}
+
+const gchar *getType(byte type) {
+	switch (type) {
+	case ANIMATION_FILE:
+		return "Animation";
+	case SCREEN_FILE:
+		return "Screen";
+	case GAME_OBJECT:
+		return "Object";
+	case WALK_GRID_FILE:
+		return "Walk Grid";
+	case GLOBAL_VAR_FILE:
+		return "Global Variables";
+	case PARALLAX_FILE_null:
+		return "Parallax File (null";
+	case RUN_LIST:
+		return "Run List";
+	case TEXT_FILE:
+		return "Text File";
+	case SCREEN_MANAGER:
+		return "Screen Manager";
+	case MOUSE_FILE:
+		return "Mouse File";
+	case WAV_FILE:
+		return "WAV File";
+	case ICON_FILE:
+		return "Icon";
+	case PALETTE_FILE:
+		return "Palette";
+	default:
+		return "<unknown>";
+	}
+}
+
+void main_window_destroy_cb(GtkWidget *widget, gpointer data) {
+	gtk_main_quit();
+}
+
+gboolean tree_view_button_cb(GtkTreeView *view, GdkEventButton *event, gpointer data) {
+	gchar *filename = (gchar *)data;
+	GtkTreeSelection *selection;
+	GtkTreeIter iter;
+	GtkTreeModel *model;
+	gchar *name;
+	gint type, pos, len;
+
+	if (event->type != GDK_2BUTTON_PRESS || event->button != 1)
+		return FALSE;
+
+	selection = gtk_tree_view_get_selection(view);
+	if (!gtk_tree_selection_get_selected(selection, &model, &iter))
+		return FALSE;
+
+	gtk_tree_model_get(model, &iter,
+		NAME_COLUMN, &name,
+		TYPE_COLUMN, &type,
+		POSITION_COLUMN, &pos,
+		LENGTH_COLUMN, &len,
+		-1);
+
+	switch (type) {
+	case SCREEN_FILE:
+		open_screen_file(filename, pos, len);
+		return TRUE;
+
+	case ANIMATION_FILE:
+	case GAME_OBJECT:
+	case WALK_GRID_FILE:
+	case GLOBAL_VAR_FILE:
+	case PARALLAX_FILE_null:
+	case RUN_LIST:
+	case TEXT_FILE:
+	case SCREEN_MANAGER:
+	case MOUSE_FILE:
+	case WAV_FILE:
+	case ICON_FILE:
+	case PALETTE_FILE:
+		g_message("'%s' is in '%s' at position %d, length %d", name, filename, pos, len);
+		return TRUE;
+	default:
+		if (type != -1)
+			g_message("Unknown resource type: %d", type);
+		return FALSE;
+	}
+}
+
+gint compare_items(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer user_data) {
+	char *name1, *name2;
+
+	gtk_tree_model_get(model, a, NAME_COLUMN, &name1, -1);
+	gtk_tree_model_get(model, b, NAME_COLUMN, &name2, -1);
+
+	return strcmp(name1, name2);
+}
+
+gchar *make_size(uint32 len) {
+	static gchar size[10];
+
+	if (len >= 0x100000)
+		sprintf(size, "%0.1fM", (double)len / 0x100000);
+	else if (len >= 0x400)
+		sprintf(size, "%dK", len / 0x400);
+	else
+		sprintf(size, "%d", len);
+
+	return size;
+}
+
+int main(int argc, char *argv[]) {
+	GtkWidget *main_window, *scroll;
+	GtkWidget *treeview;
+	GtkTreeViewColumn *column;
+	GtkCellRenderer *name_renderer, *size_renderer;
+	GtkTreeStore *store;
+	GtkTreeIter categories[14];
+	GValue value = { 0, };
+	gint offset;
+	uint32 res_counts[14];
+	uint32 res_sizes[14];
+	int i;
+
+	FILE *in;
+	uint32 index_pos;
+	uint32 pos, len;
+
+	gtk_init(&argc, &argv);
+
+	if (argc != 2) {
+		printf("Usage: %s filename\n", argv[0]);
+		return EXIT_FAILURE;
+	}
+
+	in = fopen(argv[1], "rb");
+	if (!in) {
+		printf("Couldn't open %s for reading\n", argv[1]);
+		return EXIT_FAILURE;
+	}
+
+	/* Create the main window, scrollable in both directions */
+
+	main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+	gtk_window_set_title(GTK_WINDOW(main_window), "CLUster Explorer");
+	gtk_window_set_default_size(GTK_WINDOW(main_window), 400, 400);
+
+	g_signal_connect(G_OBJECT(main_window), "destroy", G_CALLBACK(main_window_destroy_cb), NULL);
+
+	scroll = gtk_scrolled_window_new(NULL, NULL);
+	gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scroll), GTK_SHADOW_ETCHED_IN);
+	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+
+	/* Create the tree view */
+
+	for (i = 0; i < ARRAYSIZE(res_counts); i++) {
+		res_counts[i] = 0;
+		res_sizes[i] = 0;
+	}
+
+	store = gtk_tree_store_new(N_COLUMNS,
+		G_TYPE_STRING,
+		G_TYPE_STRING,
+		G_TYPE_INT,
+		G_TYPE_INT,
+		G_TYPE_INT);
+
+	gtk_tree_sortable_set_default_sort_func(GTK_TREE_SORTABLE(store), compare_items, NULL, NULL);
+	gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(store), GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID, GTK_SORT_ASCENDING);
+
+	index_pos = readUint32LE(in);
+	fseek(in, index_pos, SEEK_SET);
+
+	for (;;) {
+		GtkTreeIter iter;
+		byte type;
+		gchar *utf8_name;
+		gchar name[34];
+		gchar *size;
+
+		pos = readUint32LE(in);
+		len = readUint32LE(in);
+
+		if (pos == EOF || len == EOF)
+			break;
+
+		size = make_size(len);
+
+		index_pos = ftell(in);
+
+		fseek(in, pos, SEEK_SET);
+
+		type = readByte(in);
+		readByte(in);				/* compType	*/
+		readUint32LE(in);			/* compSize	*/
+		readUint32LE(in);			/* decompSize	*/
+		fread(name, sizeof(name), 1, in);
+
+		/*
+		 * We need to convert from Latin-1 to UTF-8. Otherwise the text
+		 * "CAF\xC9" won't be displayed properly.
+		 */
+
+		utf8_name = g_convert(name, -1, "UTF-8", "ISO-8859-1", NULL, NULL, NULL);
+
+		if (!res_counts[type]) {
+			gtk_tree_store_append(store, &categories[type], NULL);
+			gtk_tree_store_set(store, &categories[type],
+				NAME_COLUMN, getType(type),
+				SIZE_COLUMN, "",
+				TYPE_COLUMN, -1,
+				POSITION_COLUMN, -1,
+				LENGTH_COLUMN, -1,
+				-1);
+		}
+
+		res_counts[type]++;
+		res_sizes[type] += len;
+		gtk_tree_store_append(store, &iter, &categories[type]);
+		gtk_tree_store_set(store, &iter,
+			NAME_COLUMN, utf8_name,
+			SIZE_COLUMN, size,
+			TYPE_COLUMN, type,
+			POSITION_COLUMN, pos,
+			LENGTH_COLUMN, len);
+
+		fseek(in, index_pos, SEEK_SET);
+	}
+
+	fclose(in);
+
+	for (i = 0; i < ARRAYSIZE(res_counts); i++) {
+		if (res_counts[i]) {
+			gchar size[80];
+
+			sprintf(size, "%s [%d]", make_size(res_sizes[i]), res_counts[i]);
+			gtk_tree_store_set(store, &categories[i],
+				SIZE_COLUMN, size,
+				-1);
+		}
+	}
+
+	treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
+	gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), TRUE);
+
+	g_signal_connect(G_OBJECT(treeview), "button-press-event", G_CALLBACK(tree_view_button_cb), argv[1]);
+
+	/* The view now holds a reference. We can get rid of our own. */
+	g_object_unref(G_OBJECT(store));
+
+	name_renderer = gtk_cell_renderer_text_new();
+	size_renderer = gtk_cell_renderer_text_new();
+
+	g_value_init(&value, G_TYPE_FLOAT);
+	g_value_set_float(&value, 1.0);
+	g_object_set_property(G_OBJECT(size_renderer), "xalign", &value);
+
+	gtk_tree_view_insert_column_with_attributes(
+		GTK_TREE_VIEW(treeview), -1, "Name", name_renderer,
+		"text", NAME_COLUMN,
+		NULL);
+
+	offset = gtk_tree_view_insert_column_with_attributes(
+		GTK_TREE_VIEW(treeview), -1, "Size", size_renderer,
+		"text", SIZE_COLUMN,
+		NULL);
+	column = gtk_tree_view_get_column(GTK_TREE_VIEW(treeview), offset - 1);
+	gtk_tree_view_column_set_alignment(column, 1.0);
+
+	gtk_container_add(GTK_CONTAINER(scroll), GTK_WIDGET(treeview));
+	gtk_container_add(GTK_CONTAINER(main_window), scroll);
+	gtk_widget_show_all(GTK_WIDGET(main_window));
+	gtk_main();
+
+	return EXIT_SUCCESS;
+}


Property changes on: tools/trunk/sword2_clue.cpp
___________________________________________________________________
Added: svn:mime-type
   + text/plain
Added: svn:keywords
   + Date Rev Author URL Id
Added: svn:eol-style
   + native


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list