Jump to content

Recommended Posts

19 hours ago, kimchow said:

Skipped to 9.5 and went through most scenes. toris never starts the fisting scene. is there a command to get that?

I posted console commands for this a few pages back.

 

1 hour ago, Doobydoob said:

When is the next update for the Loverslab version of Thief coming out?

Haven't really been able to do any work on this stuff since the end of last month.

Link to comment

Problem with the dice game in madam's place.  the dice do not actually roll they just stay as a 2.  Anybody else have this happen?

 

also the patches you list where do i download them from?  and are they they same patches as before?  i still have those.

Link to comment
On 3/6/2021 at 4:41 AM, Mez558 said:

 

I don't know but I believe it is meant to be down to where you place the posters, going by what Toris says when you collect them.
 

  Reveal hidden contents

There is a variable hp_sw_brot RichShowGuestList_var that needs to be over 10 for it to work, if it is (I set it to 100 using the console) then Ormax's dialogue changes from him not carrying any extra coin to finding some in his pocket but the result was still the same from Toris. There is dialogue to suggest that something else should happen should they come up with 10gmarks.

 

I tried it out.

Place the ten posters near below NPCs, then you will get an achievement.

Fanar, Olaf, Tulvar, Bormir(bedroom), Ormax(bedroom), Kush, Vilgen(bedroom), Grunwald(the wall infront of him), Palamed, Huzei.

 

Link to comment

hmm, im having an odd issue and was wondering if someone could offer some assistance
I've downloaded and installed the latest version and all is working well, Except for the animations during the mini game segments
I noticed during the Rock Paper scissors game both my character and the opponent just T Posed for it

I didnt think much of it so I just did the usual, Run FNIS, but I still have them T Posing. its only during the minigame segment every other part of the mod so far has had animations.
is this a bug with the latest download version or something?

Link to comment
6 hours ago, lese8 said:

I tried it out.

Place the ten posters near below NPCs, then you will get an achievement.

Fanar, Olaf, Tulvar, Bormir(bedroom), Ormax(bedroom), Kush, Vilgen(bedroom), Grunwald(the wall infront of him), Palamed, Huzei.

 

 

Thanks for sharing that, I was going to do this myself after Dogma explained how to tell if you have the right one by the noise it plays (The sound of paper being unfurled is the noise I think he was referring to) Had a bug where I had infinite posters (remained at 10) but I was going to test my theory again and screen shot the locations. Might still do that.

Link to comment
On 3/4/2021 at 8:05 PM, SharpenedRock said:

Hi, so I am playing the SE public version. When I am trying to sneak the bards past the guy I cant signal them to move. Middle click doesn't do anything even when the guard is distracted. Does anyone have a clue how to fix or have a work around to get the bards in the city. ty

So unfortunately after trying multiple saves and retries I can't find a way to get the bards to move. I was wondering if anyone knows any console commands to get the bards into Solitude at least so I can at least do their in city content later. If not, I don't mind delving into the papyrus machine code if anyone could guide me through any necessary steps.

Link to comment
12 hours ago, SharpenedRock said:

So unfortunately after trying multiple saves and retries I can't find a way to get the bards to move. I was wondering if anyone knows any console commands to get the bards into Solitude at least so I can at least do their in city content later. If not, I don't mind delving into the papyrus machine code if anyone could guide me through any necessary steps.

The script that controls this minigame is bd_sol_01_table_mg_sc, which contains the var definition Int Signal_key = 258.

 

Probably the easiest thing to try first is to use setpqv bd_sq_sol Signal_key 57 after the minigame has started, which should change the key detection from <middle mouse> to <spacebar>.  If you want to use a different key, please reference this page for a list of key codes.  The current version of the code that I'm looking at (v1.1.1.0) has an MCM option to change this button, but in the case that your version doesn't this will hopefully work.

 

