[Scummvm-git-logs] scummvm-tools master -> 02bd02cc3306964f53a798a46549d95a49b03d21

mgerhardy noreply at scummvm.org
Fri Jan 13 17:27:54 UTC 2023


This automated email contains information about 4 new commits which have been
pushed to the 'scummvm-tools' repo located at https://github.com/scummvm/scummvm-tools .

Summary:
ae7cb1fb8d TWINE: removed offsets from output
f407bada72 TWINE: print scene details
ecfb5d62c4 TWINE: started lba2 scene support
02bd02cc33 NEWS: added detwine note


Commit: ae7cb1fb8df513acd11ec0ae760d69928d042315
    https://github.com/scummvm/scummvm-tools/commit/ae7cb1fb8df513acd11ec0ae760d69928d042315
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2023-01-12T20:02:46+01:00

Commit Message:
TWINE: removed offsets from output

Changed paths:
    engines/twine/lba1.cpp


diff --git a/engines/twine/lba1.cpp b/engines/twine/lba1.cpp
index d48d44fe..ea46c04f 100644
--- a/engines/twine/lba1.cpp
+++ b/engines/twine/lba1.cpp
@@ -459,9 +459,9 @@ static void lSNIF(ScriptContext &ctx) {
 	printf("%*sSWITCH_NO_IF ", ctx.level, " ");
 	const int32 valueSize = processLifeConditions(ctx);
 	processLifeOperators(ctx, valueSize);
+	printf("\n");
 	const int16 offset = ctx.stream.readSint16LE();
 	ctx.offsets.push_back(offset);
-	printf(" (offset %i)\n", offset);
 	ctx.level += indentWidth;
 }
 
@@ -471,7 +471,7 @@ static void lNEVERIF(ScriptContext &ctx) {
 	processLifeOperators(ctx, valueSize);
 	const int16 offset = ctx.stream.readSint16LE();
 	ctx.offsets.push_back(offset);
-	printf(" (offset %i)\n", offset);
+	printf("\n");
 	ctx.level += indentWidth;
 }
 
