6741a50b3fab2

6741a50b40fd2
2 Guests are here.
 

Topic: Super QBRs test Read 1070 times  

6741a50b418f3ZylonBane

6741a50b4196d
When I heard that in the System Shock remake the restoration bays work across decks, my first thought was, figures, more screwing around with Looking Glass's design decisions.

My second thought was... can SS2 do that?

It can!

https://www.youtube.com/watch?v=7ISbnWzcce0

This mod will, when the player dies in a map without an active QBR, resurrect the player at the closest activated QBR in any other map (unless the player dies in the BotM or SHODAN levels). Optionally, the resurrecting can be constrained to the current deck only, so you still have the tension of having to find the QBR when entering a new deck. A case could be made that this actually brings the game closer to Irrational's original intent, since many of the decks started as single large maps that had to be split up later for technical reasons.

Code: [Select]
/*
Super QBRs 0.9
May 24, 2024
by ZylonBane

Enhances QBRs to work across decks and maps. When you die, if there isn't an active
QBR in the current map, you will be resurrected at the closest active QBR. This will
not function in the endgame maps.

This mod cannot be activated mid-game. Can be deactivated mid-game.
*/

// --------------------------------------------------------------------------------
// Script configuration
const SAME_DECK_ONLY = false; // constrains resurrecting to QBR on current deck

// --------------------------------------------------------------------------------
class zbQBR_Base extends SqRootScript {
function mapName() {
local mapRef = string();
Version.GetMap(mapRef);
local map = mapRef.tostring().tolower();
local s = map.find(".mis");
return map.slice(0, s);
}
}

// --------------------------------------------------------------------------------
class zbQBR_ResBtn extends zbQBR_Base {
function OnFrobWorldEnd() {
if (!IsDataSet("Done")) {
Quest.Set("qbr_" + mapName(), 1, eQuestDataType.kQuestDataCampaign);
Property.SetSimple(ObjID("Respawn Marker"), "StartLoc", 8675309);
SetData("Done", true);
};
}
}

// --------------------------------------------------------------------------------
class zbQBR_Player extends zbQBR_Base {
function OnBeginScript() {
if (GetProperty("DestLevel") == mapName()) {
// clear temp data
Property.Remove(self, "DestLevel");
Property.Remove(self, "DestLoc");
// resurrect player
ShockGame.PlayerMode(0);
Damage.Resurrect(self, 0);
ShockGame.StartFadeIn(2000, 0, 0, 0);
Sound.PlaySchemaAmbient(self, "revive");
ShockGame.ShutoffPsi();
ShockGame.OverlayChange(kOverlayRadar, 0);
SetProperty("RadLevel", 0);
SetProperty("RadAmb",0);
ShockGame.OverlayChange(kOverlayRadiation, 0);
SetProperty("Toxin", 0);
ShockGame.OverlayChange(kOverlayPoison, 0);
SetProperty("Hitpoints", GetProperty("MAX_HP") / 3);
}
}

function OnSlain() {
// abort if can respawn on this deck, multiplayer, past point of no return, or immortal
if (Quest.Get("AllowRespawn") || Quest.Get("Difficulty") == 5 || Quest.Get("Note_7_7") == 2 || !ShockGame.AllowDeath()) {
return;
}
local mapList = [
["eng1", 1],
["eng2", 1],
["medsci1", 2],
["medsci2", 2],
["hydro1", 3],
["hydro2", 3],
["hydro3", 3],
["hydro4", 3],
["ops1", 4],
["ops2", 4],
["ops3", 4],
["ops4", 4],
["rec1", 5],
["rec2", 5],
["rec3", 5],
["command1", 6],
["command2", 6],
["rick1", 7],
["rick2", 7],
["rick3", 7]
];
local map, curDeck, qbrDist, qbrMap, spawnOk;
local qbrDistBest = 999;
local curMap = mapName();

// find current deck
foreach (map in mapList) {
if (map[0] == curMap) {
curDeck = map[1];
break;
}
}
if (!curDeck) {
return;
}

// scan for closest activated QBRs
foreach (map in mapList) {
if (Quest.Exists("qbr_" + map[0])) {
qbrDist = abs(curDeck - map[1]);
if (SAME_DECK_ONLY) {
if (qbrDist == 0) {
qbrMap = map[0];
break;
}
}
else if (qbrDist < qbrDistBest) {
qbrDistBest = qbrDist;
qbrMap = map[0];
}
}
}

// active QBR found
if (qbrMap) {
if (Quest.Get("Difficulty") == 1) {
spawnOk = true;
}
else {
if (ShockGame.PayNanites(10) == S_OK) {
spawnOk = true;
ShockGame.AddTranslatableText("ResurrectUsed", "misc", self);
}
else {
spawnOk = false;
ShockGame.AddTranslatableText("ResurrectNeedNanites", "misc", self);
}
}
if (spawnOk) {
SetProperty("DestLevel", qbrMap);
SetProperty("DestLoc", 8675309);
SetOneShotTimer("QBRLeap", 4.9);
}
}
}

function OnTimer() {
if (message().name == "QBRLeap") {
ShockGame.LevelTransport(GetProperty("DestLevel"), GetProperty("DestLoc"), 0);
}
}
}

