qt-agistudio/template/src/logic0.txt

335 lines
8.6 KiB
Plaintext

// ****************************************************************************
//
// Logic 0: Main logic
//
// ****************************************************************************
#include "defines.txt"
if (error_code > 0) {
call(98); // error handler - IMPORTANT
}
if (room_no == 0) {
call(91); // initialization
// Put test object to room2:
va=2;
put("test object", va);
if (game_restarted) {
disable.item(menu_fileseparator);
set(menu_enabled);
reset(disable_game_functions);
assignn(score,0);
new.room(2); // go to first room here
}
else {
set.menu("AGI");
set.menu.item("About ", menu_about);
set.menu.item("Help <F1>", menu_help);
set.menu("File");
set.menu.item("Save <F5>", menu_save);
set.menu.item("Restore <F7>", menu_restore);
set.menu.item("-------------", menu_fileseparator);
set.menu.item("Restart <F9>", menu_restart);
set.menu.item("Quit <Alt-Z>", menu_quit);
set.menu("Action");
set.menu.item("See Object <F4>", menu_seeobject);
set.menu.item("Inventory <Tab>", menu_inventory);
set.menu("Special");
set.menu.item("Sound On/Off <F2>", menu_soundonoff);
set.menu.item("Clock On/Off <F6>", menu_clock);
set.menu.item("Joystick <Ctrl J>", menu_joystick);
set.menu.item("Pause <Esc>", menu_pause);
set.menu("Speed");
set.menu.item("Normal ", menu_normalspeed);
set.menu.item("Slow ", menu_slowspeed);
set.menu.item("Fast ", menu_fastspeed);
set.menu.item("Fastest", menu_fastestspeed);
submit.menu();
disable.item(menu_fileseparator);
//set(disable_game_functions);
new.room(1); // intro/opening screen
}
}
if (new_room) { // First interpreter cycle in a new room
// Note: Everything other than logic 0 is discarded
// from memory when new.room is executed
load.logics(90); // Load game specific functions logic into memory // Load game specific functions logic into memory
// Use debug mode?
if (v1!=v1) {
reset(debug_active);
} else {
set(debug_active);
load.logics(99); // debug code
}
clear.lines(24,24,0); // clear bottom line of screen (remove ego's coords if shown)
animate.obj(ego);
load.view.v(ego_view_no);
set.view.v(ego, ego_view_no);
observe.objs(ego);
old_clock_seconds = 255; // make sure clock gets updated this cycle
// on this cycle (if turned on)
}
if (death_type > 0) { // player is dead
if (death_type != 255) { // first cycle since player died. disable
// some menu items and load logic 94 into
// memory as it will be called from now on.
disable.item(menu_about);
disable.item(menu_help);
disable.item(menu_save);
disable.item(menu_pause);
disable.item(menu_soundonoff);
disable.item(menu_seeobject);
disable.item(menu_joystick);
disable.item(menu_normalspeed);
disable.item(menu_fastestspeed);
disable.item(menu_fastspeed);
disable.item(menu_slowspeed);
load.logics(94);
}
call(94); // death handler
goto(End);
}
if (!disable_game_functions) {
if (controller(key_activiate_menu)) {
menu.input();
}
}
if (controller(menu_about)) {
print(game_about_message);
}
if ((controller(menu_fastestspeed) ||
said("fastest") ||
said("fastest", "speed"))) {
cycle_delay = 0; // no delay between interpreter cycles
}
if ((controller(menu_fastspeed) ||
said("fast") ||
said("fast", "speed"))) {
cycle_delay = 1; // 1/20th of a second delay between interpreter cycles
}
if ((controller(menu_normalspeed) ||
said("normal") ||
said("normal", "speed"))) {
cycle_delay = 2; // 2/20ths of a second delay between interpreter cycles
}
if ((controller(menu_slowspeed) ||
said("slow") ||
said("slow", "speed"))) {
cycle_delay = 4; // 4/20ths of a second delay between interpreter cycles
}
if (controller(key_decreasevolume)) {
sound_volume--; // decrease volume
}
if (controller(key_increasevolume) && sound_volume < 15) {
sound_volume++; // increase volume
}
if (controller(menu_soundonoff)) {
toggle(sound_on);
}
if (!disable_game_functions) {
if (!debug_active) {
if (controller(key_debug)) {
set(debug_active);
print(game_version_message);
version();
load.logics(99); // load debug logic into memory
}
}
if ((controller(menu_save) ||
said("save", "game") ||
said("save"))) {
stop.sound();
save.game();
}
if ((controller(menu_restore) ||
said("restore", "game") ||
said("restore"))) {
stop.sound();
restore.game();
}
if ((controller(menu_restart) ||
said("restart", "game") ||
said("restart"))) {
restart.game();
}
if ((controller(menu_help) ||
said("help"))) {
call(92);
}
if (controller(key_echoline)) {
echo.line();
}
if (controller(key_clearinputline)) {
cancel.line();
}
if (controller(menu_joystick)) {
init.joy();
}
if ((controller(menu_pause) ||
said("pause", "game") ||
said("pause"))) {
pause();
}
if ((controller(menu_inventory) ||
said("inventory"))) {
status();
}
if ((controller(menu_seeobject) ||
controller(key_seeobject))) {
set(inventory_select_enabled); // enable choice of inventory item in inventory screen
status(); // show inventory screen - player selects an inventory item
if (selected_inventory_item > 0 &&
selected_inventory_item != 255) { // note: selected_inventory_item is set to 255
// if ESC is pressed in the inventory screen.
// player has chosen an object (value of selected_inventory_item). We now display this object.
if (selected_inventory_item == 1) { // test object
show.obj(220);
}
// NOTE: If you have several objects, it is easier to give them
// consecutive view numbers. Then you can do the following (view
// numbers start at 220 for this example):
// v255 = selected_inventory_item; v255 += 219;
// show.obj.v(v255);
// If you this, you don't have to have separate statements for each
// object.
reset(inventory_select_enabled); // disable choice of inventory item in inventory screen
}
}
if ((controller(menu_quit) ||
said("quit", "game") ||
said("quit"))) {
stop.sound();
quit(0);
}
}
get.posn(ego, new_ego_x, new_ego_y); // get ego's current position
if (ego_dir == old_ego_dir &&
new_ego_x == old_ego_x &&
new_ego_y == old_ego_y) {
// ego hasn't moved or changed direction since last cycle
stop.cycling(ego);
}
else {
if (!never_animate_ego) {
start.cycling(ego);
}
}
old_ego_x = new_ego_x;
old_ego_y = new_ego_y;
old_ego_dir = ego_dir;
if (always_animate_ego) {
start.cycling(ego);
}
else {
if ((ego_dir == stopped || never_animate_ego)) {
stop.cycling(ego);
}
}
if ((said("clock") || controller(menu_clock))) {
toggle(clock_active);
if (!clock_active) {
status.line.on(); // remove clock text from status line
}
else {
old_clock_seconds = 255; // make sure clock gets updated this cycle
}
}
if (clock_active && !disable_game_functions) {
if (old_clock_seconds != clock_seconds) {
set.text.attribute(0,15);
display(0, 18, " %v13:%v12|2:%v11|2 "); // update clock
set.text.attribute(15,0);
old_clock_seconds = clock_seconds;
}
}
if (isset(game_restored)) { // first cycle since restore game executed
clear.lines(23, 24, 0);
reset(debug_active);
disable.item(menu_fileseparator);
}
call.v(room_no); // IMPORTANT: This calls the logic for the current room - this
// is not done automatically by the interpreter so it has to be
// called manually by logic 0. Logic 0 cycles round and on each
// cycle the current room's logic is called, so it is also
// executed with each cycle.
if (debug_active) {
call(99); // debug logic
}
call(90); // game specific functions
if (input_recieved &&
unknown_word_no > 0) {
reset(input_recieved);
if (unknown_word_no == 1) {
print("I don't understand \"%w1\"");
}
if (unknown_word_no == 2) {
print("I don't understand \"%w2\"");
}
if (unknown_word_no == 3) {
print("I don't understand \"%w3\"");
}
}
if (input_recieved &&
!input_parsed) { // no command has been recognised
print("I don't understand your request.");
reset(input_recieved);
}
reset(input_parsed);
End:
return();