@@ -480,7 +480,7 @@ static void lOR_IF(ScriptContext &ctx) {
 	const int32 valueSize = processLifeConditions(ctx);
 	processLifeOperators(ctx, valueSize);
 	const int16 offset = ctx.stream.readSint16LE();
-	printf(" (offset %i)\n", offset);
+	printf("\n");
 }
 
 static void lNO_IF(ScriptContext &ctx) {
@@ -494,7 +494,7 @@ static void lIF(ScriptContext &ctx) {
 	processLifeOperators(ctx, valueSize);
 	const int16 offset = ctx.stream.readSint16LE();
 	ctx.offsets.push_back(offset);
-	printf(" (offset %i)\n", offset);
+	printf("\n");
 	ctx.level += indentWidth;
 }
 
@@ -504,7 +504,7 @@ static void lSWIF(ScriptContext &ctx) {
 	processLifeOperators(ctx, valueSize);
 	const int16 offset = ctx.stream.readSint16LE();
 	ctx.offsets.push_back(offset);
-	printf(" (offset %i)\n", offset);
+	printf("\n");
 	ctx.level += indentWidth;
 }
 
@@ -514,7 +514,7 @@ static void lONEIF(ScriptContext &ctx) {
 	processLifeOperators(ctx, valueSize);
 	const int16 offset = ctx.stream.readSint16LE();
 	ctx.offsets.push_back(offset);
-	printf(" (offset %i)\n", offset);
+	printf("\n");
 	ctx.level += indentWidth;
 }
 


Commit: f407bada72fdcb7746a900dcfd45fd13c5f180f0
    https://github.com/scummvm/scummvm-tools/commit/f407bada72fdcb7746a900dcfd45fd13c5f180f0
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2023-01-12T20:44:45+01:00

Commit Message:
TWINE: print scene details

Changed paths:
    engines/twine/detwine.cpp
    engines/twine/lba1.cpp


diff --git a/engines/twine/detwine.cpp b/engines/twine/detwine.cpp
index c000701e..3ee407de 100644
--- a/engines/twine/detwine.cpp
+++ b/engines/twine/detwine.cpp
@@ -76,6 +76,7 @@ int main(int argc, char **argv) {
 		return 127;
 	}
 
+	printf("Scene %i\n", index);
 	if (variant == 1) {
 		return decompileLBA1(data, size);
 	}
diff --git a/engines/twine/lba1.cpp b/engines/twine/lba1.cpp
index ea46c04f..06b297f3 100644
--- a/engines/twine/lba1.cpp
+++ b/engines/twine/lba1.cpp
@@ -27,12 +27,16 @@
 #include "common/util.h"
 #include "common/memstream.h"
 
+static const int initialLevel = 3;
+static const int indentWidth = 2;
+
 struct ScriptContext {
+	ScriptContext(const uint8* data, int size) : stream(data, size) {}
 	Common::MemoryReadStream stream;
 	Common::Array<int> offsets;
-	int level;
-	int comportmentId;
-	bool comportement;
+	int level = initialLevel;
+	int comportmentId = 0;
+	bool comportment = false;
 };
 
 typedef void ScriptFunc(ScriptContext &ctx);
@@ -45,9 +49,6 @@ struct ScriptFunction {
 #define MAPFUNC(name, func) \
 	{ name, func }
 
-static const int initialLevel = 2;
-static const int indentWidth = 2;
-
 static void mEND(ScriptContext &ctx) {
 	printf("%*sEND\n", ctx.level, " ");
 }
@@ -295,126 +296,125 @@ static int32 processLifeConditions(ScriptContext &ctx) {
 	int32 conditionOpcode = ctx.stream.readByte();
 	switch (conditionOpcode) {
 	case kcCOL:
-		printf("collision");
+		printf("COLLISION");
 		break;
 	case kcCOL_OBJ: {
 		int32 actorIdx = ctx.stream.readByte();
-		printf("col_obj %i", actorIdx);
+		printf("COL_OBJ %i", actorIdx);
 		break;
 	}
 	case kcDISTANCE: {
 		int32 actorIdx = ctx.stream.readByte();
-		printf("distance %i", actorIdx);
+		printf("DISTANCE %i", actorIdx);
 		conditionValueSize = 2;
 		break;
 	}
 	case kcZONE:
-		printf("zone");
+		printf("ZONE");
 		break;
 	case kcZONE_OBJ: {
 		int32 actorIdx = ctx.stream.readByte();
-		printf("zone_obj %i", actorIdx);
+		printf("ZONE_OBJ %i", actorIdx);
 		break;
 	}
 	case kcBODY:
-		printf("body");
+		printf("BODY");
 		break;
 	case kcBODY_OBJ: {
 		int32 actorIdx = ctx.stream.readByte();
-		printf("body_obj %i", actorIdx);
+		printf("BODY_OBJ %i", actorIdx);
 		break;
 	}
 	case kcANIM:
-		printf("anim");
+		printf("ANIM");
 		break;
 	case kcANIM_OBJ: {
 		int32 actorIdx = ctx.stream.readByte();
-		printf("anim_obj %i", actorIdx);
+		printf("ANIM_OBJ %i", actorIdx);
 		break;
 	}
 	case kcL_TRACK:
-		printf("track");
+		printf("TRACK");
 		break;
 	case kcL_TRACK_OBJ: {
 		int32 actorIdx = ctx.stream.readByte();
-		printf("track_obj %i", actorIdx);
+		printf("TRACK_OBJ %i", actorIdx);
 		break;
 	}
 	case kcFLAG_CUBE: {
 		int32 flagIdx = ctx.stream.readByte();
-		printf("flag_cube %i", flagIdx);
+		printf("FLAG_CUBE %i", flagIdx);
 		break;
 	}
 	case kcCONE_VIEW: {
 		int32 targetActorIdx = ctx.stream.readByte();
-		printf("cone_view %i", targetActorIdx);
+		printf("CONE_VIEW %i", targetActorIdx);
 		break;
 	}
 	case kcHIT_BY:
-		printf("hit_by");
+		printf("HIT_BY");
 		break;
 	case kcACTION:
-		printf("action");
+		printf("ACTION");
 		break;
 	case kcFLAG_GAME: {
 		int32 flagIdx = ctx.stream.readByte();
-		printf("flag_game %i", flagIdx);
+		printf("FLAG_GAME %i", flagIdx);
 		break;
 	}
 	case kcLIFE_POINT:
-		printf("life_point");
+		printf("LIFE_POINT");
 		break;
 	case kcLIFE_POINT_OBJ: {
 		int32 actorIdx = ctx.stream.readByte();
-		printf("life_point_obj %i", actorIdx);
+		printf("LIFE_POINT_OBJ %i", actorIdx);
 		break;
 	}
 	case kcNUM_LITTLE_KEYS:
-		printf("num_little_keys");
+		printf("NUM_LITTLE_KEYS");
 		break;
 	case kcNUM_GOLD_PIECES:
-		printf("num_gold_pieces");
+		printf("NUM_GOLD_PIECES");
 		conditionValueSize = 2;
 		break;
 	case kcBEHAVIOUR:
-		printf("behaviour");
+		printf("BEHAVIOUR");
 		break;
 	case kcCHAPTER:
-		printf("chapter");
+		printf("CHAPTER");
 		break;
 	case kcDISTANCE_3D: {
 		int32 targetActorIdx = ctx.stream.readByte();
-		printf("distance_3d %i ", targetActorIdx);
+		printf("DISTANCE_3D %i ", targetActorIdx);
 		conditionValueSize = 2;
 		break;
 	}
 	case kcMAGIC_LEVEL:
-		printf("magic_level");
+		printf("MAGIC_LEVEL");
 		break;
 	case kcMAGIC_POINTS:
-		printf("magic_points");
+		printf("MAGIC_POINTS");
 		break;
 	case kcUSE_INVENTORY: {
 		int32 item = ctx.stream.readByte();
-		printf("use_inventory %i", item);
+		printf("USE_INVENTORY %i", item);
 		break;
 	}
 	case kcCHOICE:
-		printf("choice");
+		printf("CHOICE");
 		conditionValueSize = 2;
 		break;
 	case kcFUEL:
-		printf("fuel");
+		printf("FUEL");
 		break;
 	case kcCARRIED_BY:
-		printf("carried_by");
+		printf("CARRIED_BY");
 		break;
 	case kcCDROM:
-		printf("cdrom");
+		printf("CDROM");
 		break;
 	default:
 		error("Actor condition opcode %d", conditionOpcode);
-		break;
 	}
 
 	return conditionValueSize;
@@ -455,32 +455,29 @@ static void lOFFSET(ScriptContext &ctx) {
 	printf("%*sOFFSET %i\n", ctx.level, " ", (int)offset);
 }
 
-static void lSNIF(ScriptContext &ctx) {
-	printf("%*sSWITCH_NO_IF ", ctx.level, " ");
+static void lJUMPGeneric(const char *name, ScriptContext &ctx) {
+	printf("%*s%s ", ctx.level, " ", name);
 	const int32 valueSize = processLifeConditions(ctx);
 	processLifeOperators(ctx, valueSize);
-	printf("\n");
 	const int16 offset = ctx.stream.readSint16LE();
 	ctx.offsets.push_back(offset);
+	printf("\n");
+}
+
+static void lSNIF(ScriptContext &ctx) {
+	lJUMPGeneric("SWITCH_NO_IF", ctx);
 	ctx.level += indentWidth;
 }
 
 static void lNEVERIF(ScriptContext &ctx) {
-	printf("%*sNEVER_IF ", ctx.level, " ");
-	const int32 valueSize = processLifeConditions(ctx);
-	processLifeOperators(ctx, valueSize);
-	const int16 offset = ctx.stream.readSint16LE();
-	ctx.offsets.push_back(offset);
-	printf("\n");
+	lJUMPGeneric("NEVER_IF", ctx);
 	ctx.level += indentWidth;
 }
 
 static void lOR_IF(ScriptContext &ctx) {
-	printf("%*sOR_IF ", ctx.level, " ");
-	const int32 valueSize = processLifeConditions(ctx);
-	processLifeOperators(ctx, valueSize);
-	const int16 offset = ctx.stream.readSint16LE();
-	printf("\n");
+	lJUMPGeneric("OR_IF", ctx);
+	// OR_IF belongs to IF and shares the same jump offset
+	ctx.offsets.pop_back();
 }
 
 static void lNO_IF(ScriptContext &ctx) {
@@ -489,40 +486,25 @@ static void lNO_IF(ScriptContext &ctx) {
 }
 
 static void lIF(ScriptContext &ctx) {
-	printf("%*sIF ", ctx.level, " ");
-	const int32 valueSize = processLifeConditions(ctx);
-	processLifeOperators(ctx, valueSize);
-	const int16 offset = ctx.stream.readSint16LE();
-	ctx.offsets.push_back(offset);
-	printf("\n");
+	lJUMPGeneric("IF", ctx);
 	ctx.level += indentWidth;
 }
 
 static void lSWIF(ScriptContext &ctx) {
-	printf("%*sSWITCH_IF ", ctx.level, " ");
-	const int32 valueSize = processLifeConditions(ctx);
-	processLifeOperators(ctx, valueSize);
-	const int16 offset = ctx.stream.readSint16LE();
-	ctx.offsets.push_back(offset);
-	printf("\n");
+	lJUMPGeneric("SWITCH_IF", ctx);
 	ctx.level += indentWidth;
 }
 
 static void lONEIF(ScriptContext &ctx) {
-	printf("%*sONEIF ", ctx.level, " ");
-	const int32 valueSize = processLifeConditions(ctx);
-	processLifeOperators(ctx, valueSize);
-	const int16 offset = ctx.stream.readSint16LE();
-	ctx.offsets.push_back(offset);
-	printf("\n");
+	lJUMPGeneric("ONEIF", ctx);
 	ctx.level += indentWidth;
 }
 
 static void lELSE(ScriptContext &ctx) {
-	const int16 offset = ctx.stream.readSint16LE();
+	/*const int16 offset =*/ ctx.stream.readSint16LE();
 	ctx.offsets.push_back(ctx.stream.pos());
 	ctx.level -= indentWidth;
-	printf("%*sELSE (offset %i)\n", ctx.level, " ", offset);
+	printf("%*sELSE\n", ctx.level, " ");
 	ctx.level += indentWidth;
 }
 
@@ -623,24 +605,24 @@ static void lSET_FLAG_CUBE(ScriptContext &ctx) {
 	printf("%*sSET_FLAG_CUBE %i %i\n", ctx.level, " ", (int)flagIdx, (int)flagValue);
 }
 
-static void lCOMPORTEMENT(ScriptContext &ctx) {
-	printf("%*sCOMPORTEMENT %i\n", ctx.level, " ", (int)ctx.stream.readByte());
+static void lCOMPORTMENT(ScriptContext &ctx) {
+	printf("%*sCOMPORTMENT %i\n", ctx.level, " ", (int)ctx.stream.readByte());
 }
 
-static void lSET_COMPORTEMENT(ScriptContext &ctx) {
-	printf("%*sSET_COMPORTEMENT %i\n", ctx.level, " ", (int)ctx.stream.readSint16LE());
+static void lSET_COMPORTMENT(ScriptContext &ctx) {
+	printf("%*sSET_COMPORTMENT %i\n", ctx.level, " ", (int)ctx.stream.readSint16LE());
 }
 
-static void lSET_COMPORTEMENT_OBJ(ScriptContext &ctx) {
+static void lSET_COMPORTMENT_OBJ(ScriptContext &ctx) {
 	const int32 otherActorIdx = ctx.stream.readByte();
 	const int16 pos = ctx.stream.readSint16LE();
-	printf("%*sSET_COMPORTEMENT_OBJ %i %i\n", ctx.level, " ", (int)otherActorIdx, (int)pos);
+	printf("%*sSET_COMPORTMENT_OBJ %i %i\n", ctx.level, " ", (int)otherActorIdx, (int)pos);
 }
 
-static void lEND_COMPORTEMENT(ScriptContext &ctx) {
+static void lEND_COMPORTMENT(ScriptContext &ctx) {
 	ctx.level -= indentWidth;
-	printf("%*sEND_COMPORTEMENT\n", ctx.level, " ");
-	ctx.comportement = false;
+	printf("%*sEND_COMPORTMENT\n", ctx.level, " ");
+	ctx.comportment = false;
 }
 
 static void lSET_FLAG_GAME(ScriptContext &ctx) {
@@ -1004,10 +986,10 @@ static const ScriptFunction lifeScriptFunctions[] = {
 	/*0x1D*/ MAPFUNC("CAM_FOLLOW", lCAM_FOLLOW),
 	/*0x1E*/ MAPFUNC("SET_BEHAVIOUR", lSET_BEHAVIOUR),
 	/*0x1F*/ MAPFUNC("SET_FLAG_CUBE", lSET_FLAG_CUBE),
-	/*0x20*/ MAPFUNC("COMPORTEMENT", lCOMPORTEMENT),
-	/*0x21*/ MAPFUNC("SET_COMPORTEMENT", lSET_COMPORTEMENT),
-	/*0x22*/ MAPFUNC("SET_COMPORTEMENT_OBJ", lSET_COMPORTEMENT_OBJ),
-	/*0x23*/ MAPFUNC("END_COMPORTEMENT", lEND_COMPORTEMENT),
+	/*0x20*/ MAPFUNC("COMPORTMENT", lCOMPORTMENT),
+	/*0x21*/ MAPFUNC("SET_COMPORTMENT", lSET_COMPORTMENT),
+	/*0x22*/ MAPFUNC("SET_COMPORTMENT_OBJ", lSET_COMPORTMENT_OBJ),
+	/*0x23*/ MAPFUNC("END_COMPORTMENT", lEND_COMPORTMENT),
 	/*0x24*/ MAPFUNC("SET_FLAG_GAME", lSET_FLAG_GAME),
 	/*0x25*/ MAPFUNC("KILL_OBJ", lKILL_OBJ),
 	/*0x26*/ MAPFUNC("SUICIDE", lSUICIDE),
@@ -1081,10 +1063,7 @@ static const ScriptFunction lifeScriptFunctions[] = {
 };
 
 static int decompileLBA1MoveScript(int actorIdx, const uint8 *data, int16 size) {
-	Common::MemoryReadStream stream(data, size);
-	ScriptContext ctx{stream, {}, initialLevel, 0};
-
-	printf("Actor %i\n", actorIdx);
+	ScriptContext ctx(data, size);
 
 	while (ctx.stream.pos() < ctx.stream.size()) {
 		const byte scriptOpcode = ctx.stream.readByte();
@@ -1100,21 +1079,20 @@ static int decompileLBA1MoveScript(int actorIdx, const uint8 *data, int16 size)
 }
 
 static int decompileLBA1LifeScript(int actorIdx, const uint8 *data, int16 size) {
-	Common::MemoryReadStream stream(data, size);
-	ScriptContext ctx{stream, {}, initialLevel, 0, true};
-
-	printf("Actor %i\n", actorIdx);
+	ScriptContext ctx(data, size);
 
 	printf("%*sCOMPORTMENT main\n", ctx.level, " ");
 	ctx.level += indentWidth;
+	ctx.comportment = true;
+
 	while (ctx.stream.pos() < ctx.stream.size()) {
 		const byte scriptOpcode = ctx.stream.readByte();
 		if (scriptOpcode < ARRAYSIZE(lifeScriptFunctions)) {
-			if (scriptOpcode && !ctx.comportement) {
+			if (scriptOpcode && !ctx.comportment) {
 				++ctx.comportmentId;
-				printf("%*sCOMPORTEMENT %i\n", ctx.level, " ", ctx.comportmentId);
+				printf("%*sCOMPORTMENT %i\n", ctx.level, " ", ctx.comportmentId);
 				ctx.level += indentWidth;
-				ctx.comportement = true;
+				ctx.comportment = true;
 			}
 			lifeScriptFunctions[scriptOpcode].function(ctx);
 			while (!ctx.offsets.empty()) {
@@ -1137,11 +1115,11 @@ static int decompileLBA1LifeScript(int actorIdx, const uint8 *data, int16 size)
 
 int decompileLBA1(const uint8 *data, int size) {
 	Common::MemoryReadStream stream(data, size);
-	uint8_t sceneTextBank = stream.readByte();
-	uint8_t currentGameOverScene = stream.readByte();
+	uint8 sceneTextBank = stream.readByte();
+	uint8 currentGameOverScene = stream.readByte();
 	stream.skip(4);
-	int16 _alphaLight = (int16)stream.readUint16LE();
-	int16 _betaLight = (int16)stream.readUint16LE();
+	int16 alphaLight = (int16)stream.readUint16LE();
+	int16 betaLight = (int16)stream.readUint16LE();
 
 	uint16 sampleAmbiance[4];
 	uint16 sampleRepeat[4];
@@ -1162,19 +1140,22 @@ int decompileLBA1(const uint8 *data, int size) {
 	int16 sceneHeroPosy = (int16)stream.readUint16LE();
 	int16 sceneHeroPosz = (int16)stream.readUint16LE();
 
+	printf("Actor 0\n");
 	int16 moveScriptSize = (int16)stream.readUint16LE();
+	printf(" - move script: %i\n", (int)moveScriptSize);
 	const uint8 *moveScript = data + stream.pos();
 	stream.skip(moveScriptSize);
 	decompileLBA1MoveScript(0, moveScript, moveScriptSize);
 
 	int16 lifeScriptSize = (int16)stream.readUint16LE();
+	printf(" - life script: %i\n", (int)lifeScriptSize);
 	const uint8 *lifeScript = data + stream.pos();
 	stream.skip(lifeScriptSize);
 	decompileLBA1LifeScript(0, lifeScript, lifeScriptSize);
 
 	int16 sceneNumActors = (int16)stream.readUint16LE();
-	int cnt = 1;
-	for (int32 a = 1; a < sceneNumActors; a++, cnt++) {
+	for (int32 a = 1; a < sceneNumActors; a++) {
+		printf("\n");
 		uint16 staticflags = stream.readUint16LE();
 		uint16 body = stream.readUint16LE();
 		uint8 genBody = stream.readByte();
@@ -1197,12 +1178,37 @@ int decompileLBA1(const uint8 *data, int size) {
 		uint8 armor = stream.readByte();
 		uint8 lifePoints = stream.readByte();
 
+		printf("Actor %i\n", a);
+		printf(" - staticflags: %i\n", (int)staticflags);
+		printf(" - body: %i\n", (int)body);
+		printf(" - genBody: %i\n", (int)genBody);
+		printf(" - genAnim: %i\n", (int)genAnim);
+		printf(" - sprite: %i\n", (int)sprite);
+		printf(" - posx: %i\n", (int)posx);
+		printf(" - posy: %i\n", (int)posy);
+		printf(" - posz: %i\n", (int)posz);
+		printf(" - strengthOfHit: %i\n", (int)strengthOfHit);
+		printf(" - bonusflags: %i\n", (int)bonusflags);
+		printf(" - beta: %i\n", (int)beta);
+		printf(" - speed: %i\n", (int)speed);
+		printf(" - controlMode: %i\n", (int)controlMode);
+		printf(" - cropLeft: %i\n", (int)cropLeft);
+		printf(" - cropTop: %i\n", (int)cropTop);
+		printf(" - cropRight: %i\n", (int)cropRight);
+		printf(" - cropBottom: %i\n", (int)cropBottom);
+		printf(" - bonusAmount: %i\n", (int)bonusAmount);
+		printf(" - talkColor: %i\n", (int)talkColor);
+		printf(" - armor: %i\n", (int)armor);
+		printf(" - lifePoints: %i\n", (int)lifePoints);
+
 		moveScriptSize = (int16)stream.readUint16LE();
+		printf(" - move script: %i\n", (int)moveScriptSize);
 		moveScript = data + stream.pos();
 		stream.skip(moveScriptSize);
 		decompileLBA1MoveScript(a, moveScript, moveScriptSize);
 
 		lifeScriptSize = (int16)stream.readUint16LE();
+		printf(" - life script: %i\n", (int)lifeScriptSize);
 		lifeScript = data + stream.pos();
 		stream.skip(lifeScriptSize);
 		decompileLBA1LifeScript(a, lifeScript, lifeScriptSize);
@@ -1213,27 +1219,56 @@ int decompileLBA1(const uint8 *data, int size) {
 		int16 zoneminsx = stream.readSint16LE();
 		int16 zoneminsy = stream.readSint16LE();
 		int16 zoneminsz = stream.readSint16LE();
-
 		int16 zonemaxsx = stream.readSint16LE();
 		int16 zonemaxsy = stream.readSint16LE();
 		int16 zonemaxsz = stream.readSint16LE();
-
 		uint16 zonetype = stream.readUint16LE();
 		int16 zonenum = stream.readSint16LE();
-
 		int16 info0 = stream.readSint16LE();
 		int16 info1 = stream.readSint16LE();
 		int16 info2 = stream.readSint16LE();
 		int16 info3 = stream.readSint16LE();
+		printf("Zone: %i\n", i);
+		printf(" - zoneminsx: %i\n", zoneminsx);
+		printf(" - zoneminsy: %i\n", zoneminsy);
+		printf(" - zoneminsz: %i\n", zoneminsz);
+		printf(" - zonemaxsx: %i\n", zonemaxsx);
+		printf(" - zonemaxsy: %i\n", zonemaxsy);
+		printf(" - zonemaxsz: %i\n", zonemaxsz);
+		printf(" - zonetype: %i\n", zonetype);
+		printf(" - zonenum: %i\n", zonenum);
+		printf(" - info0: %i\n", info0);
+		printf(" - info1: %i\n", info1);
+		printf(" - info2: %i\n", info2);
+		printf(" - info3: %i\n", info3);
 	}
 
 	uint16 sceneNumTracks = stream.readUint16LE();
 	for (uint16 i = 0; i < sceneNumTracks; i++) {
+		printf("Track: %i\n", i);
 		int16 pointx = stream.readSint16LE();
 		int16 pointy = stream.readSint16LE();
 		int16 pointz = stream.readSint16LE();
+		printf(" - pointx: %i\n", pointx);
+		printf(" - pointy: %i\n", pointy);
+		printf(" - pointz: %i\n", pointz);
 	}
 
+	printf("Scene\n");
+	printf(" - sceneTextBank: %i\n", sceneTextBank);
+	printf(" - currentGameOverScene: %i\n", currentGameOverScene);
+	printf(" - alphaLight: %i\n", alphaLight);
+	printf(" - betaLight: %i\n", betaLight);
+	printf(" - sampleAmbiance: %i %i %i %i\n", sampleAmbiance[0], sampleAmbiance[1], sampleAmbiance[2], sampleAmbiance[3]);
+	printf(" - sampleRepeat: %i %i %i %i\n", sampleRepeat[0], sampleRepeat[1], sampleRepeat[2], sampleRepeat[3]);
+	printf(" - sampleRound: %i %i %i %i\n", sampleRound[0], sampleRound[1], sampleRound[2], sampleRound[3]);
+	printf(" - sampleMinDelay: %i\n", sampleMinDelay);
+	printf(" - sampleMinDelayRnd: %i\n", sampleMinDelayRnd);
+	printf(" - sceneMusic: %i\n", sceneMusic);
+	printf(" - sceneHeroPosx: %i\n", sceneHeroPosx);
+	printf(" - sceneHeroPosy: %i\n", sceneHeroPosy);
+	printf(" - sceneHeroPosz: %i\n", sceneHeroPosz);
+
 	if (stream.err()) {
 		return 1;
 	}


Commit: ecfb5d62c4e4d3f57a4dbfa1972a93e6afa9f5a8
    https://github.com/scummvm/scummvm-tools/commit/ecfb5d62c4e4d3f57a4dbfa1972a93e6afa9f5a8
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2023-01-12T21:00:46+01:00

Commit Message:
TWINE: started lba2 scene support

Changed paths:
  A engines/twine/shared.h
    engines/twine/lba1.cpp
    engines/twine/lba2.cpp


diff --git a/engines/twine/lba1.cpp b/engines/twine/lba1.cpp
index 06b297f3..e2751425 100644
--- a/engines/twine/lba1.cpp
+++ b/engines/twine/lba1.cpp
@@ -20,34 +20,7 @@
  */
 
 #include "engines/twine/lba1.h"
-#include <stdio.h>
-#include <string.h>
-
-#include "common/array.h"
-#include "common/util.h"
-#include "common/memstream.h"
-
-static const int initialLevel = 3;
-static const int indentWidth = 2;
-
-struct ScriptContext {
-	ScriptContext(const uint8* data, int size) : stream(data, size) {}
-	Common::MemoryReadStream stream;
-	Common::Array<int> offsets;
-	int level = initialLevel;
-	int comportmentId = 0;
-	bool comportment = false;
-};
-
-typedef void ScriptFunc(ScriptContext &ctx);
-
-struct ScriptFunction {
-	const char *name;
-	ScriptFunc *function;
-};
-
-#define MAPFUNC(name, func) \
-	{ name, func }
+#include "engines/twine/shared.h"
 
 static void mEND(ScriptContext &ctx) {
 	printf("%*sEND\n", ctx.level, " ");
@@ -1245,10 +1218,10 @@ int decompileLBA1(const uint8 *data, int size) {
 
 	uint16 sceneNumTracks = stream.readUint16LE();
 	for (uint16 i = 0; i < sceneNumTracks; i++) {
-		printf("Track: %i\n", i);
 		int16 pointx = stream.readSint16LE();
 		int16 pointy = stream.readSint16LE();
 		int16 pointz = stream.readSint16LE();
+		printf("Track: %i\n", i);
 		printf(" - pointx: %i\n", pointx);
 		printf(" - pointy: %i\n", pointy);
 		printf(" - pointz: %i\n", pointz);
diff --git a/engines/twine/lba2.cpp b/engines/twine/lba2.cpp
index 1b10b4b3..a9791db3 100644
--- a/engines/twine/lba2.cpp
+++ b/engines/twine/lba2.cpp
@@ -20,18 +20,210 @@
  */
 
 #include "engines/twine/lba2.h"
-#include "common/memstream.h"
+#include "engines/twine/shared.h"
 
-// static int decompileLBA2MoveScript(int actor, const uint8 *moveScript, int16 moveScriptSize) {
-// 	return 0;
-// }
+static int decompileLBA2MoveScript(int actor, const uint8 *moveScript, int16 moveScriptSize) {
+	return 0;
+}
 
-// static int decompileLBA2LifeScript(int actor, const uint8 *moveScript, int16 moveScriptSize) {
-// 	return 0;
-// }
+static int decompileLBA2LifeScript(int actor, const uint8 *moveScript, int16 moveScriptSize) {
+	return 0;
+}
 
 int decompileLBA2(const uint8 *data, int size) {
 	Common::MemoryReadStream stream(data, size);
+
+	uint8 sceneTextBank = stream.readByte();
+	uint8 currentGameOverScene = stream.readByte();
+	stream.skip(4);
+
+	int16 alphaLight = stream.readSint16LE();
+	int16 betaLight = stream.readSint16LE();
+
+	uint8 isOutsideScene = stream.readByte();
+
+	uint16 sampleAmbiance[4];
+	uint16 sampleRepeat[4];
+	uint16 sampleRound[4];
+	uint16 sampleFrequency[4];
+	uint16 sampleVolume[4];
+
+	for (int i = 0; i < 4; ++i) {
+		sampleAmbiance[i] = stream.readUint16LE();
+		sampleRepeat[i] = stream.readUint16LE();
+		sampleRound[i] = stream.readUint16LE();
+		sampleFrequency[i] = stream.readUint16LE();
+		sampleVolume[i] = stream.readUint16LE();
+	}
+
+	uint16 sampleMinDelay = stream.readUint16LE();
+	uint16 sampleMinDelayRnd = stream.readUint16LE();
+
+	uint8 sceneMusic = stream.readByte();
+
+	// load hero properties
+	int16 sceneHeroPosx = stream.readSint16LE();
+	int16 sceneHeroPosy = stream.readSint16LE();
+	int16 sceneHeroPosz = stream.readSint16LE();
+
+	printf("Actor 0\n");
+
+	int16 moveScriptSize = stream.readSint16LE();
+	printf(" - move script: %i\n", (int)moveScriptSize);
+	const uint8 *moveScript = data + stream.pos();
+	stream.skip(moveScriptSize);
+	decompileLBA2MoveScript(0, moveScript, moveScriptSize);
+
+	int16 lifeScriptSize = stream.readSint16LE();
+	printf(" - life script: %i\n", (int)lifeScriptSize);
+	const uint8 *lifeScript = data + stream.pos();
+	stream.skip(lifeScriptSize);
+	decompileLBA2LifeScript(0, lifeScript, lifeScriptSize);
+
+	int16 sceneNumActors = stream.readSint16LE();
+	for (int32 a = 1; a < sceneNumActors; a++) {
+		printf("\n");
+		uint32 staticflags = stream.readUint32LE();
+		int16 body = stream.readSint16LE();
+		int16 genBody = stream.readSint16LE();
+		uint8 genAnim = stream.readByte();
+		int16 sprite = stream.readSint16LE();
+		int16 posx = stream.readSint16LE();
+		int16 posy = stream.readSint16LE();
+		int16 posz = stream.readSint16LE();
+		uint8 strengthOfHit = stream.readByte();
+		uint16 dynamicFlags = stream.readUint16LE();
+		uint16 beta = stream.readSint16LE();
+		uint16 speed = stream.readSint16LE();
+		uint8 controlMode = stream.readByte();
+		int16 cropLeft = stream.readSint16LE();
+		int16 cropTop = stream.readSint16LE();
+		int16 cropRight = stream.readSint16LE();
+		int16 cropBottom = stream.readSint16LE();
+		int16 bonusAmount = stream.readSint16LE();
+		uint8 talkColor = stream.readByte();
+		printf("Actor %i\n", a);
+		if (staticflags & 0x040000) { // bHasSpriteAnim3D
+			int32 spriteAnim3DNumber = stream.readSint32LE();
+			int16 spriteSizeHit = stream.readSint16LE();
+			printf(" - spriteAnim3DNumber: %i\n", (int)spriteAnim3DNumber);
+			printf(" - spriteSizeHit: %i\n", (int)spriteSizeHit);
+		}
+		uint8 armor = stream.readByte();
+		uint8 lifePoints = stream.readByte();
+
+		printf(" - staticflags: %i\n", (int)staticflags);
+		printf(" - body: %i\n", (int)body);
+		printf(" - genBody: %i\n", (int)genBody);
+		printf(" - genAnim: %i\n", (int)genAnim);
+		printf(" - sprite: %i\n", (int)sprite);
+		printf(" - posx: %i\n", (int)posx);
+		printf(" - posy: %i\n", (int)posy);
+		printf(" - posz: %i\n", (int)posz);
+		printf(" - strengthOfHit: %i\n", (int)strengthOfHit);
+		printf(" - dynamicFlags: %i\n", (int)dynamicFlags);
+		printf(" - beta: %i\n", (int)beta);
+		printf(" - speed: %i\n", (int)speed);
+		printf(" - controlMode: %i\n", (int)controlMode);
+		printf(" - cropLeft: %i\n", (int)cropLeft);
+		printf(" - cropTop: %i\n", (int)cropTop);
+		printf(" - cropRight: %i\n", (int)cropRight);
+		printf(" - cropBottom: %i\n", (int)cropBottom);
+		printf(" - bonusAmount: %i\n", (int)bonusAmount);
+		printf(" - talkColor: %i\n", (int)talkColor);
+		printf(" - armor: %i\n", (int)armor);
+		printf(" - lifePoints: %i\n", (int)lifePoints);
+
+		moveScriptSize = (int16)stream.readUint16LE();
+		printf(" - move script: %i\n", (int)moveScriptSize);
+		moveScript = data + stream.pos();
+		stream.skip(moveScriptSize);
+		decompileLBA2MoveScript(0, moveScript, moveScriptSize);
+
+		lifeScriptSize = (int16)stream.readUint16LE();
+		printf(" - life script: %i\n", (int)lifeScriptSize);
+		lifeScript = data + stream.pos();
+		stream.skip(lifeScriptSize);
+		decompileLBA2LifeScript(0, lifeScript, lifeScriptSize);
+	}
+
+	int16 sceneNumZones = stream.readSint16LE();
+	for (int32 i = 0; i < sceneNumZones; i++) {
+		int32 zoneminsx = stream.readSint32LE();
+		int32 zoneminsy = stream.readSint32LE();
+		int32 zoneminsz = stream.readSint32LE();
+		int32 zonemaxsx = stream.readSint32LE();
+		int32 zonemaxsy = stream.readSint32LE();
+		int32 zonemaxsz = stream.readSint32LE();
+		int32 info0 = stream.readSint32LE();
+		int32 info1 = stream.readSint32LE();
+		int32 info2 = stream.readSint32LE();
+		int32 info3 = stream.readSint32LE();
+		int32 info4 = stream.readSint32LE();
+		int32 info5 = stream.readSint32LE();
+		int32 info6 = stream.readSint32LE();
+		int32 info7 = stream.readSint32LE();
+		uint16 zonetype = stream.readUint16LE();
+		int16 zonenum = stream.readSint16LE();
+		printf("Zone: %i\n", i);
+		printf(" - zoneminsx: %i\n", zoneminsx);
+		printf(" - zoneminsy: %i\n", zoneminsy);
+		printf(" - zoneminsz: %i\n", zoneminsz);
+		printf(" - zonemaxsx: %i\n", zonemaxsx);
+		printf(" - zonemaxsy: %i\n", zonemaxsy);
+		printf(" - zonemaxsz: %i\n", zonemaxsz);
+		printf(" - zonetype: %i\n", zonetype);
+		printf(" - zonenum: %i\n", zonenum);
+		printf(" - info0: %i\n", info0);
+		printf(" - info1: %i\n", info1);
+		printf(" - info2: %i\n", info2);
+		printf(" - info3: %i\n", info3);
+		printf(" - info4: %i\n", info4);
+		printf(" - info5: %i\n", info5);
+		printf(" - info6: %i\n", info6);
+		printf(" - info7: %i\n", info7);
+		printf(" - zonetype: %i\n", zonetype);
+		printf(" - zonenum: %i\n", zonenum);
+	}
+
+	int16 sceneNumTracks = stream.readSint16LE();
+	for (int16 i = 0; i < sceneNumTracks; i++) {
+		int32 pointx = stream.readSint32LE();
+		int32 pointy = stream.readSint32LE();
+		int32 pointz = stream.readSint32LE();
+		printf("Track: %i\n", i);
+		printf(" - pointx: %i\n", pointx);
+		printf(" - pointy: %i\n", pointy);
+		printf(" - pointz: %i\n", pointz);
+	}
+
+	uint16 sceneNumPatches = stream.readUint16LE();
+	for (uint16 i = 0; i < sceneNumPatches; i++) {
+		uint16 psize = stream.readUint16LE();
+		uint16 poffset = stream.readUint16LE();
+		printf("Patch: %i\n", i);
+		printf(" - size: %u\n", psize);
+		printf(" - offset: %u\n", poffset);
+	}
+
+	printf("Scene\n");
+	printf(" - sceneTextBank: %i\n", sceneTextBank);
+	printf(" - isOutsideScene: %i\n", isOutsideScene);
+	printf(" - currentGameOverScene: %i\n", currentGameOverScene);
+	printf(" - alphaLight: %i\n", alphaLight);
+	printf(" - betaLight: %i\n", betaLight);
+	printf(" - sampleFrequency: %i %i %i %i\n", sampleFrequency[0], sampleFrequency[1], sampleFrequency[2], sampleFrequency[3]);
+	printf(" - sampleVolume: %i %i %i %i\n", sampleVolume[0], sampleVolume[1], sampleVolume[2], sampleVolume[3]);
+	printf(" - sampleAmbiance: %i %i %i %i\n", sampleAmbiance[0], sampleAmbiance[1], sampleAmbiance[2], sampleAmbiance[3]);
+	printf(" - sampleRepeat: %i %i %i %i\n", sampleRepeat[0], sampleRepeat[1], sampleRepeat[2], sampleRepeat[3]);
+	printf(" - sampleRound: %i %i %i %i\n", sampleRound[0], sampleRound[1], sampleRound[2], sampleRound[3]);
+	printf(" - sampleMinDelay: %i\n", sampleMinDelay);
+	printf(" - sampleMinDelayRnd: %i\n", sampleMinDelayRnd);
+	printf(" - sceneMusic: %i\n", sceneMusic);
+	printf(" - sceneHeroPosx: %i\n", sceneHeroPosx);
+	printf(" - sceneHeroPosy: %i\n", sceneHeroPosy);
+	printf(" - sceneHeroPosz: %i\n", sceneHeroPosz);
+
 	if (stream.err()) {
 		return 1;
 	}
diff --git a/engines/twine/shared.h b/engines/twine/shared.h
new file mode 100644
index 00000000..b7a61222
--- /dev/null
+++ b/engines/twine/shared.h
@@ -0,0 +1,54 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * 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 3 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, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef TWINE_SHARED_H
+#define TWINE_SHARED_H
+
+#include <stdio.h>
+#include <string.h>
+
+#include "common/array.h"
+#include "common/util.h"
+#include "common/memstream.h"
+
+static const int initialLevel = 3;
+static const int indentWidth = 2;
+
+struct ScriptContext {
+	ScriptContext(const uint8* data, int size) : stream(data, size) {}
+	Common::MemoryReadStream stream;
+	Common::Array<int> offsets;
+	int level = initialLevel;
+	int comportmentId = 0;
+	bool comportment = false;
+};
+
+typedef void ScriptFunc(ScriptContext &ctx);
+
+struct ScriptFunction {
+	const char *name;
+	ScriptFunc *function;
+};
+
+#define MAPFUNC(name, func) \
+	{ name, func }
+
+#endif
\ No newline at end of file


Commit: 02bd02cc3306964f53a798a46549d95a49b03d21
    https://github.com/scummvm/scummvm-tools/commit/02bd02cc3306964f53a798a46549d95a49b03d21
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2023-01-13T18:27:45+01:00

Commit Message:
NEWS: added detwine note

Changed paths:
    NEWS


diff --git a/NEWS b/NEWS
index 41498a51..fd1bca34 100644
--- a/NEWS
+++ b/NEWS
@@ -10,6 +10,7 @@ For a more comprehensive changelog of the latest experimental code, see:
  - MADS: A new tool to extract Rex nebular installer.
  - Added tool for extracting SAGA resources.
  - GOB: Adibou 2 scripts support in degob.
+ - Added tool to decompile lba1 scene scripts
 
 2.6.0 (2022-08-01)
  - The project license has been upgraded to GPLv3+.




More information about the Scummvm-git-logs mailing list