187 lines
5.4 KiB
C
187 lines
5.4 KiB
C
/* $NetBSD: play.c,v 1.10 2019/02/03 03:19:25 mrg Exp $ */
|
|
|
|
/*
|
|
* Copyright (c) 1988, 1993
|
|
* The Regents of the University of California. All rights reserved.
|
|
*
|
|
* This code is derived from software contributed to Berkeley by
|
|
* Timothy C. Stoehr.
|
|
*
|
|
* 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 University 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 REGENTS 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 REGENTS 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.
|
|
*/
|
|
|
|
/*
|
|
* play.c
|
|
*
|
|
* This source herein may be modified and/or distributed by anybody who
|
|
* so desires, with the following restrictions:
|
|
* 1.) No portion of this notice shall be removed.
|
|
* 2.) Credit shall not be taken for the creation of this source.
|
|
* 3.) This code is not to be traded, sold, or used for personal
|
|
* gain or profit.
|
|
*
|
|
*/
|
|
|
|
#include "rogue.h"
|
|
|
|
boolean interrupted = 0;
|
|
|
|
static const char unknown_command[] = "unknown command";
|
|
|
|
void
|
|
play_level(void)
|
|
{
|
|
short ch;
|
|
int count;
|
|
enum { NORMAL, COUNTED, CHECK } state;
|
|
state = NORMAL;
|
|
|
|
for(;;){
|
|
switch(state){
|
|
case NORMAL:
|
|
interrupted = 0;
|
|
if (hit_message[0]){
|
|
messagef(1, "%s", hit_message);
|
|
hit_message[0] = 0;
|
|
}
|
|
if(trap_door){
|
|
trap_door = 0;
|
|
return;
|
|
}
|
|
move(rogue.row, rogue.col);
|
|
refresh();
|
|
ch = rgetchar();
|
|
case CHECK:
|
|
check_message();
|
|
count = 0;
|
|
}
|
|
state = NORMAL;
|
|
switch(ch){
|
|
case '.': rest((count > 0) ? count : 1); break;
|
|
case 's': search(((count > 0) ? count : 1), 0); break;
|
|
case 'i': inventory(&rogue.pack, ALL_OBJECTS); break;
|
|
case 'f': fight(0); break;
|
|
case 'F': fight(1); break;
|
|
case 'h': case 'j': case 'k': case 'l': case 'y': case 'u':
|
|
case 'n': case 'b':
|
|
(void)one_move_rogue(ch, 1);
|
|
break;
|
|
case 'H': case 'J': case 'K': case 'L': case 'Y': case 'U':
|
|
case 'N': case 'B': case '\010': case '\012': case '\013':
|
|
case '\014': case '\031': case '\025': case '\016':
|
|
case '\002': multiple_move_rogue(ch); break;
|
|
case 'e': eat(); break;
|
|
case 'q': quaff(); break;
|
|
case 'r': read_scroll(); break;
|
|
case 'm': move_onto(); break;
|
|
case ',': kick_into_pack(); break;
|
|
case 'd': drop(); break;
|
|
case 'P': put_on_ring(); break;
|
|
case 'R': remove_ring(); break;
|
|
case '\020':
|
|
do {
|
|
remessage(count++);
|
|
ch = rgetchar();
|
|
} while (ch == '\020');
|
|
state = CHECK;
|
|
break;
|
|
case '\027': wizardize(); break;
|
|
case '>': if(drop_check())
|
|
return;
|
|
break;
|
|
case '<': if(check_up())
|
|
return;
|
|
break;
|
|
case ')': case ']':
|
|
inv_armor_weapon(ch == ')');
|
|
break;
|
|
case '=': inv_rings(); break;
|
|
case '^': id_trap(); break;
|
|
case '/': id_type(); break;
|
|
case '?': id_com(); break;
|
|
case '!': do_shell(); break;
|
|
case 'o': edit_opts(); break;
|
|
case 'I': single_inv(0); break;
|
|
case 'T': take_off(); break;
|
|
case 'W': wear(); break;
|
|
case 'w': wield(); break;
|
|
case 'c': call_it(); break;
|
|
case 'z': zapp(); break;
|
|
case 't': throw(); break;
|
|
case 'v':
|
|
messagef(0, "rogue-clone: Version III (trinity mod)."
|
|
" (Tim Stoehr was here), tektronix!zeus!tims");
|
|
break;
|
|
case 'Q': quit(0);
|
|
case '0': case '1': case '2': case '3': case '4': case '5':
|
|
case '6': case '7': case '8': case '9':
|
|
move(rogue.row, rogue.col);
|
|
refresh();
|
|
do{
|
|
if(count < 100)
|
|
count = (10 * count) + (ch - '0');
|
|
ch = rgetchar();
|
|
}while (is_digit(ch));
|
|
if(ch != CANCEL)
|
|
state = COUNTED;
|
|
break;
|
|
case ' ': break;
|
|
case '\011': if(!wizard){
|
|
messagef(0, "%s", unknown_command);
|
|
break;
|
|
}
|
|
inventory(&level_objects, ALL_OBJECTS); break;
|
|
case '\023': if(!wizard){
|
|
messagef(0, "%s", unknown_command);
|
|
break;
|
|
}
|
|
draw_magic_map(); break;
|
|
case '\024': if(!wizard){
|
|
messagef(0, "%s", unknown_command);
|
|
break;
|
|
}
|
|
show_traps(); break;
|
|
case '\017': if(!wizard){
|
|
messagef(0, "%s", unknown_command);
|
|
break;
|
|
}
|
|
show_objects(); break;
|
|
case '\001': show_average_hp(); break;
|
|
case '\003': if(!wizard){
|
|
messagef(0, "%s", unknown_command);
|
|
break;
|
|
}
|
|
c_object_for_wizard(); break;
|
|
case '\015': if(!wizard){
|
|
messagef(0, "%s", unknown_command);
|
|
break;
|
|
}
|
|
show_monsters(); break;
|
|
case 'S': save_game(); break;
|
|
default: messagef(0, "%s", unknown_command); break;
|
|
}
|
|
}
|
|
}
|