If you want to make a permanent change to the keycode used within the compiled script, the best way I've found of doing something like that is to reference this document which specifies the v3.0 compiled papyrus script format.  The following python script will perform a full parse of the compiled code and translate it to a human-readable format.  You will have to modify the file pointer to point to the correct script file, and you may need to modify the print statements to output to a file depending on the limitations of your console output.

 

Spoiler



import datetime
import os
import struct

def uint(chunk):
	return int.from_bytes(chunk, byteorder="big", signed=False)

def uint8(chunk, index):
	return index+1, uint(chunk[index:index+1])

def uint16(chunk, index):
	return index+2, uint(chunk[index:index+2])

def uint32(chunk, index):
	return index+4, uint(chunk[index:index+4])

def uint64(chunk, index):
	return index+8, uint(chunk[index:index+8])

def sint(chunk):
	return int.from_bytes(chunk, byteorder="big", signed=True)

def sint32(chunk, index):
	return index+4, sint(chunk[index:index+4])

def float(chunk, index):
	return index+4, struct.unpack('>f', chunk[index:index+4])

def strLen(chunk, index):
	return uint(chunk[index:index+2])

def string(chunk, index, len):
	return chunk[index:index+len].decode("utf-8")

def str(chunk, index):
	len = strLen(chunk, index)
	return index+2+len, string(chunk, index+2, len)

def indent(depth):
	space = ""
	for x in range(depth):
		space += "  "
	return space

class debugFunction:
	def __init__(self, objName, stateName, funcName, funcType, insCount, lineNums):
		self.objName = objName
		self.stateName = stateName
		self.funcName = funcName
		self.funcType = funcType
		self.insCount = insCount
		self.lineNums = lineNums
		print(f"debugFunction({objName}, {stateName}, {funcName}, {funcType}, {insCount}, {lineNums})")

	@staticmethod
	def parse(chunk, index, strTable):
		index, objName = uint16(chunk, index)
		index, stateName = uint16(chunk, index)
		index, funcName = uint16(chunk, index)
		index, funcType = uint8(chunk, index)
		index, insCount = uint16(chunk, index)
		lineNums = []
		for x in range(insCount):
			index, lineNum = uint16(chunk, index)
			lineNums.append(lineNum)
		return index, debugFunction(strTable[objName], strTable[stateName], strTable[funcName], funcType, insCount, lineNums)

class userFlag:
	def __init__(self, name, index):
		self.name = name
		self.flagIndex = index
		print(f"userFlag({name}, {index})")

	@staticmethod
	def parse(chunk, index, strTable):
		index, nameIdx = uint16(chunk, index)
		index, flagIdx = uint8(chunk, index)
		return index, userFlag(strTable[nameIdx], flagIdx)

class instruction:
	def __init__(self, op, args):
		self.op = op
		self.args = args
		print(f"instruction({op})")

	@staticmethod
	def parse(chunk, index, strTable):
		index, code = uint8(chunk, index)
		numArgs = 0
		args = []
		if code >= 0x01 and code <= 0x09:
			numArgs = 3
		if code >= 0x0A and code <= 0x0E:
			numArgs = 2
		if code >= 0x0F and code <= 0x13:
			numArgs = 3
		if code == 0x14 or code == 0x1A:
			numArgs = 1
		if code == 0x15 or code == 0x16:
			numArgs = 2
		if code == 0x17 or code == 0x19:
			index, v1 = varData.parse(chunk, index, strTable)
			args.append(v1)
			index, v2 = varData.parse(chunk, index, strTable)
			args.append(v2)
			index, v3 = varData.parse(chunk, index, strTable)
			args.append(v3)
			index, c = varData.parse(chunk, index, strTable)
			args.append(c)
			numArgs = c.data
			print(f"numArgs {numArgs}")
		if code == 0x18:
			index, v1 = varData.parse(chunk, index, strTable)
			args.append(v1)
			index, v2 = varData.parse(chunk, index, strTable)
			args.append(v2)
			index, c = varData.parse(chunk, index, strTable)
			args.append(c)
			numArgs = c.data
			print(f"numArgs {numArgs}")
		if code >= 0x1B and code <= 0x1D:
			numArgs = 3
		if code == 0x1E or code == 0x1F:
			numArgs = 2
		if code == 0x20 or code == 0x21:
			numArgs = 3
		if code == 0x22 or code == 0x23:
			numArgs = 4
		for x in range(numArgs):
			index, a = varData.parse(chunk, index, strTable)
			args.append(a)
		return index, instruction(code, args)

