673f3a0c1f2e0

673f3a0c20456
2 Guests are here.
 

Topic: Super QBRs test Read 1036 times  

673f3a0c20d0fZylonBane

673f3a0c20d82
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

673f3a0c20f41voodoo47

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

673f3a0c2106fZylonBane

673f3a0c210c2
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.

673f3a0c2116avoodoo47

673f3a0c211b5
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.

673f3a0c21292ZylonBane

673f3a0c212e5
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.

673f3a0c2137evoodoo47

673f3a0c213cc
yes, but there will be less of it. not a bad thing.
673f3a0c21558
"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.

673f3a0c21967sarge945

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

673f3a0c21bb9sarge945

673f3a0c21c05
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 »

673f3a0c21cb2ZylonBane

673f3a0c21d03
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.

673f3a0c21ddesarge945

673f3a0c21e2a
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.

673f3a0c21f4bZylonBane

673f3a0c21fa3
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.

673f3a0c22209sarge945

673f3a0c22268
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.

673f3a0c2246fZylonBane

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

673f3a0c225afvoodoo47

673f3a0c225fb
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 »

673f3a0c226bbZylonBane

673f3a0c22731
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.
You are a rebel, I like you.
Contact SMF 2.0.19 | SMF © 2016, Simple Machines | Terms and Policies
FEEP
673f3a0c2349e