]> icculus.org git repositories - btb/d2x.git/blob - main/editor/med.c
remove rcs tags
[btb/d2x.git] / main / editor / med.c
1 /*
2 THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
3 SOFTWARE CORPORATION ("PARALLAX").  PARALLAX, IN DISTRIBUTING THE CODE TO
4 END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
5 ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
6 IN USING, DISPLAYING,  AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
7 SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
8 FREE PURPOSES.  IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
9 CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES.  THE END-USER UNDERSTANDS
10 AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
11 COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION.  ALL RIGHTS RESERVED.
12 */
13
14 /*
15  *
16  * Editor loop for Inferno
17  *
18  */
19
20 #ifdef HAVE_CONFIG_H
21 #include <conf.h>
22 #endif
23
24 //#define DEMO 1
25
26 #define DIAGNOSTIC_MESSAGE_MAX                          90
27 #define EDITOR_STATUS_MESSAGE_DURATION  4               //      Shows for 3+..4 seconds
28
29 #include <stdio.h>
30 #include <stdlib.h>
31 #include <stdarg.h>
32 #include <string.h>
33 #include <time.h>
34
35 #ifdef __MSDOS__
36 #include <process.h>
37 #endif
38
39
40 //#define INCLUDE_XLISP
41
42 #include "inferno.h"
43 #include "segment.h"
44 #include "gr.h"
45 #include "ui.h"
46 #include "editor.h"
47 //#include "gamemine.h"
48 #include "gamesave.h"
49 #include "gameseg.h"
50
51 #include "key.h"
52 #include "mono.h"
53 #include "error.h"
54 #include "kfuncs.h"
55 #include "macro.h"
56
57 #ifdef INCLUDE_XLISP
58 #include "medlisp.h"
59 #endif
60 #include "u_mem.h"
61 #include "render.h"
62 #include "game.h"
63 #include "slew.h"
64 #include "kdefs.h"
65 #include "func.h"
66 #include "textures.h"
67 #include "screens.h"
68 #include "texmap.h"
69 #include "object.h"
70 #include "effects.h"
71 #include "wall.h"
72 #include "info.h"
73 #include "ai.h"
74
75 #include "texpage.h"            // Textue selection paging stuff
76 #include "objpage.h"            // Object selection paging stuff
77
78 #include "medmisc.h"
79 #include "meddraw.h"
80 #include "medsel.h"
81 #include "medrobot.h"
82 #include "medwall.h"
83 #include "eswitch.h"
84 #include "ehostage.h"
85 #include "centers.h"
86
87 #include "fuelcen.h"
88 #include "gameseq.h"
89 #include "newmenu.h"
90
91 //#define _MARK_ON 1
92 //#include <wsample.h>          //should come after inferno.h to get mark setting //Not included here.
93
94 #define COMPRESS_INTERVAL       5                       // seconds
95
96 //char *undo_status[128];
97
98 int initializing;
99
100 //these are instances of canvases, pointed to by variables below
101 grs_canvas _canv_editor_game;           //the game on the editor screen
102
103 //these are pointers to our canvases
104 grs_canvas *Canv_editor;                        //the editor screen
105 grs_canvas *Canv_editor_game=&_canv_editor_game; //the game on the editor screen
106
107 grs_canvas *canv_offscreen;             //for off-screen rendering
108 grs_canvas *Pad_text_canvas;            // Keypad text
109
110 grs_font *editor_font=NULL;
111
112 //where the editor is looking
113 vms_vector Ed_view_target={0,0,0};
114
115 int gamestate_not_restored = 0;
116
117 UI_WINDOW * EditorWindow;
118
119 int     Large_view_index = -1;
120
121 UI_GADGET_USERBOX * GameViewBox;
122 UI_GADGET_USERBOX * LargeViewBox;
123 UI_GADGET_USERBOX * GroupViewBox;
124
125 #if ORTHO_VIEWS
126 UI_GADGET_USERBOX * TopViewBox;
127 UI_GADGET_USERBOX * FrontViewBox;
128 UI_GADGET_USERBOX * RightViewBox;
129 #endif
130
131 UI_GADGET_ICON * ViewIcon;
132 UI_GADGET_ICON * AllIcon;
133 UI_GADGET_ICON * AxesIcon;
134 UI_GADGET_ICON * ChaseIcon;
135 UI_GADGET_ICON * OutlineIcon;
136 UI_GADGET_ICON * LockIcon;
137 //-NOLIGHTICON- UI_GADGET_ICON * LightIcon;
138
139 UI_EVENT * DemoBuffer = NULL;
140
141 //grs_canvas * BigCanvas[2];
142 //int CurrentBigCanvas = 0;
143 //int BigCanvasFirstTime = 1;
144
145 int     Found_seg_index=0;                              // Index in Found_segs corresponding to Cursegp
146
147
148 void print_status_bar( char message[DIAGNOSTIC_MESSAGE_MAX] ) {
149         int w,h,aw;
150
151         gr_set_current_canvas( NULL );
152         gr_set_curfont(editor_font);
153         gr_set_fontcolor( CBLACK, CGREY );
154         gr_get_string_size( message, &w, &h, &aw );
155         gr_string( 4, 583, message );
156         gr_set_fontcolor( CBLACK, CWHITE );
157         gr_setcolor( CGREY );
158         gr_rect( 4+w, 583, 799, 599 );
159 }
160
161 void print_diagnostic( char message[DIAGNOSTIC_MESSAGE_MAX] ) {
162         int w,h,aw;
163
164         gr_set_current_canvas( NULL );
165         gr_set_curfont(editor_font);
166         gr_set_fontcolor( CBLACK, CGREY );
167         gr_get_string_size( message, &w, &h, &aw );
168         gr_string( 4, 583, message );
169         gr_set_fontcolor( CBLACK, CWHITE );
170         gr_setcolor( CGREY );
171         gr_rect( 4+w, 583, 799, 599 );
172 }
173
174 static char status_line[DIAGNOSTIC_MESSAGE_MAX];
175
176 struct tm       Editor_status_last_time;
177
178 void editor_status( const char *format, ... )
179 {
180         va_list ap;
181
182         va_start(ap, format);
183         vsprintf(status_line, format, ap);
184         va_end(ap);
185
186         print_status_bar(status_line);
187
188         Editor_status_last_time = Editor_time_of_day;
189
190 }
191
192 //      int  tm_sec;    /* seconds after the minute -- [0,61] */
193 //      int  tm_min;    /* minutes after the hour       -- [0,59] */
194 //      int  tm_hour;   /* hours after midnight -- [0,23] */
195 //      int  tm_mday;   /* day of the month             -- [1,31] */
196 //      int  tm_mon;    /* months since January -- [0,11] */
197 //      int  tm_year;   /* years since 1900                             */
198 //      int  tm_wday;   /* days since Sunday            -- [0,6]  */
199 //      int  tm_yday;   /* days since January 1 -- [0,365]*/
200 //      int  tm_isdst;  /* Daylight Savings Time flag */
201
202 void clear_editor_status(void)
203 {
204         int cur_time = Editor_time_of_day.tm_hour * 3600 + Editor_time_of_day.tm_min*60 + Editor_time_of_day.tm_sec;
205         int erase_time = Editor_status_last_time.tm_hour * 3600 + Editor_status_last_time.tm_min*60 + Editor_status_last_time.tm_sec + EDITOR_STATUS_MESSAGE_DURATION;
206
207         if (cur_time > erase_time) {
208                 int     i;
209                 char    message[DIAGNOSTIC_MESSAGE_MAX];
210
211                 for (i=0; i<DIAGNOSTIC_MESSAGE_MAX-1; i++)
212                         message[i] = ' ';
213
214                 message[i] = 0;
215                 print_status_bar(message);
216                 Editor_status_last_time.tm_hour = 99;
217         }
218 }
219
220
221 void diagnostic_message( const char *format, ... )
222 {
223         char diag_line[DIAGNOSTIC_MESSAGE_MAX];
224
225         va_list ap;
226
227         va_start(ap, format);
228         vsprintf(diag_line, format, ap);
229         va_end(ap);
230
231         editor_status(diag_line);
232 }
233
234
235 static char sub_status_line[DIAGNOSTIC_MESSAGE_MAX];
236
237 void editor_sub_status( const char *format, ... )
238 {
239         int w,h,aw;
240         va_list ap;
241
242         va_start(ap, format);
243         vsprintf(sub_status_line, format, ap);
244         va_end(ap);
245
246         gr_set_current_canvas( NULL );
247         gr_set_curfont(editor_font);
248         gr_set_fontcolor( BM_XRGB(0,0,31), CGREY );
249         gr_get_string_size( sub_status_line, &w, &h, &aw );
250         gr_string( 500, 583, sub_status_line );
251         gr_set_fontcolor( CBLACK, CWHITE );
252         gr_setcolor( CGREY );
253         gr_rect( 500+w, 583, 799, 599 );
254 }
255
256 int DropIntoDebugger()
257 {
258         Int3();
259         return 1;
260 }
261
262
263 #ifdef INCLUDE_XLISP
264 int CallLisp()
265 {
266         medlisp_go();
267         return 1;
268 }
269 #endif
270
271
272 int ExitEditor()
273 {
274         if (SafetyCheck())  {
275                 ModeFlag = 1;
276         }
277         return 1;
278 }
279
280 int     GotoGameScreen()
281 {
282         stop_time();
283
284 //@@    init_player_stats();
285 //@@
286 //@@    Player_init.pos = Player->pos;
287 //@@    Player_init.orient = Player->orient;
288 //@@    Player_init.segnum = Player->segnum;    
289         
290 // -- must always save gamesave.sav because the restore-objects code relies on it
291 // -- that code could be made smarter and use the original file, if appropriate.
292 //      if (mine_changed) 
293         if (gamestate_not_restored == 0) {
294                 gamestate_not_restored = 1;
295                 save_level("GAMESAVE.LVL");
296                 editor_status("Gamestate saved.\n");
297                 mprintf((0, "Gamestate saved.\n"));
298         }
299
300         ai_reset_all_paths();
301
302         start_time();
303
304         ModeFlag = 3;
305         return 1;
306 }
307
308 int GotoMainMenu()
309 {
310         ModeFlag = 2;
311         return 1;
312 }
313
314
315 void ReadLispMacro( FILE * file, char * buffer )
316 {
317 //      char c;
318 //      int size=0;
319 //      int pcount = 0;
320 //      char text[100];
321 //      int i=0;
322         
323         fscanf( file, " { %s } ", buffer );
324
325 /*
326         while (1)
327         {
328                 c = text[i++];
329                 if (pcount > 0 )
330                         buffer[size++] = c;
331                 if ( c == '(' ) pcount++;
332                 if ( c == ')' ) break;
333         }
334         buffer[size++] = 0;
335 */
336
337         return;
338 }
339
340 static int (*KeyFunction[2048])();
341
342 void medkey_init()
343 {
344         FILE * keyfile;
345         char keypress[100];
346         int key;
347         int i;  //, size;
348         int np;
349         char * LispCommand;
350
351         MALLOC( LispCommand, char, DIAGNOSTIC_MESSAGE_MAX );
352
353         for (i=0; i<2048; i++ )
354                 KeyFunction[i] = NULL;
355
356         keyfile = fopen( "GLOBAL.KEY", "rt" );
357         if (keyfile)
358         {
359                 while (fscanf( keyfile, " %s %s ", keypress, LispCommand ) != EOF )
360                 {
361                         //ReadLispMacro( keyfile, LispCommand );
362
363                         if ( (key=DecodeKeyText( keypress ))!= -1 )
364                         {
365                                 Assert( key < 2048);
366                                 KeyFunction[key] = func_get( LispCommand, &np );
367                         } else {
368                                 Error( "Bad key %s in GLOBAL.KEY!", keypress );
369                         }
370                 }
371                 fclose(keyfile);
372         }
373         d_free( LispCommand );
374 }
375
376 void init_editor()
377 {
378         minit();
379
380         ui_init();
381
382         init_med_functions();   // Must be called before medlisp_init
383
384         ui_pad_read( 0, "segmove.pad" );
385         ui_pad_read( 1, "segsize.pad" );
386         ui_pad_read( 2, "curve.pad" );
387         ui_pad_read( 3, "texture.pad" );
388         ui_pad_read( 4, "object.pad" );
389         ui_pad_read( 5, "objmov.pad" );
390         ui_pad_read( 6, "group.pad" );
391         ui_pad_read( 7, "lighting.pad" );
392         ui_pad_read( 8, "test.pad" );
393
394         medkey_init();
395
396         editor_font = gr_init_font( "pc8x16.fnt" );
397         
398         menubar_init( "MED.MNU" );
399
400         canv_offscreen = gr_create_canvas(LVIEW_W,LVIEW_H);
401         
402         Draw_all_segments = 1;                                          // Say draw all segments, not just connected ones
403
404         init_autosave();
405   
406 //      atexit(close_editor);
407
408         Clear_window = 1;       //      do full window clear.
409 }
410
411 int ShowAbout()
412 {
413         MessageBox( -2, -2, 1,  "INFERNO Mine Editor\n\n"               \
414                                                                         "Copyright (c) 1993  Parallax Software Corp.",
415                                                                         "OK");
416         return 0;
417 }
418
419 void move_player_2_segment(segment *seg,int side);
420
421 int SetPlayerFromCurseg()
422 {
423         move_player_2_segment(Cursegp,Curside);
424         Update_flags |= UF_ED_STATE_CHANGED | UF_GAME_VIEW_CHANGED;
425         return 1;
426 }
427
428 int fuelcen_create_from_curseg()
429 {
430         Curseg2p->special = SEGMENT_IS_FUELCEN;
431         fuelcen_activate(Cursegp, Curseg2p->special);
432         return 1;
433 }
434
435 int repaircen_create_from_curseg()
436 {
437         Int3(); //      -- no longer supported!
438 //      Curseg2p->special = SEGMENT_IS_REPAIRCEN;
439 //      fuelcen_activate(Cursegp, Curseg2p->special);
440         return 1;
441 }
442
443 int controlcen_create_from_curseg()
444 {
445         Curseg2p->special = SEGMENT_IS_CONTROLCEN;
446         fuelcen_activate(Cursegp, Curseg2p->special);
447         return 1;
448 }
449
450 int robotmaker_create_from_curseg()
451 {
452         Curseg2p->special = SEGMENT_IS_ROBOTMAKER;
453         fuelcen_activate(Cursegp, Curseg2p->special);
454         return 1;
455 }
456
457 int fuelcen_reset_all() {
458         fuelcen_reset();
459         return 1;
460 }
461
462 int fuelcen_delete_from_curseg() {
463         fuelcen_delete( Cursegp );
464         return 1;
465 }
466
467
468 //@@//this routine places the viewer in the center of the side opposite to curside,
469 //@@//with the view toward the center of curside
470 //@@int SetPlayerFromCursegMinusOne()
471 //@@{
472 //@@    vms_vector vp;
473 //@@
474 //@@//  int newseg,newside;
475 //@@//  get_previous_segment(SEG_PTR_2_NUM(Cursegp),Curside,&newseg,&newside);
476 //@@//  move_player_2_segment(&Segments[newseg],newside);
477 //@@
478 //@@    med_compute_center_point_on_side(&Player->obj_position,Cursegp,Side_opposite[Curside]);
479 //@@    med_compute_center_point_on_side(&vp,Cursegp,Curside);
480 //@@    vm_vec_sub2(&vp,&Player->position);
481 //@@    vm_vector_2_matrix(&Player->orient,&vp,NULL,NULL);
482 //@@
483 //@@    Player->seg = SEG_PTR_2_NUM(Cursegp);
484 //@@
485 //@@    Update_flags |= UF_GAME_VIEW_CHANGED;
486 //@@    return 1;
487 //@@}
488
489 //this constant determines how much of the window will be occupied by the
490 //viewed side when SetPlayerFromCursegMinusOne() is called.  It actually
491 //determine how from from the center of the window the farthest point will be
492 #define SIDE_VIEW_FRAC (f1_0*8/10)      //80%
493
494
495 void move_player_2_segment_and_rotate(segment *seg,int side)
496 {
497         vms_vector vp;
498         vms_vector      upvec;
499         static int edgenum=0;
500
501         compute_segment_center(&ConsoleObject->pos,seg);
502         compute_center_point_on_side(&vp,seg,side);
503         vm_vec_sub2(&vp,&ConsoleObject->pos);
504
505         vm_vec_sub(&upvec, &Vertices[Cursegp->verts[Side_to_verts[Curside][edgenum%4]]], &Vertices[Cursegp->verts[Side_to_verts[Curside][(edgenum+3)%4]]]);
506         edgenum++;
507
508         vm_vector_2_matrix(&ConsoleObject->orient,&vp,&upvec,NULL);
509 //      vm_vector_2_matrix(&ConsoleObject->orient,&vp,NULL,NULL);
510
511         obj_relink( OBJECT_NUMBER(ConsoleObject), SEG_PTR_2_NUM(seg) );
512         
513 }
514
515 int SetPlayerFromCursegAndRotate()
516 {
517         move_player_2_segment_and_rotate(Cursegp,Curside);
518         Update_flags |= UF_ED_STATE_CHANGED | UF_GAME_VIEW_CHANGED;
519         return 1;
520 }
521
522
523 //sets the player facing curseg/curside, normal to face0 of curside, and
524 //far enough away to see all of curside
525 int SetPlayerFromCursegMinusOne()
526 {
527         vms_vector view_vec,view_vec2,side_center;
528         vms_vector corner_v[4];
529         vms_vector      upvec;
530         g3s_point corner_p[4];
531         int i;
532         fix max,view_dist=f1_0*10;
533         static int edgenum=0;
534         int newseg;
535
536         view_vec = Cursegp->sides[Curside].normals[0];
537         vm_vec_negate(&view_vec);
538
539         compute_center_point_on_side(&side_center,Cursegp,Curside);
540         vm_vec_copy_scale(&view_vec2,&view_vec,view_dist);
541         vm_vec_sub(&ConsoleObject->pos,&side_center,&view_vec2);
542
543         vm_vec_sub(&upvec, &Vertices[Cursegp->verts[Side_to_verts[Curside][edgenum%4]]], &Vertices[Cursegp->verts[Side_to_verts[Curside][(edgenum+3)%4]]]);
544         edgenum++;
545
546         vm_vector_2_matrix(&ConsoleObject->orient,&view_vec,&upvec,NULL);
547
548         gr_set_current_canvas(Canv_editor_game);
549         g3_start_frame();
550         g3_set_view_matrix(&ConsoleObject->pos,&ConsoleObject->orient,Render_zoom);
551
552         for (i=max=0;i<4;i++) {
553                 corner_v[i] = Vertices[Cursegp->verts[Side_to_verts[Curside][i]]];
554                 g3_rotate_point(&corner_p[i],&corner_v[i]);
555                 if (labs(corner_p[i].p3_x) > max) max = labs(corner_p[i].p3_x);
556                 if (labs(corner_p[i].p3_y) > max) max = labs(corner_p[i].p3_y);
557         }
558
559         view_dist = fixmul(view_dist,fixdiv(fixdiv(max,SIDE_VIEW_FRAC),corner_p[0].p3_z));
560         vm_vec_copy_scale(&view_vec2,&view_vec,view_dist);
561         vm_vec_sub(&ConsoleObject->pos,&side_center,&view_vec2);
562
563         //obj_relink( OBJECT_NUMBER(ConsoleObject), SEG_PTR_2_NUM(Cursegp) );
564         //update_object_seg(ConsoleObject);             //might have backed right out of curseg
565
566         newseg = find_point_seg(&ConsoleObject->pos,SEG_PTR_2_NUM(Cursegp) );
567         if (newseg != -1)
568                 obj_relink(OBJECT_NUMBER(ConsoleObject), newseg);
569
570         Update_flags |= UF_ED_STATE_CHANGED | UF_GAME_VIEW_CHANGED;
571         return 1;
572 }
573
574 int ToggleLighting(void)
575 {
576         char    outstr[80] = "[shift-L] ";
577         int     chindex;
578
579         Lighting_on++;
580         if (Lighting_on >= 2)
581                 Lighting_on = 0;
582
583         Update_flags |= UF_GAME_VIEW_CHANGED;
584
585         if (last_keypress == KEY_L + KEY_SHIFTED)
586                 chindex = 0;
587         else
588                 chindex = 10;
589
590         switch (Lighting_on) {
591                 case 0:
592                         strcpy(&outstr[chindex],"Lighting off.");
593                         break;
594                 case 1:
595                         strcpy(&outstr[chindex],"Static lighting.");
596                         break;
597                 case 2:
598                         strcpy(&outstr[chindex],"Ship lighting.");
599                         break;
600                 case 3:
601                         strcpy(&outstr[chindex],"Ship and static lighting.");
602                         break;
603         }
604
605         diagnostic_message(outstr);
606
607         return Lighting_on;
608 }
609
610 void find_concave_segs();
611
612 int FindConcaveSegs()
613 {
614         find_concave_segs();
615
616         Update_flags |= UF_ED_STATE_CHANGED;            //list may have changed
617
618         return 1;
619 }
620
621 int DosShell()
622 {
623         int ok, w, h;
624         grs_bitmap * save_bitmap;
625
626         ok = 1;
627
628         // Save the current graphics state.
629
630         w = grd_curscreen->sc_canvas.cv_bitmap.bm_w;
631         h = grd_curscreen->sc_canvas.cv_bitmap.bm_h;
632
633         save_bitmap = gr_create_bitmap( w, h );
634         gr_bm_ubitblt(w, h, 0, 0, 0, 0, &(grd_curscreen->sc_canvas.cv_bitmap), save_bitmap );
635
636         // gr_set_mode( SM_ORIGINAL );
637
638         printf( "\n\nType EXIT to return to Inferno" );
639         fflush(stdout);
640
641         key_close();
642 #ifdef __MSDOS__
643         ok = spawnl(P_WAIT,getenv("COMSPEC"), NULL );
644 #elif defined(__linux__)
645         system("");
646 #endif
647         key_init();
648
649         gr_set_mode(grd_curscreen->sc_mode);
650         gr_bm_ubitblt(w, h, 0, 0, 0, 0, save_bitmap, &(grd_curscreen->sc_canvas.cv_bitmap));
651         gr_free_bitmap( save_bitmap );
652         //gr_pal_setblock( 0, 256, grd_curscreen->pal );
653         //gr_use_palette_table();
654
655         return ok;
656
657 }
658
659 int ToggleOutlineMode()
660 {
661 #ifndef NDEBUG
662         int mode;
663
664         mode=toggle_outline_mode();
665
666         if (mode)
667          {
668                 if (last_keypress != KEY_O)
669                         diagnostic_message("[O] Outline Mode ON.");
670                 else
671                         diagnostic_message("Outline Mode ON.");
672          }
673         else
674          {
675                 if (last_keypress != KEY_O)
676                         diagnostic_message("[O] Outline Mode OFF.");
677                 else
678                         diagnostic_message("Outline Mode OFF.");
679          }
680
681         Update_flags |= UF_GAME_VIEW_CHANGED;
682         return mode;
683 #else
684         return 1;
685 #endif
686 }
687
688 //@@int do_reset_orient()
689 //@@{
690 //@@    slew_reset_orient(SlewObj);
691 //@@
692 //@@    Update_flags |= UF_GAME_VIEW_CHANGED;
693 //@@
694 //@@    * (ubyte *) 0x417 &= ~0x20;
695 //@@
696 //@@    return 1;
697 //@@}
698
699 int GameZoomOut()
700 {
701         Render_zoom = fixmul(Render_zoom,68985);
702         Update_flags |= UF_GAME_VIEW_CHANGED;
703         return 1;
704 }
705
706 int GameZoomIn()
707 {
708         Render_zoom = fixmul(Render_zoom,62259);
709         Update_flags |= UF_GAME_VIEW_CHANGED;
710         return 1;
711 }
712
713
714 int med_keypad_goto_0() {       ui_pad_goto(0); return 0;       }
715 int med_keypad_goto_1() {       ui_pad_goto(1); return 0;       }
716 int med_keypad_goto_2() {       ui_pad_goto(2); return 0;       }
717 int med_keypad_goto_3() {       ui_pad_goto(3); return 0;       }
718 int med_keypad_goto_4() {       ui_pad_goto(4); return 0;       }
719 int med_keypad_goto_5() {       ui_pad_goto(5); return 0;       }
720 int med_keypad_goto_6() {       ui_pad_goto(6); return 0;       }
721 int med_keypad_goto_7() {       ui_pad_goto(7); return 0;       }
722 int med_keypad_goto_8() {       ui_pad_goto(8); return 0;       }
723
724 #define PAD_WIDTH       30
725 #define PAD_WIDTH1      (PAD_WIDTH + 7)
726
727 int editor_screen_open = 0;
728
729 //setup the editors windows, canvases, gadgets, etc.
730 //called whenever the editor screen is selected
731 void init_editor_screen()
732 {       
733 //      grs_bitmap * bmp;
734
735         if (editor_screen_open) return;
736
737         grd_curscreen->sc_canvas.cv_font = editor_font;
738         
739         //create canvas for game on the editor screen
740         initializing = 1;
741         gr_set_current_canvas(Canv_editor);
742         Canv_editor->cv_font = editor_font;
743         gr_init_sub_canvas(Canv_editor_game,Canv_editor,GAMEVIEW_X,GAMEVIEW_Y,GAMEVIEW_W,GAMEVIEW_H);
744         
745         //Editor renders into full (320x200) game screen 
746
747         init_info = 1;
748
749         //do other editor screen setup
750
751         // Since the palette might have changed, find some good colors...
752         CBLACK = gr_find_closest_color( 1, 1, 1 );
753         CGREY = gr_find_closest_color( 28, 28, 28 );
754         CWHITE = gr_find_closest_color( 38, 38, 38 );
755         CBRIGHT = gr_find_closest_color( 60, 60, 60 );
756         CRED = gr_find_closest_color( 63, 0, 0 );
757
758         gr_set_curfont(editor_font);
759         gr_set_fontcolor( CBLACK, CWHITE );
760
761         EditorWindow = ui_open_window( 0 , 0, ED_SCREEN_W, ED_SCREEN_H, WIN_FILLED );
762
763         LargeViewBox    = ui_add_gadget_userbox( EditorWindow,LVIEW_X,LVIEW_Y,LVIEW_W,LVIEW_H);
764 #if ORTHO_VIEWS
765         TopViewBox              = ui_add_gadget_userbox( EditorWindow,TVIEW_X,TVIEW_Y,TVIEW_W,TVIEW_H);
766         FrontViewBox    = ui_add_gadget_userbox( EditorWindow,FVIEW_X,FVIEW_Y,FVIEW_W,FVIEW_H);
767         RightViewBox    = ui_add_gadget_userbox( EditorWindow,RVIEW_X,RVIEW_Y,RVIEW_W,RVIEW_H);
768 #endif
769         ui_gadget_calc_keys(EditorWindow);      //make tab work for all windows
770
771         GameViewBox     = ui_add_gadget_userbox( EditorWindow, GAMEVIEW_X, GAMEVIEW_Y, GAMEVIEW_W, GAMEVIEW_H );
772 //      GroupViewBox    = ui_add_gadget_userbox( EditorWindow,GVIEW_X,GVIEW_Y,GVIEW_W,GVIEW_H);
773
774 //      GameViewBox->when_tab = GameViewBox->when_btab = (UI_GADGET *) LargeViewBox;
775 //      LargeViewBox->when_tab = LargeViewBox->when_btab = (UI_GADGET *) GameViewBox;
776
777 //      ui_gadget_calc_keys(EditorWindow);      //make tab work for all windows
778
779         ViewIcon        = ui_add_gadget_icon( EditorWindow, "Lock\nview",       455,25+530,     40, 22, KEY_V+KEY_CTRLED, ToggleLockViewToCursegp );
780         AllIcon = ui_add_gadget_icon( EditorWindow, "Draw\nall",        500,25+530,     40, 22, KEY_A+KEY_CTRLED, ToggleDrawAllSegments );
781         AxesIcon        = ui_add_gadget_icon( EditorWindow, "Coord\naxes",545,25+530,           40, 22, KEY_D+KEY_CTRLED, ToggleCoordAxes );
782 //-NOLIGHTICON- LightIcon       = ui_add_gadget_icon( EditorWindow, "Light\ning",       590,25+530,     40, 22, KEY_L+KEY_SHIFTED,ToggleLighting );
783         ChaseIcon       = ui_add_gadget_icon( EditorWindow, "Chase\nmode",635,25+530,           40, 22, -1,                             ToggleChaseMode );
784         OutlineIcon = ui_add_gadget_icon( EditorWindow, "Out\nline",    680,25+530,     40, 22, KEY_O,                  ToggleOutlineMode );
785         LockIcon        = ui_add_gadget_icon( EditorWindow, "Lock\nstep", 725,25+530,   40, 22, KEY_L,                  ToggleLockstep );
786
787         meddraw_init_views(LargeViewBox->canvas);
788
789         //ui_add_gadget_button( EditorWindow, 460, 510, 50, 25, "Quit", ExitEditor );
790         //ui_add_gadget_button( EditorWindow, 520, 510, 50, 25, "Lisp", CallLisp );
791         //ui_add_gadget_button( EditorWindow, 580, 510, 50, 25, "Mine", MineMenu );
792         //ui_add_gadget_button( EditorWindow, 640, 510, 50, 25, "Help", DoHelp );
793         //ui_add_gadget_button( EditorWindow, 460, 540, 50, 25, "Macro", MacroMenu );
794         //ui_add_gadget_button( EditorWindow, 520, 540, 50, 25, "About", ShowAbout );
795         //ui_add_gadget_button( EditorWindow, 640, 540, 50, 25, "Shell", DosShell );
796
797         ui_pad_activate( EditorWindow, PAD_X, PAD_Y );
798         Pad_text_canvas = gr_create_sub_canvas(Canv_editor, PAD_X + 250, PAD_Y + 8, 180, 160);
799         ui_add_gadget_button( EditorWindow, PAD_X+6, PAD_Y+(30*5)+22, PAD_WIDTH, 20, "<<",  med_keypad_goto_prev );
800         ui_add_gadget_button( EditorWindow, PAD_X+PAD_WIDTH1+6, PAD_Y+(30*5)+22, PAD_WIDTH, 20, ">>",  med_keypad_goto_next );
801
802         {       int     i;
803                 i = 0;  ui_add_gadget_button( EditorWindow, PAD_X+16+(i+2)*PAD_WIDTH1, PAD_Y+(30*5)+22, PAD_WIDTH, 20, "SR",  med_keypad_goto_0 );
804                 i++;            ui_add_gadget_button( EditorWindow, PAD_X+16+(i+2)*PAD_WIDTH1, PAD_Y+(30*5)+22, PAD_WIDTH, 20, "SS",  med_keypad_goto_1 );
805                 i++;            ui_add_gadget_button( EditorWindow, PAD_X+16+(i+2)*PAD_WIDTH1, PAD_Y+(30*5)+22, PAD_WIDTH, 20, "CF",  med_keypad_goto_2 );
806                 i++;            ui_add_gadget_button( EditorWindow, PAD_X+16+(i+2)*PAD_WIDTH1, PAD_Y+(30*5)+22, PAD_WIDTH, 20, "TM",  med_keypad_goto_3 );
807                 i++;            ui_add_gadget_button( EditorWindow, PAD_X+16+(i+2)*PAD_WIDTH1, PAD_Y+(30*5)+22, PAD_WIDTH, 20, "OP",  med_keypad_goto_4 );
808                 i++;            ui_add_gadget_button( EditorWindow, PAD_X+16+(i+2)*PAD_WIDTH1, PAD_Y+(30*5)+22, PAD_WIDTH, 20, "OR",  med_keypad_goto_5 );
809                 i++;            ui_add_gadget_button( EditorWindow, PAD_X+16+(i+2)*PAD_WIDTH1, PAD_Y+(30*5)+22, PAD_WIDTH, 20, "GE",  med_keypad_goto_6 );
810                 i++;            ui_add_gadget_button( EditorWindow, PAD_X+16+(i+2)*PAD_WIDTH1, PAD_Y+(30*5)+22, PAD_WIDTH, 20, "LI",  med_keypad_goto_7 );
811                 i++;            ui_add_gadget_button( EditorWindow, PAD_X+16+(i+2)*PAD_WIDTH1, PAD_Y+(30*5)+22, PAD_WIDTH, 20, "TT",  med_keypad_goto_8 );
812         }
813
814         gr_set_curfont(editor_font);
815         menubar_show();
816
817         // INIT TEXTURE STUFF
818         texpage_init( EditorWindow );
819         objpage_init( EditorWindow );
820
821         EditorWindow->keyboard_focus_gadget = (UI_GADGET *)LargeViewBox;
822
823         canv_offscreen->cv_font = grd_curscreen->sc_canvas.cv_font;
824 //      BigCanvas[0]->cv_font = grd_curscreen->sc_canvas.cv_font; 
825 //      BigCanvas[1]->cv_font = grd_curscreen->sc_canvas.cv_font; 
826 //      BigCanvasFirstTime = 1;
827
828         // Draw status box
829         gr_set_current_canvas( NULL );
830         gr_setcolor( CGREY );
831         gr_rect(STATUS_X,STATUS_Y,STATUS_X+STATUS_W-1,STATUS_Y+STATUS_H-1);                     //0, 582, 799, 599 );
832
833         // Draw icon box
834         // gr_set_current_canvas( NULL );
835         //  gr_setcolor( CBRIGHT );
836         //  gr_rect( 528, 2, 798, 22);
837         //  gr_setcolor( CGREY);
838         //  gr_rect( 530, 2, 799, 20);
839
840         Update_flags = UF_ALL;
841         initializing = 0;
842         editor_screen_open = 1;
843 }
844
845 //shutdown ui on the editor screen
846 void close_editor_screen()
847 {
848         if (!editor_screen_open) return;
849
850         editor_screen_open = 0;
851         ui_pad_deactivate();
852         gr_free_sub_canvas(Pad_text_canvas);
853
854         ui_close_window(EditorWindow);
855
856         close_all_windows();
857
858         // CLOSE TEXTURE STUFF
859         texpage_close();
860         objpage_close();
861
862         menubar_hide();
863
864 }
865
866 void med_show_warning(char *s)
867 {
868         grs_canvas *save_canv=grd_curcanv;
869
870         //gr_pal_fade_in(grd_curscreen->pal);   //in case palette is blacked
871
872         MessageBox(-2,-2,1,s,"OK");
873
874         gr_set_current_canvas(save_canv);
875
876 }
877
878 // Returns 1 if OK to trash current mine.
879 int SafetyCheck()
880 {
881         int x;
882                         
883         if (mine_changed) {
884                 stop_time();                            
885                 x = nm_messagebox( "Warning!", 2, "Cancel", "OK", "You are about to lose work." );
886                 if (x<1) {
887                         start_time();
888                         return 0;
889                 }
890                 start_time();
891         }
892         return 1;
893 }
894
895 //called at the end of the program
896 void close_editor() {
897
898         close_autosave();
899
900         menubar_close();
901         
902         gr_close_font(editor_font);
903
904         gr_free_canvas(canv_offscreen); canv_offscreen = NULL;
905
906         return;
907
908 }
909
910 //variables for find segments process
911
912 // ---------------------------------------------------------------------------------------------------
913 //      Subtract all elements in Found_segs from selected list.
914 void subtract_found_segments_from_selected_list(void)
915 {
916         int     s,f;
917
918         for (f=0; f<N_found_segs; f++) {
919                 int     foundnum = Found_segs[f];
920
921                 for (s=0; s<N_selected_segs; s++) {
922                         if (Selected_segs[s] == foundnum) {
923                                 Selected_segs[s] = Selected_segs[N_selected_segs-1];
924                                 N_selected_segs--;
925                                 break;
926                         }
927                 }
928         }
929 }
930
931 // ---------------------------------------------------------------------------------------------------
932 //      Add all elements in Found_segs to selected list.
933 void add_found_segments_to_selected_list(void) {
934         int     s,f;
935
936         for (f=0; f<N_found_segs; f++) {
937                 int     foundnum = Found_segs[f];
938
939                 for (s=0; s<N_selected_segs; s++)
940                         if (Selected_segs[s] == foundnum)
941                                 break;
942
943                 if (s == N_selected_segs)
944                         Selected_segs[N_selected_segs++] = foundnum;
945         }
946 }
947
948 void gamestate_restore_check() {
949         char Message[DIAGNOSTIC_MESSAGE_MAX];
950         obj_position Save_position;
951
952         if (gamestate_not_restored) {
953                 sprintf( Message, "Do you wish to restore game state?\n");
954         
955                 if (MessageBox( -2, -2, 2, Message, "Yes", "No" )==1) {
956
957                         // Save current position
958                         Save_position.pos = ConsoleObject->pos;
959                         Save_position.orient = ConsoleObject->orient;
960                         Save_position.segnum = ConsoleObject->segnum;
961
962                         load_level("GAMESAVE.LVL");
963
964                         // Restore current position
965                         if (Save_position.segnum <= Highest_segment_index) {
966                                 ConsoleObject->pos = Save_position.pos;
967                                 ConsoleObject->orient = Save_position.orient;
968                                 obj_relink(OBJECT_NUMBER(ConsoleObject), Save_position.segnum);
969                         }
970
971                         gamestate_not_restored = 0;
972                         Update_flags |= UF_WORLD_CHANGED;       
973                         }
974                 else
975                         gamestate_not_restored = 1;
976                 }
977 }
978
979 int RestoreGameState() {
980         load_level("GAMESAVE.LVL");
981         gamestate_not_restored = 0;
982
983         mprintf((0, "Gamestate restored.\n"));
984         editor_status("Gamestate restored.\n");
985
986         Update_flags |= UF_WORLD_CHANGED;
987         return 0;
988 }
989
990 extern void check_wall_validity(void);
991
992 // ---------------------------------------------------------------------------------------------------
993 //this function is the editor. called when editor mode selected.  runs until
994 //game mode or exit selected
995 void editor(void)
996 {
997         int w,h;
998         grs_bitmap * savedbitmap;
999         editor_view *new_cv;
1000         static int padnum=0;
1001         vms_matrix      MouseRotMat,tempm;
1002         //@@short camera_objnum;                        //a camera for viewing
1003
1004         init_editor();
1005
1006         InitCurve();
1007
1008         restore_effect_bitmap_icons();
1009
1010         if (!set_screen_mode(SCREEN_EDITOR))    {
1011                 set_screen_mode(SCREEN_GAME);
1012                 Function_mode=FMODE_GAME;                       //force back into game
1013                 return;
1014         }
1015
1016         gr_set_current_canvas( NULL );
1017         gr_set_curfont(editor_font);
1018
1019         //Editor renders into full (320x200) game screen 
1020
1021         set_warn_func(med_show_warning);
1022
1023         keyd_repeat = 1;                // Allow repeat in editor
1024
1025 //      _MARK_("start of editor");//Nuked to compile -KRB
1026
1027         ui_mouse_hide();
1028
1029         ui_reset_idle_seconds();
1030
1031 //@@    //create a camera for viewing in the editor. copy position from ConsoleObject
1032 //@@    camera_objnum = obj_create(OBJ_CAMERA,0,ConsoleObject->segnum,&ConsoleObject->pos,&ConsoleObject->orient,0);
1033 //@@    Viewer = &Objects[camera_objnum];
1034 //@@    slew_init(Viewer);              //camera is slewing
1035
1036         Viewer = ConsoleObject;
1037         slew_init(ConsoleObject);
1038
1039         Update_flags = UF_ALL;
1040
1041         medlisp_update_screen();
1042
1043         //set the wire-frame window to be the current view
1044         current_view = &LargeView;
1045
1046         if (faded_in==0)
1047         {
1048                 faded_in = 1;
1049                 //gr_pal_fade_in( grd_curscreen->pal );
1050         }
1051
1052         w = GameViewBox->canvas->cv_bitmap.bm_w;
1053         h = GameViewBox->canvas->cv_bitmap.bm_h;
1054         
1055         savedbitmap = gr_create_bitmap(w, h );
1056
1057         gr_bm_ubitblt( w, h, 0, 0, 0, 0, &GameViewBox->canvas->cv_bitmap, savedbitmap );
1058
1059         gr_set_current_canvas( GameViewBox->canvas );
1060         gr_set_curfont(editor_font);
1061         //gr_setcolor( CBLACK );
1062         //gr_deaccent_canvas();
1063         //gr_grey_canvas();
1064         
1065         ui_mouse_show();
1066
1067         gr_set_curfont(editor_font);
1068         ui_pad_goto(padnum);
1069
1070         gamestate_restore_check();
1071
1072         while (Function_mode == FMODE_EDITOR) {
1073
1074                 gr_set_curfont(editor_font);
1075                 info_display_all(EditorWindow);
1076
1077                 ModeFlag = 0;
1078
1079                 // Update the windows
1080
1081                 // Only update if there is no key waiting and we're not in
1082                 // fast play mode.
1083                 if (!key_peekkey()) //-- && (MacroStatus != UI_STATUS_FASTPLAY))
1084                         medlisp_update_screen();
1085
1086                 //do editor stuff
1087                 gr_set_curfont(editor_font);
1088                 ui_mega_process();
1089                 last_keypress &= ~KEY_DEBUGGED;         //      mask off delete key bit which has no function in editor.
1090                 ui_window_do_gadgets(EditorWindow);
1091                 do_robot_window();
1092                 do_object_window();
1093                 do_wall_window();
1094                 do_trigger_window();
1095                 do_hostage_window();
1096                 do_centers_window();
1097                 check_wall_validity();
1098                 Assert(Num_walls>=0);
1099
1100                 if (Gameview_lockstep) {
1101                         static segment *old_cursegp=NULL;
1102                         static int old_curside=-1;
1103
1104                         if (old_cursegp!=Cursegp || old_curside!=Curside) {
1105                                 SetPlayerFromCursegMinusOne();
1106                                 old_cursegp = Cursegp;
1107                                 old_curside = Curside;
1108                         }
1109                 }
1110
1111 //              mprintf((0, "%d ", ui_get_idle_seconds() ));
1112
1113                 if ( ui_get_idle_seconds() > COMPRESS_INTERVAL ) 
1114                         {
1115                         med_compress_mine();
1116                         ui_reset_idle_seconds();
1117                         }
1118   
1119 //      Commented out because it occupies about 25% of time in twirling the mine.
1120 // Removes some Asserts....
1121 //              med_check_all_vertices();
1122                 clear_editor_status();          // if enough time elapsed, clear editor status message
1123                 TimedAutosave(mine_filename);
1124                 set_editor_time_of_day();
1125                 gr_set_current_canvas( GameViewBox->canvas );
1126                 
1127                 // Remove keys used for slew
1128                 switch(last_keypress)
1129                 {
1130                 case KEY_PAD9:
1131                 case KEY_PAD7:
1132                 case KEY_PADPLUS:
1133                 case KEY_PADMINUS:
1134                 case KEY_PAD8:
1135                 case KEY_PAD2:
1136                 case KEY_LBRACKET:
1137                 case KEY_RBRACKET:
1138                 case KEY_PAD1:
1139                 case KEY_PAD3:
1140                 case KEY_PAD6:
1141                 case KEY_PAD4:
1142                         last_keypress = 0;
1143                 }
1144                 if ((last_keypress&0xff)==KEY_LSHIFT) last_keypress=0;
1145                 if ((last_keypress&0xff)==KEY_RSHIFT) last_keypress=0;
1146                 if ((last_keypress&0xff)==KEY_LCTRL) last_keypress=0;
1147                 if ((last_keypress&0xff)==KEY_RCTRL) last_keypress=0;
1148 //              if ((last_keypress&0xff)==KEY_LALT) last_keypress=0;
1149 //              if ((last_keypress&0xff)==KEY_RALT) last_keypress=0;
1150
1151                 gr_set_curfont(editor_font);
1152                 menubar_do( last_keypress );
1153
1154                 //=================== DO FUNCTIONS ====================
1155
1156                 if ( KeyFunction[ last_keypress ] != NULL )     {
1157                         KeyFunction[last_keypress]();
1158                         last_keypress = 0;
1159                 }
1160                 switch (last_keypress)
1161                 {
1162                 case 0:
1163                 case KEY_Z:
1164                 case KEY_G:
1165                 case KEY_LALT:
1166                 case KEY_RALT:
1167                 case KEY_LCTRL:
1168                 case KEY_RCTRL:
1169                 case KEY_LSHIFT:
1170                 case KEY_RSHIFT:
1171                 case KEY_LAPOSTRO:
1172                         break;
1173                 case KEY_SHIFTED + KEY_L:
1174                         ToggleLighting();
1175                         break;
1176                 case KEY_F1:
1177                         render_3d_in_big_window = !render_3d_in_big_window;
1178                         Update_flags |= UF_ALL;
1179                         break;                  
1180                 default:
1181                         {
1182                         char kdesc[100];
1183                         GetKeyDescription( kdesc, last_keypress );
1184                         editor_status("Error: %s isn't bound to anything.", kdesc  );
1185                         }
1186                 }
1187
1188                 //================================================================
1189
1190                 if (ModeFlag==1)
1191                 {
1192                         close_editor_screen();
1193                         Function_mode=FMODE_EXIT;
1194                                 gr_free_bitmap( savedbitmap );
1195                         break;
1196                 }
1197
1198                 if (ModeFlag==2) //-- && MacroStatus==UI_STATUS_NORMAL )
1199                 {
1200                         close_editor_screen();
1201                         Function_mode = FMODE_MENU;
1202                         set_screen_mode(SCREEN_MENU);           //put up menu screen
1203                         gr_free_bitmap(savedbitmap);
1204                         break;
1205                 }
1206
1207                 if (ModeFlag==3) //-- && MacroStatus==UI_STATUS_NORMAL )
1208                 {
1209 //                      med_compress_mine();                                            //will be called anyways before game.
1210                         close_editor_screen();
1211                         Function_mode=FMODE_GAME;                       //force back into game
1212                         set_screen_mode(SCREEN_GAME);           //put up game screen
1213                         gr_free_bitmap( savedbitmap );
1214                         break;
1215                 }
1216
1217 //              if (CurWindow->keyboard_focus_gadget == (UI_GADGET *)GameViewBox) current_view=NULL;
1218 //              if (CurWindow->keyboard_focus_gadget == (UI_GADGET *)GroupViewBox) current_view=NULL;
1219
1220                 new_cv = current_view ;
1221
1222 #if ORTHO_VIEWS
1223                 if (CurWindow->keyboard_focus_gadget == (UI_GADGET *)LargeViewBox) new_cv=&LargeView;
1224                 if (CurWindow->keyboard_focus_gadget == (UI_GADGET *)TopViewBox)        new_cv=&TopView;
1225                 if (CurWindow->keyboard_focus_gadget == (UI_GADGET *)FrontViewBox) new_cv=&FrontView;
1226                 if (CurWindow->keyboard_focus_gadget == (UI_GADGET *)RightViewBox) new_cv=&RightView;
1227 #endif
1228                 if (new_cv != current_view ) {
1229                         current_view->ev_changed = 1;
1230                         new_cv->ev_changed = 1;
1231                         current_view = new_cv;
1232                 }
1233
1234                 calc_frame_time();
1235                 if (slew_frame(0)) {            //do movement and check keys
1236                         Update_flags |= UF_GAME_VIEW_CHANGED;
1237                         if (Gameview_lockstep) {
1238                                 Cursegp = &Segments[ConsoleObject->segnum];
1239                                 med_create_new_segment_from_cursegp();
1240                                 Update_flags |= UF_ED_STATE_CHANGED;
1241                         }
1242                 }
1243
1244                 // DO TEXTURE STUFF
1245                 texpage_do();
1246                 objpage_do();
1247
1248
1249                 // Process selection of Cursegp using mouse.
1250                 if (LargeViewBox->mouse_onme && LargeViewBox->b1_clicked && !render_3d_in_big_window) 
1251                 {
1252                         int     xcrd,ycrd;
1253                         xcrd = LargeViewBox->b1_drag_x1;
1254                         ycrd = LargeViewBox->b1_drag_y1;
1255
1256                         find_segments(xcrd,ycrd,LargeViewBox->canvas,&LargeView,Cursegp,Big_depth);     // Sets globals N_found_segs, Found_segs
1257
1258                         // If shift is down, then add segment to found list
1259                         if (keyd_pressed[ KEY_LSHIFT ] || keyd_pressed[ KEY_RSHIFT ])
1260                                 subtract_found_segments_from_selected_list();
1261                         else
1262                                 add_found_segments_to_selected_list();
1263
1264                         Found_seg_index = 0;    
1265                 
1266                         if (N_found_segs > 0) {
1267                                 sort_seg_list(N_found_segs,Found_segs,&ConsoleObject->pos);
1268                                 Cursegp = &Segments[Found_segs[0]];
1269                                 med_create_new_segment_from_cursegp();
1270                                 if (Lock_view_to_cursegp)
1271                                         set_view_target_from_segment(Cursegp);
1272                         }
1273
1274                         Update_flags |= UF_ED_STATE_CHANGED | UF_VIEWPOINT_MOVED;
1275                 }
1276
1277                 if (GameViewBox->mouse_onme && GameViewBox->b1_dragging) {
1278                         int     x, y;
1279                         x = GameViewBox->b1_drag_x2;
1280                         y = GameViewBox->b1_drag_y2;
1281
1282                         ui_mouse_hide();
1283                         gr_set_current_canvas( GameViewBox->canvas );
1284                         gr_setcolor( 15 );
1285                         gr_rect( x-1, y-1, x+1, y+1 );
1286                         ui_mouse_show();
1287
1288                 }
1289                 
1290                 // Set current segment and side by clicking on a polygon in game window.
1291                 //      If ctrl pressed, also assign current texture map to that side.
1292                 //if (GameViewBox->mouse_onme && (GameViewBox->b1_done_dragging || GameViewBox->b1_clicked)) {
1293                 if ((GameViewBox->mouse_onme && GameViewBox->b1_clicked && !render_3d_in_big_window) ||
1294                         (LargeViewBox->mouse_onme && LargeViewBox->b1_clicked && render_3d_in_big_window)) {
1295
1296                         int     xcrd,ycrd;
1297                         int seg,side,face,poly,tmap;
1298
1299                         if (render_3d_in_big_window) {
1300                                 xcrd = LargeViewBox->b1_drag_x1;
1301                                 ycrd = LargeViewBox->b1_drag_y1;
1302                         }
1303                         else {
1304                                 xcrd = GameViewBox->b1_drag_x1;
1305                                 ycrd = GameViewBox->b1_drag_y1;
1306                         }
1307         
1308                         //Int3();
1309
1310                         if (find_seg_side_face(xcrd,ycrd,&seg,&side,&face,&poly)) {
1311
1312
1313                                 if (seg<0) {                                                    //found an object
1314
1315                                         Cur_object_index = -seg-1;
1316                                         editor_status("Object %d selected.",Cur_object_index);
1317
1318                                         Update_flags |= UF_ED_STATE_CHANGED;
1319                                 }
1320                                 else {
1321
1322                                         //      See if either shift key is down and, if so, assign texture map
1323                                         if (keyd_pressed[KEY_LSHIFT] || keyd_pressed[KEY_RSHIFT]) {
1324                                                 Cursegp = &Segments[seg];
1325                                                 Curside = side;
1326                                                 AssignTexture();
1327                                                 med_create_new_segment_from_cursegp();
1328                                                 editor_status("Texture assigned");
1329                                         } else if (keyd_pressed[KEY_G]) {
1330                                                 tmap = Segments[seg].sides[side].tmap_num;
1331                                                 texpage_grab_current(tmap);
1332                                                 editor_status( "Texture grabbed." );
1333                                         } else if (keyd_pressed[ KEY_LAPOSTRO] ) {
1334                                                 ui_mouse_hide();
1335                                                 move_object_to_mouse_click();
1336                                         } else {
1337                                                 Cursegp = &Segments[seg];
1338                                                 Curside = side;
1339                                                 med_create_new_segment_from_cursegp();
1340                                                 editor_status("Curseg and curside selected");
1341                                         }
1342                                 }
1343
1344                                 Update_flags |= UF_ED_STATE_CHANGED;
1345                         }
1346                         else 
1347                                 editor_status("Click on non-texture ingored");
1348
1349                 }
1350
1351                 // Allow specification of LargeView using mouse
1352                 if (keyd_pressed[ KEY_LCTRL ] || keyd_pressed[ KEY_RCTRL ]) {
1353                         ui_mouse_hide();
1354                         if ( (Mouse.dx!=0) && (Mouse.dy!=0) ) {
1355                                 GetMouseRotation( Mouse.dx, Mouse.dy, &MouseRotMat );
1356                                 vm_matrix_x_matrix(&tempm,&LargeView.ev_matrix,&MouseRotMat);
1357                                 LargeView.ev_matrix = tempm;
1358                                 LargeView.ev_changed = 1;
1359                                 Large_view_index = -1;                  // say not one of the orthogonal views
1360                         }
1361                 } else  {
1362                         ui_mouse_show();
1363                 }
1364
1365                 if ( keyd_pressed[ KEY_Z ] ) {
1366                         ui_mouse_hide();
1367                         if ( Mouse.dy!=0 ) {
1368                                 current_view->ev_dist += Mouse.dy*10000;
1369                                 current_view->ev_changed = 1;
1370                         }
1371                 } else {
1372                         ui_mouse_show();
1373                 }
1374
1375                 gr_update();
1376                 
1377         }
1378
1379 //      _MARK_("end of editor");//Nuked to compile -KRB
1380
1381         clear_warn_func(med_show_warning);
1382
1383         //kill our camera object
1384
1385         Viewer = ConsoleObject;                                 //reset viewer
1386         //@@obj_delete(camera_objnum);
1387
1388         padnum = ui_pad_get_current();
1389
1390         close_editor();
1391         ui_close();
1392
1393
1394 }
1395
1396 void test_fade(void)
1397 {
1398         int     i,c;
1399
1400         for (c=0; c<256; c++) {
1401                 printf("%4i: {%3i %3i %3i} ",c,gr_palette[3*c],gr_palette[3*c+1],gr_palette[3*c+2]);
1402                 for (i=0; i<16; i++) {
1403                         int col = gr_fade_table[256*i+c];
1404
1405                         printf("[%3i %3i %3i] ",gr_palette[3*col],gr_palette[3*col+1],gr_palette[3*col+2]);
1406                 }
1407                 if ( (c%16) == 15)
1408                         printf("\n");
1409                 printf("\n");
1410         }
1411 }
1412
1413 void dump_stuff(void)
1414 {
1415         int     i,j,prev_color;
1416
1417         printf("Palette:\n");
1418
1419         for (i=0; i<256; i++)
1420                 printf("%3i: %2i %2i %2i\n",i,gr_palette[3*i],gr_palette[3*i+1],gr_palette[3*i+2]);
1421
1422         for (i=0; i<16; i++) {
1423                 printf("\nFade table #%i\n",i);
1424                 for (j=0; j<256; j++) {
1425                         int     c = gr_fade_table[i*256 + j];
1426                         printf("[%3i %2i %2i %2i] ",c, gr_palette[3*c], gr_palette[3*c+1], gr_palette[3*c+2]);
1427                         if ((j % 8) == 7)
1428                                 printf("\n");
1429                 }
1430         }
1431
1432         printf("Colors indexed by intensity:\n");
1433         printf(". = change from previous, * = no change\n");
1434         for (j=0; j<256; j++) {
1435                 printf("%3i: ",j);
1436                 prev_color = -1;
1437                 for (i=0; i<16; i++) {
1438                         int     c = gr_fade_table[i*256 + j];
1439                         if (c == prev_color)
1440                                 printf("*");
1441                         else
1442                                 printf(".");
1443                         prev_color = c;
1444                 }
1445                 printf("  ");
1446                 for (i=0; i<16; i++) {
1447                         int     c = gr_fade_table[i*256 + j];
1448                         printf("[%3i %2i %2i %2i] ", c, gr_palette[3*c], gr_palette[3*c+1], gr_palette[3*c+2]);
1449                 }
1450                 printf("\n");
1451         }
1452
1453 }
1454
1455 #ifndef NDEBUG
1456 int MarkStart(void)
1457 {
1458         char mystr[30];
1459         sprintf(mystr,"mark %i start",Mark_count);
1460 //      _MARK_(mystr);//Nuked to compile -KRB
1461
1462         return 1;
1463 }
1464
1465 int MarkEnd(void)
1466 {
1467         char mystr[30];
1468         sprintf(mystr,"mark %i end",Mark_count);
1469         Mark_count++;
1470 //      _MARK_(mystr);//Nuked to compile -KRB
1471
1472         return 1;
1473 }
1474 #endif