class varType:
	def __init__(self, name, type):
		self.name = name
		self.type = type
		print(f"varType({name}, {type})")

	@staticmethod
	def parse(chunk, index, strTable):
		index, nameIdx = uint16(chunk, index)
		#print(nameIdx)
		index, typeIdx = uint16(chunk, index)
		#print(typeIdx)
		return index, varType(strTable[nameIdx], strTable[typeIdx])

class function:
	def __init__(self, retType, doc, usrFlags, flags, numParams, params, numLocals, locals, numIns, ins):
		self.retType = retType
		self.doc = doc
		self.usrFlags = usrFlags
		self.flags = flags
		self.numParams = numParams
		self.params = params
		self.numLocals = numLocals
		self.locals = locals
		self.numIns = numIns
		self.ins = ins
		print(f"function({retType}, {doc}, {usrFlags}, {flags}, {numParams}, {numLocals}, {numIns})")

	@staticmethod
	def parse(chunk, index, strTable):
		index, retIdx = uint16(chunk, index)
		print(f"retType {strTable[retIdx]}")
		index, docIdx = uint16(chunk, index)
		index, usrFlags = uint32(chunk, index)
		index, flags = uint8(chunk, index)
		index, numParams = uint16(chunk, index)
		print(f"{numParams} params")
		params = []
		for x in range(numParams):
			index, p = varType.parse(chunk, index, strTable)
			params.append(p)
		index, numLocals = uint16(chunk, index)
		print(f"{numLocals} locals")
		locals = []
		for x in range(numLocals):
			index, l = varType.parse(chunk, index, strTable)
			locals.append(l)
		index, numIns = uint16(chunk, index)
		print(f"{numIns} instructions")
		ins = []
		for x in range(numIns):
			index, i = instruction.parse(chunk, index, strTable)
			ins.append(i)
		return index, function(strTable[retIdx], strTable[docIdx], usrFlags, flags, numParams, params, numLocals, locals, numIns, ins)

class namedFunc:
	def __init__(self, name, func):
		self.name = name
		self.func = func
		print(f"namedFunc({name})")

	@staticmethod
	def parse(chunk, index, strTable):
		index, nameIdx = uint16(chunk, index)
		print(f"namedFunc {strTable[nameIdx]}")
		index, f = function.parse(chunk, index, strTable)
		return index, namedFunc(strTable[nameIdx], f)

class state:
	def __init__(self, name, numFuncs, funcs):
		self.name = name
		self.numFuncs = numFuncs
		self.funcs = funcs
		print(f"state({name}, {numFuncs})")

	@staticmethod
	def parse(chunk, index, strTable):
		index, nameIdx = uint16(chunk, index)
		index, numFuncs = uint16(chunk, index)
		funcs = []
		for x in range(numFuncs):
			index, f = namedFunc.parse(chunk, index, strTable)
			funcs.append(f)
		return index, state(strTable[nameIdx], numFuncs, funcs)

