From 640aa303a762eb851eac85e270700c62cb13e305 Mon Sep 17 00:00:00 2001 From: Neil Edelman Date: Sun, 11 Sep 2016 02:35:22 -0400 Subject: [PATCH] New version control. --- Mac.c | 390 +++++++++++++++++++ Mac.h | 1 + Makefile | 19 + Oss.c | 475 +++++++++++++++++++++++ Oss.h | 16 + Room.c | 1058 +++++++++++++++++++++++++++++++++++++++++++++++++++ Room.h | 3 + badass | 7 + copying.txt | 16 + gpl.txt | 619 ++++++++++++++++++++++++++++++ index.html | 42 ++ readme.txt | 7 + 12 files changed, 2653 insertions(+) create mode 100644 Mac.c create mode 100644 Mac.h create mode 100644 Makefile create mode 100644 Oss.c create mode 100644 Oss.h create mode 100644 Room.c create mode 100644 Room.h create mode 100644 badass create mode 100644 copying.txt create mode 100644 gpl.txt create mode 100644 index.html create mode 100644 readme.txt diff --git a/Mac.c b/Mac.c new file mode 100644 index 0000000..9037ad4 --- /dev/null +++ b/Mac.c @@ -0,0 +1,390 @@ +/* Copyright 2000, 2009, 2011, 2012 Neil Edelman, distributed under the terms + of the GNU General Public License, see copying.txt */ + +/* AlexV hacked the game; thanks for the recomendations -- Jan 2011 +I'm using Olivier Gay's SHA-256 implementation, slightly modified */ + +#include +#include "Mac.h" + +#define SHA256_BLOCK_SIZE (512 / 8) + +void hmac_sha256(unsigned char *key, + unsigned char *message, unsigned int message_len, + unsigned char *mac, unsigned mac_size); + +char *Mac(const char *str) { + static const char *mime = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; + static const char *key = +#ifdef SECRET + SECRET +#else + "5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843" +#endif + ; + int i; + static char mac[SHA256_BLOCK_SIZE+1]; + + hmac_sha256((unsigned char *)key, (unsigned char *)str, strlen(str), (unsigned char *)mac, SHA256_BLOCK_SIZE); + + /* URI stringise the MAC (loss of 2-bits) */ + for(i = 0; i < SHA256_BLOCK_SIZE; i++) mac[i] = mime[mac[i] & 63]; + mac[i] = '\0'; + + return mac; +} + +/*- + * HMAC-SHA-224/256/384/512 implementation + * Last update: 06/15/2005 + * Issue date: 06/15/2005 + * + * Copyright (C) 2005 Olivier Gay + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the project nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include + +#define SHA256_DIGEST_SIZE ( 256 / 8) + +#define SHFR(x, n) (x >> n) +#define ROTR(x, n) ((x >> n) | (x << ((sizeof(x) << 3) - n))) +#define CH(x, y, z) ((x & y) ^ (~x & z)) +#define MAJ(x, y, z) ((x & y) ^ (x & z) ^ (y & z)) + +#define SHA256_F1(x) (ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22)) +#define SHA256_F2(x) (ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25)) +#define SHA256_F3(x) (ROTR(x, 7) ^ ROTR(x, 18) ^ SHFR(x, 3)) +#define SHA256_F4(x) (ROTR(x, 17) ^ ROTR(x, 19) ^ SHFR(x, 10)) + +#define UNPACK32(x, str) \ +{ \ + *((str) + 3) = (uint8) ((x) ); \ + *((str) + 2) = (uint8) ((x) >> 8); \ + *((str) + 1) = (uint8) ((x) >> 16); \ + *((str) + 0) = (uint8) ((x) >> 24); \ +} + +#define PACK32(str, x) \ +{ \ + *(x) = ((uint32) *((str) + 3) ) \ + | ((uint32) *((str) + 2) << 8) \ + | ((uint32) *((str) + 1) << 16) \ + | ((uint32) *((str) + 0) << 24); \ +} + +/* Macros used for loops unrolling */ + +#define SHA256_SCR(i) \ +{ \ + w[i] = SHA256_F4(w[i - 2]) + w[i - 7] \ + + SHA256_F3(w[i - 15]) + w[i - 16]; \ +} + +#define SHA256_EXP(a, b, c, d, e, f, g, h, j) \ +{ \ + t1 = wv[h] + SHA256_F2(wv[e]) + CH(wv[e], wv[f], wv[g]) \ + + sha256_k[j] + w[j]; \ + t2 = SHA256_F1(wv[a]) + MAJ(wv[a], wv[b], wv[c]); \ + wv[d] += t1; \ + wv[h] = t1 + t2; \ +} + +typedef uint8_t uint8; +typedef uint32_t uint32; +typedef uint64_t uint64; + +const static uint32 sha256_h0[8] = { + 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, + 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19}; + +uint32 sha256_k[64] = { + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, + 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, + 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, + 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, + 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, + 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, + 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, + 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, + 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2}; + +/* sha2 */ + +typedef struct { + unsigned int tot_len; + unsigned int len; + unsigned char block[2 * SHA256_BLOCK_SIZE]; + uint32 h[8]; +} sha256_ctx; + +void sha256_transf(sha256_ctx *ctx, const unsigned char *message, + unsigned int block_nb) +{ + uint32 w[64]; + uint32 wv[8]; + uint32 t1, t2; + const unsigned char *sub_block; + int i; + + for (i = 0; i < (int) block_nb; i++) { + sub_block = message + (i << 6); + + PACK32(&sub_block[ 0], &w[ 0]); PACK32(&sub_block[ 4], &w[ 1]); + PACK32(&sub_block[ 8], &w[ 2]); PACK32(&sub_block[12], &w[ 3]); + PACK32(&sub_block[16], &w[ 4]); PACK32(&sub_block[20], &w[ 5]); + PACK32(&sub_block[24], &w[ 6]); PACK32(&sub_block[28], &w[ 7]); + PACK32(&sub_block[32], &w[ 8]); PACK32(&sub_block[36], &w[ 9]); + PACK32(&sub_block[40], &w[10]); PACK32(&sub_block[44], &w[11]); + PACK32(&sub_block[48], &w[12]); PACK32(&sub_block[52], &w[13]); + PACK32(&sub_block[56], &w[14]); PACK32(&sub_block[60], &w[15]); + + SHA256_SCR(16); SHA256_SCR(17); SHA256_SCR(18); SHA256_SCR(19); + SHA256_SCR(20); SHA256_SCR(21); SHA256_SCR(22); SHA256_SCR(23); + SHA256_SCR(24); SHA256_SCR(25); SHA256_SCR(26); SHA256_SCR(27); + SHA256_SCR(28); SHA256_SCR(29); SHA256_SCR(30); SHA256_SCR(31); + SHA256_SCR(32); SHA256_SCR(33); SHA256_SCR(34); SHA256_SCR(35); + SHA256_SCR(36); SHA256_SCR(37); SHA256_SCR(38); SHA256_SCR(39); + SHA256_SCR(40); SHA256_SCR(41); SHA256_SCR(42); SHA256_SCR(43); + SHA256_SCR(44); SHA256_SCR(45); SHA256_SCR(46); SHA256_SCR(47); + SHA256_SCR(48); SHA256_SCR(49); SHA256_SCR(50); SHA256_SCR(51); + SHA256_SCR(52); SHA256_SCR(53); SHA256_SCR(54); SHA256_SCR(55); + SHA256_SCR(56); SHA256_SCR(57); SHA256_SCR(58); SHA256_SCR(59); + SHA256_SCR(60); SHA256_SCR(61); SHA256_SCR(62); SHA256_SCR(63); + + wv[0] = ctx->h[0]; wv[1] = ctx->h[1]; + wv[2] = ctx->h[2]; wv[3] = ctx->h[3]; + wv[4] = ctx->h[4]; wv[5] = ctx->h[5]; + wv[6] = ctx->h[6]; wv[7] = ctx->h[7]; + + SHA256_EXP(0,1,2,3,4,5,6,7, 0); SHA256_EXP(7,0,1,2,3,4,5,6, 1); + SHA256_EXP(6,7,0,1,2,3,4,5, 2); SHA256_EXP(5,6,7,0,1,2,3,4, 3); + SHA256_EXP(4,5,6,7,0,1,2,3, 4); SHA256_EXP(3,4,5,6,7,0,1,2, 5); + SHA256_EXP(2,3,4,5,6,7,0,1, 6); SHA256_EXP(1,2,3,4,5,6,7,0, 7); + SHA256_EXP(0,1,2,3,4,5,6,7, 8); SHA256_EXP(7,0,1,2,3,4,5,6, 9); + SHA256_EXP(6,7,0,1,2,3,4,5,10); SHA256_EXP(5,6,7,0,1,2,3,4,11); + SHA256_EXP(4,5,6,7,0,1,2,3,12); SHA256_EXP(3,4,5,6,7,0,1,2,13); + SHA256_EXP(2,3,4,5,6,7,0,1,14); SHA256_EXP(1,2,3,4,5,6,7,0,15); + SHA256_EXP(0,1,2,3,4,5,6,7,16); SHA256_EXP(7,0,1,2,3,4,5,6,17); + SHA256_EXP(6,7,0,1,2,3,4,5,18); SHA256_EXP(5,6,7,0,1,2,3,4,19); + SHA256_EXP(4,5,6,7,0,1,2,3,20); SHA256_EXP(3,4,5,6,7,0,1,2,21); + SHA256_EXP(2,3,4,5,6,7,0,1,22); SHA256_EXP(1,2,3,4,5,6,7,0,23); + SHA256_EXP(0,1,2,3,4,5,6,7,24); SHA256_EXP(7,0,1,2,3,4,5,6,25); + SHA256_EXP(6,7,0,1,2,3,4,5,26); SHA256_EXP(5,6,7,0,1,2,3,4,27); + SHA256_EXP(4,5,6,7,0,1,2,3,28); SHA256_EXP(3,4,5,6,7,0,1,2,29); + SHA256_EXP(2,3,4,5,6,7,0,1,30); SHA256_EXP(1,2,3,4,5,6,7,0,31); + SHA256_EXP(0,1,2,3,4,5,6,7,32); SHA256_EXP(7,0,1,2,3,4,5,6,33); + SHA256_EXP(6,7,0,1,2,3,4,5,34); SHA256_EXP(5,6,7,0,1,2,3,4,35); + SHA256_EXP(4,5,6,7,0,1,2,3,36); SHA256_EXP(3,4,5,6,7,0,1,2,37); + SHA256_EXP(2,3,4,5,6,7,0,1,38); SHA256_EXP(1,2,3,4,5,6,7,0,39); + SHA256_EXP(0,1,2,3,4,5,6,7,40); SHA256_EXP(7,0,1,2,3,4,5,6,41); + SHA256_EXP(6,7,0,1,2,3,4,5,42); SHA256_EXP(5,6,7,0,1,2,3,4,43); + SHA256_EXP(4,5,6,7,0,1,2,3,44); SHA256_EXP(3,4,5,6,7,0,1,2,45); + SHA256_EXP(2,3,4,5,6,7,0,1,46); SHA256_EXP(1,2,3,4,5,6,7,0,47); + SHA256_EXP(0,1,2,3,4,5,6,7,48); SHA256_EXP(7,0,1,2,3,4,5,6,49); + SHA256_EXP(6,7,0,1,2,3,4,5,50); SHA256_EXP(5,6,7,0,1,2,3,4,51); + SHA256_EXP(4,5,6,7,0,1,2,3,52); SHA256_EXP(3,4,5,6,7,0,1,2,53); + SHA256_EXP(2,3,4,5,6,7,0,1,54); SHA256_EXP(1,2,3,4,5,6,7,0,55); + SHA256_EXP(0,1,2,3,4,5,6,7,56); SHA256_EXP(7,0,1,2,3,4,5,6,57); + SHA256_EXP(6,7,0,1,2,3,4,5,58); SHA256_EXP(5,6,7,0,1,2,3,4,59); + SHA256_EXP(4,5,6,7,0,1,2,3,60); SHA256_EXP(3,4,5,6,7,0,1,2,61); + SHA256_EXP(2,3,4,5,6,7,0,1,62); SHA256_EXP(1,2,3,4,5,6,7,0,63); + + ctx->h[0] += wv[0]; ctx->h[1] += wv[1]; + ctx->h[2] += wv[2]; ctx->h[3] += wv[3]; + ctx->h[4] += wv[4]; ctx->h[5] += wv[5]; + ctx->h[6] += wv[6]; ctx->h[7] += wv[7]; + } +} + +void sha256_init(sha256_ctx *ctx) +{ + ctx->h[0] = sha256_h0[0]; ctx->h[1] = sha256_h0[1]; + ctx->h[2] = sha256_h0[2]; ctx->h[3] = sha256_h0[3]; + ctx->h[4] = sha256_h0[4]; ctx->h[5] = sha256_h0[5]; + ctx->h[6] = sha256_h0[6]; ctx->h[7] = sha256_h0[7]; + ctx->len = 0; + ctx->tot_len = 0; +} + +void sha256_update(sha256_ctx *ctx, const unsigned char *message, + unsigned int len) +{ + unsigned int block_nb; + unsigned int new_len, rem_len, tmp_len; + const unsigned char *shifted_message; + + tmp_len = SHA256_BLOCK_SIZE - ctx->len; + rem_len = len < tmp_len ? len : tmp_len; + + memcpy(&ctx->block[ctx->len], message, rem_len); + + if (ctx->len + len < SHA256_BLOCK_SIZE) { + ctx->len += len; + return; + } + + new_len = len - rem_len; + block_nb = new_len / SHA256_BLOCK_SIZE; + + shifted_message = message + rem_len; + + sha256_transf(ctx, ctx->block, 1); + sha256_transf(ctx, shifted_message, block_nb); + + rem_len = new_len % SHA256_BLOCK_SIZE; + + memcpy(ctx->block, &shifted_message[block_nb << 6], + rem_len); + + ctx->len = rem_len; + ctx->tot_len += (block_nb + 1) << 6; +} + +void sha256_final(sha256_ctx *ctx, unsigned char *digest) +{ + unsigned int block_nb; + unsigned int pm_len; + unsigned int len_b; + + block_nb = (1 + ((SHA256_BLOCK_SIZE - 9) + < (ctx->len % SHA256_BLOCK_SIZE))); + + len_b = (ctx->tot_len + ctx->len) << 3; + pm_len = block_nb << 6; + + memset(ctx->block + ctx->len, 0, pm_len - ctx->len); + ctx->block[ctx->len] = 0x80; + UNPACK32(len_b, ctx->block + pm_len - 4); + + sha256_transf(ctx, ctx->block, block_nb); + + UNPACK32(ctx->h[0], &digest[ 0]); + UNPACK32(ctx->h[1], &digest[ 4]); + UNPACK32(ctx->h[2], &digest[ 8]); + UNPACK32(ctx->h[3], &digest[12]); + UNPACK32(ctx->h[4], &digest[16]); + UNPACK32(ctx->h[5], &digest[20]); + UNPACK32(ctx->h[6], &digest[24]); + UNPACK32(ctx->h[7], &digest[28]); +} + +void sha256(const unsigned char *message, unsigned int len, unsigned char *digest) +{ + sha256_ctx ctx; + + sha256_init(&ctx); + sha256_update(&ctx, message, len); + sha256_final(&ctx, digest); +} + +/* hmac-sha2 */ + +typedef struct { + sha256_ctx ctx_inside; + sha256_ctx ctx_outside; + + /* for hmac_reinit */ + sha256_ctx ctx_inside_reinit; + sha256_ctx ctx_outside_reinit; + + unsigned char block_ipad[SHA256_BLOCK_SIZE]; + unsigned char block_opad[SHA256_BLOCK_SIZE]; +} hmac_sha256_ctx; + +void hmac_sha256_init(hmac_sha256_ctx *ctx, unsigned char *key) +{ + unsigned int num; + + unsigned char *key_used; + int i; + + key_used = key; + num = SHA256_BLOCK_SIZE; + + for (i = 0; i < num; i++) { + ctx->block_ipad[i] = key_used[i] ^ 0x36; + ctx->block_opad[i] = key_used[i] ^ 0x5c; + } + + sha256_init(&ctx->ctx_inside); + sha256_update(&ctx->ctx_inside, ctx->block_ipad, SHA256_BLOCK_SIZE); + + sha256_init(&ctx->ctx_outside); + sha256_update(&ctx->ctx_outside, ctx->block_opad, + SHA256_BLOCK_SIZE); + + /* for hmac_reinit */ + memcpy(&ctx->ctx_inside_reinit, &ctx->ctx_inside, + sizeof(sha256_ctx)); + memcpy(&ctx->ctx_outside_reinit, &ctx->ctx_outside, + sizeof(sha256_ctx)); +} + +void hmac_sha256_reinit(hmac_sha256_ctx *ctx) +{ + memcpy(&ctx->ctx_inside, &ctx->ctx_inside_reinit, + sizeof(sha256_ctx)); + memcpy(&ctx->ctx_outside, &ctx->ctx_outside_reinit, + sizeof(sha256_ctx)); +} + +void hmac_sha256_update(hmac_sha256_ctx *ctx, unsigned char *message, + unsigned int message_len) +{ + sha256_update(&ctx->ctx_inside, message, message_len); +} + +void hmac_sha256_final(hmac_sha256_ctx *ctx, unsigned char *mac, + unsigned int mac_size) +{ + unsigned char digest_inside[SHA256_DIGEST_SIZE]; + unsigned char mac_temp[SHA256_DIGEST_SIZE]; + + sha256_final(&ctx->ctx_inside, digest_inside); + sha256_update(&ctx->ctx_outside, digest_inside, SHA256_DIGEST_SIZE); + sha256_final(&ctx->ctx_outside, mac_temp); + memcpy(mac, mac_temp, mac_size); +} + +void hmac_sha256(unsigned char *key, + unsigned char *message, unsigned int message_len, + unsigned char *mac, unsigned mac_size) +{ + hmac_sha256_ctx ctx; + + hmac_sha256_init(&ctx, key); + hmac_sha256_update(&ctx, message, message_len); + hmac_sha256_final(&ctx, mac, mac_size); +} diff --git a/Mac.h b/Mac.h new file mode 100644 index 0000000..7f1df6a --- /dev/null +++ b/Mac.h @@ -0,0 +1 @@ +char *Mac(const char *str); diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..592719c --- /dev/null +++ b/Makefile @@ -0,0 +1,19 @@ +PROJ := oss.cgi +OBJS := Oss.o Room.o Mac.o +SRCS := $(OBJS:.o=.c) +H := $(OBJS:.o=.h) + +CC := gcc +CF := -Wall -O3 -fasm -fomit-frame-pointer -ffast-math -funroll-loops -fasm -fomit-frame-pointer -ffast-math -funroll-loops -pedantic -ansi + +default: $(PROJ) + +$(PROJ): $(OBJS) + $(CC) $(CF) -o $@ $(OBJS) + +.c.o: + $(CC) $(CF) -c $< -D NEIL #DEBUG + +.PHONY: clean +clean: + -rm $(OBJS) diff --git a/Oss.c b/Oss.c new file mode 100644 index 0000000..8f5032b --- /dev/null +++ b/Oss.c @@ -0,0 +1,475 @@ +/* Copyright 2000, 2009, 2011, 2012 Neil Edelman, distributed under the terms + of the GNU General Public License, see copying.txt */ + +/* it's the OSS game, by Neil Edelman (Dec. 2000) */ +/* let's make it playable on the web (Dec 2009) */ + +#include /* malloc free */ +#include /* fprintf */ +#include +#include /* manipulating query strings */ +#include /* isalnum */ +#include /* time */ +#include "Oss.h" +#include "Mac.h" +#include "Room.h" + +/* constants */ +static const char *year = "2000, 2011, 2012"; +static const int versionMajor = 3; +static const int versionMinor = 0; +#define SCORES 8 +extern const int nowhereroom; +extern const int startroom; /* def in Room */ +static const char *title = "OSS Game"; +static const char *inputname = "choice"; +static const char *exec = "oss.cgi"; +static const char *scorefile = "badass"; +static const unsigned long forget_time = 1024; /* about 15 minutes */ +/* my sever name */ +#ifdef NEIL +static const char *valid = "http://neil.chaosnet.org/cgi-bin/oss-game/oss.cgi"; +static const char *start = "http://neil.chaosnet.org/cgi-bin/oss-game/"; +#endif + +/* private */ +struct Hi { + char last_ip[16]; /* xxx.xxx.xxx.xxx */ + char last_game[HISTSIZE]; + unsigned long last_time; + struct Oss score[SCORES]; + int size; +}; + +/* C89 (in which we compile, maybe) doesn't have this prototype (pedantic) */ +/*int snprintf(char *str, size_t size, const char *format, ...);*/ + +static void Oss(struct Oss *oss); +static struct Oss *history(const char *history); +static int osscomp(const struct Oss *a, const struct Oss *b); +static char *query(void); +static char *get_next(char **queryp, const char *want); +static char *status(const struct Oss *o); +static char load(struct Oss *oss); +static int simplify(char *str); +static void printoss(const struct Oss *oss); +static int Hi(struct Hi *hi); +static void HiPrint(struct Hi *hi); +static void HiSave(struct Oss *oss); +static void usage(const char *argvz); + +/** initialise */ +static void Oss(struct Oss *oss) { + if(!oss) return; + oss->room = startroom; + oss->flags = 0; + oss->points = 0; + oss->friends = 0; + oss->enemies = 0; + oss->education = 0; + oss->trouble = 0; + oss->history[0]= '\0'; + oss->name[0] = '\0'; +} + +/** options */ +void OssMessage(const struct Oss *o, const char *message, ...) { + va_list ap; + char *option, letter = 'a'; + + /* print the text */ + printf("

