Annotation of 43BSDReno/games/warp/us.c, revision 1.1.1.1

1.1       root        1: /* $Header: us.c,v 7.0.1.3 87/01/13 17:13:21 lwall Exp $ */
                      2: 
                      3: /* $Log:       us.c,v $
                      4:  * Revision 7.0.1.3  87/01/13  17:13:21  lwall
                      5:  * Partially fixed ^S behavior.  It now just ignores ^S.
                      6:  * 
                      7:  * Revision 7.0.1.2  86/12/12  17:06:09  lwall
                      8:  * Baseline for net release.
                      9:  * 
                     10:  * Revision 7.0.1.1  86/10/16  10:53:50  lwall
                     11:  * Added Damage.  Fixed random bugs.
                     12:  * 
                     13:  * Revision 7.0  86/10/08  15:14:21  lwall
                     14:  * Split into separate files.  Added amoebas and pirates.
                     15:  * 
                     16:  */
                     17: 
                     18: #include "EXTERN.h"
                     19: #include "warp.h"
                     20: #include "bang.h"
                     21: #include "object.h"
                     22: #include "play.h"
                     23: #include "sig.h"
                     24: #include "term.h"
                     25: #include "util.h"
                     26: #include "weapon.h"
                     27: #include "INTERN.h"
                     28: #include "us.h"
                     29: 
                     30: void
                     31: us_init()
                     32: {
                     33:     ;
                     34: }
                     35: 
                     36: void
                     37: do_direction(dy,dx)
                     38: int dy, dx;
                     39: {
                     40:     Reg1 int decr;
                     41:     Reg2 OBJECT *obj;
                     42: 
                     43:     if (status < 2) {
                     44:        if (cloaking) {
                     45:            char ch;
                     46:            
                     47:            cloaked = FALSE;
                     48:            ch = (ent->energy >= 500?'E':'e');
                     49:            if (ch != ent->image) {
                     50:                setimage(ent, ch);
                     51:            }
                     52:        }
                     53:        decr = 5+abs(evely)+abs(evelx)+tractor*tractor;
                     54:        if (ent->energy >= decr) {
                     55:            ent->energy -= decr;
                     56:            if (tractor) {
                     57:                if (!damage || !damflag[NOTRACTORS]) {
                     58:                    if (!rand_mod(50)) {
                     59:                        damage++;
                     60:                        damflag[NOTRACTORS] = rand_mod(smarts+10)+2;
                     61:                    }
                     62:                    if (tract(ent,dy,dx,tractor)) {
                     63:                        evely += tractor*dy;
                     64:                        evelx += tractor*dx;
                     65:                    }
                     66:                }
                     67:            }
                     68:            else if (!damage ||
                     69:              (!entmode && !damflag[NOIMPULSE]) ||
                     70:              (entmode && !damflag[NOWARP]) ) {
                     71:                if (!rand_mod(30+500/(abs(evely)+abs(evelx)+1))) {
                     72:                    damage++;
                     73:                    damflag[entmode?NOWARP:NOIMPULSE] = rand_mod(smarts+10)+2;
                     74:                }
                     75:                evely += dy;
                     76:                evelx += dx;
                     77:            }
                     78:            if (inumthols &&
                     79:              (obj=occupant[(ent->posy+evely+YSIZE00)%YSIZE]
                     80:                           [(ent->posx+evelx+XSIZE00)%XSIZE] ) &&
                     81:              obj->type == Web)
                     82:                evely = evelx = 0;
                     83:        }
                     84:     }
                     85:     else if (status == 2) {
                     86:        decr = 500+abs(bvely)*5+abs(bvelx)*5+tractor*tractor*100;
                     87:        if (base->energy >= decr) {
                     88:            base->energy -= decr;
                     89:            if (tractor) {
                     90:                if (tract(base,dy,dx,tractor)) {
                     91:                    bvely += tractor*dy;
                     92:                    bvelx += tractor*dx;
                     93:                }
                     94:            }
                     95:            else {
                     96:                bvely += dy;
                     97:                bvelx += dx;
                     98:            }
                     99:            if (inumthols &&
                    100:              (obj=occupant[(base->posy+bvely+YSIZE00)%YSIZE]
                    101:                           [(base->posx+bvelx+XSIZE00)%XSIZE] ) &&
                    102:              obj->type == Web)
                    103:                bvely = bvelx = 0;
                    104:        }
                    105:     }
                    106:     tractor = 0;
                    107: }
                    108: 
                    109: void
                    110: ctrl_direction(dy,dx)
                    111: int dy, dx;
                    112: {
                    113:     if (status < 2) {
                    114:        if (cloaking) {
                    115:            char ch;
                    116:            
                    117:            cloaked = FALSE;
                    118:            ch = (ent->energy >= 500?'E':'e');
                    119:            if (ch != ent->image) {
                    120:                setimage(ent, ch);
                    121:            }
                    122:        }
                    123:        if (!damage || !damflag[NOPHASERS]) {
                    124:            if (!rand_mod(200)) {
                    125:                damage++;
                    126:                damflag[NOPHASERS] = rand_mod(smarts+10)+2;
                    127:            }
                    128:            fire_phaser(ent, dy, dx);
                    129:        }
                    130:     }
                    131:     else if (status == 2)
                    132:        fire_phaser(base, dy, dx);
                    133: }
                    134: 
                    135: void
                    136: shift_direction(dy,dx)
                    137: int dy, dx;
                    138: {
                    139:     if (status < 2) {
                    140:        if (cloaking) {
                    141:            char ch;
                    142:            
                    143:            cloaked = FALSE;
                    144:            ch = (ent->energy >= 500?'E':'e');
                    145:            if (ch != ent->image) {
                    146:                setimage(ent, ch);
                    147:            }
                    148:        }
                    149:        if (!damage || !damflag[NOTORPS]) {
                    150:            if (!rand_mod(300)) {
                    151:                damage++;
                    152:                damflag[NOTORPS] = rand_mod(smarts+10)+2;
                    153:            }
                    154:            fire_torp(ent, dy, dx);
                    155:        }
                    156:     }
                    157:     else if (status == 2)
                    158:        fire_torp(base, dy, dx);
                    159: }
                    160: 
                    161: void
                    162: get_commands(done)
                    163: bool *done;
                    164: {
                    165:     static char ch[80];
                    166:     Reg1 int i;
                    167:     Reg2 int count;
                    168:     Reg3 bool ctrla = FALSE;
                    169:     char numdestructs = 0, numzaps = 0;
                    170: 
                    171: top:
                    172:     while (count = read_nd(ch,(sizeof ch))) {
                    173:        for (i=0; i<count; i++) {
                    174:            if (ch[i] == 'Q') {
                    175:                bombed_out = TRUE;
                    176:                *done = TRUE;
                    177:                keepgoing = FALSE;
                    178:                return;
                    179:            }
                    180:            if (ch[i] == 'q' || ch[i] == BREAKCH || ch[i] == INTRCH) {
                    181:                int x;
                    182:                static char quest[] = "Do you wish to escape from reality? ";
                    183: 
                    184:                if (timer >= whenok) {
                    185:                    mvaddstr(12,22,quest);
                    186:                    do {
                    187:                        getcmd(&ch[i]);
                    188:                    } while (ch[i] != 'y' && ch[i] != 'n');
                    189:                    if (ch[i] == 'y') {
                    190:                        bombed_out = TRUE;
                    191:                        *done = TRUE;
                    192:                        return;
                    193:                    }
                    194:                    else {
                    195:                        for (x=11; x<=28; x++) {
                    196:                            mvaddch(12,x*2,
                    197:                                occupant[11][x]
                    198:                                   ? occupant[11][x]->image
                    199:                                   : numamoebas
                    200:                                      ? amb[11][x]
                    201:                                      : ' ');
                    202:                            addspace();
                    203:                        }
                    204:                        roundsleep(2);
                    205:                        whenok = timer + 10;
                    206:                        goto top;
                    207:                    }
                    208:                }
                    209:                else {
                    210:                    write(1,"\07",1);
                    211:                    goto top;
                    212:                }
                    213:            }
                    214:        }
                    215:        for (i=0; i<count; i++) {
                    216:            if (ctrla) {
                    217:                switch (ch[i]) {
                    218:                case '1': case 'b':
                    219:                    ctrl_direction(1, -1);
                    220:                    break;
                    221:                case '2': case 'j':
                    222:                    ctrl_direction(1, 0);
                    223:                    break;
                    224:                case '3': case 'n':
                    225:                    ctrl_direction(1, 1);
                    226:                    break;
                    227:                case '4': case 'h':
                    228:                    ctrl_direction(0, -1);
                    229:                    break;
                    230:                case '6': case 'l':
                    231:                    ctrl_direction(0, 1);
                    232:                    break;
                    233:                case '7': case 'y':
                    234:                    ctrl_direction(-1, -1);
                    235:                    break;
                    236:                case '8': case 'k':
                    237:                    ctrl_direction(-1, 0);
                    238:                    break;
                    239:                case '9': case 'u':
                    240:                    ctrl_direction(-1, 1);
                    241:                    break;
                    242:                case 'r':
                    243:                    rewrite();
                    244:                    roundsleep(3);
                    245:                    ctrla = FALSE;
                    246:                    goto top;
                    247:                case 'w':
                    248:                    clear();
                    249:                    while (!input_pending())
                    250:                        sleep(1);
                    251:                    rewrite();
                    252:                    roundsleep(3);
                    253:                    ctrla = FALSE;
                    254:                    goto top;
                    255: #ifdef SIGTSTP
                    256:                case 'z':
                    257:                    clear();
                    258:                    mytstp();
                    259:                    sleep(4);
                    260:                    ctrla = FALSE;
                    261:                    goto top;
                    262: #endif
                    263:                default:
                    264:                    break;
                    265:                }
                    266:                ctrla = FALSE;
                    267:            }
                    268:            else {
                    269:                switch (ch[i]) {
                    270:                case 'Z':
                    271:                    clear();
                    272:                    mytstp();
                    273:                    sleep(4);
                    274:                    goto top;
                    275:                case 'i':
                    276:                    if (ent && (!damage || !damflag[NOIMPULSE])) {
                    277:                        entmode = 0;
                    278:                        status = 0;
                    279:                    }
                    280:                    break;
                    281:                case 'w':
                    282:                    if (ent && (!damage || !damflag[NOWARP])) {
                    283:                        entmode = 1;
                    284:                        status = 1;
                    285:                    }
                    286:                    break;
                    287:                case 'p':
                    288:                    if (base) {
                    289:                        status = 2;
                    290:                    }
                    291:                    break;
                    292:                case 'o':
                    293:                    if (status < 2) {
                    294:                        if (base)
                    295:                            status = 2;
                    296:                    }
                    297:                    else if (status == 2) {
                    298:                        if (ent)
                    299:                            status = entmode;
                    300:                    }
                    301:                    break;
                    302:                case 'v':
                    303:                    if (ent) {
                    304:                        status = entmode;
                    305:                    }
                    306:                    cloaking=FALSE;
                    307:                    cloaked=FALSE;
                    308:                    break;
                    309:                case 'c':
                    310:                    if (ent) {
                    311:                        status = entmode;
                    312:                        if (ent->energy >= 250)
                    313:                            cloaking = TRUE;
                    314:                    }
                    315:                    break;
                    316:                case 'z':
                    317:                    if (ent && (!damage || !damflag[NOZAPPER])) {
                    318:                        ++numzaps;
                    319:                        if (!rand_mod(100/numzaps)) {
                    320:                            damage++;
                    321:                            damflag[NOZAPPER] = rand_mod(smarts+10)+2;
                    322:                        }
                    323:                        if (nxtbang && bangm[nxtbang-1] < 0)
                    324:                            --nxtbang;  /* consolidate zaps */
                    325:                        make_blast(evely*2+ent->posy,evelx*2+ent->posx,
                    326:                            -5000000L, 3*numzaps);
                    327:                        ent->energy /= 2;
                    328:                    }
                    329:                    break;
                    330:                case 'D':
                    331:                    if (status < 2 && (!damage || !damflag[NODESTRUCT])) {
                    332:                        if (ent && !rand_mod(10)) {
                    333:                            damage++;
                    334:                            damflag[NODESTRUCT] = rand_mod(smarts+10)+2;
                    335:                        }
                    336:                        if (++numdestructs <= 2)
                    337:                            make_blast(evely*2+ent->posy,evelx*2+ent->posx,
                    338:                                15000L, 3);
                    339:                        ent->energy /= 4;
                    340:                    }
                    341:                    else if (status == 2) {
                    342:                        if (numdestructs)
                    343:                            base->energy = base->energy / 2;
                    344:                        if (++numdestructs <= 2)
                    345:                            make_blast(base->posy, base->posx, 15000L, 5);
                    346:                    }
                    347:                    break;
                    348:                case 'd':
                    349:                    if ((!damage || !damflag[NODESTRUCT]) && (base||ent)) {
                    350:                        Reg4 OBJECT *obj;
                    351:                        int x, y;
                    352: 
                    353:                        if (ent && !rand_mod(200)) {
                    354:                            damage++;
                    355:                            damflag[NODESTRUCT] = rand_mod(smarts+10)+2;
                    356:                        }
                    357:                        for (obj = root.prev;
                    358:                          obj != &root;
                    359:                          obj = obj->prev) {
                    360:                            if (obj->image == '+') {
                    361:                                blast[y=(obj->posy+obj->vely+YSIZE00)%YSIZE]
                    362:                                     [x=(obj->posx+obj->velx+XSIZE00)%XSIZE]
                    363:                                     += 1;
                    364:                                yblasted[y] |= 1;
                    365:                                xblasted[x] |= 1;
                    366:                                blasted = TRUE;
                    367:                                obj->mass = (massacre?3000:4000);
                    368:                            }
                    369:                        }
                    370:                    }
                    371:                    break;
                    372:                case 's':
                    373:                    if ((!damage || !damflag[NODESTRUCT]) && (base||ent)) {
                    374:                        Reg4 OBJECT *obj;
                    375:                        if (ent && !rand_mod(200)) {
                    376:                            damage++;
                    377:                            damflag[NODESTRUCT] = rand_mod(smarts+10)+2;
                    378:                        }
                    379:                        for (obj = root.prev;
                    380:                          obj->type == Torp || obj->type == Web ||
                    381:                          obj->type == Star;
                    382:                          obj = obj->prev) {
                    383:                            if (obj->image == '+')
                    384:                                obj->vely = obj->velx = 0;
                    385:                        }
                    386:                    }
                    387:                    break;
                    388:                case '\001':
                    389:                    ctrla = TRUE;
                    390:                    break;
                    391:                case '\002':
                    392:                case '\003':
                    393:                case '\004':
                    394:                case '\005':
                    395:                case '\006':
                    396:                case '\007':
                    397:                case '\010':
                    398:                case '\011':
                    399:                case '\012':
                    400:                case '\013':
                    401:                case '\014':
                    402:                case '\015':
                    403:                case '\016':
                    404:                case '\017':
                    405:                case '\020':
                    406:                case '\021':
                    407:                case '\022':
                    408:                case '\023':
                    409:                case '\024':
                    410:                case '\025':
                    411:                case '\026':
                    412:                case '\027':
                    413:                case '\030':
                    414:                case '\031':
                    415:                case '\032':
                    416:                    ch[i] += 96;
                    417:                    i--;
                    418:                    ctrla = TRUE;
                    419:                    break;
                    420:                case '\033':
                    421:                    tractor = 0;
                    422:                    break;
                    423:                case 'a':
                    424:                    tractor++;
                    425:                    break;
                    426:                case 'r':
                    427:                    tractor--;
                    428:                    break;
                    429:                case '1': case 'b':
                    430:                    do_direction(1,-1);
                    431:                    break;
                    432:                case '2': case 'j':
                    433:                    do_direction(1,0);
                    434:                    break;
                    435:                case '3': case 'n':
                    436:                    do_direction(1,1);
                    437:                    break;
                    438:                case '4': case 'h':
                    439:                    do_direction(0,-1);
                    440:                    break;
                    441:                case '6': case 'l':
                    442:                    do_direction(0,1);
                    443:                    break;
                    444:                case '7': case 'y':
                    445:                    do_direction(-1,-1);
                    446:                    break;
                    447:                case '8': case 'k':
                    448:                    do_direction(-1,0);
                    449:                    break;
                    450:                case '9': case 'u':
                    451:                    do_direction(-1,1);
                    452:                    break;
                    453:                case '0': case 'S':
                    454:                    if (status < 2) {
                    455:                        evely = 0;
                    456:                        evelx = 0;
                    457:                    }
                    458:                    break;
                    459:                case '-':
                    460:                    if (status < 2 && ent->energy >= 10) {
                    461:                        evely *= -1;
                    462:                        evelx *= -1;
                    463:                        ent->energy -= 10;
                    464:                    }
                    465:                    break;
                    466:                case '%': case '\177': case '_':
                    467:                    shift_direction(0, -1);
                    468:                    shift_direction(0, 1);
                    469:                    shift_direction(-1, 0);
                    470:                    shift_direction(1, 0);
                    471:                    shift_direction(-1, -1);
                    472:                    shift_direction(-1, 1);
                    473:                    shift_direction(1, -1);
                    474:                    shift_direction(1, 1);
                    475:                    break;
                    476:                case '!': case 'B':
                    477:                    shift_direction(1, -1);
                    478:                    break;
                    479:                case '@': case 'J':
                    480:                    shift_direction(1, 0);
                    481:                    break;
                    482:                case '#': case 'N':
                    483:                    shift_direction(1, 1);
                    484:                    break;
                    485:                case '$': case 'H':
                    486:                    shift_direction(0, -1);
                    487:                    break;
                    488:                case '^': case 'L':
                    489:                    shift_direction(0, 1);
                    490:                    break;
                    491:                case '&': case 'Y':
                    492:                    shift_direction(-1, -1);
                    493:                    break;
                    494:                case '*': case 'K':
                    495:                    shift_direction(-1, 0);
                    496:                    break;
                    497:                case '(': case 'U':
                    498:                    shift_direction(-1, 1);
                    499:                    break;
                    500:                case '?':
                    501:                    helper();
                    502:                    roundsleep(3);
                    503:                    goto top;
                    504:                default:
                    505:                    break;
                    506:                }
                    507:            }
                    508:        }
                    509:     }
                    510: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.