673f431b9fa61

673f431ba217a
3 Guests are here.
 

Topic: Super QBRs test Read 1044 times  

673f431ba2b2eZylonBane

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

673f431ba2d80voodoo47

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

673f431ba2eb5ZylonBane

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

673f431ba2fb3voodoo47

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

673f431ba310dZylonBane

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

673f431ba3234voodoo47

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

673f431ba38fdsarge945

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

673f431ba3b7csarge945

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

673f431ba3cf4ZylonBane

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

673f431ba3e46sarge945

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

673f431ba3fbdZylonBane

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

673f431ba434bsarge945

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

673f431ba4653ZylonBane

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

673f431ba47c5voodoo47

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

673f431ba4905ZylonBane

673f431ba495f
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:

Look at you, hacker: a pathetic ____ of meat and bone!  (Fill in the missing word):
3 Guests are here.
Fammi l'amore lei che pensa ad un altro e si inventa l'America
Contact SMF 2.0.19 | SMF © 2016, Simple Machines | Terms and Policies
FEEP
673f431ba572d