🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: comp.sources.apple2
1 messages
1 total messages Started by Jonathan A. Chandross Sun, 08 Nov 1992 23:12
v001SRC065: Robots for HyperC
#80
Author: Jonathan A. Chandross
Date: Sun, 08 Nov 1992 23:12
806 lines
22956 bytes
Submitted-by: Andy Tefft (teffta@tsengr.dnet.ge.com)
Posting-number: Volume 1, Source:65
Archive-name: games/c/robots
Architecture: ANY_2
Version-number: 2.5

The object of this game is to stay alive while robots chase you.  If
a robot catches you, you die.  You are given two weapons in your fight:
a teleportation device and a blaster.  When two robots crash into each
other they create a junk heap; junk heaps are deadly to other robots.
You are allowed to move junk heaps around.  When all the robots are
junk heaps, you advance to the next level.

Enjoy.

=Read.Me
- 
-Robots
- 
-The object of this game is to stay alive while robots chase you.  If
-a robot catches you, you die.  You are given two weapons in your fight:
-a teleportation device and a blaster.  When two robots crash into each
-other they create a junk heap; junk heaps are deadly to other robots.
-You are allowed to move junk heaps around.  When all the robots are
-junk heaps, you advance to the next level.
- 
-This version of robots is based on the robots game that is usually
-distributed with Unix. It is not a port, however, but written mostly
-on my Apple //c under Hyperc.  This is version 2.5.  It should be 
-slightly faster than previous versions in the higher levels (results
-vary), and fixes the unlimited blast bug. Revision history is in robots.c.
- 
-Files:
-	Read.Me		This file
-	ccrobots	script to compile and link source files
-	ladd.c		ladd() function (see robots.doc)
-	lnkrobots	script to just link object files
-	robots.c	HyperC source
-	robots.doc	Documentation
-	robots.files 	list of files for linker to link
-	uitostr.c	uitostr() function (see robots.doc)
- 
- 
-Andrew Tefft
-TEFFTA@tsengr.dnet.ge.com
-July 1992
-Version 2.5
-
=Manifest
-Read.Me
-ccrobots
-ladd.c
-lnkrobots
-robots.c
-robots.doc
-robots.files
-uitostr.c
=ccrobots
-/csys/bin/ppf -i |/ram/|/csys/hdrs/ -o $1.p $1.c
-/csys/bin/hyperc -o $1.s $1.p
-rm $1.p
-/csys/bin/asmcp -o $1.o $1.s
-rm $1.s
-lnk -l |/ram/|/csys/libs/ -o robots -as &s.o robots.o ladd.o &mylib &libc
-
=ladd.c
-/* for some reason ladd is unresolved so... */
-
-/* this version of ladd just adds the lsb of src to the array dest. */
-
-ladd(dest,src)
-unsigned int dest[2],src[2];
-{
-int t;
-t=dest[1]+src[1];
-if (t < dest[1]) dest[0]++;
-dest[1]=t;
-}
-
=lnkrobots
-lnk -l |/ram/|/csys/libs/ -o robots -asi robots.files
=robots.c
-/* robots by Andy Tefft, 6/28/92
-
-version 1.0: 6/28/92 (original)
-version 2.0: 6/29/92 (pushable piles) (developed under unix)
-version 2.1: 6/29/92 (2-move robots)  (developed under unix)
-version 2.2: 6/29/92 (ported back to hyperc)
-version 2.3: 6/29/92 - disable / until it works
-                     - add blast command
-                     - various scoring changes
-version 2.4: 7/4/92  attempt to use long integer array for score
-version 2.5: 7/8/92  added first & last for faster looping
-*/
-
-#define VER "2.5"
-
-#include <std.h>
-
-#define XSIZE 79
-#define YSIZE 22
-#define ROBOT(x) robot_string[robot_moves[x]]
-
-char robot_moves[251];
-char robot_x[251],robot_y[251],player_x,player_y; /* position;
-                                                    x=255 means dead */
-char field[XSIZE+1][YSIZE+1]; /* grid array. 0: empty
-                            1 - 250: robot #
-                                253: wall
-                                254: pile
-                                255: player  */
-
-char pile_x[250],pile_y[250];
-
-int RANDSeed=5343;
-int first,last,blasts,piles,safe_teleports,score[2];
-char get_cmd,rndl,robot_string[4];
-
-main() {
-int result,number; /* number of robots */
-
-printf("Robots by Andy Tefft, version %s.\n",VER);
-
-robot_string=" #&";
-
-while (1) {
-  putstr("Seeding random number generator now...\n");
-  rs();  /* randomize rndl */
-  srandom( (unsigned int) rndl); /* seed with randomized # */
-
-  score[0]=0,score[1]=0;
-  safe_teleports=0;
-  blasts=1;
-
- for (number=10 ;; ++safe_teleports, ++blasts, number += (number < 240) * 10){
-
-    init(number); /* initialize arrays to 0 */
-    randomize(number); /* fill screen with n robots */
-    screensetup(number);
-    first=1; last=number;
-    get_cmd=0;
-
-while (1) {
-    cursor(player_y,player_x);
-    result=get_player_move(number);
-    if (result==2) quit();
-    if (!result) if ((result=robot_move(number))) break;
-}
-    if (result==2) { quit(); break; } /* died */
-    /* otherwise result==-1 which means end of level so continue */
-}
-}
-}
-
-quit() {
-char key;
-    cursor(23,0);
-    putstr("\nYour score was: ");
-    prscore();
-    putstr("\nPress q to quit, any other key to play again: ");
-    key=getkey(1);
-    cr();
-    if (key=='q') exit(0);
-}
-
-/*  A random number generator */
-
-srandom(NewSeed)
-int NewSeed;
-
-{
-RANDSeed = NewSeed;
-}
-
-unsigned int random()
-{
-  RANDSeed = RANDSeed * 18627;
-  if (RANDSeed < 0)
-   RANDSeed += 32768;
-  return RANDSeed;
-}
-
-#define FIELD(n) field[robot_x[n]][robot_y[n]]
-
-/* robot_move moves the robots, creates piles, checks for dead player.
-    returns: 
-        0: robots & player are alive
-        2: player died
-       -1: all robots are dead
-*/
-
-robot_move(number)
-int number;
-{
-int flag,i,alive,x,n,nx,ny;
-
-for (n=last,flag=0,alive=1; n>=first; n--) {
-  if (robot_x[n]==255) continue;
-
-  for(i=0; i<robot_moves[n]; i++) {
-
-    if (FIELD(n)==n) {
-        FIELD(n) = 0;
-        cursor(robot_y[n],robot_x[n]);
-        putchr(' ');                 /* blank out old position */
-    }
-
-    if (robot_x[n] > player_x) --robot_x[n];
-    else if (robot_x[n] < player_x) ++robot_x[n];
-    if (robot_y[n] > player_y) --robot_y[n];
-    else if (robot_y[n] < player_y) ++robot_y[n];
-
-    nx=robot_x[n]; ny=robot_y[n];
-
-    cursor(ny,nx);
-
-    if ((x=FIELD(n)) > n) {
-        if (x==255) {
-            return 2; /* player just died */
-        }
-        addscore(number*robot_moves[n]);
-        if (get_cmd=='w') addscore(number*robot_moves[n]);
-
-        FIELD(n) = 254; /* pile */
-/*
-        pile_x[++piles]=robot_x[n];
-        pile_y[piles]=robot_y[n];
-*/
-        robot_x[n]=255; /* this robot is dead */
-        if (x != 254) {
-            robot_x[x] = 255; /* kill the other robot too */
-            addscore(number*robot_moves[x]);
-            if (get_cmd=='w') addscore(number*robot_moves[x]);
-        }
-        putchr('*'); /* draw pile */
-        break;   /* don't try and move a dead robot */
-    }
-    else  {
-        FIELD(n)=n;
-        putchr(ROBOT(n));
-        alive=0;
-        if (!flag) last=n;
-        flag=n;
-    }
-  }
-  if (robot_x[n]==255) continue; /* 2-mover just died */
-}
-first=flag;
-return (-alive);
-}
-
-/* return values:
-    0: normal move
-    1: don't move robots
-    2: quit
-*/
-
-get_player_move(number)
-int number;
-{
-char move;
-int ox,oy,ox1,oy1;
-
-    if (!get_cmd) move = getkey();
-    else move=get_cmd;
-
-    if (!index(" .?qtrhjklyubnw>HJKLYUBNz",move)) return 1; /* legal moves */
-    if (move=='q') return 2;
-
-    if (move=='t' && !safe_teleports) return 1;
-    if (move=='r' || move=='t') {
-        field[player_x][player_y]=0;
-        cursor(player_y,player_x);
-        putchr(' ');
-
-        if (move=='r') do {
-            player_x=random()%(XSIZE-1)+1;
-            player_y=random()%(YSIZE-1)+1;
-        } while (field[player_x][player_y]);
-
-        else do {
-            player_x=random()%(XSIZE-1)+1;
-            player_y=random()%(YSIZE-1)+1;
-        } while (!safe_pos(player_x,player_y));
-        if (move=='t') safe_teleports--;
-
-        field[player_x][player_y]=255;
-        cursor(player_y,player_x);
-        putchr('@');
-        cursor(player_y,player_x);
-    return 0;
-    }
-
-    if (move=='.') return 0;
-
-    if (move=='?') {
-        cursor(23,0);
-        putstr("hjklyubn move, . stay, r/t rand/safe, z blast  sc: ");
-        prscore();
-        printf(" tele: %d bl: %d (%d)",safe_teleports,blasts,
-                number/10);
-        return 1; /* don't do robot move */
-    }
-
-    if (move==' ') return print_safe();
-
-    if (move=='z') return blast();
-
-    if (move=='/') {
-        screensetup(number);
-        return 1;
-    }
-
-    if (move=='w') {
-        get_cmd='w'; return 0;
-    }
-
-    else if (move=='>') {
-        if (safe_pos(player_x,player_y)) {
-            get_cmd='>'; return 0;
-        } else {
-            get_cmd=0; return 1;
-        }
-    }
-
-/* all commands previous to this point MUST contain a return! */
-
-    ox=player_x; oy=player_y;
-    field[player_x][player_y]=0;
-    cursor(player_y,player_x);
-    putchr(' ');
-
-/* move-while-safe moves */
-
-    if (move=='H') {
-        if (!move_if_safe(player_x-1,player_y)) return put_n_stop();
-        else get_cmd='H';
-    } 
-    else if (move=='J') {
-        if (!move_if_safe(player_x,player_y+1)) return put_n_stop();
-        else get_cmd='J';
-    }
-    else if (move=='K') {
-        if (!move_if_safe(player_x,player_y-1)) return put_n_stop();
-        else get_cmd='K';
-    }
-    else if (move=='L') {
-        if (!move_if_safe(player_x+1,player_y)) return put_n_stop();
-        else get_cmd='L';
-    }
-    else if (move=='Y') {
-        if (!move_if_safe(player_x-1,player_y-1)) return put_n_stop();
-        else get_cmd='Y';
-    }
-    else if (move=='U') {
-        if (!move_if_safe(player_x+1,player_y-1)) return put_n_stop();
-        else get_cmd='U';
-    }
-    else if (move=='B') {
-        if (!move_if_safe(player_x-1,player_y+1)) return put_n_stop();
-            get_cmd='B';
-    }
-    else if (move=='N') {
-        if (!move_if_safe(player_x+1,player_y+1)) return put_n_stop();
-            get_cmd='N';
-    }
-
-/* regular moves */
-
-    ox1=player_x; oy1=player_y;
-
-    if ((move=='h' || move=='y' || move=='b') && player_x > 1 )
-         --ox1;
-    if ((move=='l' || move=='n' || move=='u') && player_x < XSIZE-1)
-         ++ox1;
-    if ((move=='j' || move=='b' || move=='n') && player_y < YSIZE-1)
-         ++oy1;
-    if ((move=='k' || move=='y' || move=='u') && player_y > 1)
-         --oy1;
-
-    if (field[ox1][oy1]==254) move_pile(ox1,oy1,ox1-player_x,oy1-player_y);
-
-    if (!field[ox1][oy1]) player_x=ox1,player_y=oy1;
-
-    field[player_x][player_y]=255;
-    cursor(player_y,player_x);
-
-    putchr('@');
-
-    cursor(player_y,player_x);
-
-    return (ox==player_x && oy==player_y);
-}
-
-blast() {
-int i,j,x;
-    if (!blasts) return 1;
-    blasts--;
-    for (i=-1; i<2; i++)
-        for (j=-1; j<2; j++)
-            if ((x=(int)field[player_x+i][player_y+j]) < 251
-                && x>0) {
-               cursor(player_y+j,player_x+i);
-               putchr(' ');
-               field[player_x+i][player_y+j]=0;
-               robot_x[x]=255;
-            }
-    return 0;
-}
-
-
-/* move_if_safe(x,y) updates player_x and player_y to x,y if x,y is
-    a safe position. It does not update field[][]. Returns 1 if moved. */
-
-move_if_safe(x,y) 
-int x,y;
-{
-  if (safe_pos(x,y)) {
-      player_x=x,player_y=y;
-      return 1;
-  } else return 0;
-}
-
-
-/* put_n_stop() can be used anytime it is needed to draw the player
-    and update the field[][] array with his position. */
-
-put_n_stop() {
-    get_cmd=0;
-    cursor(player_y,player_x);
-    putchr('@');
-    field[player_x][player_y]=255;
-    return 1;
-}
-
-/* move_pile moves pile from (x,y) to (x+dx,y+dy) if possible. returns 1
-    if successful */
-
-move_pile(x,y,dx,dy) 
-int x,y,dx,dy;
-{
-if (field[x+dx][y+dy]) return 0;
-field[x][y]=0;
-field[x+dx][y+dy]=254;
-cursor(y,x);
-putchr(' ');
-cursor(y+dy,x+dx);
-putchr('*');
-return 1;
-}
-
-/* safe_pos checks to see if pos (x,y) would be safe to go to. returns 1
-    unless:
-
-    - wall or pile is there
-    - robot would move there if player moved there
-*/
-
-safe_pos(x,y)
-int x,y;
-{
-int i,j;
-
-    if (field[x][y]) if (field[x][y] != 255) return 0;
-    for (i=-2; i<3; i++)
-        for (j=-2; j<3; j++) {
-           if (x+i<0 || x+i>XSIZE || y+j<0 || y+j>YSIZE) continue;
-           if (field[x+i][y+j]) if (field[x+i][y+j] < 251) {
-              if (abs(i)<2 && abs(j)<2) return 0;
-              if (robot_moves[field[x+i][y+j]] == 2 &&
-                 field[x+i/2][y+j/2] != 253) return 0;
-            }
-    }
-    return 1;
-}
-
-init(number) 
-int number; 
-{
-int x,y;
-
-page();
-printf("initializing...\n");
-
-piles=0;
-for (x=0; x<XSIZE; x++)
-    for (y=0; y<YSIZE; y++)
-        field[x][y]=0;
-
-}
-
-randomize(number) 
-int number;
-{
-int i,x,y;
-putstr("Randomizing...\n");
-for (i=1; i<=number; i++) {
-    do {
-        x=random()%(XSIZE-1)+1;
-        y=random()%(YSIZE-1)+1;
-        }
-    while (field[x][y]!=0);
-
-    robot_x[i]=x; robot_y[i]=y;
-    field[x][y]=i;
-
-    if (random()%10==2) robot_moves[i]=2;
-    else robot_moves[i]=1;
-}
-
-    do {
-        x=random()%(XSIZE-1)+1;
-        y=random()%(YSIZE-1)+1;
-        }
-    while (field[x][y]!=0);
-
-    player_x=x; player_y=y;
-    field[x][y]=255;
-}
-
-screensetup(n)
-int n;
-{
-int i;
-
-page();
-
-for (i=0; i<= XSIZE; i++) { putchr('-'); field[i][0]=253; }
-cursor(YSIZE,0);
-for (i=0; i<= XSIZE; i++) { putchr('-'); field[i][YSIZE]=253; }
-
-for (i=1; i<YSIZE; i++) {
-    cursor(i,0);
-    putchr('|');
-    cursor(i,XSIZE);
-    putchr('|');
-    field[0][i]=253;
-    field[XSIZE][i]=253;
-}
-
-for (i=1; i<=n; i++) {
-    cursor(robot_y[i],robot_x[i]);
-    putchr(ROBOT(i));
-}
-
-for (i=0; i<piles; i++) {
-    cursor(pile_y[i],pile_x[i]);
-    putchr('*');
-}
-
-cursor(player_y,player_x);
-putchr('@');
-
-}
-
-/* rs waits for a keypress, scrambling rndl until pressed. This seeds
-    the random number generator. */
-
-rs() {
-printf("Press a key to begin...");
-while (!keypress()) ++rndl;
-return 0;
-}
-
-/* print_safe() is a kludge to print out the safe moves. */
-
-print_safe() {
-cursor(23,0);
-
-clreol();
-
-if (safe_pos(player_x-1,player_y)) putchr('h');
-if (safe_pos(player_x,player_y-1)) putchr('k');
-if (safe_pos(player_x,player_y+1)) putchr('j');
-if (safe_pos(player_x+1,player_y)) putchr('l');
-if (safe_pos(player_x-1,player_y-1)) putchr('y');
-if (safe_pos(player_x+1,player_y-1)) putchr('u');
-if (safe_pos(player_x-1,player_y+1)) putchr('b');
-if (safe_pos(player_x+1,player_y+1)) putchr('n');
-if (safe_pos(player_x,player_y)) putchr('.');
-
-return 1;
-}
-
-/* addscore adds int i to score[2] */
-
-addscore(i)
-int i;
-{
-int i2[2];
-
-i2[0]=0;
-i2[1]=i;
-
-ladd(score,i2);
-}
-
-/* prscore prints the score in ascii */
-
-prscore() {
-char scorestr[9];
-
-uitostr2(scorestr,score);
-putstr(scorestr);
-}
-
=robots.doc
-This version of robots is based on the robots game that is usually
-distributed with Unix. It is not a port however, but written mostly on
-my Apple //c under Hyperc. The SYS file version was created with the
-use of Gary Desrochers and Andy Werner's 'makesys' programs.
-
-The object of the game is to stay alive while robots chase after you.
-These robots are evil in that they will kill you if they catch you. However,
-they are also stupid, and tend to crash into each other.
-
-You are given two weapons in your fight. One is a teleportation device.
-You are allowed unlimited random teleports (which can drop you right into
-danger), and a limited number of 'guaranteed safe' teleports. You also
-have a blaster which has limited uses; it destroys all robots adjacent
-to you but does not stop the rest from advancing.
-
-When two robots crash into each other, they create a junk heap and you
-get points. Robots which run into junk heaps are also destroyed, giving you
-more points. If a robot runs into you, you die and the game ends. You cannot
-run into junk heaps or the screen borders. You can push a junk heap in any
-direction as long as there is a blank space to move it into.
-
-When all the robots are junk heaps, you advance to the next level.
-You gain one safe teleportation and one blast, and the next level contains 
-more robots (up to a maximum of 250). (if all the robots are dead but you
-have not advanced to the next level, press any movement key.)
-
-You are represented on the screen by an inverse '@'. Robots are '#' and
-'&'; the latter move twice as fast as the former. Junk heaps are '*'. Borders
-are obvious.
-
-Keys are as follows (and are the same as vi cursor-motion keys):
-
-             y   k   u    >: wait as long as it's safe
-               \ | /      w: wait until level is cleared or you die
-             h -   - l    .: wait one move
-               / | \
-             b   j   n
-
-YUHJKLBN: run in that direction as long as it's safe
-?: show brief help, # of safe teleports (te:), # of blasts (bl:), score (sc:),
-   and level
-z: blast (or think of it as zap)
-<space>: show safe moves
-q: quit
-
-Scoring: each '#' robot is worth 10 points times the level number. '&' robots
-are worth double. Each dead robot after you press 'w' is worth double its
-usual value. Robots that you blast are worth 0.
-
------------------------------------------------------------------------
-planned future enhancements:
-
-- high score list
-- ability to skip lower levels
-
------------------------------------------------------------------------
-The files:
-
-robots.doc: this file
-robots:     hyperc executable
-robots.c:   hyperc source
-robots.system: prodos SYS file
-ladd.c:     the ladd() function (see below)
-uitostr.c:  the uitostr() function (see below)
-ladd.o, uitostr.o
-robots.files: list of files to link; use -i option with the linker
-lnkrobots: the link command in a script
-
-Please send me any bug reports or enhancements (I'm particularly looking
-for speed improvements and a better random-number generator).
-
-Andy Tefft
-teffta@tsengr.dnet.ge.com
-6/30/90
-------------------------------------------------------------------------
-Version 2.4 (7/4/92):
-
-You only need read this section if you plan on compiling the program.
-You can play robots without compiling the program. You would only need
-to recompile it if you make changes.
-
-So that the score doesn't "roll over" at 65536, I now use a two-integer
-array to store the score. At this time I have decided to start splitting
-up the source because it is taking a long time to compile. Therefore
-this distribution contains two extra files: uitostr.[c,o] and ladd.[c,o].
-
-To compile robots, you now must follow these steps:
-
-1) cc ladd, if ladd.o does not exist (the 'lnk' command will fail,
-    but we just need the ladd.o file anyway)
-2) cc uitostr, if uitostr.o does not exist
-
-(note: I have included uitostr.o and ladd.o in the distribution so
-you don't have to compile them again unless you change them)
-
-3) cc robots
-4) do 'lnkrobots' or else type in the lnk command yourself.
-
-Note that you only have to cc the files you change; keep the .o files
-around so that you can just redo 'lnkrobots' after you change & cc
-one or more of the source files.
-
-note on ladd:
-
-ladd(ldest,lsrc) is listed in the hyperc manual. lib /csys/libs/libc shows
-ladd.o. But I kept getting _ladd: unresolved when I linked the program,
-so I wrote my own ladd() function. IMPORTANT: it does *not* add the
-most significant int of the arrays, even though it takes two arrays
-as arguments. I only needed to add an int to a 2-byte int array so that's
-all I made it do, although I made the calling interface the same as
-what the manual specifies.
-
-What this means to you is that if something is screwed up in my copy
-of hyperc, and your copy of hyperc includes ladd like it should, you
-will get a duplicate reference when you link it. If this should happen,
-just remove ladd.o from the 'robots.files' file which is used by the link
-command, and re-link. It should work. 
-
-note on uitostr:
-
-It is ugly. If you have a better way to do it, send it to me! If you don't,
-and you want to use uitostr, feel free, and keep these things in mind:
-
-1) uitostr(str,i) converts the integer i[2] to the string str. i[0]
-    is the *least* significant 16 bits of i.
-2) uitostr2(str,i) expects i[0] to be the *most* significant bits of i.
-3) i must be positive; it is actually treated as an unsigned int by
-    the function. If you want to print a negative number, figure out
-    how to take its absolute value, and print a - yourself.
-4) str must be declared with size of at least 9 -- up to 8 digits
-    plus a trailing null. No checks are made on this size and the function
-    will be more than happy to tromp on other variables if you declare
-    the string too small.
-5) the string returned is right-justified. to print it without the leading
-    spaces, you can do something like this:
-
-    putstr(rindex(str,' ')+1);
-
-    (rindex will return a pointer to the last ' ' character in the string).
-
-
=robots.files
-&s.o
-robots.o
-uitostr.o
-ladd.o
-&libc
=uitostr.c
-/* uitostr.c:
-
-    prints a two-byte unsigned int in ascii.
-    uitostr(buf,i) assumes i[2] with i[0]=least significant;
-    uitostr2(buf,i) assumes i[0] is most significant
-
-    note: uitostr destroys i; uitostr2 does not.
-*/
-
-
-#include <std.h>
-
-__twodiv(i) /* divides i by 10 and leaves the result in i */
-unsigned int i[2]; /* i[0] is lsb */
-{
-i[0]=(i[0]/10)+6553*(i[1]%10)+(i[0]%10+6*(i[1]%10))/10;
-i[1]=i[1]/10;
-}
-
-__mod10(i) /* returns i%10 */
-unsigned int i[2];
-{
-return (i[0]%10+(6*i[1])%10)%10;
-}
-
-uitostr(buf,i)
-char buf[9]; /* room for 8 chars */
-unsigned int i[2];
-{
-int j;
-for(j=7; j>=0; j--) {
-    if (!(i[1]|i[0])) buf[j]=' ';
-    else buf[j]=__mod10(i)+'0';
-    __twodiv(i);
-}
-buf[8]=0;
-if (buf[7]==' ') buf[7]='0';
-return;
-}
-
-uitostr2(buf,i)
-char buf[9];
-unsigned int i[2];
-{
-unsigned int j[2];
-j[0]=i[1];
-j[1]=i[0];
-uitostr(buf,j);
-}
-
+ END OF ARCHIVE
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads