forked from earlfogel/UltraRogue
-
Notifications
You must be signed in to change notification settings - Fork 0
/
CHANGELOG
805 lines (465 loc) · 21.2 KB
/
CHANGELOG
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
March 2021
----------
Less likely to die of starvation in easy games.
Ring of extra sight prevents blindness.
Fix null pointer dereference after death by petrification
followed by autosave/restore -- wake_monster() returned a
pointer to the monster that killed you, but restore reset
the list of monsters, invalidating that pointer.
Fix: display glitch stealing item from under monster.
February 2021
-------------
Can steal items from underneath monsters.
Preserve hitpoints for dividing monsters.
Allow buffering of fight commands.
Move POWEREAT from do_minor to do_major.
Lembas cure POWEREAT and SUPEREAT.
January 2021
------------
More consistent behavior at the end of long fights.
Fix the secret door display glitch entering a dark room after magic mapping.
Don't autosave when rogue is blind.
Fix - restoring a copied save file would overwrite original on next save
December 2020
-------------
Fix: doctor stops working after save/restore on level with no monsters.
Found permanent phasing cheat.
Blessed ring of levitation protects you from fire traps.
Saved games are resumed by default; use 'urogue -new' to override this.
October 2020
------------
Rogue gets points for genocided monsters.
Friendly monsters don't like being bumped into in hard games.
Blessed rings of wizardry, searching and regeneration are better.
Cursed rings of wizardry and searching are less effective.
September 2020
--------------
Don't autosave after falling through a trap.
Dividing monsters are more vulnerable to vorpal weapons.
Petrifying monsters are more dangerous.
Fix spurious "Illegal command" messages due to saved commands.
Vorpal blades are easier to create.
Blessed genocide not affected by difficulty level.
Fix: stuff you know/guess gets restored after autosave/restore
August 2020
-----------
New option: autosave
Fix: rare crash in do_move when you run into a monster that doesn't exist.
Fix: shiny armor protection against gazing monsters.
July 2020
---------
Support CTRL arrow keys on xterm(ish) terminals.
You can now unwield a weapon by pressing "w-".
Fix gcc -Wextra and -Wformat=2 warnings.
Hidden feature: can cast blessed spells and prayers (at extra cost)
by typing upper-case letters.
New option: noautopickup
June 2020
---------
Fix: artifacts lost below level 99 could never return.
Fix: more varieties of monster appear deep in the dungeon.
You don't lose protected/owned items when resurrected.
In easy games, you don't lose any items when resurrected.
Implement ISSWARM and ISFLOCK in difficult games.
Make shopkeeper optional when using -mr option.
Player heals even more slowly in difficult games.
May 2020
--------
Player heals more slowly in difficult games.
Fix: infinite loop in wanderer() after killing friendly fiend.
Can't start normal games with mithril or hard games with plate armor.
Fix: can't pick up items in trading posts while Friendly Fiend is there.
Fix: bugs tracking the number of items in purse.
Killing Friendly Fiend is safer in easy games, more dangerous in others.
Friendly Fiend only appears in some "-mr" games.
April 2020
----------
Fix: dropped items can't land on doors under monsters.
do_minor() #17 excludes ring/POWERSTR bonus
Rogue should be more careful when injured.
Fix: use fopen() in binary mode for score file and saved character file
to prevent file corruption issues on Windows.
Implement CANSPORE.
March 2020
----------
Ignore special keys when waiting for "any character".
Otherwise attempts to scroll at the end of a game
cause it to end suddenly.
Falling items may scatter a bit further.
Falling items may (rarely) land under the rogue.
Reset maxpack when difficulty level changes.
Fix: sometimes rooms don't light up when fire monsters appear or enter.
Fix the ancient disappearing door bug.
Fix the ancient long messages mess up the dungeon bug.
Clear "which item" prompt after putting on rings.
Display usage message if invalid command-line option is used.
Don't rewrite score file unless it changes.
Stepping on a trap clears the type-ahead buffer (save_ch).
Fights last longer deep in the dungeon (min_fight).
Fix null pointer dereference in look().
February 2020
-------------
Updated handling of command-line arguments.
Fix: change odds of cursed/blessed items when difficulty level changes.
Fix: make sure at least one wandering monster is available on level 1.
Fix: fighting monsters that divide when hit.
Fix: fiery monsters only light rooms if we're in them.
Limit how many items scavengers can carry (based on their experience level).
Save/restore *_guess arrays.
In 'C'all command, press <return> to erase previous guess.
Code cleanup in state.c: switch from ur_alloc/ur_free to ALLOC/FREE
Throne rooms less dangerous early in the game.
Fix: use curses input routines instead of getchar()
Fix: sometimes light room when new monsters appear.
Fix: integer arithmetic bug healing in difficult games
Fix: at some ability levels ring of regeneration would slow healing
January 2020
------------
Monsters can't summon a unique if it's already there.
Add a few monsters to list of classic monsters (-mc)
and removed Friendly Fiend.
You'd better stop fighting if you start suffocating.
You are move vulnerable to magical attacks in hard games.
Save key pressed in wait_for() to use as next command.
Player gains spells/prayers more slowly in hard games.
Better tracking of injuries sustained in long fights.
Tweak to chose character screen.
Health state shows when player stats are low.
Fix: don't fight when HP too low (change int to float).
Fix: waiting for new monster in long fights.
Support for CTRL and ARROW keys in get_dir().
Fix multiple glitches when swapping places with friendly monsters.
Moving into a monster while phasing now swaps places with it.
Fix: don't light room when new monsters appear.
Friendly monsters still guard their treasure.
December 2019
-------------
Vorpal blades affect NOMETAL monsters.
Blessed protection scrolls are better than normal.
Can press <ESCAPE> to interrupt fights or repeat commands.
Fix: random dots in dark rooms when scavenger picks stuff up.
Fix: level inventory in debug mode.
Change debug mode 'floor map' command from ^F to ^A
to avoid conflict with ^F 'serious fight' command.
While phasing, the first step of a run can move you into a wall.
Blessed protection makes armor shiny.
Shiny armor deflects the gaze of gazing monsters.
Player heals more slowly in difficult games.
Fix ^C wizard mode command, which conflicted with SIGINT.
Fix: save/restore of canwizard.
Enchanting stuff is riskier in hard games.
Option to show cursor while playing (showcursor).
Blessed 'magic hitting' improved.
Stop fighting when you change experience levels.
November 2019
-------------
Option to let players (and monsters) turn sharper corners.
Bad luck fades over time.
urogue.bat and urogue.sh have example of setting options.
Thieves can steal from shops.
If friendly monsters notice your attempt to steal, they get angry.
Can use SROGUEOPTS environment variable to set difficulty level.
Can change difficulty level on the fly.
Score adjusted based on lowest difficulty level used.
'S'ave won't clobber an existing file.
Don't stop to pick things up in searching runs.
Make swings connect sometimes when fights are uneven.
Limit how many times a monster can divide.
New CTRL('F') command fights monsters that are usually best to avoid.
Don't pick stuff up during searching runs.
Fix: show cursor when needed for teleport control.
Using a blessed enchantment scroll on a stick/wand adds charges
and blesses it.
Using a blessed wand of drain life is less draining.
Status line shows when Debug Mode is on.
Fix: initialize buffer before calling get_str()
(fixes bugs in Call command and scroll of acquirement)
Since monsters get a boost once you make it past level 80,
you now get more experience for killing them.
Fix: scoreboard ordering of repeat games.
Fix: <return> is harmless when guessing what things are.
Serious fights continue even if you're asleep or confused.
October 2019
------------
It's harder for monsters to shatter protected crystalline armor
in hard games -- the protection is lost instead.
Fix off-by-one error in pick_one().
Show luck on options screen.
Restore abilities prayer can restore luck.
Friendly monsters don't shoot at you.
Exploding rings only hurt if you're wearing them.
Things don't explode as early when blessed enchantment is overused.
Greedy monsters don't chase you if they're also friendly.
Drop multiple items, e.g. 10d to drop 10 food rations.
Can combine -s and -w command-line options to see game IDs.
Fix SIGINT handling on Windows.
Fix null pointer dereference in do_zap().
Fix infinite itch.
Fix most gcc -Wextra issues.
Fix the ancient moving invisible monster space bug.
Don't show top scores unless the user actually scores some points.
Support <SHIFT> and <CTRL> arrow keys where terminal makes them available.
Use %APPDATA%/urogue folder on Windows.
Bumping into a friendly monster doesn't start a fight.
Change help for 'S' to: Save game and exit.
September 2019
--------------
Special abilities for gods.
Can genocide shopkeeper, quartermaster and yourself, if you dare.
Don't fight friendly monsters ('f' and 'F' commands). Hitting a friendly
monster makes them decidedly unfriendly.
Don't show bag letter when adding item to purse, to avoid confusion
with revised 'A'pply command.
Protected crystalline armor may shatter in hard games.
Loss of intelligence or wisdom is temporary in easy games,
and only sometimes permanent in regular games.
Applying artifacts in hard games is a bit safer.
Wizard (software developer) can change difficuly level.
Friendly monsters don't chase you.
Skip most friendly monsters at runtime so we don't have to edit monsdata.c.
New -mm command-line option to include more monsters.
Make scroll of peace less powerful.
Don't show score if developer/wizard mode was used.
Fewer "breaks free from the hold" messages.
Make the middle levels more interesting.
Save/restore now works in trading posts.
August 2019
-----------
Make ^R (refresh command) clear window, then refresh.
Adjust food value based on window size (from 1.0.7)
so food lasts longer in larger dungeons.
Fix misaligned columns on scoreboard when scores are large.
Do away with libsrogue, stat.h, pwd.h and encread/encwrite routines.
Cleanup some gcc "may be used uninitialized" warnings.
Blessed potion of healing slightly improved.
New scroll of peace - calms monsters around you.
Clerics can pray for light and peace.
Fix: init_weapon() now sets object type to WEAPON
Blessed scroll of genocide improved.
Can apply artifacts from within purse.
Monsters can't steal Claimed objects, even on the deepest levels.
Gelatinous blue horror changed to 'H' and stone gargoyle to 'G'.
Move to gender-neutral language.
If you lose the Magic Purse, it gets recreated on a future level.
Casting spells and praying repeatedly (via repeat counts) is a bit more
efficient -- it remembers the previous spell or prayer.
Occasionally monsters are not hostile, based on player's charisma
and monster's (LOW|MED|HIGH)FRIENDLY attributes.
Removed old flush and terse options.
New option to choose type of run (doorstop).
New command-line options to choose level of difficulty (-easy and -hard).
Easy:
- pack can hold more items
- players start out with more stuff
- reduce damage for players with thick skin (ie. s_arm<10).
- fewer traps
- fewer cursed items
- less likely to be summoned to a throne room
Hard:
- reduce benefit of high armor class
- can't start game with best armor
- artifacts are more dangerous
- fewer blessed items
- more likely to be summoned to a throne room
July 2019
---------
When choosing which monsters to use in a game, make sure to
include monsters summoned by other monsters we include.
Workaround: doctor daemon still dies sometimes, so restore will
recreate it.
Fix: ring of sustain ability (etc.) don't blow up when enchanted.
Can enter wizard mode when restoring a game (for debugging).
Improve accuracy of id_monster().
Make genocide scroll more rare.
If there's no food on the first two levels, there will be on the third.
Bumping into a wall also searches for secret doors.
Shops now have shopkeepers.
Chance of hitting high level opponents improved from none to slim.
This fixes a problem where players with very good armor would never be hit,
making the deepest dungeon levels too easy.
Use wgetch() for user input and let curses deal with escape sequences
(eg. arrow keys), as this is more portable.
Removed some quaint old code (shell escapes, load average checks,
wizard password file).
If urogue can't access a central score file, put it in the users's home
directory instead.
Stolen artifacts sometimes reappear if thief disappears, and
occasionally scavengers drop stuff when they disappear.
Scorefile, saved characters and save/restore now work on Windows.
Monsters don't get a saving throw against blessed sticks/wands
or the Sceptre of Might.
Can unwield a weapon.
Can arrow up and down when setting options.
Fix: reset food_left if it gets completely out of whack.
Fix: new health status display updates properly.
Supereat ends, after a while.
June 2019
---------
'~' command shows experience needed to reach next level, as per 1.0.7.
Fix: save/restore of doctor daemon sometimes failed.
Make backspace work when typing filenames and options.
Show blessed/cursed status of food and rings when itemizing pack
when game ends.
Fix: reset keyboard state when restore of saved game fails.
Swapped 'c' and 'C' commands, as per 1.0.7.
rip.c: show what happened just before you died.
Gain ability potions are more rare, as per 1.0.7.
When running, <shift><dir> acts like <ctrl><dir> used to
(run ends before you run into things).
Also, <ctrl><dir> runs now alternate searching and moving.
In genocide(), truncate long names in list so they don't wrap.
In genocide(), press 'b' to back up and show list again,
press 'q' or ESC to exit.
If there are fewer than NLEVMONS*100 monsters, we'll run out of new
monsters before we run out of levels. So space them out a bit more.
Conversely, if there are too many monsters, we show new monsters more
often or we'll never see them all.
Can 'm'ove through monsters when phasing.
Try harder to find a place for dropped items.
Can't fight when diseased or infested ('f' and 'F' commands).
Once activated, the Silmaril maps new levels automatically.
Less chance of being sent to a throne room when you go up a level.
Backport monster flags from 1.0.3, and bumped the
t_flags and m_flags arrays from 10 and 4 to 16 each.
This lets new monsters have new abilities and lets us
add new flags (i.e. CLASSIC).
Now includes most monsters from 1.0.3 with command-line options
to choose which ones to use:
-mc: classic monsters from 1.0.2
-mr: a random selection of monsters
-ma: all 300+ monsters
-mm: classic monsters plus lots of random extras
The default is classic monsters plus a few random extras.
Defined a few new constants in rogue.h so array sizes aren't hard
coded in multiple places (NT_FLAGS, NM_FLAGS, NMSGS, NFINGERS).
Show blind/diseased/infest etc. state in status bar.
Implement
ISLARGE, ISSMALL, ISFAST, CANFLY, CANTRAMPLE, CANSWIM, DRAINBRAIN, DRAINWISDOM, NOMETAL
May 2019
--------
'F' command now fights a group of monsters. I.e., when the monster you're
fighting dies, it picks another and keeps fighting as long as there's a
monster in reach.
Fewer interruptions (and fewer messages) when fighting ('f' and 'F' commands).
In particular, you don't get tired of fighting as quickly, and you don't stop
fighting when zapped, unless the bolt causes damage.
Nymphs can no longer curse protected items.
Once activated, the Phial lights up new levels automatically.
Magic mapping shows secret doors as '&'. This works around a bug where
magic mapping released monsters from treasure rooms.
Scoreboard now shows which entry is current run, if you made it into the
top 10.
Magic and prayer points slowly regenerate when not hungry or hurt.
'x' command to rest (same as '.', but left-handed)
'g' command to move right (same as 'l', but left-handed)
'f/F' commands avoid quartermaster and monsters that divide when hit.
If a 'F'ight ends quickly because there are no more monsters in reach,
wait a bit in case others come in range (if not hurt or hungry).
Don't stop 'F'ighting when hit by a second monster.
Enchanted armor offers some protection from magical attacks.
Fixed calculation of how much mithril protects against magic.
Create a unique ID for each game. Users can restart saved games over and
over (by copying the save file), but each game only appears in the
scorefile once.
Warn player each turn while suffocating.
Increase chance of finding secret doors (less typing).
Scroll of genocide shows which monsters are already gone
(e.g. due to earlier scroll of genocide).
'd'rop multiple food at once, like arrows and rocks.
Fights end when we recover from being held, paralized, etc. instead
of at the start (to reduce the number of annoying messages).
Fix: half the time find_slot was called with arguments in the wrong order.
Removed wizard scorefile commands from rip.c, and replaced
it with program to delete lines from score file (scorefile.c).
April 2019
----------
Fix: save/restore favorite fruit, number of items in pack and bag.
Check that save file is complete, because sometimes it isn't (due
to gcc address sanitizer)
Add support for arrow keys (via ANSI escape sequences, not curses, sigh).
Protected crystaline armor doesn't shatter.
Stop 'f'ighting when hit by a second monster (used to be when attacked).
Save/restore which monsters are available (e.g. not genocided).
Fixed a use-after-free error in chase(), using position after monster dies.
Fixed a use-after-free error in runners(). If the next monster in the list
dies (eg. after being zapped by the current monster) we reset the pointer
to the next monster (nitem). Initialize t_quiet in new_monster().
Thanks valgrind.
March 2019
----------
Backported and enhanced save/restore code from urogue 1.0.7. Also daemon
code as it's needed for save/restore. I.e., ported save.c, state.c and
daemon.c from 1.0.7, with changes to many other files.
Made evil sorceress more vulnerable (change AC from -16 to -10 as in 1.0.7).
When enchanting weapons, keep hit and damage closer together.
When game ends, use space to page through final info, rather
than alternating space and return.
When fighting, reduce number of "bounce" messages from zapped bolts.
Also, quit fighting when fainting from hunger.
Cleanup unused code in pack.c.
Plugged some memory leaks. E.g., in new_level() monsters from old level
were freed, but the contents of their packs were not.
February 2019
-------------
Added ',' command to pick up an object
January 2019
------------
Artifacts:
Trying to invoke an artifact, and failing, may cause minor or major harm.
- reduced the chance of minor bad effects
- removed major bad effects
Parasites:
Originally, parasitic infestation could only be cured by a cure disease
scroll. Now infestations clear up on their own (like diseases, but more
slowly).
Fighting:
When using 'f' or 'F' commands, don't ask for a direction if there's only
one monster in reach and visible (to reduce typing and wrist strain).
November 2018
-------------
Electrification:
When you read a scroll of electrification, nearby monsters are damaged for
several turns. This is done by iterating through the monster list. But if
one dies, it gets removed from the list and the 'next' pointer becomes
invalid, leading to a segmentation fault. So we save it in tmp_item,
temporarily.
$ diff -u command.c.bak command.c
--- command.c.bak 2002-04-28 09:41:01.000000000 -0600
+++ command.c 2018-11-22 14:18:09.990385258 -0600
@@ -509,15 +509,18 @@
if (on(player, ISELECTRIC)) {
int lvl;
struct linked_list *item;
+ struct linked_list tmp_item;
struct thing *tp;
for (item = mlist; item != NULL; item = next(item)) {
tp = (struct thing *) ldata(item);
- if (DISTANCE(tp->t_pos.y, tp->t_pos.x, hero.y, hero.x) < 5) {
+ if (tp && DISTANCE(tp->t_pos.y, tp->t_pos.x, hero.y, hero.x) < 5) {
if ((tp->t_stats.s_hpt -= roll(2,4)) <= 0) {
msg("The %s is killed by an electric shock.",
monsters[tp->t_index].m_name);
+ tmp_item.l_next = item->l_next;
killed(item, TRUE, TRUE);
+ item = &tmp_item;
continue;
}
lvl = tp->t_stats.s_intel - 5;
Wizard mode:
Originally wizard mode required typing a null character as a command-line
argument to urogue (and typing a password), but that's too hard, so you can
now use 'urogue -w -w' instead.
Earlier
-------
- pack.c, weapons.c, sticks.c
(delay cleanup of items until we're finished with them,
i.e. after they've been thrown or dropped)
- monsters.c
initialize and use flags correctly
- save.c
Save and restore don't work in modern operating systems.
They used a hack (save would dump all the program's memory to disk;
restore would overwrite the running image (code and data) with the
old image).
- init.c
Write strings to buffers instead of pointers.