%s

\n\n", message); + printf("

\n", exec); + /* hidden args */ + printf("\n", o->room); + printf("\n", o->flags); + printf("\n", o->points); + printf("\n", o->friends); + printf("\n", o->enemies); + printf("\n", o->education); + printf("\n", o->trouble); + printf("\n", o->history); + /* start at the first argument */ + va_start(ap, message); + while((option = va_arg(ap, char *))) { + printf("", inputname, letter); + printf("%s
\n", option); + if(++letter == 'z') break; + } + va_end(ap); + /* end the form */ + printf("\n"); + printf("

\n"); +} + +/* private */ + +/** given a history in choices, let it play out and return the result */ +static struct Oss *history(const char *history) { + void (*fn)(struct Oss *, const char, const int); + static struct Oss oss; + char *h; + + Oss(&oss); + for(h = (char *)history; *h; h++) { + if(!(fn = RoomFn(oss.room))) break; +#ifdef DEBUG + printf("

%s: %s(%c)

\n\n", RoomName(oss.room), h, *h); + printoss(&oss); +#endif + (*fn)(&oss, *h, 0); + } + return &oss; +} + +/** compares the oss games, returns 0 if they're equal */ +static int osscomp(const struct Oss *a, const struct Oss *b) { + if(!a || !b) return 1; + if(a->room != b->room) return -1; + if(a->points != b->points) return -2; + if(a->friends != b->friends) return -3; + if(a->enemies != b->enemies) return -4; + if(a->education != b->education) return -5; + if(a->trouble != b->trouble) return -6; + if(a->flags != b->flags) return -7; + return 0; +} + +/** get the query string */ +static char *query(void) { + /*'mac=[64]&room=xx&flags=xxxx&points=xxx&friends=xxx&ememies=xxx&education=xxx&trouble=xxx&choice=xx'*/ + /*'mac=[64]&room=xx&flags=xxxx&points=xxx&friends=xxx&ememies=xxx&education=xxx&trouble=xxx&name=xxxxxxx'*/ + static char post[192]; + char *query = 0, *method; + + if(!(method = getenv("REQUEST_METHOD"))) return 0; + if(!strcmp("POST", method)) { + fgets(post, sizeof(post), stdin); + query = post; + } else if(!strcmp("GET", method)) { + query = getenv("QUERY_STRING"); + } else { + printf("

