-
Notifications
You must be signed in to change notification settings - Fork 1
/
TODO
2366 lines (2173 loc) · 90.2 KB
/
TODO
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
----------------------------------------
TO-DO LIST FOR YADEX
----------------------------------------
General
- Automatically adapt to level to edit; if it's a Doom level (ExMy),
reread doom.wad, if it's a Doom II level (MAPnn), reread doom2.wad.
what if it's a Heretic level ? It must be possible to tell a Heretic
level by the special sector & thing types.
Command line
- Add option -e like in sed and Perl. Auto quit at end or not ?
- Add option -f like in sed ?
- Unix version recognizes -V but does not list it in the usage.
Configuration file
- Add operator ".=" (E.G. "iwad_dir .= ,/foo/bar"). Perhaps implement
real lists. Perhaps not.
- Comments are not allowed if not at the beginning of a line
- New option --print-config-path or --cfg-dirs to print the config file
search path and exit
Variables
- Make variables objects instead of C++ variables. It should not be
necessary to recompile everything each time you want to add a
variable. Still be able to generate a list of all known variables...
- Better support for changing of configuration variables from the
editor.
- Add a way to set variables from the command line ("-sname=value" or
something like that).
- Setting options: add a "set name value" prompt command.
- Setting options: make "set" stop after each screenful.
- Setting options: modify the "Preferences" menu so that all options can
be changed from there and modifications are saved.
Game definitions
- Move thing groups colour from .ygd to .cfg.
- Generalize the principle of game by replacing iwad[123]= by iwad= in
different sections of the .cfg.
- Fix TranslateToDoomColor().
- -g should accept anything as long as <anything>.ygd exists.
- It is prob. possible to crash the program by entering weird things in
LoadGameDefs. For example, shortdesc is not truncated and the current
number of "raise floor" types will probably make the menu "overflow"
the screen. DisplayMenu() should fix the y-offset if necessary.
- It is possible to define the same group twice or use a non existing
group.
- LoadGameDefs: try to waste less memory if possible.
- FreeGameDefs(): apparently does not unallocate everything. It's
immaterial since it's only called just before exiting but I'll have to
fix it one day.
- Enter two iwad names for the same game (E.G. doom.wad and doom1.wad).
- Add list of animated flats and textures.
- Add "height" and "is_obstacle" fields to things definitions.
- Add flat width and height.
- Add min and max player and deathmatch starts.
- Add default level names.
- Move the definition of special sector tags out of the exe and into the
ygd files.
- Gadget: add level names (E.G. "E1M1" -> "Hangar").
- The basename need not be in the configuration file; it should be in
the ygd (E.G. iwad_base = "doom.wad,doom1.wad")
- The .ygd collection has grown so large that it has become difficult to
maintain. For example, changes made to strife.ygd must be propagated
to strife10.ygd by hand. There is a lot of duplication : the 150 kB of
game definition data boil down to 30 kB after piping into sort | uniq.
I would like to implement an include directive and reorganize
accordingly :
_boom.ygd in Boom but not in Doom*
_doom.ygd in all versions of Doom >= 1.0
_doom16.ygd in Doom 1.666 and above (linedef types)
_doom2.ygd in Doom II (things)
_heretic.ygd in Heretic only (things, sector types)
_mbf.ygd in MBF but not in Boom
_strife.ygd in all versions of Strife
_tgroups.ygd all things groups ?
_zdoom.ygd in ZDoom but not in Boom
doom.ygd include _doom; include _doom16
doom04.ygd ?
doom05.ygd ?
doompr.ygd ?
doom2.ygd include _doom; include _doom16; include _doom2
hacx.ygd ??
heretic.ygd include _doom; include _doom16/_doom2 (?); include _heretic
hexen.ygd no change
plutonia.ygd include doom2: iwad_base plutonia.wad [solves Colin's pb]
strife.ygd include _strife; texture_format strife11
strife10.ygd include _strife; texture_format normal
tnt.ygd include doom2: iwad_base tnt.wad [solves Colin's pb]
The rules for locating of relative includes :
1. search the current directory,
2. search the directory where the parent ygd file is,
3. search the standard directories.
If an include has a bad magic, don't abort, just keep searching for
one that has the appropriate magic (but warn). If an include was not
found just print a warning and continue ?
- Allow overriding of a previous linedef type / thing type / sector type
definition (currently it just *adds* and, since the new definition is
at the end the of list, it's *ignored*). Possibly with an option to
warn about such redefinitions.
- New option -Y (or -y or -G ?) to insert a directory at the beginning
of the .ygd files search path. Perhaps -Y- to clear the path (think
-I-). Add it to "make test" and "make dtest".
- New option --print-ygd-path or --ygd-dirs to print the ygd file search
path and exit.
Game and wad support
- Some wads have sidedefs with a sector# of -1. Apparently, those are
always unused sidedefs but perhaps there is something to do about it.
dyst3, mm, mm2 map13,28, wads2/1kill (e2m2,6,7,8,9), wads2/adieu
wads2/ebola, wads2/requiem (map03,08,etc).
- Some wads generate a flurry of messages "updating entry ''" when
loaded (11fortko, 1_on_1, chase21). Fix that.
- Some working pwads are not pwads. 1sthell is an iwad.
- Some wads have a large number of unused vertices in the middle. base,
phobos, 2wad/dks_e1l1, 2wad/dks_e1l3, amanda2 (no tail !), atica,
badblu35, dmdv (tail 76% unused 45/469), drdeath (unused 69/1382),
spit e1m2 unused 661/816 tail 0
- Perhaps it would make sense to forget the directory completely when
it's not needed ? Each entry takes 16+4+4 = 24 bytes. Here are the
number of entries in the iwads' directories :
Iwad Total entries Level entries
Doom 2306 54 kB 36 9 kB
Doom II 2956 69 kB 32 8 kB
Heretic 2415 56 kB 28 7 kB
Hexen 4249 99 kB 32 9 kB
That's a lot. When do we use the directory ?
- During an editing session, to display the flats.
- During an editing session, to display the textures (TEXTURE1,
TEXTURE2, PNAMES, patches).
- During an editing session, to get the PLAYPAL.
- When loading or saving a level.
- At the prompt when saving or extracting a lump (not often).
All the levels are kept in memory all the time, even though they're
used only when saving and reading. The sounds, musics and graphics are
never unused (about 450 entries = 10 kB).
- The message "Use F_END instead" should be displayed only once, when
the pwad is loaded, not each time you open an edit window.
- Fix OpenPatchWad() so that, if a pwad contains FF_START ... FF_END
F_END (mm2.wad), the F_END does not replace the F_END from the iwad,
as this causes a spurious "this wad uses FF_END" warning.
- icarus.wad uses F_END + FF_END. Sigh.
- Gothic2 uses F_END but not F*_START. Therefore, the custom flats don't
show. FMH !
- When a pwad contains F_START F1_START ... F3_END F_END, the F_END
replaces the one from the iwad and this causes Yadex to think all
following lumps are flats (sod.wad).
- With hacxsw.wad, which replaces all patches and has P_START/P_END
labels, get a "No matching P_END for P_START in hacxsw.wad". Surely
the same problem as with F_END ; OpenPatchWad() uses the P_END from
the pwad to replace the P_END from the iwad.
- viewpat: mm.wad and mm2.wad put patches directly in the master
directory, without any surrounding P_START/P_END. viewpat sees the
replacement patches but not the new ones of course.
- Now that wad_read_i16() and wad_read_i32() don't abort anymore, check
the code that uses them.
- Colin wants to be able to use the Final Doom iwads without having to
type "yadex -iwad2 /foo/bar/tnt.wad". He suggests either (1) adding a
new game or (2) changing the code so that "yadex -iwad2 tnt.wad" looks
for tnt.wad in the iwad2 directory defined in the config file.
- Graphics: Yadex uses no COLORMAP, instead of COLORMAP 0. In practice
COLORMAP 0 is very close to no COLORMAP but...
- Graphics: Yadex uses colour index IMG_TRANSP = 0 to represent
transparent pixels and remaps index 0 to the closest index (247 in the
case of Doom). Because we save in PPM format, it doesn't matter. But
if we wanted to save in BMP format, many pixels would have their value
changed, which I'd rather avoid. If Yadex used IMG_TRANSP = 255, no
remapping would be necessary because that index is not used in Doom,
Doom II, Heretic and Hexen. For Strife, it's the other way around :
index 255 is used quite a lot and index 0 is not.
- Be able to edit levels with silly names like "QD2" (cf. qdoomtst.wad).
This implies not replacing entries in the master directory anymore !
- When "saving as" a create'd level, NODES, SEGS, SSECTORS, REJECT,
BLOCKMAP and VERTEXES are not empty. Recipe : yadex: c [Return] [F3]
[y] [Return] beurk.wad q yadex: q $ lswad -l beurk.wad.
- Bug: there is a small memory leak in that can be seen when repeatedly
loading two wads that contain the same level (E.G. while true; do echo
r tmp.wad; echo r 11.wad; done | yadex). I suspect the leak is in
ReadLevelData().
Doom alpha
- Fix wrong things definitions and add missing ones.
- When loading a pwad with several contiguous levels, every second level
is discarded. See wads2.cc.
Doom press release pre-beta
- Matt says there is a separate resource file named texture2.lmp.
Hexen
- Hexen has some flats with a size of 8 kB.
- Generate the "thing" directives by either parsing info.c or ripping
off the one in DETH.
- Hexen: add linedef types and check
Heretic
- Heretic has some flats with a size of 4160. Is this why DeuTex accepts
64x65 flats ?
- Most "1.666" linedefs types are wrong.
Strife
- Extract the radii from the exe.
- Matt says sector tag 999 means "slam shut on alarm".
- Matt wonders what RIFLB0 is and what's the difference with RIFLA0.
- Incorporate what's only in the USS.
Boom
- convenient way of entering generalized types.
- Decode generalized types.
- Allow WATERMAP pseudo-texture (frankc@srv.net).
XDoom
- Write or get someone to write xdoom.ygd.
- Check XDoom linedef types
- Copy XDoom linedefs types to doom.ygd
ZDoom
- Allow AARRGGBB pseudo-texture ? (frankc@srv.net)
EDGE
- Abstract away extrafloor linedef types.
- Parse DDF and RTS.
- Function to jump to n-th extrafloor for this sector.
Messages and reports
The reason for emitting messages :
- Bug (internal error, unexpected condition in the program that
indicates the existence of a bug somewhere)
- Error in the iwad (something looks fishy)
- Environment error (not enough memory, failure to open a file for
writing, failure to create a subprocess, failure to allocate X
resources or to connect to the X server, etc.)
- Informational (to inform the user on what's happening)
- Verbose messages (like informational, except that they are not on by
default and are meant as an aid to debugging)
- Syntax error messages
- Usage message
- Copyright message
Certain messages could be prefixed by the name of the program
("yadex: "). I think this would be only useful for messages that are
issued while Yadex is not in interactive mode. For messages that are
meant to happen only in interactive mode, the prefix is a waste of
screen real estate.
Messages can be printed to stdout, stderr and on the window, or a
combination of these. Future versions of Yadex might have a GUI-only
interface and stdout/stderr messages might be lost, then. To print
messages on the window, it would be better to have a scrollable
message textbox at the bottom than alert boxes, that require constant
interaction and leave no trace.
Bug messages should come with a "THIS IS A BUG" notice and an
exhortation to go tell the maintainer.
If possible, the message printing function(s) should be
interface-independant.
There should be a smart handling of carriage returns. Instead of
inserting '\n' in the format string, one should be able to specify
whether the message should start on a new line and whether the message
should be followed by a newline.
There should be some handling of indent. One should be able to start
and end an indented block. The output routine would take care of the
printing of the indent whitespace.
If possible, it should be possible to write to several channels
(indent levels) asynchronously.
Confirmation
- Fine selection of automatic confirmations ("split linedef when
inserting new vertex", "split linedef when moving vertex", "merging
vertices", etc).
- When moving a bunch of vertices, do not check for vertex-on-linedef
condition if both vertices of the linedef were part of the vertices
that are being moved.
AJA 2000-09-21: (d) when moving a large bunch of vertices or linedefs
that are very close together (e.g. 2 units), there often pops up a
message to confirm merging vertices or splitting a linedef. (This
would be worse with the 1.5.0 config file which makes merges/splits
happen automatically).
I guess the solution would be making Yadex to skip checks for
overlapping vertex/linedef _between_ all the vertices/lines that are
being moved at once (i.e. only check a moving V/L against a non-moving
V/L).
Old bugs to fix
- When splitting and merging sectors, some of the sidedefs in the split
sector are given the wrong sector number.
- When splitting a sector, sometimes get erroneous messages like
"vertices A and B not on the same sector" or "cannot find a closed
path", etc. I have already got "no sector between vertex A and vertex
B" ; save, quit, edit and try again : it works !
- DOS: Let [right] work after [space] (works if no mouse driver!)
- DOS: understand why mouse pointer moves 8 pixels at a time and fix
that.
- When merging sectors, linedefs sometimes get only 1 sidedef...
- If you do "delete linedef and merge sectors" when it's the same sector
on both sides of the linedef, the sector is deleted.
- Check that all sectors are closed : chokes on pseudo sectors (s1=s2).
I've verified that unclosed sectors, whether single ou double sided
don't disturb Doom. However, some look ugly. The checking function
should be modified so that only ugly unclosed sectors are reported.
- Create new sector from linedefs: should be smarter.
Editing in general
- Implement undo and redo.
- Move cursor : jump to next object in direction ...
- Move objects n grid steps in direction ...
- Move objects n Grid steps in direction ...
- Move object to nth next grid position in direction ...
- Move object to nth next Grid position in direction ...
- Flip info window on either side of the screen.
- Gadget: show level with different orientations, i.e. with logical
north not always being at the top. And rotate the sprite images
accordingly.
- Go to next/previous object in selection.
- Renumbering objects:
- Renumber the selected object by either exchanging numbers with the
object having the target number or bumping all numbers by one. The
former solution has the advantage of being faster. The second
solution has the advantage of not disturbing the relative numbering
of the other objects.
- Make the highlighted object the lowest-numbered (highest-numbered)
one of all the selected objects of the same kind.
- Bug: pasting repeatedly a large number of objects (all the linedefs of
Eternal MAP28, for instance) ends up triggering a segfault. Perhaps
we're overflowing/underflowing the objects arrays ?
- Bug: my tests indicate that out-of-memory conditions are badly handled
(E.G. segfault upon switching to sector mode).
- For very large levels, the lower limit on the zoom factor is too high
to allow showing the whole level.
- Bug: for very large levels (very low zoom factors), the upper limit on
the grid step is too restrictive.
- Strife's MAP29 is so much to the west (-23,000 or so) that the current
limit to -20,000 prevents from seeing the whole map.
- Cut and paste between wads. at least in a limited way: insert the
contents of a wad at the cursor. involves renumbering all items by
adding the number of such items already existing. E.G. if there are
already 50 vertices, increment the vertex numbers in all the linedefs
by 50. Same thing for sidedefs numbers in linedefs, sector tags (DON'T
increment those that have a special meaning like 666 or 667 or those
above 900!). increment sector# in sidedefs too. that's all ?
- Andy Baker wants a don't-drag toggle. I'd rather just add some initial
resistance.
- For the two widest grids, display the coordinates along the edges.
- There is something that sucks in the edit loop ; when you scroll
without moving the mouse, the selection box always "lags behind"
because its map coordinates are updated only _after_ the next screen
refresh.
- Select all.
- Reverse selection (select everything that's not selected and unselect
everything that's selected).
- Edit functions : copy, cut, paste.
- Crop (delete all unselected objects).
- Persistent box for cropping ?
- BD suggests sector creation à la DCK ([r] then draw box).
- When there are several objects under the pointer, report it and give a
way to access any one of them. Or maybe implement planes ?
- When doing drag-n-drop, should the snap-to-grid be applied to A.
relative position since started dragging B. or to the highlighted
object ? If A, you can't use drag-n-drop to snap-to-grid objects that
aren't. If B, you can't drag correctly objects that are not aligned on
grid.
- Object number: the type should be "i16", not "int" (cf. SelPtr).
- Object number: the test for "none" should not be hard-coded "< 0".
- While dragging or drawing a selbox, prevent Del, Ins, etc. from
working. E.G. Del would suppress the object being dragged !
- Add config file parameters for initial snap_to_grid and
lock_grid_step.
- Scale: make it local to an edit window.
- MadeChanges: make it local to an edit window.
- MadeMapChanges: make it local to an edit window.
- When saving with [F2], ".wad" should be appended automatically.
- Save ([F2]): should not ask for the file name every time.
- Save ([F2]): I swear I've seen the file name dialog open with
"nase.bak" in it !
- Save ([F2]): should use the Save as... ([F3]) code, not duplicate it.
- Get rid of the Level variable.
- The file name should be a member of edit-session or level-data, not
retrieved by looking up the master directory.
- A function that would be really very useful would be the possibility
to change the start/end vertex of a linedef. That could be done by
holding, say, [Alt], down and dragging the start/end until on top of
another vertex. When the button is released, the linedef start/end is
changed and the sector references of the impacted linedefs are
updated.
- Displaying pointer coords; should look into using PutImageFont().
- [Ctrl][Click]: Press button: do nothing. Release button: select or
unselect IF STILL ON TOP OF OBJECT. Thus we can use [Ctrl] + drag to
copy :-).
- Dragging with [Ctrl] on duplicates ?
- Vertex on linedef: lower tolerance when zoom factor is high. [partly
done as of 1998-12-20 but still needs work].
- Check self-consistency of level data: for each linedef, v1 and v2 must
be either OBJ_NO_NONE or between 0 and NumVertexes and s1 and s2 must
be either OBJ_NO_NONE or between 0 and NumSideDefs.
- Goto function: takes as an argument either the centre of the level or
a previously set mark. Like in vi: m<mark>, '<mark>. Maybe '' to go to
centre ?
- Clicking and superimposed objects: if n1 and n2 (n1 < n2) are
superimposed, n1 is not selected but n2 is selected and you click on
them, Yadex thinks you are starting a new selection because
is_selected (highlight) is false.
- objects.cc: GetObjectCoords(): should use center_of_objects() instead.
- Permanently show a 64-wide object to scale ?
- Right-button menus: access to many different menus (no modifier,
[Shift], [Ctrl], [Alt], several of them).
- Cut, copy, paste
- Show properties
- Misc. operations
- Frequently used properties (toggle bit of linedef...)
- Change tool
- Menus: when you move the pointer over a pulled down menu is, you can
highlight the objects it hides.
- Replace "insert rectangle"/"insert polygon" by :
- insert pillar (nb. of sides, size)
- insert subsector Differences in floor/ceiling height/textures and
lighting level could be set by predefined styles :
- pedestal (floor + 48, ceiling - ...)
- hanging from ceiling
- teleporters
- In addition of make nook/make boss,
- insert protruding subsector
- insert recessed subsector
- Minor glitch: when a popup menu is active, the spot is still shown
- Object info box: if the box is already drawn, don't draw it again; it
makes the strings flicker slightly.
- [Alt] alone should highlight the menu bar.
- Split linedefs and sector: if there is no sector between the linedefs,
they shouldn't be split.
- Split linedefs and sector: if only one linedef is
selected/highlighted, assume that the other linedef is the one
opposite.
- Moving/scrolling: centre view around spot under pointer (binding :
perhaps [Ctrl][But2]).
- James Caldwell says that, with v1.4, if you create a polygon, delete
the sector inside it and try to draw a selection box around the
linedefs, Yadex segfaults. James was not able to give me a backtrace
and, apparently, no one has been able to reproduce that bug. After
upgrading to 1.5 and a new version of Red Hat, the problem
disappeared. A bug in GCC 2.96 ?
- Linedef type/sector type/thing type selector : the current
implementation (cascaded menus) has certain shortcomings :
- No scrollbars for long lists.
- It's not possible to associate a bitmap to an item, which would be
very useful for thing types.
- There doesn't seem to be a good way to specify which fields are to
be printed, especially not dynamically. This could be useful in some
occasions (thing types : sprite root).
- There doesn't seem to be a good way to change the sorting order,
especially not dynamically. Still it would be nice to be able to
sort linedef types by either (function, trigger) or (trigger,
function) or (number), etc.
- There doesn't seem to be a good way to restrict which items are
shown. For example, one might wish to hide all linedef types that
are not available in plain Doom 1.666. Arguably, that should be done
by chosing the right game specification in the first place, but
there *might* be good reasons to do otherwise.
It seems that ldt/st/tt selection is an operation that calls for more
complex interactions than a simple list menu can do. We should
probably use a specialised widget, perhaps like this one :
_________________________________________________________________
| _____________________________ |
| Group ( ) Door | 0 -- None |^| |
| ( ) Door (red key) | 1 DR Open door | | |
| ... | 2 W1 Open door (stays op| | |
| ( ) Misc | 3 ... | | |
| (o) All | 4 | | |
| | 5 | | |
| Sort ( ) Group, desc, trig | 6 | | |
| ( ) Group, trig, desc | 7 | | |
| ( ) Desc, trig, group | 8 | | |
| ( ) Trig, desc, group | 9 | | |
| ( ) Desc, trig, number | 10 | | |
| ( ) Trig, desc, number | 11 | | |
| (o) Number | 12 | | |
| | 13 | | |
| Show [x] Boom | 14 | | |
| [x] EDGE | 15 | | |
| [x] MBF | 16 | | |
| [x] PR | 17 |_| |
| [x] XDoom |_18________________________|v| |
| [x] v1.6 |<_________________________>| |
| _________________ |
| |___OK___|_Cancel_| |
|_________________________________________________________________|
Note #1: how do we enter linedef types by number ?
Note #2: the "Show" items are not hard coded but unique values of a
field that does not yet exist (alternatively "from which ygd file the
definition comes from").
Note #3: instead of hard-coding "Sort" items, one could make this
group a collection of special widgets, one for each field. Each widget
has two buttons : up and down. By clicking on said button, you move
the widget up down the list. More flexible, but also more confusing
when you're not used to it. Promises to be awkward to use with the
keyboard.
Note #4: it might be useful to have two descriptions : an internal one
that sorts well (door open, door close) and an external one that's
human readable (Open door, Close door).
- Arguably, when snap to grid is on,
- the pointer position shown in the info bar should honour it,
- the pointer position used for dragging etc. should honour it.
Editing, global mode:
- Editing properties (double-clicking or [Return]), selecting by
clicking and selecting with a box still care about the mode. Selection
in general is broken, because only the number is remembered.
- Autosplit linedef by dragging vertex doesn't work unless in vertex
mode.
- draw_map(): linedefs are still shown according to mode.
- draw_map(): need another representation for sectors (conflicts with
linedefs).
- draw_map(): always show right side of linedefs ?
Editing things:
- Thing info box:
- Eye candy: animate the sprites.
- Eye candy: show the sprites according to their angle.
- Numeric thing type : make it optional. Give choice of format between
signed decimal, unsigned decimal and hexadecimal. Default format is
specified by config parameter format_thing_type. Also have a key
binding to cycle between the three.
- String thing type : when unknown, use the format for numeric thing
type.
- Thing angle : when unknown, give choice between signed decimal,
unsigned decimal and hexadecimal.
- Thing flags : have an option to show the numeric value of the flags
field, with a format one of signed decimal, unsigned decimal and
hexadecimal.
- Flip/mirror: allow user to specify whether or not things should
be spinned.
- Thing properties -> type : on selecting group with 0 things, fatal
error PTD1.
- Check Doom's behaviour w.r.t. negative angles.
- On the map, if the thing has a root but no sprite by that root was
found, display the root ? (instead of the type)
- On the map, show things according to their angles ?
- On the map, switch between displaying the sprite, the type in decimal,
the type in hex, the root, etc.
- Option to show both the sprite and the square. Or maybe the sprite and
a cross, à la WinDEU/DETH ?
- Perhaps choose between sprite and square automatically depending on
zoom factor ?
- Things: the name is sometimes too long and cut off. It looks bad.
- Unknown things (i.e. thing numbers for which there's no record in the
ygd) should be displayed in red, to distinguish them from things that
just don't have a root.
Editing vertices:
Editing linedefs and sidedefs
- Linedef type : show long name.
- Paint linedef with colour depending on difference of floor height...
- Show several textures at a time ?
- Insert window/corridor/door between sectors. exactly 2 linedefs must
be selected and they must no belong to the same sector. select style;
low window, high window, small door (64x72), big door (128x128-),
user-defined.
- Function: split inner sector with channel:
+---------+ +---------+
| +-----+ | | +-----+ |
| | | | | | | |
| | | | ===> | +-----+ |
| | | | | +-----+ |
| | | | | | | |
| +-----+ | | +-----+ |
+---------+ +---------+
- Function: make plain embrasure:
---+----+--- ---+----+---
| | ===> |----|
| | | |
also "45° embrasure" and "fancy embrasure" (sides are L-shaped).
- Nooks and bosses: add a way to specify width and depth. Maybe have
several predefined dimensions plus user-defined dimensions (set in the
config file). Maybe set textures automatically (EG DOORSTOP and
LITE4). Provide for shapes other than rectangle. Difference with
"Make nook" is that it also splits the sector. Maybe set
automatically floor and ceiling height of new sector.
- Automatically set UTU/LTU when line becomes 2-sided ?
- Reset linedef as double-sided (sets 2S, unsets IM, clears normal
texture, set upper and lower textures, possibly set UTU and LTU).
- Frequent operations : copy upper texture -> lower texture or inverse
set texture. mostly on 1st sidedef set normal texture copy lower+upper
texture = normal texture of adjacent linedef, set lower+upper texture
unpegged, normaltx = -
- Select all linedefs that in same path as the highlighted one. This
can be hairy when the same vertex is shared by more than 2 sidedefs.
Ideas that come to mind :
- only single-sided linedefs,
- only linedefs that have as many sides as the reference linedef,
- called from sector mode: select all linedefs that form the boundary
of the sector and switch to linedef mode,
- only linedefs that form a chain (last (n-1) == first (n)).
- Duplicating/copying linedefs: fix the mess. The ideal would be to
duplicate sidedefs, but to be also able to share them (if asked
explicitly). Maybe by using a modifier when copying like [Alt]...
- Duplicating/copying linedefs: allow user to specify whether or not
sectors should be duplicated too.
- Function to substitute sidedef texture.
- Dragging linedefs is still slower than dragging vertices. But it might
be just because of the overhead of highlighting all those linedefs.
- Another function often needed : "split" a vertex shared between
several linedefs :
| |
--x-- ===> --x x--
| |
The way to use it could be : select one or more linedefs that have a
common vertex. That vertex is duplicated, moved aside a little bit (so
as to reduce the lengths of the linedefs and the vertex reference of
the concerned linedefs is changed. Instead of moving it, it could be
selected for dragging automatically... Could be called "unlink
vertex".
- Cut corner : must select a vertex shared by two linedefs. The linedefs
are shortened and the vertex is replaced by a linedef connecting the
two other linedefs, an forming the same angle with both of them
(typically, 45°)
x--- x--
| ===> /
| x
| |
It should be possible to set the length of the new linedef in an
interactive fashion. But I don't see how to do that without having a
modeful interface.
- Linedef type : give choice of format between signed decimal, unsigned
decimal, hexadecimal. Default format is specified by config parameter
format_thing_type. Also have a key binding to cycle between the three.
- Linedef tag : same thing.
- Linedef flags : give choice between string, signed decimal, unsigned
decimal and hexadecimal.
- AJA 2000-09-21: (b) the texture checker only gives you two choices
when it encounters missing textures: stop, or make it STARTAN3 and
continue. When using some Doom tricks using missing uppers/lowers,
this is a pain, ideally (IMHO) there would be four options:
Press ESC to see the object,
or `y' to fix the texture and continue,
or `A' to fix all remaining textures,
or any other key to leave it and continue
- Look into texture alignment. Look at what's been done with DETH.
AJA 2000-09-21: (e) I wanted to horizontally align a bunch of lower
textures on some two-sided lines, but the X alignment functions only
work on middle textures.
This is how I would prefer it to work: well, pseudo-code would
explain it best:
AlignX(sidedef_t S[], int NUM)
{
int i, x_offset;
// initial x offset comes from first sidedef
int x_offset = S[0].x_offset;
for (i=1; i < NUM; i++)
{
// ... check if S[i] contiguous with S[i-1] ...
x_offset += LineLength(S[i-1]);
x_offset &= 4095;
S[i].x_offset = x_offset;
}
}
That would collapse the 8 alignment choices into 2 (sidedef1 or
sidedef2). Well, 4 if you keep the texture checking versions.
It should work fine in practice since all Doom textures are powers
of two. If one wasn't, it wouldn't be drawn properly since the
R_GetColumn() routine in the Doom source does this:
column &= (width-1)
Do you think this "texture-independent" version is better ?
- Highlighting linedefs: the test "tag > 0" is arguable. Shouldn't it be
"tag != 0" ?
- When merging superimposed 1S linedefs, the resulting 2S linedef often
has the middle textures the 1S linedefs had.
- Showing linedef textures: several solutions:
- easiest: show raw middle texture,
- easy: show raw upper, middle and lower textures,
- hardest: show as Doom would render it, with offsets, LTU, UTU and
all. Scale it down so as to fit in the window that has a fixed size.
Optionally apply brightness. Maybe show the edge of the neighbouring
walls, it might help for alignment. ISSUE: it might not be a good
thing to respect the length of the linedef as, for long linedefs, it
will force us to scale down too much. For textures that don't
exist, show background with cross. For texture "-", show background
only. For transparent texture, background sees through. It's
probably better to use a special colour (like black) for background
as the user might want to use a bright colour for window
backgrounds, which wouldn't look too good with Doom's dark textures.
- Split linedef: if pointer is somewhere on top of linedef, split it
there (not in the middle).
- Split linedef: buglet: the new vertex is initially put at (0,0) and
MapMaxX and friends are updated accordingly. So if the centre of the
map is way off (0,0), the next centre-map command will appear to put
the map off-centre.
- Highlighting linedefs: same problem when some of the linedefs to
highlight have a non-zero tag. IMO, the key of the problem is the O(2)
part in the highlighting of sectors. Should restructure
HighlightObject() and HighlightObjects(). Build a bit vector of all
linedefs that should be highlighted and do them all in a loop, without
recursion. And thus we would not highlight the same linedef more than
once anymore.
- Show all linedefs that have errors in red. That includes :
1. bad type,
2. type requires a tag but its tag is set to 0,
3. type requires a tag but no sector uses that tag,
4. door type on a single-sided linedef,
4b. W? linedef type used on single-sided linedef,
5. missing texture (HOM) (though this is normal for some tricks),
6. tx with multi-patch columns on a double-sided linedef (medusa),
7. bad flag,
8. misaligned (bad X-offset),
9. superimposed linedefs.
10. teleport type, but the target sector has no teleport exit, or it's
not present at all skill levels.
Notes:
- For (3), you probably need a bit vector of tags used by at least one
sector. When should it be refreshed ? It's perhaps safer to do it
from scratch before displaying, than trying to keep track...
- (7) is another reason to move the definition of flags out of the
executable and into the .ygd.
- (6), (8) and (9) are not too easy.
- The colour of the linedef should probably be reset to normal before
highlighting and selecting. Having lines of many different colour is
just going to be confusing.
- Check texture names: if the sidedef is not used by any linedefs, you
are still prompted to "press [esc] to see the object". If you do, you
get a "Bug: GetObjectCoords: bad sector# x" message.
Editing sectors
- Set floor height to ceiling height - headroom.
- Set ceiling height to floor height + headroom.
- "Change sector reference" or "substitute sector" Change sector
reference for all the sidedefs that reference one of the selected
sectors.
- Paint sectors with colour depending on tallness, brightness,
texture...
- Function to substitute sector texture.
- Dragging sectors is still slower than dragging vertices. But it might
be because of the overhead incurred by highlighting all the linedefs.
- Sectors are sometimes mistakenly considered unclosed and don't
highlight properly. E.G. in ss27bet2.wad, sector #66.
Also: I already got erroneous "sector not closed" messages. The last
time I remember, it was on a tiny triangular sector (base=16,
height=2).
AJA 2000-09-21: two linedefs meeting at a vertex, and the other ends
are very close to each other (like 2 units) causes spurious
Sector-not-closed messages in the consistency check.
- A DCK-like philosophy could be used when moving sectors :
| |
| +----+ +-+--+
| | | ==> | |
| | | | |
| +----+ +-+--+
| |
- Sector type : give choice of format between signed decimal, unsigned
decimal, hexadecimal. Default format is specified by config parameter
format_thing_type. Also have a key binding to cycle between the three.
- Sector tag : same thing.
- Eye candy: animate flats
- Bug: in sectors mode, [n], [p] and [<] sometimes loop over the same
sector forever because GoToObject() does not do quite the right thing
regarding subsectors. [>] is not subject to this problem because then
[Shift] is on. [If you're confused by this entry, look at the layout
for a french PC keyboard in xkeycaps.]
- Place the sector number correctly. Account for convex sectors
and fractioned sectors. Avoid sloping due to an excess of
vertices on one side. One strategy that comes to mind is
placing it at the centre of the largest area (where
"largeness" is a compound of "surface" and "squareness").
- Showing sector textures: optionally apply brightness.
- Andy Baker reported than when merging linedefs, Yadex sometimes
deleted the wrong linedef.
- Highlighting sectors: for a constant number of sectors to highlight,
gets slower as the total number of sectors increases. Might have to do
with the search for tagged linedefs.
Keyboard interface
- Proposition: in linedef mode, <letter><letter> gives access to
parameter.
- Add macros and key bindings.
Documentation
- Update DEU 5.21 doc...
- Document screenshot.
- faq.html should be included in the distribution.
- Some entries in the FAQ should also be in trouble.html and vice-versa.
- In TODO, entries should be numbered.
- The following should be externalized:
- the URL of the homepage (when it's done, update web/readme.html)
- the URLs of the mirrors
- the names of the copyright holders (contributors et al.)
- the name of the maintainer
- Each file should have its own copyright statement.
Unimportant :
- If bgi= or -bgi specifies a path for the .bgi driver, handle it.
- Search for .cfg in directory where .wad is. hm-hm...
- Nodes: have an option to pipe the output file through BSP.
Flat/sprite/texture viewer
- Use other palettes than #0 (also when saving).
- Use COLORMAPs (also when saving).
- Save bug: should save entire image, not clipped. Requires implementing
Sticker::load (Img, int oxfs, int yofs, int width, int height). And
changing textures.cc so that it does not clip the width and height.
- Save: will never be able to save all arch-vile frame under MS-DOS
(contain "[", "\", "]"). Use DeuTex's translation scheme ?
- Zoom and scrollbars.
- Add binding to toggle between SW1* and SW2*, cycle through the frames
of an animation. For Hexen, it's much more complicated (3-frame
switches...).
- Display number of patches (and posts, and patch list...).
- Show several pictures at a time.
- Add a flag somewhere to allow choosing a flat/texture that's not in
the list.
- Support pictures higher than 255 and textures higher than 128.
- If the "view" command is given a lower case argument, the positionning
in the list of sprite names is wrong.
Build:
- Document somewhere what RELEASE does and why it's important.
- Makefile: after changing DEFINES in the makefile, running make does
nothing ! (have to delete manually wads.o and sanity.o)
- Makefile: after hacking for two days on a machine, some objects are
not rebuilt on another machine. Even though yadex.h has changed !
- Should not build yadex.dep from scratch every time you type "make".
- "make clean all" fails because clean removes obj/0 but does not create
it again.
- Some configuration items are not detected by configure but by the
makefile. This is confusing (there's no simple rule).
- It would be nice to automatically detect when -fpermissive is needed
(GCC >= 3 + "extern XSetTransientForHint" in /usr/include/X11/Xlib.h)
- It would be nice to automatically detect where the X11 headers and
library are. And omit -I/usr/X11R6/include from the command line when
it's not needed.
DOS/BGI port
- Do more modules splitting (deu.c, ReadConfigFile, menus.c). In
gfx.c, move InitGfx() in a separate module.
- Be able to handle large levels.
- Switch to DJGPP
- Dig *.wad...
- Maybe compress the sidedef struct (30 B -> 12 B).
- Try to waste less space with in-core image of wad directories.
- Respect screen ;
- restore contents
- restore proper number of lines/columns
- Replace putimage() by calls to display_game_image(). Implement the
BGI version of display_game_image().
- Old bug: numeric keypad "." means Del even if Numlock is on.
- Old bug: fake pointer: make it an arrow and not flickering (Ben Davies).
X11 port
- Implement -geometry and -display.
- Add an option like in Xmame to have either a private or shared
colormap (by default shared, at least in map mode).
- Look into *WMHints*()
- When drawing the map, etc, ignore some intermediate events (for mouse
pointer position). Also, when several arrow key keystrokes are in the
input key, just count them and redraw only once.
- Set WM hints (icon name, min size, max size, etc.).
- Find a replacement for bioskey(0) in text mode.
- Look into getting the status of scroll lock.
- Handle KeymapNotify events.
- Show cursor in input boxes and let user move it with arrows and mouse.
- The numeric keypad does not seem to work.
- When there is another colour-hungry app running (like Netscape), get
error upon freeing colours. I think Xmame has the same problem.
- Make sure that input.c intercepts only events concerning Yadex's
window.
- After a resize, pointer_x/y are not updated so the wrong object is
highlighted.
- After a resize, the map is redrawn 3 TIMES ! I know why : the window
manager (FVWM) sends three sets of exposure events. Making drawmap()
and refresh in general able to do partial drawings will eliminate this
problem. And give better performance when moving a thing, or flipping
through the menus.
- Fonts: allow several font names in the config file. The first font
found is used. If none is found, use the default font.
- Fonts: be able to use variable-width fonts.
- With font "variable", in the flat viewer, underscores are not cleared
properly.
- Why do I sometimes get this when closing a window :
X Error of failed request: BadAccess (attempt to access private resource
denied)
Major opcode of failed request: 88 (X_FreeColors)
Serial number of failed request: 503121
Current serial number in output stream: 503135
I've trapped it in colour4.cc :
Warning: error freeing colour <hex number> (<cause>)
If you can reproduce this error, mail me.
- I've heard on comp.windows.x Mattias Engdegård say that bitmap_pad is
relevant. What are the constraints on it, then ?
- Use XShm.
- Perhaps optimize transparency :
pic -> img -> img(scaled) -> ximage, ximage -> pixmap, pixmap
pic -----------------------> ximage, ximage -> pixmap, pixmap
- Time spent within Yadex and time spent within the X server
- When moving sprites at large scale factor, we waste a lot of time in
Sprite::make_bitmap, scale_img and, above all, Sprite::make_ximage.
Making sprites persistent across iterations helps enormously. Do it.
Unix port
- Basenames are truncated to 8 characters. The DOS approach of fixed
size al_f* types does not scale on Unix. Should probably modify
al_fana() to use dynamically allocated buffers.
Platforms/Portability
- Solaris 7: bad X11/Xlib.h. With GCC, need -fpermissive
and/or -isystem /usr/openwin/include
- Solaris 7: don't assume that having gcc implies that cc is
gcc. cc might be the native compiler in which case -Wall might
no be appreciated.
- Solaris 9: nanosleep() needs -lrt. Best to use usleep() ?
Prompt
- Add access to the prompt from an editing window (":" like in vi).
- Use readline.
- "e" command (and possibly others): warn if too many arguments.
- "e" command: perhaps accept "e 4 2" as synonym to "e e4m2".
Misc.
- Implement several windows at once ?
- Replace all occurrences of BLACK, WHITE, ... by logical colours.
- Externalize occurrences of ".wad".
- Externalize occurrences of ".bak".
- Browse mode, as in xv and psp, to browse through a large number of
wads.
- Be able to open zipped files ?
- On ProgError(), save current data to a file named yadexcrash.wad. On
startup, if that file exists, propose to use it.
- Add a handler for the SIGSEGV signal to, on segfault (SIGSEGV), save
current data to a file named yadexcrash.wad. On startup, if that file
exists, propose to use it.
- If DOOMWADDIR exists, use it ? But overridden by yadex.cfg & -iwad
- Texture browser : it's so slow that, even on a K6/200, some textures
are slow to come (AMRIBS). Should cache patches ? 1999-11-28: after
implementing Patch_dir, did not notice a huge improvement.
- Parameters :
- colour# used to represent transparent colour when saving textures,
- rgb used to represent transparent colour when saving textures,
- rgb used to represent transparent colour when displaying textures,
- Log file: create/update it iff the pwad file is modified.
- Events; generalize internal events and hold refresh until all events
have been processed. Though autoscroll could bite me.
- Delete all those "huge" qualifiers ; means nothing for Unix and the
DOS version should be compiled with -mh anyway. Update: 1999-11-25:
Ha! Ha! Ha! Ha! Ho! Ho! ... I was so young and naive...
- The popup menus should get the pointer position event when there is no
motion event. It's an issue when, to close a submenu, you click on the
parent menu; until you move, the parent menu still highlights the old
line.
- Popup menus: that code is brittle because the same menu_c object is
used for popups and pull-downs. For example, if a menu was pulled down
before the same menu (that was previously popped up) was undrawn,
weird things might happen. I don't like the idea of duplicating the
whole menus, though. It would be cleaner to split the menu_c class
into a constant part and a dynamic part but it would be a lot of work.
- Instead of { Beep(); Notify (); }, should have a specialized function.
- Somehow unify configuration variables and game definition variables,
at least so that "set" displays both. AYM 2000-07-11: mmm...
- Palette viewer: better cursor.
- Textures: load the texture descriptions (TEXTURE[12]) once for all
at startup.
- Textures: don't abort if the TEXTURE[12] lumps have weird things in
them.
- There is a way to trigger the "Callback %p did not set disp_" bug
message. Don't remember where. Perphaps in the texture viewer. Had to
do with missing patches ?
yadex: viewflat checkers
Yadex: Bug: Callback 0x805a770 did not set disp_
REPORT ALL "Bug:" MESSAGES TO THE MAINTAINER !
- Certain calls to InputInteger() should use different bounds so that
one can enter E.G. 0xffff as well as -1.
- InputInteger() should be objectified so that it doesn't force the