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

dreammaster at users.sourceforge.net dreammaster at users.sourceforge.net
Fri Jun 22 14:22:17 CEST 2007


Revision: 27601
          http://scummvm.svn.sourceforge.net/scummvm/?rev=27601&view=rev
Author:   dreammaster
Date:     2007-06-22 05:19:59 -0700 (Fri, 22 Jun 2007)

Log Message:
-----------
Added missing scripts and animations for remainder of game, as well as missing fields from room data structures

Modified Paths:
--------------
    scummvm/trunk/tools/create_lure/create_lure_dat.cpp
    scummvm/trunk/tools/create_lure/create_lure_dat.h
    scummvm/trunk/tools/create_lure/process_actions.cpp

Modified: scummvm/trunk/tools/create_lure/create_lure_dat.cpp
===================================================================
--- scummvm/trunk/tools/create_lure/create_lure_dat.cpp	2007-06-22 09:27:13 UTC (rev 27600)
+++ scummvm/trunk/tools/create_lure/create_lure_dat.cpp	2007-06-22 12:19:59 UTC (rev 27601)
@@ -121,7 +121,6 @@
 
 		if ((FROM_LE_16(headerEntry.offset) != 0) && 
 			(FROM_LE_16(headerEntry.offset) != 0xffff) &&
-			(FROM_LE_16(headerEntry.roomNumber) != 0xc09) && 
 			(FROM_LE_16(headerEntry.roomNumber) != 0)) {
 			// Store offset of room entry
 			*offsetPtr++ = TO_LE_16(offset);
@@ -129,11 +128,10 @@
 			// Copy over basic room details
 			lure_exe.seek(DATA_SEGMENT + headerEntry.offset);
 			lure_exe.read(&buffer, sizeof(RoomResource));
-
 			RoomResourceOutput *rec = (RoomResourceOutput *) (data + offset);
 			rec->hdrFlags = headerEntry.hdrFlags;
 			rec->actions = FROM_LE_32(buffer.actions);
-			rec->roomNumber = headerEntry.roomNumber;
+			rec->roomNumber = index; 
 			rec->descId = headerEntry.descId;
 			rec->numLayers = buffer.numLayers;
 			memcpy(rec->layers, buffer.layers, 8);
@@ -141,6 +139,8 @@
 			rec->clippingXStart = TO_LE_16(FROM_LE_16(buffer.clippingXStart) - 0x80);
 			rec->clippingXEnd = (FROM_LE_16(buffer.clippingXEnd) == 0) ? 0 : 
 			  TO_LE_16(FROM_LE_16(buffer.clippingXEnd) - 0x80);
+			rec->exitTime = FROM_LE_32(buffer.exitTime);
+			rec->areaFlag = buffer.areaFlag;
 			rec->numExits = 0;
 
 			offset += sizeof(RoomResourceOutput);
@@ -283,10 +283,15 @@
 				r->roomNumber = TO_LE_16(28);
 
 			// Find the walk-to coordinates for the hotspot
+			uint16 findId = FROM_LE_16(r->hotspotId);
 			walkCtr = 0;
-			while ((walkCtr < walkNumEntries) &&
-				   (FROM_LE_16(walkList[walkCtr].hotspotId) != FROM_LE_16(r->hotspotId)))
+			while (walkCtr < walkNumEntries) {
+				uint16 id = FROM_LE_16(walkList[walkCtr].hotspotId);
+				if ((id == findId) || ((findId == 1007) && (id == 0xffff)))
+					break;
 				++walkCtr;
+			}
+					
 			if (walkCtr == walkNumEntries) {
 				r->walkX = 0;
 				r->walkY = 0;
@@ -473,11 +478,33 @@
 
 void read_anim_data(byte *&data, uint16 &totalSize) {
 	// Add special pixel records
-	add_anim_record(0x5c95);
-	add_anim_record(0x5ce9);		// Blacksmith in bar?
+	add_anim_record(0x55C0);		// Player midswing animation
+	add_anim_record(0x55C9);		// Player mid-level defend
+	add_anim_record(0x55D2);		// Player high-level strike
+	add_anim_record(0x55DB);		// Player high-level defend
+	add_anim_record(0x55E4);		// Player low-level strike
+	add_anim_record(0x55ED);		// Player low-level defend
+	add_anim_record(0x55F6);		// Player fight animation
+	add_anim_record(0x55FF);		// Pig fight animation
+	add_anim_record(0x5611);		// Player mid-level strike
+	add_anim_record(0x5623);		// Pig fight animation
+	add_anim_record(0x562C);		// Misc fight animation
+	add_anim_record(0x5635);		// Pig fight animation
+	add_anim_record(0x563E);		// Player recoiling from hit
+	add_anim_record(0x5647);		// Pig recoiling from hit
+	add_anim_record(0x5650);		// Pig dies
 	add_anim_record(0x5915);		// Blacksmith hammering
 	add_anim_record(0x59ED);		// Ewan's alternate animation
+	add_anim_record(0x59FF);		// Dragon breathing fire
+	add_anim_record(0x5A08);		// Dragon breathing fire 2
+	add_anim_record(0x5A11);		// Dragon breathing fire 3
+	add_anim_record(0x5A1A);		// Player turning winch in room #48
+	add_anim_record(0x5A59);		// Player pulling lever in room #48
+	add_anim_record(0x5A62);		// Minnow pulling lever in room #48
+	add_anim_record(0x5AAA);		// Goewin mixing potion
+	add_anim_record(0x5C95);
 	add_anim_record(0x5CAA);		// Selena animation
+	add_anim_record(0x5CE9);		// Blacksmith in bar?
 	add_anim_record(0x5D28);		// Goewin animation
 
 	// Get the animation data records
@@ -881,32 +908,40 @@
 {
 	// Read in the exit coordinates list	
 	int roomNum, entryNum;
+	uint16 x, y;
+	RoomExitCoordinateEntryInputResource dataIn;
 
-	totalSize = EXIT_COORDINATES_NUM_ROOMS * sizeof(RoomExitCoordinateEntryResource) + 2; 
+	totalSize = EXIT_COORDINATES_NUM_ROOMS * sizeof(RoomExitCoordinateEntryOutputResource) + 2; 
 	data = (byte *) malloc(totalSize);
 	lure_exe.seek(DATA_SEGMENT + EXIT_COORDINATES_OFFSET);
-	lure_exe.read(data, totalSize - 2);
 	WRITE_LE_UINT16(data + totalSize - 2, 0xffff);
 
 	// Post process the list to adjust data
-	RoomExitCoordinateEntryResource *rec = (RoomExitCoordinateEntryResource *) data;
+	RoomExitCoordinateEntryOutputResource *rec = (RoomExitCoordinateEntryOutputResource *) data;
 	for (roomNum = 1; roomNum <= EXIT_COORDINATES_NUM_ROOMS; ++roomNum, ++rec) {
+		lure_exe.read(&dataIn, sizeof(RoomExitCoordinateEntryInputResource));
+
 		for (entryNum = 0; entryNum < ROOM_EXIT_COORDINATES_NUM_ENTRIES; ++entryNum) {
-			if ((rec->entries[entryNum].x != 0) || (rec->entries[entryNum].y != 0)) {
-				rec->entries[entryNum].x = TO_LE_16(FROM_LE_16(rec->entries[entryNum].x) - 0x80);
-				uint16 tempY = FROM_LE_16(rec->entries[entryNum].y);
-				rec->entries[entryNum].y = TO_LE_16(
-					((tempY & 0xfff) - 0x80) | (tempY & 0xf000));
+			x = FROM_LE_16(dataIn.entries[entryNum].x);
+			y = FROM_LE_16(dataIn.entries[entryNum].y);
+			if ((x != 0) || (y != 0)) {
+				x -= 0x80;
+				y = ((y & 0xfff) - 0x80) | (y & 0xf000);
 			}
+
+			RoomExitCoordinateResource *p = &rec->entries[entryNum];
+			p->x = TO_LE_16(x);
+			p->y = TO_LE_16(y);
+			p->roomNumber = dataIn.entries[entryNum].roomNumber;
 		}
 
 		for (entryNum = 0; entryNum < ROOM_EXIT_COORDINATES_ENTRY_NUM_ROOMS; ++entryNum) {
-			rec->roomIndex[entryNum] = TO_LE_16(FROM_LE_16(rec->roomIndex[entryNum]) / 6);
+			rec->roomIndex[entryNum] = TO_LE_16(FROM_LE_16(dataIn.roomIndex[entryNum]) / 6);
 		}
 
-		// Bugfix for the original game data to get to room #27 via rooms #10 or #11 
+		// WORKAROUND: Bugfix for the original game data to get to room #27 via rooms #10 or #11 
 		if ((roomNum == 10) || (roomNum == 11))
-			rec->roomIndex[26] = 1;
+			rec->roomIndex[26] = TO_LE_16(1);
 	}
 }
 
@@ -928,6 +963,14 @@
 	totalSize += sizeof(uint16);
 }
 
+void save_fight_segment(byte *&data, uint16 &totalSize) {
+	lure_exe.seek(FIGHT_SEGMENT);
+	
+	totalSize = FIGHT_SEGMENT_SIZE;
+	data = (byte *) malloc(totalSize);
+	lure_exe.read(data, totalSize);
+}
+
 #define NUM_TEXT_ENTRIES 40
 const char *text_strings[NUM_TEXT_ENTRIES] = {
 	"Get", NULL, "Push", "Pull", "Operate", "Open", "Close", "Lock", "Unlock", "Use", 
@@ -1075,6 +1118,11 @@
 		break;
 
 	case 21:
+		// Save the fight segment data
+		save_fight_segment(data, size);
+		break;
+
+	case 22:
 		// Set up the list of text strings used by the game
 		save_text_strings(data, size);
 		break;

Modified: scummvm/trunk/tools/create_lure/create_lure_dat.h
===================================================================
--- scummvm/trunk/tools/create_lure/create_lure_dat.h	2007-06-22 09:27:13 UTC (rev 27600)
+++ scummvm/trunk/tools/create_lure/create_lure_dat.h	2007-06-22 12:19:59 UTC (rev 27601)
@@ -30,7 +30,7 @@
 #include "common/endian.h"
 
 #define VERSION_MAJOR 1
-#define VERSION_MINOR 19
+#define VERSION_MINOR 20
 #define ENGLISH_LURE 
 
 #define DATA_SEGMENT 0xac50
@@ -53,6 +53,8 @@
 #define SCRIPT_SEGMENT_SIZE 0x2c57
 #define SCRIPT2_SEGMENT 0x19c70
 #define SCRIPT2_SEGMENT_SIZE 0x2800
+#define FIGHT_SEGMENT 0x1C400
+#define FIGHT_SEGMENT_SIZE 0x1850
 
 #define HOTSPOT_SCRIPT_LIST 0x57e0
 #define HOTSPOT_SCRIPT_SIZE 0x30
@@ -200,7 +202,8 @@
 	byte numLayers;
 	uint16 layers[4];
 	uint16 sequenceOffset;
-	byte unknown2[5];
+	uint32 exitTime;
+	uint8 areaFlag;
 	uint8 walkBoundsIndex;
 	int16 clippingXStart;
 	int16 clippingXEnd;
@@ -227,6 +230,8 @@
 	uint16 sequenceOffset;
 	int16 clippingXStart;
 	int16 clippingXEnd;
+	uint32 exitTime;
+	uint8 areaFlag;
 	RoomRectOut walkBounds;
 	uint16 numExits;
 };
@@ -343,11 +348,17 @@
 #define ROOM_EXIT_COORDINATES_NUM_ENTRIES 6
 #define ROOM_EXIT_COORDINATES_ENTRY_NUM_ROOMS 52
 
-struct RoomExitCoordinateEntryResource {
+struct RoomExitCoordinateEntryInputResource {
 	RoomExitCoordinateResource entries[ROOM_EXIT_COORDINATES_NUM_ENTRIES];
 	uint8 roomIndex[ROOM_EXIT_COORDINATES_ENTRY_NUM_ROOMS];
 };
 
+struct RoomExitCoordinateEntryOutputResource {
+	uint8 roomIndex[ROOM_EXIT_COORDINATES_ENTRY_NUM_ROOMS];
+	RoomExitCoordinateResource entries[ROOM_EXIT_COORDINATES_NUM_ENTRIES];
+};
+
+
 enum CurrentAction {NO_ACTION, START_WALKING, DISPATCH_ACTION, EXEC_HOTSPOT_SCRIPT, 
 	PROCESSING_PATH, WALKING};
 

Modified: scummvm/trunk/tools/create_lure/process_actions.cpp
===================================================================
--- scummvm/trunk/tools/create_lure/process_actions.cpp	2007-06-22 09:27:13 UTC (rev 27600)
+++ scummvm/trunk/tools/create_lure/process_actions.cpp	2007-06-22 12:19:59 UTC (rev 27601)
@@ -33,9 +33,9 @@
 	LOOK = 15, LOOK_AT = 16, LOOK_THROUGH = 17,	ASK = 18, DRINK = 20,
 	STATUS = 21, GO_TO = 22, RETURN = 23, BRIBE = 24, EXAMINE = 25,
 	NPC_SET_ROOM_AND_BLOCKED_OFFSET = 28, NPC_HEY_SIR = 29, NPC_EXEC_SCRIPT = 30, 
-	NPC_UNKNOWN2 = 31, NPC_SET_RAND_DEST = 32, NPC_WALKING_CHECK = 33, 
+	NPC_RESET_PAUSED_LIST = 31, NPC_SET_RAND_DEST = 32, NPC_WALKING_CHECK = 33, 
 	NPC_SET_SUPPORT_OFFSET = 34, NPC_SUPPORT_OFFSET_COND = 35, 
-	NPC_DISPATCH_ACTION = 36, NPC_UNKNOWN3 = 37, NPC_UNKNOWN4 = 38, 
+	NPC_DISPATCH_ACTION = 36, NPC_TALK_NPC_TO_NPC = 37, NPC_PAUSE = 38, 
 	NPC_START_TALKING = 39, NPC_JUMP_ADDRESS = 40,
 	NONE = 0
 };
@@ -365,11 +365,13 @@
 	// Handle required initial entries - the Lure engine refers to them directly by
 	// index, so they need to be first, and in that order
 #ifdef ENGLISH_LURE
-	process_entry(0x13c2, data, totalSize);
-	process_entry(0xbb95, data, totalSize);
-	process_entry(0x7060, data, totalSize);
-	process_entry(0x728a, data, totalSize);
-	process_entry(0x76ec, data, totalSize);
+	process_entry(0x13c2, data, totalSize);	  // RETURN sequence
+	process_entry(0xbb95, data, totalSize);	  // Exit blocked sequence
+	process_entry(0x7060, data, totalSize);   // Jump proc #2 - go to castle basement
+	process_entry(0x728a, data, totalSize);		
+	process_entry(0x76ec, data, totalSize);   
+	process_entry(0x4ebb, data, totalSize);	  // Goewin as a follower in cave
+	process_entry(0x7D9D, data, totalSize);	  // Goewin standard handler
 #endif
 
 	// Process the script engine list 


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