I managed finding a moderately broken version with asset building tools included (from October 1999). So i can finally present this project, incomplete (sigh) with bad porn removed:
English version (text messages translated by editing the EXE in Notepad++) http://chebmaster.com/downloads/bryed_3d_English.zip
Original (Russian only) version http://chebmaster.com/downloads/bryed_3d.zip
Lifted assets galore (doom2, duke nukem, blood) and general lack of sanity, as expected from a college student during the lawless Great Depression of the 90s. (I recently stumbled on an VHS tape with a movie recorded from TV, from that time period. Gratuitous rape scenes with tits flashing, live pigs doused in gasoline and set on fire... Oft interrupted with ads of lawnmowers, beer or luxury cars. No ratings, no limitations, only separated from Chip&Dale Rescue Rangers by time slots. A generation of kids grew watching this)
Someone's speedrun @ YouTube: https://www.youtube.com/watch?v=Ggt_U2-bldI
At first, I just covered all tits with black bars. I then realized it was lowest of hypocrisy as bad porn interaction was still there. I rebuilt all maps removing all porn actors and hastily re-uploaded. I then realized there's a not-so-rare glitch that makes a dead ogre flicker through the entire sprite atlas. And also sprites could be seen in FAR because they are uncompressed. I hastily rebuilt the pak file replacing even censored hentai with empty spaces and re-uploaded again.
Sorry, still no sources because sources of code and art are intermixed and removing all porn from these is a *much* harder task.
Cave entrances/exits not showing in game
Interestingly, those are items, map generator raises them by 100cm so that you pick them up without crouching, while render routine places their sprite 130cm below origin.
Map editing:
code sample (note integer = smallint)
init:
Code:
New( SqrtTable );
for i:=0 to 1023 do
SqrtTable^[i]:=Round(Sqrt(i)*2048);
New(ST);
For c:=0 to 1024 do
ST^[c]:=Round(32767*Sin(c*2*Pi/1024));
New(CT);
For c:=0 to 1024 do
CT^[c]:=Round(32767*Cos(c*2*Pi/1024));
New(AT);
For c:=0 to 1024 do
AT^[c]:=Round(Arctan((c/512)-1)*32767/Pi);
usage:
Code:
Function Angle(x1,y1,x2,y2: integer): integer;
var x,y: LongInt;
begin
x:=x1-x2; if x=0 then x:=1;
y:=y1-y2; if y=0 then y:=1;
If abs(x)>abs(y) then
If x>0 then Angle:=AT^[512+((y shl 9) div x)]
else Angle:=word(32767)+word(AT^[512+((y shl 9) div x)])
else
If y>0 then Angle:=16384-AT^[512+((x shl 9) div y)]
else Angle:=49152-AT^[512+((x shl 9) div y)];
end;
Procedure SinCos(var s,c: integer; rasst, angle: integer);
begin
S:=(longint(ST^[angle shr 6]) * Rasst) div 32767;
C:=(longint(CT^[angle shr 6]) * Rasst) div 32767;
end;
type
STable = array[0..1023] of Word;
var
SqrtTable: ^STable;
i: Word;
function KOREN( S: LongInt ): Word; assembler;
asm
db 66h; xor si, si { xor esi, esi }
les si, dword ptr SqrtTable
db 66h; mov bx, word ptr S { mov ebx, S }
mov dx, 11
db 66h, 0Fh, 0BDh, 0CBh { bsr ecx, ebx }
sub cx, 9; jle @less
shr cx, 1
adc cx, 0
sub dx, cx
shl cx, 1
db 66h; shr bx, cl { shr ebx, cl }
@less:
db 26h, 67h, 8Bh, 04h, 5Eh { mov ax, es:[esi+ebx*2] }
mov cx, dx
shr ax, cl
end;
All coordinates are in centimeters, speeds in centimeters per tick (1/25 s), angle is the full SmallInt range is 360 degrees. With overflows exploited to loop it.
Bookmarks