»Axe Demento Posted April 14, 2014 Report Posted April 14, 2014 Hello all, Looking for a list of all things SUBSPACE. Particularity anything that can actually be used to play Subspace. So there are the classicsSubspace 1.34Subspace 1.35Continuum (anyone know what versions can still play the game) So if you have a combination that works let me knowSomething like subgame1 and subspace 1.32 that would be great. Or Discretion and Subiller2 etc Any Help and knowledge is greatly appreciated. 2ndary info like chat clients or bots that can work with specific versions ...Axe . Quote
Dav Posted April 14, 2014 Report Posted April 14, 2014 You will find that almost all servers will not allow earlier clients to play. IIRC they can enter spec though as can subspace clients if the player is given access to do so. Quote
»Axe Demento Posted April 14, 2014 Author Report Posted April 14, 2014 i control the horizontal and the vertical don't be alarmed. What i'm looking for is what combinations work. Ie i'll run the servers what i'm interested is in what clients work with what billers. I'm not worried about continuum restrictions. Its time to move away from a continuum only viewpoint. the more i dig the more fun stuff i find. For Example in programming and using other stuff more options arise. I much prefer Subspace to continuum its much smoother to play but i will say continuum chat is good but its time to improve and move beyond it.Thus taking bits from everything and moving forward. So back to the original post. Specific answers are best. ie Subspace 1.31 doesn't work with subiller2 etc If you want to play orginal subspace just log into SSDZ KAOS South. and you can fly to your hearts content probably even without the cd crack ...AxeShip 9 indeed give me some time and you'll see it one way or the other. ..Axe Quote
Dr Brain Posted May 22, 2014 Report Posted May 22, 2014 Don't forget to collect the various versions of Twister... for the complete SS 1.35 experience. Quote
»Axe Demento Posted May 23, 2014 Author Report Posted May 23, 2014 Don't fear innovation Dr Brain even those type of programs can be used for good Just because SS didn't fear memory locations that were out in the open doesn't make them bad. Feel free to send me any programs that work. I'm still looking for more old copies of billers and version that work with them. ...Axe Quote
Fatrolls Posted June 6, 2014 Report Posted June 6, 2014 Old twister source code: unit submain; { +--------------------------------------------------------------------+ | CyberWare Subspace Twister v.1.34.2, main module | | Copyright (c) 1998 CyberWare, Inc. All Rights Reserved. | | | | -= Written by Alex // cyberware =- | | | | subspace cheat impelemtations submain.pas v1.34.2 | | | | author: voice +7 (095) 550-3599; e-mail: sage386@hotmail.com | |--------------------------------------------------------------------| | Compile this source using: dcc32 subcheat.dpr | 04-Nov-1998 | +--------------------------------------------------------------------+ } interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, syncobjs, registry; {$I subcheat.inc} type TCheatForm = class(TForm) Label1: TLabel; Label2: TLabel; Memo1: TMemo; procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private param, cheat: string; paramv: integer; locations: TStringList; safe: TCriticalSection; FEquip: longint; // ship equipment table; FTable: longint; { Private declarations } procedure WMCheat(var Msg: TMessage); message WM_CHEAT; procedure ExecuteCheat; function GetShipBase: integer; function GetShipX: integer; function GetShipY: integer; procedure SetShipX(value: integer); procedure SetShipY(value: integer); function GetShipShape: integer; procedure SetShipShape(value: integer); procedure SetSupervisor; procedure SetFlag; procedure SetFlaggerWeaponsUpgrade; procedure RequestGreen; procedure SetupKillMultiplier; procedure UnlimitedWeapons; procedure Unban; procedure SaveLocation; procedure RestoreLocation; procedure JumpRelative; procedure JumpToMap; procedure ChangeShip; // NEW: access to ship equipment function GetShipEquip(index: integer): integer; procedure SetShipEquip(index, value: integer); procedure FillEquip; procedure GetIndexMinMax(index: integer; var aMin, aMax: integer); procedure EquipLoad; public { Public declarations } property ShipX: integer read GetShipX write SetShipX; property ShipY: integer read GetShipY write SetShipY; property ShipShape: integer read GetShipShape write SetShipShape; property ShipEquip[index: integer]: integer read GetShipEquip write SetShipEquip; end; var CheatForm: TCheatForm; procedure RegisterCallback; external 'SUBKEYS'; procedure UnregisterCallback; external 'SUBKEYS'; implementation {$R *.DFM} var StartupInfo: TStartupInfo; ProcessInfo: TProcessInformation; bloaded: integer; function Min(const a, b: longint): longint; register; assembler; asm cmp eax, edx; jl @@1; mov eax, edx; @@1: end; function Max(const a, b: longint): longint; register; assembler; asm cmp eax, edx; jg @@1; mov eax, edx; @@1: end; function TCheatForm.GetShipBase: integer; var addr1, addr2: integer; begin if (not ReadProcessMemory(ProcessInfo.hProcess, ptr($47C278), @addr1, 4, bloaded)) or (not ReadProcessMemory(ProcessInfo.hProcess, ptr($4AC768), @addr2, 4, bloaded)) or (addr1 <> addr2) then abort; result := addr1; end; function TCheatForm.GetShipX: integer; begin if not ReadProcessMemory(ProcessInfo.hProcess, ptr(GetShipBase + $96), @result, 4, bloaded) then abort; end; function TCheatForm.GetShipY: integer; begin if not ReadProcessMemory(ProcessInfo.hProcess, ptr(GetShipBase + $96 + 4), @result, 4, bloaded) then abort; end; function TCheatForm.GetShipShape: integer; var a: byte; begin if not ReadProcessMemory(ProcessInfo.hProcess, ptr(GetShipBase + $56), @a, 1, bloaded) then abort; result := a; end; procedure TCheatForm.SetShipX(value: integer); begin value := max(0, min(value, $FA0000)); if not WriteProcessMemory(ProcessInfo.hProcess, ptr(GetShipBase + $96), @value, 4, bloaded) then abort; end; procedure TCheatForm.SetShipY(value: integer); begin value := max(0, min(value, $FA0000)); if not WriteProcessMemory(ProcessInfo.hProcess, ptr(GetShipBase + $96 + 4), @value, 4, bloaded) then abort; end; procedure TCheatForm.SetShipShape(value: integer); begin value := max(1, min(value, 9)) - 1; if not WriteProcessMemory(ProcessInfo.hProcess, ptr(GetShipBase + $56), @value, 1, bloaded) then abort; end; // saves current ship location to the 'param' slot procedure TCheatForm.SaveLocation; begin if param = '' then begin // save to file Locations.SaveToFile('subcheat.loc'); end else begin // save to slot Locations.Values[param] := '$' + IntToHex(ShipX, + '$' + IntToHex(ShipY, ; end; end; procedure TCheatForm.SetupKillMultiplier; type KillerRecord = packed record opcode: byte; value: longint; nops: word; end; const DefaultCode1: array[1..7] of byte = ($0F, $BF, $15, $32, $DD, $47, $00); KillersCode1: KillerRecord = (opcode:$BA; value: 0; nops:$9090); DefaultCode2: array[1..7] of byte = ($0F, $BF, $05, $32, $DD, $47, $00); KillersCode2: KillerRecord = (opcode:$B8; value: 0; nops:$9090); var ptr1, ptr2: pointer; begin if param = '' then begin // restore default flagger kill multiplier behavior ptr1 := @DefaultCode1; ptr2 := @DefaultCode2; end else begin // setup new behaviour KillersCode1.value := max(1, min(10000000, StrToInt(param))); KillersCode2.value := KillersCode1.value; ptr1 := @KillersCode1; ptr2 := @KillersCode2; end; WriteProcessMemory(ProcessInfo.hProcess, ptr($416C5B), ptr1, sizeof(DefaultCode1), bloaded); WriteProcessMemory(ProcessInfo.hProcess, ptr($416C6F), ptr2, sizeof(DefaultCode1), bloaded); end; procedure TCheatForm.SetSupervisor; var value: integer; begin value := StrToInt(param); if not WriteProcessMemory(ProcessInfo.hProcess, ptr($4B2174), @value, 4, bloaded) then abort; end; // setup virtual flag, so each kill procedure TCheatForm.SetFlag; begin WriteProcessMemory(ProcessInfo.hProcess, ptr(GetShipBase + $66), @paramv, 4, bloaded); // Flags; if paramv > 0 then SetFlaggerWeaponsUpgrade; end; procedure TCheatForm.RequestGreen; const DefaultCode: array[1..6] of byte = ($8B, $52, $0C, $8B, $01, $52); FakeCode: array[1..6] of byte = ($8B, $01, $6A, $7F, $90, $90); function check(const lex: string): boolean; // return true if current param string matches specified lexem var len, i: integer; begin result := false; len := min(length(param), length(lex)); for i := 1 to len do if param[i] <> lex[i] then exit; result := true; end; begin if param = '' then begin // restore default green codeflow WriteProcessMemory(ProcessInfo.hProcess, ptr($42EFB5), @DefaultCode, sizeof(DefaultCode), bloaded); end else begin // setup requested green try FakeCode[4] := max(1, min($1C, StrToInt(param))); except param := Uppercase(param); if check('PORTAL') then FakeCode[4] := 28 else if check('ROCKET') then FakeCode[4] := 27 else if check('BRICK') then FakeCode[4] := 26 else if check('WALL') then FakeCode[4] := 26 else if check('MULTIPRIZE') then FakeCode[4] := 25 else if check('PRIZE') then FakeCode[4] := 25 else if check('THOR') then FakeCode[4] := 24 else if check('DECOY') then FakeCode[4] := 23 else if check('BURST') then FakeCode[4] := 22 else if check('REPELLER') then FakeCode[4] := 21 else if check('ANTIWARP') then FakeCode[4] := 20 else if check('SHRAPNEL') then FakeCode[4] := 19 else if check('SHIELDS') then FakeCode[4] := 18 else if check('SUPERPOWER') then FakeCode[4] := 17 else if check('PROXIMITY') then FakeCode[4] := 16 else if check('MULTIFIRE') then FakeCode[4] := 15 else if check('FIRE') then FakeCode[4] := 15 else if check('SHUTDOWN') then FakeCode[4] := 14 else if check('RECHARGE') then FakeCode[4] := 13 else if check('FULLCHARGE') then FakeCode[4] := 13 else if check('SPEED') then FakeCode[4] := 12 else if check('TOPSPEED') then FakeCode[4] := 12 else if check('THRUSTERS') then FakeCode[4] := 11 else if check('BOUNCING') then FakeCode[4] := 10 else if check('BOMBS') then FakeCode[4] := 09 else if check('GUNS') then FakeCode[4] := 08 else if check('WARP') then FakeCode[4] := 07 else if check('RADAR') then FakeCode[4] := 06 else if check('CLOACK') then FakeCode[4] := 05 else if check('STEALTH') then FakeCode[4] := 04 else if check('ROTATION') then FakeCode[4] := 03 else if check('ENERGY') then FakeCode[4] := 02 else if check('MAXENERGY') then FakeCode[4] := 02 else if check('RATE') then FakeCode[4] := 01 else if check('CHARGERATE') then FakeCode[4] := 01 else exit; end; WriteProcessMemory(ProcessInfo.hProcess, ptr($42EFB5), @FakeCode, sizeof(FakeCode), bloaded); end; end; // change flagger bombs upgrade flag procedure TCheatForm.SetFlaggerWeaponsUpgrade; const IncEDX: byte = $42; IncECX: byte = $41; TheNOP: byte = $90; var aptr: pointer; begin aptr := @TheNOP; // bombs if paramv = 0 then aptr := @IncEDX; WriteProcessMemory(ProcessInfo.hProcess, ptr($41101B), aptr, 1, bloaded); // bullets if paramv = 0 then aptr := @IncECX; WriteProcessMemory(ProcessInfo.hProcess, ptr($410D8F), aptr, 1, bloaded); end; // restores ship position from the 'param' slot procedure TCheatForm.RestoreLocation; begin if param = '' then begin // load from file Locations.Clear; Locations.LoadFromFile('subcheat.loc'); end else begin param := Locations.Values[param]; ShipX := StrToInt(copy(param, 1, 9)); ShipY := StrToInt(copy(param, 10, 9)); end; end; procedure TCheatForm.JumpRelative; var delta: integer; begin if length(param) < 2 then abort; delta := StrToInt(copy(param, 2, 255)) * 65535; case upcase(param[1]) of 'U','N': ShipY := ShipY - delta; // up, north 'L','W': ShipX := ShipX - delta; // left, west 'R','E': ShipX := ShipX + delta; // right, east 'D','S': ShipY := ShipY + delta; // down, south end; end; procedure TCheatForm.JumpToMap; var x, y: integer; begin if length(param) < 2 then abort; x := min(19, max(0, byte(upcase(param[1])) - ord('A'))); y := min(19, max(0, StrToInt(copy(param, 2, 255)) - 1)); ShipX := x * 819200 + 409600; ShipY := y * 819200 + 409600; end; procedure TCheatForm.ChangeShip; begin ShipShape := StrToInt(param); end; procedure TCheatForm.ExecuteCheat; begin try safe.Enter; try param := copy(cheat, 2, 255); case upcase(cheat[1]) of 'S': SaveLocation; // stores current ship location 'R': RestoreLocation; // restores ship location '0'..'9': begin // quick position restore param := cheat[1]; RestoreLocation; end; 'J': JumpRelative; // relative jump 'M': JumpToMap; // absolute jump by map coordinates 'C': ChangeShip; // change ship 'V': SetSupervisor; // setup supervisor mode 'E': EquipLoad; // full load equipment; 'G': RequestGreen; // request next green to be.... 'K': SetupKillMultiplier; 'U': UnlimitedWeapons; // Set or clear unlimited thors, walls etc.. 'B': Unban; end; finally Safe.Leave; end; MessageBeep(-1); except // oops, an error encountered MessageBeep(MB_ICONEXCLAMATION); end; end; procedure TCheatForm.UnlimitedWeapons; const SuperPower: word = $FB2B; SuperEnergy: word = $D12B; TheNop: word = $9090; DecESI: byte = $4E; DecEBX: byte = $4B; begin if (param = '') or (StrToInt(param) = 0) then begin // restore default flow // thors WriteProcessMemory(ProcessInfo.hProcess, ptr($412413), @DecESI, 1, bloaded); // decoys WriteProcessMemory(ProcessInfo.hProcess, ptr($412370), @DecESI, 1, bloaded); // burst WriteProcessMemory(ProcessInfo.hProcess, ptr($4123A9), @DecESI, 1, bloaded); // repels WriteProcessMemory(ProcessInfo.hProcess, ptr($4123DF), @DecESI, 1, bloaded); // rockets WriteProcessMemory(ProcessInfo.hProcess, ptr($411A31), @DecESI, 1, bloaded); // walls WriteProcessMemory(ProcessInfo.hProcess, ptr($4119C5), @DecESI, 1, bloaded); // portals WriteProcessMemory(ProcessInfo.hProcess, ptr($411FB7), @DecEBX, 1, bloaded); // super power //WriteProcessMemory(ProcessInfo.hProcess, ptr($42D1B8), @SuperPower, 2, bloaded); // shields power //WriteProcessMemory(ProcessInfo.hProcess, ptr($42D177), @SuperPower, 2, bloaded); // energy level //WriteProcessMemory(ProcessInfo.hProcess, ptr($412542), @SuperEnergy, 2, bloaded); end else begin // setup unlimited weapon config // thors WriteProcessMemory(ProcessInfo.hProcess, ptr($412413), @TheNOP, 1, bloaded); // decoys WriteProcessMemory(ProcessInfo.hProcess, ptr($412370), @TheNOP, 1, bloaded); // burst WriteProcessMemory(ProcessInfo.hProcess, ptr($4123A9), @TheNOP, 1, bloaded); // repels WriteProcessMemory(ProcessInfo.hProcess, ptr($4123DF), @TheNOP, 1, bloaded); // rockets WriteProcessMemory(ProcessInfo.hProcess, ptr($411A31), @TheNOP, 1, bloaded); // walls WriteProcessMemory(ProcessInfo.hProcess, ptr($4119C5), @TheNOP, 1, bloaded); // portals WriteProcessMemory(ProcessInfo.hProcess, ptr($411FB7), @TheNOP, 1, bloaded); // super power //WriteProcessMemory(ProcessInfo.hProcess, ptr($42D1B8), @TheNop, 2, bloaded); // shields power //WriteProcessMemory(ProcessInfo.hProcess, ptr($42D177), @TheNop, 2, bloaded); // energy //WriteProcessMemory(ProcessInfo.hProcess, ptr($412542), @TheNop, 2, bloaded); end; end; procedure TCheatForm.Unban; var Reg: TRegistry; d1, d2: integer; begin reg := TRegistry.Create; try reg.RootKey := HKEY_LOCAL_MACHINE; if reg.OpenKey('Software', false) then begin Randomize; d1 := Random(maxint); d2 := Random(maxint); reg.WriteInteger('D1', d1); reg.WriteInteger('D2', d2); reg.CloseKey; end; // randomize values in memory WriteProcessMemory(ProcessInfo.hProcess, ptr($4AFF38), @d1, 4, bloaded); WriteProcessMemory(ProcessInfo.hProcess, ptr($4AFBA0), @d2, 4, bloaded); finally reg.Free; end; end; procedure TCheatForm.WMCheat; begin case Msg.wParam of // execute entered chear sequence VK_RETURN: if length(cheat) > 0 then begin ExecuteCheat; cheat := ''; end; // abort current cheat sequence VK_ESCAPE, VK_CHEAT: begin MessageBeep(MB_ICONEXCLAMATION); cheat := ''; end; VK_BACK: begin if length(cheat) > 0 then cheat := copy(cheat, 1, pred(length(cheat))); end; VK_LEFT, VK_RIGHT, VK_UP, VK_DOWN, VK_SHIFT, VK_TAB: exit; // ordinal; chanarters, store into cheat string else if length(cheat) < 255 then begin cheat := cheat + char(Msg.wParam); MessageBeep(-1); end; end; end; procedure TCheatForm.FormCreate(Sender: TObject); //var // wnd: hWND; begin cheat := ''; CheatForm.Caption := CHEAT_WINDOW; application.Title := CHEAT_WINDOW; Locations := TStringList.Create; safe := TCriticalSection.Create; FillChar(StartupInfo, sizeof(StartupInfo), 0); StartupInfo.cb := sizeof(StartupInfo); { wnd := FindWindow(nil, SUBSPACE_WINDOW); if dword(wnd) <> 0 then begin // 'Please close subspace and run SUBCHEAT.EXE instead' end else } if CreateProcess(nil, 'subspace.exe', nil, nil, false, 0, nil, nil, StartupInfo, ProcessInfo) then begin RegisterCallback; end; //Label1.Caption := IntToHex(ProcessInfo.hProcess, ; end; procedure TCheatForm.FormClose(Sender: TObject; var Action: TCloseAction); begin UnregisterCallback; Locations.Free; safe.Free; end; // NEW procedure TCheatForm.FillEquip; begin ReadProcessMemory(ProcessInfo.hProcess, ptr(GetShipBase + $92), @FTable, 4, bloaded); ReadProcessMemory(ProcessInfo.hProcess, ptr(FTable + $04), @FEquip, 4, bloaded); end; function TCheatForm.GetShipEquip(index: integer): integer; var FEquipXor: integer; begin FillEquip; ReadProcessMemory(ProcessInfo.hProcess, ptr(FTable + $0c), @FEquipXor, 4, bloaded); ReadProcessMemory(ProcessInfo.hProcess, ptr(FEquip + index), @result, 4, bloaded); result := result xor FEquipXor; end; procedure TCheatForm.SetShipEquip(index, value: integer); var FEquipXor: integer; begin FillEquip; ReadProcessMemory(ProcessInfo.hProcess, ptr(FTable + $0c), @FEquipXor, 4, bloaded); value := value xor FEquipXor; WriteProcessMemory(ProcessInfo.hProcess, ptr(FEquip + index), @value, 4, bloaded); end; procedure TCheatForm.GetIndexMinMax(index: integer; var aMin, aMax: integer); var shp, minadr, maxadr: integer; begin aMin := 0; aMax := 0; case index of $74: begin minadr := $47D864; maxadr := $47d85a; end; $7c: begin minadr := $47D85e; maxadr := $47d854; end; $80: begin minadr := $47D860; maxadr := $47d856; end; $84: begin minadr := $47D862; maxadr := $47d858; end; else exit; end; shp := ShipShape * 9 * 16; ReadProcessMemory(ProcessInfo.hProcess, ptr(minadr + shp), @amin, 2, bloaded); ReadProcessMemory(ProcessInfo.hProcess, ptr(maxadr + shp), @amax, 2, bloaded); end; procedure TCheatForm.EquipLoad; procedure _gun(val: integer); begin ShipEquip[$38] := max(0, min(val, 3)); // Guns; ShipEquip[$24] := byte(val > 0); // multifire bullets end; procedure _bombs(val: integer); // Mines/Bombs; var exists: integer; begin val := max(0, min(val, 3)); exists := byte(val > 0); ShipEquip[$4C] := exists; ShipEquip[$2C] := exists; ShipEquip[$3C] := val; end; procedure _recharger; // Recharge level, Thrusters, Speed, Rotation -- to max; var exists, temp: integer; begin GetIndexMinMax($74, exists, temp); ShipEquip[$74] := temp; GetIndexMinMax($7C, exists, temp); ShipEquip[$7C] := temp; GetIndexMinMax($80, exists, temp); ShipEquip[$80] := temp; GetIndexMinMax($84, exists, temp); ShipEquip[$84] := temp; end; procedure _fullload; begin ShipEquip[$58] := 2; // Burst; + ShipEquip[$64] := 2; // Repels; + ShipEquip[$70] := 2; // Decoys; + ShipEquip[$68] := 2; // Thors; + ShipEquip[$5C] := 2; // Walls; + ShipEquip[$60] := 2; // Rockets; + ShipEquip[$6C] := 2; // Portals; + _gun(3); _bombs(3); _recharger; ShipEquip[$50] := 10000; ShipEquip[$28] := 1; // Bouncing bullets (amount) ShipEquip[$14] := 1; // Steath; ShipEquip[$20] := 1; // Cloak; ShipEquip[$1C] := 1; // Xradar; ShipEquip[$18] := 1; // Antiwarp; end; begin if param = '' then _fullLoad else begin if length(param) < 2 then abort; paramv := StrToInt(copy(param, 2, 255)); case upcase(param[1]) of 'A': ShipEquip[$18] := max(0, min(1, paramv)); // Antiwarp; 'B': ShipEquip[$58] := paramv; // Burst; 'C': ShipEquip[$20] := max(0, min(1, paramv)); // Cloak; 'D': ShipEquip[$70] := paramv; // Decoys; 'E': ShipEquip[$78] := paramv * 1000; // Energy Level; 'F': SetFlag; 'G': _gun(paramv); 'H': ShipEquip[$14] := max(0, min(1, paramv)); // Steath; 'I': _Recharger; //'J': 'K': ShipEquip[$60] := paramv; // Rockets; 'L': ShipEquip[$50] := paramv; // Shields; 'M': _bombs(paramv); 'N': ShipEquip[$40] := paramv; // Shrapnel amount; 'O': ShipEquip[$28] := paramv; // Bouncing bullets (amount) 'P': ShipEquip[$6C] := paramv; // Portals; //'Q': 'R': ShipEquip[$64] := paramv; // Repels; //'S': 'T': ShipEquip[$68] := paramv; // Thors; 'U': ShipEquip[$48] := paramv; // Super time; //'V': 'W': ShipEquip[$5C] := paramv; // Walls; 'X': ShipEquip[$1C] := max(0, min(1, paramv)); // Xradar; 'Y': ShipEquip[$34] := paramv; // Bounty; 'Z': SetFlaggerWeaponsUpgrade; end; end; end; end. Quote
Siaon Posted July 25, 2014 Report Posted July 25, 2014 I might be able to entertain you if you feel something is missing, I tend to store everything so depending on your purpose I might be inclined to look it up for you; what exactly did you manage to collect thus far? Seek and you shall find, or at least one might hope so; I am still looking for a player from a long long time ago - The Serpent Mage. I have even forgotten the zone I attented, it was (one of?) Balle the Nalle's zones. In case anyone has contact information, I would still like to get into touch with TSM (even after all these years). Quote
Cheese Posted July 25, 2014 Report Posted July 25, 2014 tsm played hyperspace regularly a year or so ago, hang around in there and u might see him Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.