EDIT: Testing complete, posted to the mods forum.
« Last Edit: 05. June 2024, 21:36:02 by ZylonBane »
Acknowledged by 2 members: RoSoDude, dp_flint

6741a50b41ab3voodoo47

6741a50b41b05
usually not the greatest fan of QBRs, but this will make it fell less like hey, game levels, improving immersion, so sure, why not.

6741a50b41bf8ZylonBane

6741a50b41c4b
Hmm, currently I have every Rickenbacker map tagged as the same deck. So running in single-deck mode, if you died on the bridge you'd come back to life in the depths of rick1. Possibly justifiable since the Rickenbacker is a smaller, more compact vessel than the Von Braun, but I imagine most players would rather just resume from the autosave than trudge all the way back to where they were.

6741a50b41d0bvoodoo47

6741a50b41d59
yes, but this still will improve the experience for people who are doing a no save run (so if I die, QBR only, unless there is no QBR).

saves break immersion, so the less saving/loading, the better.

6741a50b41e3bZylonBane

6741a50b41e87
Well there's still going to be saving and loading if you're running this in single-deck mode and die before activating the QBR on a deck.

That rollercoaster of tension when entering new territory is great game design. Players have to seek out the QBR to make each deck "safe". If they can always resurrect at any previous QBR it makes things a bit less interesting.

6741a50b41f16voodoo47

6741a50b41f62
yes, but there will be less of it. not a bad thing.
6741a50b4212e
"If they can always resurrect at any previous QBR it makes things a bit less interesting."

It's not always though. 0 nanites = game over. I will be using the super duper version of your mod for sure.

6741a50b425a8sarge945

6741a50b4260f
"If they can always resurrect at any previous QBR it makes things a bit less interesting."

It's not always though. 0 nanites = game over. I will be using the super duper version of your mod for sure.

Lets be honest though, you have to play insanely badly to actually run out of nanites. In a typical playthrough they are so plentiful you should end the game with hundreds if not thousands of them, even with low CYB.
6741a50b42711
Very true. Someone mod in a new resource specifically for resurrections on top of the nanite cost. 

6741a50b427ffsarge945

6741a50b4284f
Making death more punishing is completely pointless while quicksaves/quickloads exist.

If there was a realistic way to limit it to autosaves only, I would love to create a mod based around QBR use, especially an extremely interesting resource-based respawn system with checkpoints for saving.

But with free saving anywhere and loading the game being cheaper and easier than using a QBR, it's a total waste of time.
« Last Edit: 03. June 2024, 12:25:23 by sarge945 »

6741a50b42900ZylonBane

6741a50b42953
Yes yes, some gamers are so terminally lacking in executive function that they can't stop themselves from save-scumming. Probably can't stop themselves from entering keypad codes they haven't found yet either.

6741a50b42a1asarge945

6741a50b42a65
I know you're making fun of how I complain about save-scumming, but the problem here isn't even that people abuse quicksaves (although they do). Saving in general is just plain better than using a QBR, so even someone who is saving fairly conservatively will still have no reason to ever use a QBR for any reason, except for the rare occasion where they haven't saved in a while.

6741a50b42b5fZylonBane

6741a50b42bc0
In exchange for a piddly 10 nanites, QBRs will transform you from "dead" to "not dead", remove any status effects, give you back a third of your max HP, and retain all inventory, stats, and progress that you had at the moment of death, automatically.

Reloading on the other hand resets your inventory, stats, and progress to whatever it was the last time you remembered to save or entered the current deck, requiring you to redo everything you'd done between then and dying. And it breaks immersion.

"Just plain better", LOL.

6741a50b42e42sarge945

6741a50b42ea9
Reloading on the other hand resets your inventory, stats, and progress to whatever it was the last time you remembered to save or entered the current deck, requiring you to redo everything you'd done between then and dying. And it breaks immersion.

You do realise the average player mashes the quicksave key every 5 seconds, right?

Saving 10 nanites for 5 seconds of progress is a bargain.

6741a50b430e7ZylonBane

6741a50b4313b
You do realise the average player mashes the quicksave key every 5 seconds, right?
Oh deary me, you actually believe this, don't you.

6741a50b43226voodoo47

6741a50b432c0
nope, I can confirm a quickasave is a very hazy concept as far as an average modern player is concerned. and this is not limited to SS2 - some old(er) games (FO4) have mods that take care of this so the player doesn't have to.

it's expected the game will take care of this itself nowadays.
« Last Edit: 09. June 2024, 15:47:35 by voodoo47 »

6741a50b43397ZylonBane

6741a50b433f6
Sarge has previously admitted to being a quicksave addict. It probably makes him feel better about his addiction to believe that everyone is the same way.

Your name:
This box must be left blank:

Name the company that developed System Shock 2:
2 Guests are here.
I’ve spent days awkwardly crammed between my desk and wall, reconnecting wires, with plenty of Doc Brown moments.
Contact SMF 2.0.19 | SMF © 2016, Simple Machines | Terms and Policies
FEEP
6741a50b43dac