|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T c
Length: 7742 (0x1e3e)
Types: TextFile
Names: »callbacks.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/X/Xrobots/callbacks.c«
/*
* callbacks.c -- xrobots v1.0
*/
#include <X11/X.h>
#include <X11/Intrinsic.h>
#include <X11/StringDefs.h>
#include <math.h>
#include "game.h"
#include "callbacks.h"
#include "graphics.h"
extern Widget sonic_command;
/*----------------------------------------------------------------------*/
/* Editorial note: For most of the functions in this file, callbacks
* are nothing more than overgrown actions. Both are used and
* needed. Unfortunately, there's alot of boilerplate overhead.
* Actually, all this could be done without any callbacks.
*/
/*ARGSUSED*/
XtCallbackProc
teleport_callback(widget,closure,callData)
Widget widget;
caddr_t closure;
caddr_t callData;
{
teleport();
}
/*ARGSUSED*/
static XtActionProc
teleport_action(w,event,params,num_params)
Widget w;
XEvent *event;
String *params;
Cardinal *num_params;
{
teleport();
}
/*ARGSUSED*/
XtCallbackProc
wait_callback(widget,closure,callData)
Widget widget;
caddr_t closure;
caddr_t callData;
{
wait_for_em();
}
/*ARGSUSED*/
static XtActionProc
wait_action(w,event,params,num_params)
Widget w;
XEvent *event;
String *params;
Cardinal *num_params;
{
wait_for_em();
}
/*ARGSUSED*/
XtCallbackProc
sonic_callback(widget,closure,callData)
Widget widget;
caddr_t closure;
caddr_t callData;
{
static Arg arg = { XtNsensitive, False};
if(!game_active) return;
XtSetValues(sonic_command,&arg,1);
sonic_screwdriver();
}
/*ARGSUSED*/
static XtActionProc
sonic_action(w,event,params,num_params)
Widget w;
XEvent *event;
String *params;
Cardinal *num_params;
{
static Arg arg = { XtNsensitive, False};
if(!game_active) return;
XtSetValues(sonic_command,&arg,1);
sonic_screwdriver();
}
void
reset_sonic_button()
{
static Arg arg = { XtNsensitive, True };
XtSetValues(sonic_command,&arg,1);
}
/*ARGSUSED*/
XtCallbackProc
new_game_callback(widget,closure,callData)
Widget widget;
caddr_t closure;
caddr_t callData;
{
new_game();
}
/*ARGSUSED*/
static XtActionProc
new_game_action(w,event,params,num_params)
Widget w;
XEvent *event;
String *params;
Cardinal *num_params;
{
new_game();
}
/*ARGSUSED*/
XtCallbackProc
quit_callback(widget,closure,callData)
Widget widget;
caddr_t closure;
caddr_t callData;
{
quit_game();
}
/*ARGSUSED*/
static XtActionProc
quit_action(w,event,params,num_params)
Widget w;
XEvent *event;
String *params;
Cardinal *num_params;
{
quit_game();
}
/*ARGSUSED*/
static XtActionProc
do_nothing_action(w,event,params,num_params)
Widget w;
XEvent *event;
String *params;
Cardinal *num_params;
{
/* do nothing */
}
/*----------------------------------------------------------------------*/
int
determine_direction(button_x,button_y)
int button_x,button_y;
{
/*
* Given the mouse's x&y position, this routine determines the direction
* relative to the player, and returns the result coded into a int.
*/
float slope, invslope;
int direction = 0;
int coord_x = pos_to_coord(human_x) + CELLSIZE/2,
coord_y = pos_to_coord(human_y) + CELLSIZE/2;
if( (abs(coord_x - button_x) < (CELLSIZE/2)+2) &&
(abs(coord_y - button_y) < (CELLSIZE/2)+2))
return(STILL); /* cursor is directly over the player */
if(button_x - coord_x != 0) {
slope = fabs((float)(button_y - coord_y) / (float)(button_x - coord_x));
if( button_x > coord_x ) { /* in coordinates 1 or 4 */
if( (slope < 2) && (human_x < MAXX) )
direction = RIGHT;
}
else /* in coordinates 2 or 3 */
if( (slope < 2) && (human_x > -1) )
direction = LEFT;
}
if(button_y - coord_y != 0) {
invslope = fabs((float)(button_x - coord_x) / (float)(button_y - coord_y));
if( button_y > coord_y ) { /* in coordinates 1 or 2 */
if( (invslope < 2) && (human_y < MAXY) )
direction |= DOWN;
}
else /* in coordinates 3 or 4 */
if( (invslope < 2) && (human_y > -1) )
direction |= UP;
}
return(direction);
}
/*----------------------------------------------------------------------*/
/*ARGSUSED*/
static XtActionProc
move_action(w,event,params,num_params)
Widget w;
XButtonEvent *event;
String *params;
Cardinal *num_params;
{
/*
* Called to move the player's icon. This action can be called
* when a mouse button is pressed or when a key is pressed.
* This is all dependent on the current translations.
*/
int direction;
int tmp_human_x = human_x, tmp_human_y = human_y;
int num_wasted;
int param_count = *num_params;
if(!game_active) return;
if(!*num_params) { /* no parameters - use the mouse pointer */
direction = determine_direction(event->x,event->y);
if(!direction) return;
if(direction & UP) tmp_human_y--;
if(direction & DOWN) tmp_human_y++;
if(direction & LEFT) tmp_human_x--;
if(direction & RIGHT) tmp_human_x++;
} else
while(param_count--) {
/* else pull the direction out of the parameters. */
/* you can 'cheat' here... but who's gonna tell? */
if(!strcmp("right",*(params+param_count)))
tmp_human_x++;
if(!strcmp("left", *(params+param_count)))
tmp_human_x--;
if(!strcmp("up", *(params+param_count)))
tmp_human_y--;
if(!strcmp("down", *(params+param_count)))
tmp_human_y++;
}
last_human_x = human_x;
last_human_y = human_y;
if( can_go(tmp_human_x,tmp_human_y) ) {
human_x = tmp_human_x;
human_y = tmp_human_y;
num_wasted = chase();
show_movement();
add_score(num_wasted);
if(!num_robots)
new_level();
else
display_possible_moves();
pointer_moved((Widget)0,(caddr_t)0,event);
}
}
/*ARGSUSED*/
static XtActionProc
go_here_action(w,event,params,num_params)
Widget w;
XButtonEvent *event;
String *params;
Cardinal *num_params;
{
/*
* This action causes player's icon to try to go to a spot in the
* play area. It stops if a move cannot be made.
*/
int direction;
int tmp_human_x, tmp_human_y;
int num_wasted;
if(!game_active) return;
while(direction = determine_direction(event->x,event->y)) {
if(direction == STILL) break;
tmp_human_x = human_x;
tmp_human_y = human_y;
if(direction & UP) tmp_human_y--;
if(direction & DOWN) tmp_human_y++;
if(direction & LEFT) tmp_human_x--;
if(direction & RIGHT) tmp_human_x++;
if( !can_go(tmp_human_x,tmp_human_y) )
break;
last_human_x = human_x;
last_human_y = human_y;
human_x = tmp_human_x;
human_y = tmp_human_y;
num_wasted = chase();
show_movement();
add_score(num_wasted);
if(!num_robots) {
new_level();
break;
}
if(spiffy) {
display_possible_moves();
pointer_moved((Widget)0,(caddr_t)0,event);
}
}
if(spiffy)
display_possible_moves();
pointer_moved((Widget)0,(caddr_t)0,event);
}
/*ARGSUSED*/
XtEventHandler
pointer_moved(w, closure, event)
Widget w;
caddr_t closure;
XPointerMovedEvent *event;
{
if(game_active)
update_pointer( determine_direction(event->x,event->y) );
}
/*----------------------------------------------------------------------*/
/*----------------------------------------------------------------------*/
static XtActionsRec actions[] = {
{"wait", (XtActionProc)wait_action},
{"teleport", (XtActionProc)teleport_action},
{"sonic", (XtActionProc)sonic_action},
{"move", (XtActionProc)move_action},
{"go_here", (XtActionProc)go_here_action},
{"quit", (XtActionProc)quit_action},
{"new_game", (XtActionProc)new_game_action},
{"do_nothing",(XtActionProc)do_nothing_action},
};
void
init_actions()
{
XtAddActions(actions,XtNumber(actions));
}