Undefined request method, "%s."

\n\n", method); + } + + return query; +} + +/** gets a query string "want" and advances the queryPtr, or does nothing if + "want" is not arg */ +static char *get_next(char **queryp, const char *want) { + char *thing = 0, *query; + + /* paranoid */ + if(!queryp || !(query = *queryp) || !want) return 0; + /* thing is at '=', make sure the 'want' is actually what we have */ + if(!(thing = strpbrk(query, "="))) return 0; + if(strncmp(query, want, thing - query)) return 0; + thing++; + /* move to the next arg, return it and advance the query */ + if((query = strpbrk(thing, "&"))) { + *query = '\0'; + query++; + *queryp = query; + } else { + *queryp = 0; + } + + return thing; +} + +/** for MAC */ +static char *status(const struct Oss *o) { + static char status[64]; + /* rXXfXXpXXfXXeXXeXXtXX */ + snprintf(status, 64, "r%df%dp%df%de%de%dt%d", o->room, o->flags, + o->points, o->friends, o->enemies, o->education, o->trouble); + return status; +} + +/** load game */ +static char load(struct Oss *oss) { + char *env, *q; + char *sRoom, *sFlags, *sPoints, *sFriends, *sEnemies, *sEducation; + char *sTrouble, *sChoice, *sHistory, choice; + char *sMac, *cMac, *sName; + int histSize; + struct Oss *check; + + /* initial game state */ + Oss(oss); + /* check env vars */ + if(!(env = getenv("REQUEST_METHOD")) || strcmp(env, "POST")) return 0; + /* not valid referrer, show the hi-scores */ +#ifdef NEIL + if(!(env = getenv("HTTP_REFERER")) || strncmp(env, valid, strlen(valid))) { + struct Hi hi; + if(Hi(&hi)) HiPrint(&hi); + else printf("

Error loading high scores.

\n\n"); + printf("

Go back to the start of OSS game.

", start); + printf("\n\n"); + printf("\n"); + exit(0); + } +#endif + if(!(q = query())) return 0; + /* deconstruct query */ + if(!(sRoom = get_next(&q, "room"))) return 0; + if(!(sFlags = get_next(&q, "flags"))) return 0; + if(!(sPoints = get_next(&q, "points"))) return 0; + if(!(sFriends = get_next(&q, "friends"))) return 0; + if(!(sEnemies = get_next(&q, "enemies"))) return 0; + if(!(sEducation = get_next(&q, "education"))) return 0; + if(!(sTrouble = get_next(&q, "trouble"))) return 0; + if(!(sHistory = get_next(&q, "history"))) return 0; + /* history can only be HISTSIZE-1 */ + histSize = strlen(sHistory); + if(histSize >= HISTSIZE) + { printf("

Too much history!

\n\n"); return 0; } + oss->room = atoi(sRoom); + oss->flags = atoi(sFlags); + oss->points = atoi(sPoints); + oss->friends = atoi(sFriends); + oss->enemies = atoi(sEnemies); + oss->education = atoi(sEducation); + oss->trouble = atoi(sTrouble); + if((sChoice = get_next(&q, "choice"))) { + if(sChoice[0] == '\0' || sChoice[1] != '\0') + { printf("

Choice is not single character.

\n\n"); return 0; } + if(histSize >= HISTSIZE - 1) + { printf("

Too much history.

\n\n"); return 0; } + choice = sChoice[0]; + sprintf(oss->history, "%s%c", sHistory, choice); + } else { + strcpy(oss->history, sHistory); + /* high score? */ + if(!(sName = get_next(&q, "name")) || !simplify(sName)) + { printf("

Invalid entry; sorry try again.

\n\n"); return 0; } + strcpy(oss->name, sName); + /* check MAC */ + if(!(sMac = get_next(&q, "mac"))) + { printf("

Submitted to high-score without Message Authentication Code.

\n\n"); return 0; } + cMac = Mac(status(oss)); + if(strcmp(sMac, cMac)) + { printf("

