6741a4f9de567

6741a4f9df9ae
1 Guest is here.
 

Topic: Super QBRs test Read 1069 times  

6741a4f9e02fdZylonBane

6741a4f9e036a
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

6741a4f9e04c1voodoo47

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

6741a4f9e05dfZylonBane

6741a4f9e0631
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.

6741a4f9e06e5voodoo47

6741a4f9e0731
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.

6741a4f9e0810ZylonBane

6741a4f9e085e
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.

6741a4f9e08fdvoodoo47

6741a4f9e0949
yes, but there will be less of it. not a bad thing.
6741a4f9e0ae7
"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.

6741a4f9e0e8fsarge945

6741a4f9e0ef3
"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.
6741a4f9e101b
Very true. Someone mod in a new resource specifically for resurrections on top of the nanite cost. 

6741a4f9e10fcsarge945

6741a4f9e1148
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 »

6741a4f9e11f4ZylonBane

6741a4f9e1245
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.

6741a4f9e130bsarge945

6741a4f9e1355
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.

6741a4f9e143bZylonBane

6741a4f9e1497
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.

6741a4f9e177esarge945

6741a4f9e17e2
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.

6741a4f9e1b62ZylonBane

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

6741a4f9e1cb0voodoo47

6741a4f9e1cfe
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 »

6741a4f9e1dc0ZylonBane

6741a4f9e1e14
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 default melee weapon in System Shock 2:
1 Guest is here.
Yup. It's pure greed.
Contact SMF 2.0.19 | SMF © 2016, Simple Machines | Terms and Policies
FEEP
6741a4f9e23b4