6741a850de015

6741a850dff4a
2 Guests are here.
 

Topic: Super QBRs test Read 1071 times  

6741a850e08d3ZylonBane

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

6741a850e0a9fvoodoo47

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

6741a850e0bc1ZylonBane

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

6741a850e0cb8voodoo47

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

6741a850e0debZylonBane

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

6741a850e0ebfvoodoo47

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

6741a850e14a8sarge945

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

6741a850e1701sarge945

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

6741a850e1802ZylonBane

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

6741a850e194dsarge945

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

6741a850e1a9aZylonBane

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

6741a850e1d68sarge945

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

6741a850e1fd0ZylonBane

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

6741a850e2134voodoo47

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

6741a850e2251ZylonBane

6741a850e22af
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 Guests are here.
Amazing views and what a wonderful city.
Contact SMF 2.0.19 | SMF © 2016, Simple Machines | Terms and Policies
FEEP
6741a850e34b7