Message Authentication Code check failed!

\n\n"); return 0; } + /* check history (muhaha!) */ + if(osscomp(oss, check = history(oss->history))) { + printf("

Data given does not support score; how did you get here?

\n\n"); + printf("

You scored:

\n\n"); + printoss(oss); + printf("

But the history says:

\n\n"); + printoss(check); + return 0; + } + /* flags it as not an error */ + return -1; + } +#ifdef DEBUG + printf("Load: room:%d;flags:%d;points:%d;f%de%de%dt%d;h:%s;%c

\n", + oss->room, oss->flags, oss->points, oss->friends, oss->enemies, + oss->education, oss->trouble, oss->history, choice == 0 ? '0' : choice); +#endif + return choice; +} + +/** gets rid of all not isalnum, returns the size of the result */ +static int simplify(char *str) { + char *i, *o; + for(i = o = str; ; i++) { + if(*i == '\0') { + *o = '\0'; + break; + } else if(*i == '%') { + if(!i[1] || !i[2]) continue; + i += 2; /* forget fancy chars, too much work! */ + } else if(isalnum((int)*i)) { + *o = *i; + o++; + } + } + return o - str; +} + +/** entry point */ +int main(int argc, char **argv) { + char choice; + void (*fn)(struct Oss *, const char, const int); + struct Oss oss; + + if(argc > 1) { usage(argv[0]); return 0; } + printf("Content-Type: text/html; encoding=us-ascii\n\n"); + printf("\n\n"); + printf("\n\n"); + printf("\n"); + printf("%s\n", title); + printf("\n"); + printf("\n"); + printf("\n"); + printf("\n"); + printf("\n"); + printf("\n\n"); + printf("\n"); + printf("

%s

\n", title); + /* load a game based on POST */ + choice = load(&oss); + /* find the room */ + fn = RoomFn(oss.room); + /* execute the room */ + if(fn && choice) { + printf("

\n"); + (*fn)(&oss, choice, -1); + printf("

\n"); + /* the room now is no longer valid, find the new room */ + fn = RoomFn(oss.room); + if(strlen(oss.history) >= HISTSIZE - 1) { + printf("

You pass out from exhaustion. You shouldh've eaten a hardier breakfast.

\n\n"); + fn = 0; + } + } + /* print the new room */ + if(fn) { + printoss(&oss); + (*fn)(&oss, 0, -1); + } else if(choice) { + /* isn't in a room! the play has stopped, choice has been flagged as + valid in load(), end of the game! */ + HiSave(&oss); + } + printf("

Go back to The Beginning.

\n"); + printf("\n\n"); + printf("\n"); + + return EXIT_SUCCESS; +} + +/* Oss to html */ +static void printoss(const struct Oss *oss) { + printf("\n\n"); + printf("\n", + oss->points, oss->friends, oss->enemies, oss->education, oss->trouble); + printf("
ScoreFriendsEnemiesEducationDetentions
%d%d%d%d%d
\n\n"); +} + +/** loads the high scores */ +static int Hi(struct Hi *hi) { + struct Oss *s; + FILE *fp; + int i; + + if(!(fp = fopen(scorefile, "r"))) return 0; + if(fscanf(fp, "%15s %lu %63s\n", hi->last_ip, &hi->last_time, hi->last_game) != 3) + { fclose(fp); return 0; } + for(i = 0; i < SCORES; i++) { + s = &hi->score[i]; + if(fscanf(fp, "%d, %d, %d, %d, %d, %d, %hd, %7s\n", + &s->room, &s->points, &s->friends, &s->enemies, &s->education, + &s->trouble, &s->flags, s->name) != 8) break; + } + fclose(fp); + hi->size = i; + return -1; +} + +/** prints the high scores */ +static void HiPrint(struct Hi *hi) { + struct Oss *s; + int i; + + printf("\n\n"); + printf("\n"); + for(i = 0; i < hi->size; i++) { + s = &hi->score[i]; + printf("\n", + i & 1 ? "odd" : "even", s->name, s->points, s->friends, + s->enemies, s->education, s->trouble); + } + printf("
High-Score Table
NameScoreFriendsEnemiesEducationDetentions
%s%d%d%d%d%d
\n\n"); +} + +/** this does a high score, assumed they passed the hacker's test */ +static void HiSave(struct Oss *oss) { + struct Hi hi; + struct Oss *s; + FILE *fp; + int p, i, named = oss->name[0] == '\0' ? 0 : -1; + char *ip; + + if(!named) { + printf("

Game over; you:

\n\n"); + RoomReport(oss); + } + if(!Hi(&hi)) { + printf("

Error loading the high-scores table.

\n\n"); + return; + } + if(!named) { + HiPrint(&hi); + } + /* find the position in the high score table */ + for(p = 0; p < hi.size; p++) if(oss->points >= hi.score[p].points) break; + /* did not make it */ + if(p >= SCORES) return; + /* is not named */ + if(!named) { + printf("

You made a high-score; enter your mark to live in glory forever:\n"); + printf("

\n", exec); + printf("\n", oss->room); + printf("\n", oss->flags); + printf("\n", oss->points); + printf("\n", oss->friends); + printf("\n", oss->enemies); + printf("\n", oss->education); + printf("\n", oss->trouble); + printf("\n", oss->history); + printf("\n"); + printf("\n", Mac(status(oss))); + printf("\n"); + printf("

\n\n"); + return; + } + /* check if the score is new */ + for(i = p; i < hi.size; i++) { + if(oss->points != hi.score[i].points) break; + if(!strcmp(oss->name, hi.score[i].name)) { + printf("

"%s" is already the high score with %d points.

\n\n", oss->name, oss->points); + return; + } + } + /* check if it's the same player entering different names */ + if(!(ip = getenv("REMOTE_ADDR"))) + { printf("Your REMOTE_ADDR needs to be recorded to get on the high-scores table.\n"); return; } + if(!strcmp(hi.last_ip, ip) && hi.last_time + forget_time > time(0) && !strcmp(hi.last_game, oss->history)) { + printf("This REMOTE_ADDR has recently been added to the high-score table with that exact same game.\n"); + return; + } + /* move the scores down to make space */ + if(p < hi.size) { + int size = (hi.size < SCORES) ? hi.size - p : SCORES - 1 - p; + memmove(&hi.score[p+1], &hi.score[p], sizeof(struct Oss)*size); + } + if(hi.size < SCORES) hi.size++; + memcpy(&hi.score[p], oss, sizeof(struct Oss)); + /* save score! */ + if(!(fp = fopen(scorefile, "w"))) + { printf("

Error saving the score.

\n\n"); return; } + /* time_t -> unsigned long is scetch */ + fprintf(fp, "%.15s %lu %.63s\n", getenv("REMOTE_ADDR"), (unsigned long)time(0), oss->history); + for(i = 0; i < hi.size; i++) { + s = &hi.score[i]; + fprintf(fp, "%d, %d, %d, %d, %d, %d, %hd, %7s\n", + s->room, s->points, s->friends, s->enemies, s->education, + s->trouble, s->flags, s->name); + } + fclose(fp); + printf("

%s shall be known for all enternity with a high-score of %d.