class prop:
	def __init__(self, name, type, doc, usrFlags, flags, varName, read, write):
		self.name = name
		self.type = type
		self.doc = doc
		self.usrFlags = usrFlags
		self.flags = flags
		self.varName = varName
		self.read = read
		self.write = write
		print(f"prop({name}, {type}, {doc}, {usrFlags}, {flags}, {varName})")

	@staticmethod
	def parse(chunk, index, strTable):
		index, nameIdx = uint16(chunk, index)
		index, typeIdx = uint16(chunk, index)
		index, docIdx = uint16(chunk, index)
		index, usrFlags = uint32(chunk, index)
		index, flags = uint8(chunk, index)
		varName = None
		if flags & 4 != 0:
			index, varIdx = uint16(chunk, index)
			varName = strTable[varIdx]
		read = None
		if flags & 5 == 1:
			index, f = function.parse(chunk, index, strTable)
			read = f
		write = None
		if flags & 6 == 2:
			index, f = function.parse(chunk, index, strTable)
			write = f
		return index, prop(strTable[nameIdx], strTable[typeIdx], strTable[docIdx], usrFlags, flags, varName, read, write)

class varData:
	def __init__(self, type, data):
		self.type = type
		self.data = data
		print(f"varData({type}, {data})")

	@staticmethod
	def parse(chunk, index, strTable):
		index, type = uint8(chunk, index)
		data = None
		if type == 1 or type == 2:
			index, strIdx = uint16(chunk, index)
			data = strTable[strIdx]
		if type == 3:
			index, data = sint32(chunk, index)
		if type == 4:
			index, data = float(chunk, index)
		if type == 5:
			index, data = uint8(chunk, index)
		return index, varData(type, data)

class variable:
	def __init__(self, name, type, usrFlags, data):
		self.name = name
		self.type = type
		self.usrFlags = usrFlags
		self.data = data
		print(f"variable({name}, {type}, {usrFlags})")

	@staticmethod
	def parse(chunk, index, strTable):
		index, nameIdx = uint16(chunk, index)
		index, typeIdx = uint16(chunk, index)
		index, flags = uint32(chunk, index)
		index, data = varData.parse(chunk, index, strTable)
		return index, variable(strTable[nameIdx], strTable[typeIdx], flags, data)

class objectData:
	def __init__(self, parent, doc, usrFlags, stateName, numVars, vars, numProps, props, numStates, states):
		self.parent = parent
		self.doc = doc
		self.usrFlags = usrFlags
		self.stateName = stateName
		self.numVars = numVars
		self.vars = vars
		self.numProps = numProps
		self.props = props
		self.numStates = numStates
		self.states = states
		print(f"objectData({parent}, {doc}, {usrFlags}, {stateName}, {numVars}, {numProps}, {numStates})")

	@staticmethod
	def parse(chunk, index, strTable):
		index, parentIdx = uint16(chunk, index)
		index, docIdx = uint16(chunk, index)
		index, flags = uint32(chunk, index)
		index, sNameIdx = uint16(chunk, index)
		index, numVars = uint16(chunk, index)
		vars = []
		for x in range(numVars):
			index, v = variable.parse(chunk, index, strTable)
			vars.append(v)
		index, numProps = uint16(chunk, index)
		props = []
		for x in range(numProps):
			index, p = prop.parse(chunk, index, strTable)
			props.append(p)
		index, numStates = uint16(chunk, index)
		states = []
		for x in range(numStates):
			index, s = state.parse(chunk, index, strTable)
			states.append(s)
		return index, objectData(strTable[parentIdx], strTable[docIdx], flags, strTable[sNameIdx], numVars, vars, numProps, props, numStates, states)

class object:
	def __init__(self, name, size, data):
		self.name = name
		self.size = size
		self.data = data
		print(f"object({name}, {size})")

	@staticmethod
	def parse(chunk, index, strTable):
		index, nameIdx = uint16(chunk, index)
		index, size = uint32(chunk, index)
		index, data = objectData.parse(chunk, index, strTable)
		return index, object(strTable[nameIdx], size, data)

