|
|
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 m
Length: 7400 (0x1ce8)
Types: TextFile
Names: »main.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/Sun/Sdi/main.c«
/************************************ main.c *************************/
#include "sdi.h"
/*
* Copyright 1987 by Mark Weiser.
* Permission to reproduce and use in any manner whatsoever on Suns is granted
* so long as this copyright and other identifying marks of authorship
* in the code and the game remain intact and visible. Use of this code
* in other products is reserved to me--I'm working on Mac and IBM versions.
*/
/*
* A big, long, initialization routine.
*/
static short cursor_data[] = {
#include "cursor.h"
};
mpr_static(cursor_pr, 16, 16, 1, cursor_data);
static short icon_image[] = {
#include "city_icon1.h"
};
DEFINE_ICON_FROM_IMAGE(icon, icon_image);
static short i_pic_array[] = {
#include "incoming_picture.h"
};
mpr_static(incoming_pic, 16, 16, 1, i_pic_array);
static short g_pic_array[] = {
#include "foe_ground_picture.h"
};
mpr_static(foe_ground_pic, 16, 16, 1, g_pic_array);
static void done_proc();
extern void main_event_proc(), canvas_resize_proc();
extern Notify_value canvas_input_proc(), asynch_event_proc(), synch_event_proc();
Notify_value scheduler(), input_notify();
#define FONT_NAME "/usr/lib/fonts/fixedwidthfonts/serif.r.14"
static char tenblanks[] = " ";
Panel launchpanel;
/*
* In need of no comment:
*/
main(argc, argv)
char **argv;
{
extern char *version;
Menu menu, null_menu_gen();
char tmp_string[128];
Panel controlpanel;
struct timeval tp;
char *s;
/* randomize us */
gettimeofday(&tp, 0);
srandom(tp.tv_sec);
/* init score file from environment, if possible */
if ((s = (char *)getenv("SDI_SCORES")) != NULL)
scorefile = s;
init_circles();
init_city_bits(NULL);
fixup_font(&argc, &argv, FONT_NAME);
open_our_font(FONT_NAME);
sprintf(tmp_string, " SDI Control Panel%s%s%s%s%sby mark weiser",
tenblanks,tenblanks,tenblanks,tenblanks,tenblanks);
s = (char *)get_name();
if (s && s[0] != '\0')
strcpy(user_name, s);
/* no background pre-write to our icon--otherwise we flicker. */
icon.ic_flags = 0;
/* make the control window, which serves as the base for all others. */
controlframe = window_create(NULL, FRAME,
FRAME_ARGC_PTR_ARGV, &argc, argv,
FRAME_LABEL, tmp_string,
FRAME_ICON, &icon,
WIN_ERROR_MSG, "Can't create window.",
WIN_FONT, font,
WIN_X, 0, WIN_Y, 0, /* start at zero, move later. */
0);
process_args(argc, argv);
init_icons();
build_playing_fields();
controlpanel = window_create(controlframe, PANEL,
WIN_VERTICAL_SCROLLBAR, scrollbar_create(0), /* but provide a loophole */
PANEL_LABEL_FONT, font,
PANEL_VALUE_FONT, font,
WIN_FONT, font,
WIN_ERROR_MSG, "Can't create window.",
/* magic numbers which seem to look good: */
WIN_WIDTH, 730,
PANEL_ITEM_X_GAP, 30,
PANEL_ITEM_Y_GAP, 15,
0);
init_control(controlpanel);
window_fit(controlpanel);
window_fit(controlframe);
city_fd = (int)window_get(citycanvas, WIN_FD);
launch_fd = (int)window_get(launchcanvas, WIN_FD);
max_x = (int)window_get(citycanvas, CANVAS_WIDTH);
max_y = (int)window_get(citycanvas, CANVAS_HEIGHT);
{ /* little block for a bunch of little variables */
struct screen screen;
int playwidth = (int)window_get(cityframe, WIN_WIDTH);
int controlwidth = (int)window_get(controlframe, WIN_WIDTH);
int controlheight = (int)window_get(controlframe, WIN_HEIGHT);
int center;
win_screenget(city_fd, &screen);
center = screen.scr_rect.r_width/2;
/* put the playing frames into position (control is at 0,0) */
window_set(cityframe, WIN_X, center - playwidth, 0);
window_set(launchframe, WIN_X, center, 0);
/* center the control frame */
window_set(controlframe, WIN_X, center - controlwidth/2,
/* magic number which seems to look good: */
WIN_Y, 200, 0);
/* put the playing frames below it. */
window_set(cityframe, WIN_Y, controlheight, 0);
window_set(launchframe, WIN_Y, controlheight, 0);
} /* end of little block */
/*
* menus in the playing fields are a distraction, but
* they can't be just menu-destroyed, because that leaves a
* dangling pointer inside sunview (and a core dump).
* So instead, we cleverly(?) modify the menu so that it will
* generate an empty contents.
* (Ychhhh!)
*/
menu = window_get(launchframe, WIN_MENU);
menu_set(menu, MENU_GEN_PROC, null_menu_gen, 0);
menu = window_get(cityframe, WIN_MENU);
menu_set(menu, MENU_GEN_PROC, null_menu_gen, 0);
notify_interpose_event_func(launchframe, synch_event_proc, NOTIFY_SAFE);
notify_interpose_event_func(cityframe, synch_event_proc, NOTIFY_SAFE);
notify_interpose_event_func(controlframe, synch_event_proc, NOTIFY_SAFE);
notify_set_scheduler_func(scheduler);
notify_set_input_func(citycanvas, input_notify, city_fd);
notify_set_input_func(launchcanvas, input_notify, launch_fd);
init_cursor();
update_cursor();
window_main_loop(controlframe);
exit(0);
}
static void
done_proc(frame)
Frame frame;
{
/* do nothing */
}
build_playing_fields()
{
Panel citypanel;
extern Panel_item foe_ground_item;
cityframe = window_create(controlframe, FRAME,
FRAME_LABEL, " SDI Friend Cities",
FRAME_SHOW_LABEL, TRUE,
FRAME_DONE_PROC, done_proc,
WIN_ERROR_MSG, "Can't create window.",
WIN_FONT, font,
FRAME_SUBWINDOWS_ADJUSTABLE, FALSE,
0);
citypanel = window_create(cityframe, PANEL, 0);
ballistic_item = panel_create_item(citypanel, PANEL_SLIDER,
ATTR_LIST, panel_common,
PANEL_LABEL_STRING, "Incoming missiles: ",
0);
window_fit_height(citypanel);
citycanvas = window_create(cityframe, CANVAS,
WIN_CONSUME_PICK_EVENTS, WIN_UP_EVENTS, 0,
WIN_EVENT_PROC, main_event_proc,
WIN_CURSOR, cursor_create(CURSOR_IMAGE, &cursor_pr,
CURSOR_XHOT, 8, CURSOR_YHOT, 8,
CURSOR_OP, PIX_SRC ^ PIX_DST,
0),
WIN_WIDTH, max_x+(2*FIELD_MARGIN), WIN_HEIGHT, max_y+(2*FIELD_MARGIN),
CANVAS_RESIZE_PROC, canvas_resize_proc,
CANVAS_RETAINED, TRUE, /* need retained for city computations */
WIN_ERROR_MSG, "Can't create window.",
CANVAS_MARGIN, 0,
0);
window_fit(cityframe);
citypw = pw_region(canvas_pixwin(citycanvas), FIELD_MARGIN, FIELD_MARGIN,
max_x, max_y);
launchframe = window_create(controlframe, FRAME,
FRAME_LABEL, " SDI Foe Launch",
FRAME_SHOW_LABEL, TRUE,
FRAME_DONE_PROC, done_proc,
WIN_ERROR_MSG, "Can't create window.",
WIN_FONT, font,
FRAME_SUBWINDOWS_ADJUSTABLE, FALSE,
0);
launchpanel = window_create(launchframe, PANEL, 0);
foe_ground_item = panel_create_item(launchpanel, PANEL_SLIDER,
ATTR_LIST, panel_common,
PANEL_LABEL_STRING, "Missiles on the ground:",
0);
window_fit_height(launchpanel);
launchcanvas = window_create(launchframe, CANVAS,
WIN_CONSUME_PICK_EVENTS, WIN_UP_EVENTS, 0,
WIN_EVENT_PROC, main_event_proc,
WIN_CURSOR, cursor_create(CURSOR_IMAGE, &cursor_pr,
CURSOR_XHOT, 8, CURSOR_YHOT, 8,
CURSOR_OP, PIX_SRC ^ PIX_DST,
0),
WIN_WIDTH, max_x+(2*FIELD_MARGIN), WIN_HEIGHT, max_y+(2*FIELD_MARGIN),
CANVAS_RESIZE_PROC, canvas_resize_proc,
CANVAS_RETAINED, TRUE,
WIN_ERROR_MSG, "Can't create window.",
CANVAS_MARGIN, 0,
0);
window_fit(launchframe);
launchpw = pw_region(canvas_pixwin(launchcanvas), FIELD_MARGIN, FIELD_MARGIN,
max_x, max_y);
/*
* A noble sentiment, but too much trouble to handle resizing correctly.
window_set(launchcanvas,
WIN_HEIGHT, window_get(launchcanvas, WIN_HEIGHT),
WIN_Y, 0,
0);
window_set(launchpanel, WIN_BELOW, launchcanvas,
0);
*/
draw_background();
}