\n\n", oss->name, oss->points); +} + +static void usage(const char *argvz) { + fprintf(stderr, "Usage: %s\n", argvz); + fprintf(stderr, "Version %d.%d.\n\n", versionMajor, versionMinor); + fprintf(stderr, "%s Copyright %s Neil Edelman\n", title, year); + fprintf(stderr, "Uses HMAC-SHA-256 code Copyright (C) 2005 Olivier Gay.\n\n"); + fprintf(stderr, "This program comes with ABSOLUTELY NO WARRANTY.\n"); + fprintf(stderr, "This is free software, and you are welcome to redistribute it\n"); + fprintf(stderr, "under certain conditions; see copying.txt.\n\n"); +} diff --git a/Oss.h b/Oss.h new file mode 100644 index 0000000..3257108 --- /dev/null +++ b/Oss.h @@ -0,0 +1,16 @@ +/* change the strings "%63s" etc too! */ +#define HISTSIZE 64 + +struct Oss { + int room; + int points; + int friends; + int enemies; + int education; + int trouble; + short flags; + char history[HISTSIZE]; + char name[8]; +}; + +void OssMessage(const struct Oss *o, const char *message, ...); diff --git a/Room.c b/Room.c new file mode 100644 index 0000000..3c29f34 --- /dev/null +++ b/Room.c @@ -0,0 +1,1058 @@ +/* Copyright 2000, 2009, 2011, 2012 Neil Edelman, distributed under the terms + of the GNU General Public License, see copying.txt */ + +/* it's the OSS game, by Neil Edelman (Dec. 2000) */ +/* let's make it playable on the web (Dec 2009) */ +/* high-score and oops fix (May 2012) */ + +#include +#include +#include "Oss.h" +#include "Room.h" + +int room_comp(const void *key, const void *elem); + +static void Outside(struct Oss *oss, const char, const int); +static void Entrance(struct Oss *oss, const char, const int); +static void ParkingLot(struct Oss *oss, const char, const int); +static void Concourse(struct Oss *oss, const char, const int); +static void ComputerRoom(struct Oss *oss, const char, const int); +static void Office(struct Oss *oss, const char, const int); +static void StaffRoom(struct Oss *oss, const char, const int); +static void Bathroom(struct Oss *oss, const char, const int); +static void ScienceRoom(struct Oss *oss, const char, const int); +static void Lunch(struct Oss *oss, const char, const int); +static void Concession(struct Oss *oss, const char, const int); +static void EndLunch(struct Oss *oss, const char, const int); +static void Basement(struct Oss *oss, const char, const int); +static void Gym(struct Oss *oss, const char, const int); +static void OutsideAgriculture(struct Oss *oss, const char, const int); +static void Agriculture(struct Oss *oss, const char, const int); +static void Detentions(struct Oss *oss, const char, const int choice); +static void EndSchool(struct Oss *oss, const char, const int); +static void JackShaw(struct Oss *oss, const char, const int); +static void JackShawDogopole(struct Oss *oss, const char, const int choice); +static void JackShawSchulting(struct Oss *oss, const char, const int choice); +static void Cops(struct Oss *oss, const char, const int); + +enum Room { + rNowhere = 0, + rAgriculture, + rBasement, + rBathroom, + rComputerRoom, + rConcession, + rConcourse, + rCops, + rDetentions, + rEndLunch, + rEndSchool, + rEntrance, + rGym, + rJackShaw, + rJackShawDogopole, + rJackShawSchulting, + rLunch, + rOffice, + rOutside, + rOutsideAgriculture, + rParkingLot, + rScienceRoom, + rStaffRoom +}; + +enum { + SavedFlagBoy = 1, + MessedWithSign = 2, + BeenInComputerRoom = 4, + BeenInBathroom = 8, + KnowOfFight = 16, + ResetClock = 32, + SeenConcession = 64, + FriedFork = 128, + SeenGym = 256, + Explored = 512, + FireAlarm = 1024 +}; + +static const struct FnName { + char *description; + void (*fn)(struct Oss *, const char, const int); + enum Room code; +} fnnames[] = { + { "Agriculture", &Agriculture, rAgriculture }, + { "Basement", &Basement, rBasement }, + { "Bathroom", &Bathroom, rBathroom }, + { "ComputerRoom", &ComputerRoom, rComputerRoom }, + { "Concession", &Concession, rConcession }, + { "Concourse", &Concourse, rConcourse }, + { "Cops", &Cops, rCops }, + { "Detentions", &Detentions, rDetentions }, + { "EndLunch", &EndLunch, rEndLunch }, + { "EndSchool", &EndSchool, rEndSchool }, + { "Entrance", &Entrance, rEntrance }, + { "Gym", &Gym, rGym }, + { "JackShaw", &JackShaw, rJackShaw }, + { "JackShawDogopole", &JackShawDogopole, rJackShawDogopole }, + { "JackShawSchulting", &JackShawSchulting, rJackShawSchulting }, + { "Lunch", &Lunch, rLunch }, + { "Office", &Office, rOffice }, + { "Outside", &Outside, rOutside }, + { "OutsideAgriculture", &OutsideAgriculture, rOutsideAgriculture }, + { "ParkingLot", &ParkingLot, rParkingLot }, + { "ScienceRoom", &ScienceRoom, rScienceRoom }, + { "StaffRoom", &StaffRoom, rStaffRoom }, +}; + +/* constants */ +const int nowhereroom = rNowhere; +const int startroom = rOutside; +static const int keywaitcount = 4; +static const int detentionminutes = 30; + +/** given the number of the room, return the function */ +void (*RoomFn(const int room))(struct Oss *, const char, const int) { + struct FnName *fnname = bsearch(&room, /* key */ + fnnames, /* base, num, size */ + sizeof(fnnames) / sizeof(struct FnName), + sizeof(struct FnName), + &room_comp); /* comparator */; + return fnname ? fnname->fn : 0; +} + +/** given the number of the room, return the name (for debuging) */ +char *RoomName(const int room) { + struct FnName *fnname = bsearch(&room, /* key */ + fnnames, /* base, num, size */ + sizeof(fnnames) / sizeof(struct FnName), + sizeof(struct FnName), + &room_comp); /* comparator */; + return fnname ? fnname->description : 0; +} + +/** report points */ +void RoomReport(const struct Oss *oss) { + printf("

Scored %i; made %i new friend%s; made %i new enem%s; changed \ +your grade by %i; and skipped %i detention%s.

\n\n", + oss->points, oss->friends, oss->friends == 1 ? "" : "s", + oss->enemies, oss->enemies == 1 ? "y" : "ies", oss->education, + oss->trouble, oss->trouble == 1 ? "" : "s"); + if(oss->flags & SavedFlagBoy) printf("

You saved flag boy.

\n\n"); + if(oss->flags & MessedWithSign) printf("

You messed with the sign.

\n\n"); + if(oss->flags & ResetClock) printf("

You permenently altered The Clock; now the school is in it's own time zone.

\n\n"); + if(oss->flags & FriedFork) printf("

You put a fork in the microwave.

\n\n"); + if(oss->flags & Explored) printf("

You explored the school.

\n\n"); + if(oss->flags & FireAlarm) printf("

You have a broken fire alarm pull station.