class Header:
	def __init__(self, chunk):
		index, self.magic = uint32(chunk, 0)
		if self.magic != 0xFA57C0DE:
			print("Bad header!")
		index, self.majVer = uint8(chunk, index)
		index, self.minVer = uint8(chunk, index)
		index, self.gameId = uint16(chunk, index)
		index, timeStamp = uint64(chunk, index)
		self.compTime = datetime.datetime.fromtimestamp(timeStamp)
		index, self.sourceFile = str(chunk, index)
		index, self.userName = str(chunk, index)
		index, self.mchnName = str(chunk, index)
		index, self.tableSize = uint16(chunk, index)
		self.strTable = []
		for x in range(self.tableSize):
			index, s = str(chunk, index)
			self.strTable.append(s)
		index, self.debugFlag = uint8(chunk, index)
		self.debugFuncs = []
		if self.debugFlag == 0x01:
			index, timeStamp = uint64(chunk, index)
			self.modTime = datetime.datetime.fromtimestamp(timeStamp)
			index, self.dbgCount = uint16(chunk, index)
			for x in range(self.dbgCount):
				index, d = debugFunction.parse(chunk, index, self.strTable)
				self.debugFuncs.append(d)
		index, self.flagCount = uint16(chunk, index)
		self.userFlags = []
		for x in range(self.flagCount):
			index, f = userFlag.parse(chunk, index, self.strTable)
		index, self.objCount = uint16(chunk, index)
		self.objects = []
		for x in range(self.objCount):
			index, o = object.parse(chunk, index, self.strTable)
			self.objects.append(o)

	def print(self):
		print(self.magic)
		print(self.majVer)
		print(self.minVer)
		print(self.gameId)
		print(self.compTime)
		print(self.sourceFile)
		print(self.userName)
		print(self.mchnName)
		print(self.tableSize)
		for x in range(0, self.tableSize):
			print(f"String {x}: {self.strTable[x]}")
		print(self.debugFlag)
		print(self.modTime)
		print(self.dbgCount)

path = "C:\\Program Files (x86)\\Steam\\steamapps\\common\\Skyrim\\Champollion\\compiled\\sf_hp_kustlq_farmersoutside_0308ef34.pex"
with open(path, "rb") as file:
	chunk = file.read(os.path.getsize(path))
	head = Header(chunk)
	head.print()

 

I have been able to use this code, the uesp page, and a hex editor to directly modify scripts in-place.  I think you'll need to have python 3.5 or better to run this code.

 

If all else fails, you can use the in-place papyrus modification tools to change the line var.bards_to_town_Signal = false in the function start_table_mini_game() to var.bards_to_town_Signal = true, and then make a patch in TES5Edit that changes all of the phase start conditions in scene bd_sq_sol_01_ikol_mg_scene that contain the condition Subject.GetVMQuestVariable(bd_sq_sol, ::bards_to_town_IsDetect_var) = 1.0 to a condition that always evals to false.  This should prevent the need to hit any buttons at all, and prevent Ikol from reacting to the bards.

Link to comment
On 3/4/2021 at 8:05 PM, SharpenedRock said:

Hi, so I am playing the SE public version. When I am trying to sneak the bards past the guy I cant signal them to move. Middle click doesn't do anything even when the guard is distracted. Does anyone have a clue how to fix or have a work around to get the bards in the city. ty

 

Use console command to disable and enable each of the bards then they will start moving for me

 

Instruction

(note this quest is bug. Workaround as the sex minigame starts. Press the middle mouse button. Pull up console command select one of the bards boys, then disable him, do not close the console window but wait two seconds, then enable him again and close the console window. He should move at that point. Rinse and repeat for the other boy.)

 

Link to comment
3 hours ago, ElvinJG81 said:

How stable is the SE version?

 

Edit: Every plugin is form 43. Every. Single. One.

I played the latest version with the plugin in form 43 with no issues. But you can try converting them by opening Creation Kit and saving.

Link to comment
5 hours ago, decaluka said:

Have the early parts of the quest been fixed at this point? I read that they had a few bugs

I think many of them were fixed, but I didn't test it.

1 hour ago, ElvinJG81 said:

Is it better to use SOS or SOS Light? (SSE)

I think the mod works better with Light version

Link to comment