\n\n"); +} + +/** compares the key-enum with the function; this is bsearch-compatible */ +int room_comp(const void *key, const void *elem) { + return *(enum Room *)key - ((struct FnName *)elem)->code; +} + +/* right, enough with the preliminaries, this is the story */ + +static void Outside(struct Oss *oss, const char choice, const int show) { + switch(choice) { + case 0: + OssMessage(oss, "You find yourself outside of \"Osoyoos Secondarie Skol\" (according to the sign). On the wall is a \"Drug Free Zone\" poster. A grade-8 is duct-tapped to the flag pole.\n", + "go inside;", + "go back to the parking lot;", + "cut the grade-8 down; or", + "vandalize the sign;", (char *)0); + break; + case 'a': + oss->room = rEntrance; + break; + case 'b': + oss->room = rParkingLot; + break; + case 'c': + if(show) printf("You try to gnaw off the duct tape holding the kid, but it won't come loose. Eventually a teacher named Mr. Mocci helps you take him down, but not before some seniors laugh at you.\n"); + oss->flags |= SavedFlagBoy; + oss->points--; + oss->friends++; + oss->room = rEntrance; + break; + case 'd': + if(show) printf("You draw a big smiley face on the sign. Some kids come by and are impressed with your artwork, but a Mr. Hartman sees you and gives you a detention.\n"); + oss->flags |= MessedWithSign; + oss->points++; + oss->trouble++; + oss->room = rEntrance; + break; + } +} + +static void Entrance(struct Oss *oss, const char choice, const int show) { + switch(choice) { + case 0: + OssMessage(oss, "You enter the main school building.", + "go ahead to the concourse", + "go left into the computer room", + "head right into the office", (char *)0); + break; + case 'a': + oss->room = rConcourse; + break; + case 'b': + oss->room = rComputerRoom; + break; + case 'c': + if(show) printf("Some students in the concourse see you enter the office and think that you are a loser.\n"); + oss->points--; + oss->room = rOffice; + break; + } +} + +static void ParkingLot(struct Oss *oss, const char choice, const int show) { + switch(choice) { + case 0: + OssMessage(oss, "The parking lot is full of rusty old cars. Just then, a student pulls in, does a doughnut, and squeals his car to a halt beside you. You:", + "compliment him on his driving;", + "swear at him for almost running you over;", + "run away and hope he isn't trying to kill you; or", + "ask him to help you sabotage a teacher's car.", (char *)0); + break; + case 'a': + if(show) printf("He laughs and you head back to the school.\n"); + oss->friends++; + oss->room = rEntrance; + break; + case 'b': + if(show) printf("\"I didn't even come close to hitting you,\" he says. You follow him inside.\n"); + oss->enemies++; + oss->room = rEntrance; + break; + case 'c': + if(show) printf("He doesn't seem to notice you as you run back to the school.\n"); + oss->room = rEntrance; + break; + case 'd': + if(show) printf("\"Dude!\" says the driver. You go to the mechanics room, get a Mr. Sanderson to lend you a jack, and return to the parking lot, removing the tires from a blue neon. That teacher will be mad. You go back into the school.\n"); + oss->points += 2; + oss->friends++; + oss->room = rEntrance; + break; + } +} + +static void Concourse(struct Oss *oss, const char choice, const int show) { + switch(choice) { + case 0: + OssMessage(oss, "You are in the concourse, heart of the school. What a mess. People are everywhere. So is garbage.", + "sit with the grade-8's;", + "sit with the grade-12's;", + "try to find some hot babes;", + "help the janitor pick up garbage;", + "get to science class on time;", + "go to the computer room; or", + "go to the bathroom.", (char *)0); + break; + case 'a': + if(show) printf("The grade-8's throw food at you, but are otherwise friendly. When it is five minutes after the start of class, you follow some other students into class.\n"); + oss->friends++; + oss->room = rScienceRoom; + break; + case 'b': + if(show) printf("The grade-12's tell you about a fight at Jack Shaw Gardens tonight. When it is ten minutes after the start of class, you follow them into the science room.\n"); + oss->flags |= KnowOfFight; + oss->room = rScienceRoom; + break; + case 'c': + if(show) printf("By the time class should start, you still can't find any. Maybe they'll be some in class.\n"); + oss->room = rScienceRoom; + break; + case 'd': + if(show) printf("You pick up garbage until class and get crud all over your hands.\n"); + oss->points--; + oss->room = rScienceRoom; + break; + case 'e': + if(show) printf("You go to the science class and stand at the door for a few minutes until the teacher unlocks it.\n"); + oss->room = rScienceRoom; + break; + case 'f': + if(oss->flags & BeenInComputerRoom) { + if(show) printf("

The door to the computer room is locked. You back into the concourse.

\n\n"); + oss->room = rConcourse; + } else { + oss->room = rComputerRoom; + } + break; + case 'g': + if(oss->flags & BeenInBathroom) { + if(show) printf("

The bathroom is still the same. You go back to the concourse.

\n\n"); + oss->room = rConcourse; + } else { + oss->room = rBathroom; + } + break; + } +} + +static void ComputerRoom(struct Oss *oss, const char choice, const int show) { + switch(choice) { + case 0: + OssMessage(oss, "The computer room is full of malfunctioning computers:", + "leave;", + "hack into the student database;", + "bust into the closet with the main server in it;", + "push a computer onto the floor and blame it on someone else; or", + "listen to what the teacher is saying.", (char *)0); + return; + case 'a': + oss->room = rConcourse; + break; + case 'b': + if(show) printf("Mr. Schulting sees you and gives you a detention, but not before you manage to augment your grades a bit. He becomes your sworn enemy, though the computer dudes think that you are cool.\n"); + oss->points++; + oss->friends++; + oss->enemies++; + oss->education++; + oss->trouble++; + oss->room = rConcourse; + break; + case 'c': + if(show) printf("You bust down the door, but Mr. Schulting quickly overpowers you and sends you outside, giving you a detention. The other students think that you are a weird psycho.\n"); + oss->points--; + oss->trouble++; + oss->room = rConcourse; + break; + case 'd': + if(show) printf("SMASH. The monitor falls on your foot and glass flies everywhere. The shaking causes a light to fall on your head. You die.\n"); + oss->points--; + oss->room = rNowhere; + break; + case 'e': + if(show) printf("Mr. Schulting tells you about the final exams for the computer courses before you leave.\n"); + oss->education++; + oss->room = rConcourse; + break; + } + oss->flags |= BeenInComputerRoom; +} + +static void Office(struct Oss *oss, const char choice, const int show) { + switch(choice) { + case 0: + OssMessage(oss, "The office is before you . . . ", + "get the secretary to print out a class schedule for you;", + "put a whoopie-cushion on the principal's chair;", + "sneak back into the staff room; or", + "report the flag-pole kid to the vice-principal.", (char *)0); + break; + case 'a': + if(show) printf("You get a class schedule, and walk back to the concourse.\n"); + oss->education++; + oss->room = rConcourse; + break; + case 'b': + if(show) printf("In a daring move, you duck into the principal's office and place the trap, walking back to the concourse. The watching students now think that you are very cool.\n"); + oss->points += 2; + oss->room = rConcourse; + break; + case 'c': + oss->room = rStaffRoom; + break; + case 'd': + if(show) printf("The VP thanks you as you return to the concourse.\n"); + oss->friends++; + oss->room = rConcourse; + break; + } +} + +static void StaffRoom(struct Oss *oss, const char choice, const int show) { + switch(choice) { + case 0: + OssMessage(oss, "The teachers in the staff lounge are distracted by their conversations. You:", + "run back to the concourse before you get caught;", + "pretend that you are lost;", + "yell, \"Hello\" in a load voice to surprise the teachers; or", + "mix some vodka from the cupboard into the coffee machine.", (char *)0); + break; + case 'a': + oss->room = rConcourse; + break; + case 'b': + if(show) printf("Mr. Coutu escorts you back to the concourse; he seems aggrevated.\n"); + oss->room = rConcourse; + break; + case 'c': + if(show) printf("Mr. Coutu spills his coffee on Mrs. Lacey and announces that you have a detention after school before sending you to the concourse.\n"); + oss->trouble++; + oss->room = rConcourse; + break; + case 'd': + if(show) printf("You spike the drink and escape to the concourse without getting caught.\n"); + oss->points += 3; + oss->room = rConcourse; + break; + } +} + +static void Bathroom(struct Oss *oss, const char choice, const int show) { + switch(choice) { + case 0: + OssMessage(oss, "The bathroom is in a state of disarray.", + "leave;", + "get a little relief;", + "try to stuff some little kid in the toilet;", + "bust stuff and generally make a big mess;", + "help out the janitor by cleaning up a bit; or", + "admire yourself in the mirror.", (char *)0); + return; + case 'a': + oss->room = rConcourse; + break; + case 'b': + if(show) printf("Ahh . . . much better.\n"); + oss->points++; + oss->room = rConcourse; + break; + case 'c': + if(show) printf("The kid is stronger than you thought, and he yells and screams. Mr. Saffik comes in and gives you a detention.\n"); + oss->enemies++; + oss->trouble++; + oss->room = rConcourse; + break; + case 'd': + if(show) printf("Just as you are smashing a stall door, a massive janitor enters and attacks you in a mad rage with the end of his mop, beating you until the paramedics remove you to the hospital. The whole school thinks that you are a total loser for trashing the bathroom.\n"); + oss->points -= 2; + oss->enemies += 300; + oss->room = rNowhere; + break; + case 'e': + if(show) printf("You start cleaning up, but you get some weird goo on your hands. After a minute, it has spread up your arm. You try to wash it off, but it is too late; it melts away the rest of your body. You Die.\n"); + oss->room = rNowhere; + break; + case 'f': + if(show) printf("The mirror is too dirty to see anything.\n"); + oss->room = rBathroom; + return; + } + oss->flags |= BeenInBathroom; +} + +static void ScienceRoom(struct Oss *oss, const char choice, const int show) { + switch(choice) { + case 0: + OssMessage(oss, "Welcome to science. Mr. Bonnett is your teacher for this class. Choose your tactic:", + "sneak out of class and go home;", + "sit and pay attention;", + "socialize;", + "get some sleep while pretending to pay attention;", + "tip over the liquid nitrogen;", + "try to palm some lab specimens; or", + "mix dangerous chemicals and try to make a bomb.", (char *)0); + break; + case 'a': + if(show) printf("You skip out of class and go home.\n"); + oss->points += 2; + oss->education--; + oss->room = rNowhere; + break; + case 'b': + if(show) printf("You pay attention until lunch and absorb lots of information.\n"); + oss->education += 2; + oss->room = rLunch; + break; + case 'c': + if(oss->flags & KnowOfFight) { + if(show) printf("You talk to the other students until lunch about the fight tonight and make some friends.\n"); + oss->friends += 2; + } else { + if(show) printf("You talk with some students until lunch and learn about a fight going down tonight at Jack Shaw Gardens.\n"); + oss->friends++; + oss->flags |= KnowOfFight; + } + oss->room = rLunch; + break; + case 'd': + if(show) printf("You sleep through class and feel refreshed. While you were sleeping, you learned some of the class content subliminally.\n"); + oss->points++; + oss->education++; + oss->room = rLunch; + break; + case 'e': + if(show) printf("You open the can and knock it over, pretending that it was an accident. Some of it splashes on Mr. Bonnett's hair, freezing it sticking straight up. He makes you sit by his desk for the rest of the class, where you learn a bit.\n"); + oss->points++; + oss->education++; + oss->enemies++; + oss->room = rLunch; + break; + case 'f': + if(show) printf("You 'borrow' a preserved eel and some snails, then sit down and listen for the rest of class.\n"); + oss->points++; + oss->education++; + oss->room = rLunch; + break; + case 'g': + if(show) printf("A funny smell starts to fill the room. You set the chemicals into a cupboard and run outside with everyone else. Soon thereafter, the science room blows up. Some think that this is really cool, others think that you are an idiot. You are told that you have a detention, and hang out outside until lunch.\n"); + oss->points += 2; + oss->friends += 2; + oss->enemies += 2; + oss->trouble++; + oss->room = rLunch; + break; + } +} + +static void Lunch(struct Oss *oss, const char choice, const int show) { + switch(choice) { + case 0: + OssMessage(oss, "Lunch time. You decide to:", + "do some studying;", + "go home for a while;", + "go to the concession;", + "put a fork in the microwave;", + "sit and chat;", + "go to the gym; or", + "explore the school.", (char *)0); + break; + case 'a': + if(show) printf("You study a bit and get a headache.\n"); + oss->education++; + oss->room = rEndLunch; + break; + case 'b': + if(show) printf("You go home and come back later.\n"); + oss->room = rEndLunch; + break; + case 'c': + if(oss->flags & SeenConcession) { + if(show) printf("You don't want to go there again.\n"); + oss->room = rLunch; + } else { + oss->flags |= SeenConcession; + oss->room = rConcession; + } + break; + case 'd': + if(oss->flags & FriedFork) { + if(show) printf("The microwave is too fried to do that again.\n"); + oss->room = rLunch; + } else { + oss->flags |= FriedFork; + if(show) printf("You secretly slip a fork into the microwave, and run it on high for fifteen minutes. The microwave fries, and a bolt of electricity hits Mrs. Douglas, who's hair catches on fire until a student grabs an extinguisher and puts it out.\n"); + oss->points++; + oss->room = rEndLunch; + } + break; + case 'e': + if(show) printf("You make some new friends.\n"); + oss->friends++; + oss->room = rEndLunch; + break; + case 'f': + if(oss->flags & SeenGym) { + if(show) printf("You should try something different.\n"); + oss->room = rLunch; + } else { + oss->flags |= SeenGym; + oss->room = rGym; + } + break; + case 'g': + if(oss->flags & Explored) { + if(show) printf("You've seen enough of the school for now.\n"); + oss->room = rLunch; + } else { + if(show) printf("You find a door leading to the basement of the school beside room 112. Using a paper clip to unlock it, you proceed underground.\n"); + oss->flags |= Explored; + oss->room = rBasement; + } + break; + } +} + +static void Concession(struct Oss *oss, const char choice, const int show) { + switch(choice) { + case 0: + OssMessage(oss, "Welcome to the concession:", + "buy a pizza sub for $3.00;", + "buy some pop for $1.00;", + "buy a hot dog for $2.00;", + "buy the mystery special for $0.25;", + "steal some food;", + "buy some food and give it to a starving grade-8; or", + "push the food line to cause a domino effect.", (char *)0); + break; + case 'a': + if(show) printf("The pizza sub had been left out too long and contained a deadly bacteria. You die.\n"); + oss->room = rNowhere; + break; + case 'b': + if(show) printf("The pop is warm, but tastes okay.\n"); + oss->room = rEndLunch; + break; + case 'c': + if(show) printf("Someone had accidentally spilt rat poison on the hot dogs. You eat it and die.\n"); + oss->room = rNowhere; + break; + case 'd': + if(show) printf("You can't tell what the mystery special is, but it certainly is mysterious. You throw it in the garbage, deciding not to take any chances with your health.\n"); + oss->room = rEndLunch; + break; + case 'e': + if(show) printf("You swipe some of the mystery special, eat it, and die from botulism.\n"); + oss->room = rNowhere; + break; + case 'f': + if(show) printf("The grade-8 eats it and turns green. The paramedics arrive on scene minutes later and take him to the hospital unconscious.\n"); + oss->friends++; + oss->room = rEndLunch; + break; + case 'g': + if(show) printf("You manage to knock down half the kids standing around the concession with one push.\n"); + oss->points++; + oss->room = rEndLunch; + break; + } +} + +static void EndLunch(struct Oss *oss, const char choice, const int show) { + switch(choice) { + case 0: + OssMessage(oss, "Lunch is over. You now decide to:", + "go straight to your next class;", + "skip your next class and go home;", + "set the clock in the concourse back fifteen minutes; or", + "set the school on fire.", (char *)0); + break; + case 'a': + oss->room = rOutsideAgriculture; + break; + case 'b': + if(show) printf("You go home.\n"); + oss->points++; + oss->room = rNowhere; + break; + case 'c': + if(oss->flags & ResetClock) { + if(show) printf("You try again, but get caught by Mr. Coutu, who gives you a detention and sends you to class.\n"); + oss->points--; + oss->trouble++; + oss->room = rOutsideAgriculture; + } + else { + if(show) printf("You get some other students to help you distract the supervisors and extend lunch by a few minutes.\n"); + oss->points++; + oss->friends++; + oss->flags |= ResetClock; + oss->room = rLunch; + } + break; + case 'd': + if(show) printf("You manage to burn down a few rooms, but Mr. Saffik catches you and turns you over to the police. You spend the next few years of your life sharing a cell with 'Spike.'\n"); + oss->points--; + oss->room = rNowhere; + break; + } +} + +static void Basement(struct Oss *oss, const char choice, const int show) { + switch(choice) { + case 0: + OssMessage(oss, "The basement is damp and dark. You have difficulty making out anything. You can hear breathing. You:", + "get out of here;", + "investigate the sound; or", + "grab some files and run.", (char *)0); + break; + case 'a': + if(show) printf("You manage to escape alive, going to your class.\n"); + oss->room = rAgriculture; + break; + case 'b': + if(show) printf("You have a bad feeling about this. Just when you think that you've found the source, something hits you in the back of your head and you fall dead on the ground.\n"); + oss->points++; + oss->room = rNowhere; + break; + case 'c': + if(show) printf("You grab some of the school's secret files for future revision, stash them in a pocket, and run up to class.\n"); + oss->points++; + oss->room = rAgriculture; + break; + } +} + +static void Gym(struct Oss *oss, const char choice, const int show) { + switch(choice) { + case 0: + OssMessage(oss, "You go outside and enter the gym/theater building. There you:", + "scout the place out, then leave;", + "play some basketball;", + "pump iron;", + "play some soccer outside;", + "play some floor hockey; or", + "jam the water fountain.", (char *)0); + break; + case 'a': + if(show) printf("The place shows not evidence of anything interesting.\n"); + oss->room = rEndLunch; + break; + case 'b': + if(show) printf("You play some basketball and make some friends.\n"); + oss->friends++; + oss->room = rEndLunch; + break; + case 'c': + if(show) printf("You use the weight room and get pumped up.\n"); + oss->points++; + oss->room = rEndLunch; + break; + case 'd': + if(show) printf("You play soccer and make some friends.\n"); + oss->friends++; + oss->room = rEndLunch; + break; + case 'e': + if(show) printf("You beat Mr. Becker's team, so, addition to making some friends, he agrees to bump up your math mark a bit.\n"); + oss->friends++; + oss->education++; + oss->room = rEndLunch; + break; + case 'f': + if(show) printf("You shove some gum in the water fountain and flood the gym.\n"); + oss->points++; + oss->room = rEndLunch; + break; + } +} + +static void OutsideAgriculture(struct Oss *oss, const char choice, const int show) { + switch(choice) { + case 0: + OssMessage(oss, "You are outside of your afternoon class, agriculture, in room 112:", + "go into class;", + "check out what's inside of that locked door beside the class; or", + "pull the fire alarm by the door and run for it.", (char *)0); + break; + case 'a': + oss->room = rAgriculture; + break; + case 'b': + if(oss->flags & Explored) { + if(show) printf("You don't want to go back down there.\n"); + oss->room = rOutsideAgriculture; + } else { + if(show) printf("The door leads to the basement of the school. Using a paper clip to unlock it, you proceed underground.\n"); + oss->flags |= Explored; + oss->room = rBasement; + } + break; + case 'c': + if(oss->flags & FireAlarm) { + if(show) printf("You pull the alarm again and some blue ink squirts on your face. You go into class looking like a moron.\n"); + oss->points--; + oss->room = rAgriculture; + } else { + if(show) printf("You pull the alarm, but a piece just breaks off. You put it in your pocket to keep for later.\n"); + oss->flags |= FireAlarm; + oss->points++; + oss->room = rOutsideAgriculture; + } + break; + + } +} + +static void Agriculture(struct Oss *oss, const char choice, const int show) { + switch(choice) { + case 0: + OssMessage(oss, "You enter agriculture where a Mr. Huggins is showing the class how to grow substances of dubious legality. You:", + "leave and hang out outside;", + "grab some and run;", + "socialize", + "report him to the office; or", + "pay attention.", (char *)0); + break; + case 'a': + if(show) printf("You hang out outside for the class, but find nothing interesting."); + oss->room = oss->trouble ? rDetentions : rEndSchool; + break; + case 'b': + if(show) printf("Mr. Huggins doesn't even notice as you slip outside, but some other kids think that you're a weirdo.\n"); + oss->points++; + oss->enemies++; + oss->room = oss->trouble ? rDetentions : rEndSchool; + break; + case 'c': + if(oss->flags & KnowOfFight) { + if(show) printf("You chat and make some friends.\n"); + oss->friends++; + oss->room = oss->trouble ? rDetentions : rEndSchool; + } + else { + if(show) printf("You learn about a fight going down tonight at Jack Shaw Gardens.\n"); + oss->flags |= KnowOfFight; + oss->room = oss->trouble ? rDetentions : rEndSchool; + } + break; + case 'd': + if(show) printf("The office staff don't seem to believe you. They think that you're making trouble and they give you a detention.\n"); + oss->trouble++; + oss->room = oss->trouble ? rDetentions : rEndSchool; + break; + case 'e': + if(show) printf("You pay attention and improve your grade a bit.\n"); + oss->education++; + oss->room = oss->trouble ? rDetentions : rEndSchool; + break; + } +} + +static void Detentions(struct Oss *oss, const char choice, const int show) { + switch(choice) { + case 0: + OssMessage(oss, "The end of school is here, but it seems that you have gotten into a bit of trouble:", + "attend your detentions; or", + "skip the detentions.", (char *)0); + break; + case 'a': + if(show) printf("You waste %i minutes at school in detention, then go home.\n", oss->trouble * detentionminutes); + oss->trouble = 0; + oss->room = rNowhere; + break; + case 'b': + oss->room = rEndSchool; + break; + } + return; +} + +static void EndSchool(struct Oss *oss, const char choice, const int show) { + if(oss->flags & KnowOfFight) { + switch(choice) { + case 0: + OssMessage(oss, "School's out. You decide to:", + "go to Jack Shaw Gardens;", + "take the bus home;", + "bum a ride with someone;", + "stay and study a while; or", + "walk home.", (char *)0); + return; + case 'a': + oss->points++; + oss->room = rJackShaw; + break; + case 'b': + if(show) printf("You take the bus home.\n"); + oss->room = rNowhere; + break; + case 'c': + if(show) printf("You get a ride, but the car you're in has no brakes and it careens over the side of the cliff by the school. It then takes you hours to get home.\n"); + oss->points--; + oss->room = rNowhere; + break; + case 'd': + if(show) printf("You study and improve your grade, but waste your evening.\n"); + oss->points--; + oss->education++; + oss->room = rNowhere; + break; + case 'e': + if(show) printf("You walk home.\n"); + oss->room = rNowhere; + break; + } + } else { + switch(choice) { + case 0: + OssMessage(oss, "School's out. You decide to:", + "take the bus home;", + "bum a ride with someone;", + "stay and study a while; or", + "walk home.", (char *)0); + return; + case 'a': + if(show) printf("You take the bus home.\n"); + oss->room = rNowhere; + break; + case 'b': + if(show) printf("You get a ride, but the car you're in has no brakes and it careens over the side of the cliff by the school. It then takes you hours to get home.\n"); + oss->points--; + oss->room = rNowhere; + break; + case 'c': + if(show) printf("You study and improve your grade, but waste your evening.\n"); + oss->points--; + oss->education++; + oss->room = rNowhere; + break; + case 'd': + if(show) printf("You walk home.\n"); + oss->room = rNowhere; + break; + } + } +} + +static void JackShaw(struct Oss *oss, const char choice, const int show) { + switch(choice) { + case 0: + OssMessage(oss, "You arrive on scene to find that the combatants are none other than Mr. Schulting and Mr. Dogopole, fighting over who knows more about networking. Mr. Dogopole has the upper hand until Mr. Schulting whips out an old hard drive and smashes it on Mr. Dogopole's head. You:", + "get out of here now;", + "watch the fight and leave before the cops arrive;", + "watch the fight and run away when the cops arrive;", + "jump in and help Mr. Schulting;", + "jump in and help Mr. Dogopole;", + "jump in and fight both of them at the same time; or", + "try to even the odds by passing Mr. Dogopole a big stick.", (char *)0); + break; + case 'a': + if(show) printf("You wisely return home.\n"); + oss->room = rNowhere; + break; + case 'b': + if(show) printf("Mr. Schulting has the upper hand when you hear sirens in the distance. Prudently, you decide to make your exit.\n"); + oss->points++; + oss->room = rNowhere; + break; + case 'c': + if(show) printf("Mr. Schulting has the upper hand when you hear sirens in the distance, but you stick around to watch what happens.\n"); + oss->points++; + oss->room = rCops; + break; + case 'd': + oss->room = rJackShawSchulting; + break; + case 'e': + oss->room = rJackShawDogopole; + break; + case 'f': + if(show) printf("Jumping into the fight, you start swinging at both teachers. Everyone else, following your example, starts beating on each other in a massive free-for-all.\n"); + oss->points++; + oss->room = rCops; + break; + case 'g': + if(show) printf("You grab a branch and pass it to Mr. Dogopole, who catches it it whips it around in a ninja move, hitting Mr. Schulting in the arm. Mr Schulting then hits Mr. Dogopole with his hard drive. The fight escalates, and everyone becomes more interested.\n"); + oss->points++; + oss->friends++; + oss->room = rCops; + break; + } +} + +static void JackShawDogopole(struct Oss *oss, const char choice, const int show) { + switch(choice) { + case 0: + OssMessage(oss, "You jump out, prepared to defend the weakened Mr. Dogopole. Mr. Schulting is surprised:", + "go for the head;", + "tackle him;", + "stand there and block him; or", + "punch him in the stomach.", (char *)0); + return; + case 'a': + if(show) printf("You hit Mr. Schulting in the head and he goes down. Everyone disperses, slightly disappointed that you ended the fight. Mr. Dogopole, however, says that he'll give you some nice grades when you go to his class.\n"); + oss->points--; + oss->friends++; + oss->enemies += 2; + oss->education++; + oss->room = rNowhere; + break; + case 'b': + if(show) printf("Mr. Schulting just throws you off to the side and keeps fighting.\n"); + oss->points--; + oss->room = rCops; + break; + case 'c': + if(show) printf("Mr. Schulting clobbers you on the head with the hard drive. You wake up the next morning in the hospital.\n"); + oss->points--; + oss->enemies += 2; + oss->room = rNowhere; + break; + case 'd': + if(show) printf("Mr. Schulting blocks your punch and nails you in the stomach. You wake up the next morning in a daze, alone on the ground at Jack Shaw.\n"); + oss->points--; + oss->friends++; + oss->enemies++; + oss->room = rNowhere; + break; + } + return; +} + +static void JackShawSchulting(struct Oss *oss, const char choice, const int show) { + switch(choice) { + case 0: + OssMessage(oss, "You jump out, prepared to attack the weakened Mr. Dogopole:", + "go for the head;", + "tackle him;", + "stand there and block him; or", + "punch him in the stomach.", (char *)0); + return; + case 'a': + if(show) printf("Whoops, Mr. Dogopole avoids your punch and nails you in the head. You wake up the next morning in a daze, alone on the ground at Jack Shaw.\n"); + oss->points--; + oss->friends++; + oss->enemies++; + oss->room = rNowhere; + break; + case 'b': + if(show) printf("Mr. Dogopole just throws you off to the side and keeps fighting.\n"); + oss->points--; + oss->room = rCops; + break; + case 'c': + if(show) printf("Mr. Schulting, not realizing your intentions, clobbers you on the head. You wake up the next morning in the hospital.\n"); + oss->points--; + oss->enemies += 2; + oss->room = rNowhere; + break; + case 'd': + if(show) printf("You hit Mr. Dogopole in the stomach and he goes down. Everyone disperses, disappointed that you ended the fight. Mr. Schulting, however, says that he'll give you some nice grades when you go to his class.\n"); + oss->points--; + oss->friends++; + oss->enemies += 3; + oss->education++; + oss->room = rNowhere; + break; + } + return; +} + +static void Cops(struct Oss *oss, const char choice, const int show) { + switch(choice) { + case 0: + OssMessage(oss, "The sound of sirens approaches, and the cops arrive on scene. You:", + "run;", + "walk innocently away, pretending not to see the fight;", + "pretend that you don't see them;", + "try to grab a nightstick from one of the cops;", + "try to get the cops involved in a massive brawl; or", + "warn everyone else and try to escape as a group.", (char *)0); + break; + case 'a': + if(show) printf("You run away, but a cop grabs and you spend the rest of your evening answering questions at the police department.\n"); + oss->points--; + oss->room = rNowhere; + break; + case 'b': + if(show) printf("You walk off carefully, and manage to escape the scene without getting caught.\n"); + oss->room = rNowhere; + break; + case 'c': + if(show) printf("You just stay where you are. The cops break up the fight and send everyone home.\n"); + oss->room = rNowhere; + break; + case 'd': + if(show) printf("The cop was too alert, and used the nightstick on you. You wake up the next day in a cell, but you are soon released.\n"); + oss->room = rNowhere; + break; + case 'e': + if(show) printf("The rest of the spectators join you, and so do the police. A massive brawl ensues. You become famous for starting such an awesome fight, though you are badly bruised the next morning.\n"); + oss->points += 2; + oss->friends++; + oss->room = rNowhere; + break; + case 'f': + if(show) printf("You manage to warn a small group of spectators. You all manage to escape into the bushes, making you a few new friends.\n"); + oss->points++; + oss->friends += 2; + oss->room = rNowhere; + break; + } +} diff --git a/Room.h b/Room.h new file mode 100644 index 0000000..b697d8f --- /dev/null +++ b/Room.h @@ -0,0 +1,3 @@ +void (*RoomFn(const int room))(struct Oss *, const char, const int); +char *RoomName(const int room); +void RoomReport(const struct Oss *oss); diff --git a/badass b/badass new file mode 100644 index 0000000..b640f2b --- /dev/null +++ b/badass @@ -0,0 +1,7 @@ +142.157.12.162 1355443304 abcge +0, 3, 10, 10, 10, 10, 0, Johnny +0, 9999999, 10, 10, 10, 10, 0, AlexV +0, 2, 3, 2, 1, 2, 6, Arr +0, 2, 2, 2, 0, 2, 516, Eve +0, 1, 1, 0, -1, 1, 2, Arr +0, 1, 2, 2, 0, 2, 516, Even diff --git a/copying.txt b/copying.txt new file mode 100644 index 0000000..be57511 --- /dev/null +++ b/copying.txt @@ -0,0 +1,16 @@ +Copyright (C) 2000, 2009, 2011, 2012 Neil Edelman +Uses HMAC-SHA-256 code Copyright (C) 2005 Olivier Gay, see Mac.c. + +OSS Game is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with OSS Game (see gnu.txt.) If not, see +. diff --git a/gpl.txt b/gpl.txt new file mode 100644 index 0000000..bc08fe2 --- /dev/null +++ b/gpl.txt @@ -0,0 +1,619 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. diff --git a/index.html b/index.html new file mode 100644 index 0000000..a9f8126 --- /dev/null +++ b/index.html @@ -0,0 +1,42 @@ + + + + + +Oss Game + + + + + + + + + + + + + +

OSS Game

+ + + +

Welcome to Osoyoos Secondary School, Osoyoos' home of +learning and enlightenment, where the immortal wisdom of Juvenal lives +etched in the walls of the central concourse, "mens sana in corpre +sano." Your impendent adventure finds you on the steeply rising steps +leading to this hallowed centre of scholarly trades, set at the turn of +the millennium. Good luck. Enter the school! +

+ +

+

+ +See the ! +

+ +

Go back to root.

+ + + diff --git a/readme.txt b/readme.txt new file mode 100644 index 0000000..95d9ec9 --- /dev/null +++ b/readme.txt @@ -0,0 +1,7 @@ +Copyright (C) 2000, 2009, 2011, 2012 Neil Edelman, see copying.txt. +neil dot edelman each mail dot mcgill dot ca + +Version 3.0. + +Supplying an argument will get you usage. Intended to be a cgi web +programme.