For people having trouble with trying to get the bards into Solitude and the middle mouse button not working, Dogma posted today a workaround:

 

I fixed a few more issues that were reported to me and updated the files from the links.

The only thing I didn’t fix was the problem with the bards in the Icol minigame. I saw for a long time how they wrote that the button does not work, so in the last update I added a control setting for this mini-game, but as it turned out, it’s not about the button. I have this problem only on SE, I found out the other day when I decided to check on this version. The bards really do not move, this is some kind of game error, because the variable switches correctly, but the AI idle packet continues to play, although this cannot be, since the conditions are not suitable. This is the first time I come across this. The only thought is that the SE version has a different implementation of the package system in the scene, and they are not redefined there inside the action. Let me know if you also have this problem on LE. In the future, I will redo this moment in a different way, so that it would work on SE too, I didn't want to do this now because this is the last patch, and I could have done some other jambs, but I already want to fully deal with the future update and not be distracted by all this. For now, you can use the console command setpqv bd_sq_sol bards_qs 100 during the mini-game, the scene should play as if the bards were in the city. You just have to manually delete those bards that remained outside the city, for this you need to enter the console, select them and write disable.

Link to comment
On 3/12/2021 at 2:29 PM, ElvinJG81 said:

How stable is the SE version?

 

Edit: Every plugin is form 43. Every. Single. One.

I have a Skyrim SE build that I put together in late November which has 351 mods and 9 of them are form 43 ..... I have 302+ hours on my save and have done everything (Including Amorous Adventures, Immersive Wenches and Sisters of Dibella) except for the Dragonborn DLC and it's still going strong ..... I even have 15 followers stashed away at the Bathing Beauties and Luxury Suites plus Ysolda as the housecarl in the private residence there .....  If the nag bothers you in MO2 you can go to the Configure Settings, plugin tab, look for "Form 43 plugin checker" and set it to Enabled = false ..... 

 

Or you can convert them in the Creation Kit but IMO that's just a waste of time ..... I used to worry about it but after this experiment I no longer do because anything over 300 hours with Sexlab Aroused is pushing it to the limit with or without Form 43 mods ..... 

Link to comment

I can't get the over nite scene with Hamlof to play.  If i tell him i will come back at night then as soon as i step away he says eww you have cum on your face.  i wash it in the river and then he stops saying that but then i can only offer to pay him and he says he wants a kiss but then the only talk option is nevermind.  i can kiss him if i did it the first time i talk to him but then that is just the short scene.

Link to comment
22 minutes ago, alex61821 said:

I can't get the over nite scene with Hamlof to play.  If i tell him i will come back at night then as soon as i step away he says eww you have cum on your face.  i wash it in the river and then he stops saying that but then i can only offer to pay him and he says he wants a kiss but then the only talk option is nevermind.  i can kiss him if i did it the first time i talk to him but then that is just the short scene.

When you agree to meet him at night for the kiss, you have to meet him at night, between 7 PM and 8 PM I believe. Then, wash at the samll waterway behind him, and then talk to him and the dialogue option to start should appear.

 

If you talk with him too early I think you'll only get the options you mentioned.

Link to comment

Does the achievement for placing the posters in all the right places affect the 10 gold marks gathering and does it unlock any new content? Also, someone asked before whether it's possible to change the amount of drinks with a console command rather than replaying the entire mod from scratch but it went unanswered, so I'm bumping the question.

Link to comment
18 hours ago, Highborn said:

When you agree to meet him at night for the kiss, you have to meet him at night, between 7 PM and 8 PM I believe. Then, wash at the samll waterway behind him, and then talk to him and the dialogue option to start should appear.

 

If you talk with him too early I think you'll only get the options you mentioned.

OK i will try that time.  

Do you know what the timescale should be at?  time is barely moving.  I dont think time actually moved in the skunkway is that correct?  it only moved if you did something right?  after leaving the skunkway should time go back to normal?

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. For more information, see our Privacy Policy & Terms of Use