diff options
-rw-r--r-- | crawl-ref/source/cio.cc | 45 | ||||
-rw-r--r-- | crawl-ref/source/cio.h | 3 | ||||
-rw-r--r-- | crawl-ref/source/files.cc | 5 | ||||
-rw-r--r-- | crawl-ref/source/ghost.cc | 15 | ||||
-rw-r--r-- | crawl-ref/source/makeitem.cc | 11 | ||||
-rw-r--r-- | crawl-ref/source/mon-util.cc | 12 | ||||
-rw-r--r-- | crawl-ref/source/monstuff.cc | 4 | ||||
-rw-r--r-- | crawl-ref/source/output.cc | 8 | ||||
-rw-r--r-- | crawl-ref/source/religion.cc | 3 | ||||
-rw-r--r-- | crawl-ref/source/spells3.cc | 5 |
10 files changed, 83 insertions, 28 deletions
diff --git a/crawl-ref/source/cio.cc b/crawl-ref/source/cio.cc index e74e6dbd3e..2a3cfea496 100644 --- a/crawl-ref/source/cio.cc +++ b/crawl-ref/source/cio.cc @@ -184,6 +184,51 @@ void cursorxy(int x, int y) #endif } +// cprintf that stops outputting when wrapped +// Conceptually very similar to wrapcprintf() +int nowrapcprintf( int wrapcol, const char *s, ... ) +{ + char buf[1000]; // Hard max + + va_list args; + va_start(args, s); + // XXX: If snprintf isn't available, vsnprintf probably isn't, either. + const int len = vsnprintf(buf, sizeof buf, s, args); + va_end(args); + + // Sanity checking to prevent buffer overflows + const int maxlen = std::min( std::max( wrapcol + 1 - wherex(), 0 ), len ); + + // Force the string to terminate at maxlen + buf[maxlen] = 0; + + cprintf("%s", buf); + return std::min(len, maxlen); +} + +// convenience wrapper (hah) for nowrapcprintf +// FIXME: should pass off to nowrapcprintf() instead of doing it manually +int nowrap_eol_cprintf( const char *s, ... ) +{ + const int wrapcol = get_number_of_cols() - 1; + char buf[1000]; // Hard max + + va_list args; + va_start(args, s); + // XXX: If snprintf isn't available, vsnprintf probably isn't, either. + const int len = vsnprintf(buf, sizeof buf, s, args); + va_end(args); + + // Sanity checking to prevent buffer overflows + const int maxlen = std::min( std::max( wrapcol + 1 - wherex(), 0 ), len ); + + // Force the string to terminate at maxlen + buf[maxlen] = 0; + + cprintf("%s", buf); + return std::min(len, maxlen); +} + // cprintf that knows how to wrap down lines (primitive, but what the heck) int wrapcprintf( int wrapcol, const char *s, ... ) { diff --git a/crawl-ref/source/cio.h b/crawl-ref/source/cio.h index 69085ebd48..694860babd 100644 --- a/crawl-ref/source/cio.h +++ b/crawl-ref/source/cio.h @@ -58,6 +58,9 @@ void get_input_line( char *const buff, int len ); // In view.cc, declared here for default argument to cancelable_get_line() int get_number_of_cols(void); +int nowrapcprintf( int wrapcol, const char *s, ... ); +int nowrap_eol_cprintf( const char *s, ... ); + // Returns zero if user entered text and pressed Enter, otherwise returns the // key pressed that caused the exit, usually Escape. // diff --git a/crawl-ref/source/files.cc b/crawl-ref/source/files.cc index 2dbce76869..3a25835dde 100644 --- a/crawl-ref/source/files.cc +++ b/crawl-ref/source/files.cc @@ -1830,7 +1830,7 @@ static void _restore_ghost_version( FILE *ghostFile, void save_ghost( bool force ) { - if (!force && (you.your_level < 2 || you.is_undead)) + if (!force && you.your_level < 2) return; std::string cha_fil = make_filename( "bones", you.your_level, @@ -1849,6 +1849,9 @@ void save_ghost( bool force ) ghosts = ghost_demon::find_ghosts(); + if (ghosts.empty()) + return; + gfile = lk_open("wb", cha_fil); if (gfile == NULL) diff --git a/crawl-ref/source/ghost.cc b/crawl-ref/source/ghost.cc index 728489b8f2..3535f4c449 100644 --- a/crawl-ref/source/ghost.cc +++ b/crawl-ref/source/ghost.cc @@ -470,12 +470,17 @@ std::vector<ghost_demon> ghost_demon::find_ghosts() { std::vector<ghost_demon> gs; - ghost_demon player; - player.init_player_ghost(); - announce_ghost(player); - gs.push_back(player); + if (!you.is_undead) + { + ghost_demon player; + player.init_player_ghost(); + announce_ghost(player); + gs.push_back(player); + } - find_extra_ghosts( gs, n_extra_ghosts() ); + // Pick up any other ghosts that happen to be on the level if we have space. + // If the player is undead, add one to the ghost quota for the level. + find_extra_ghosts( gs, n_extra_ghosts() + 1 - gs.size() ); return (gs); } diff --git a/crawl-ref/source/makeitem.cc b/crawl-ref/source/makeitem.cc index 07da7fbef3..c1343719c8 100644 --- a/crawl-ref/source/makeitem.cc +++ b/crawl-ref/source/makeitem.cc @@ -3829,7 +3829,16 @@ static void _give_ammo(monsters *mon, int level, if (thing_created != NON_ITEM) { - mitm[thing_created].quantity = qty; + item_def& w(mitm[thing_created]); + + // Limit returning brand to only one. + if (weap_type == OBJ_WEAPONS + && get_weapon_brand(w) == SPWPN_RETURNING) + { + qty = 1; + } + + w.quantity = qty; _give_monster_item(mon, thing_created, false, &monsters::pickup_throwable_weapon); } diff --git a/crawl-ref/source/mon-util.cc b/crawl-ref/source/mon-util.cc index 763364d943..62f1beff85 100644 --- a/crawl-ref/source/mon-util.cc +++ b/crawl-ref/source/mon-util.cc @@ -374,15 +374,9 @@ static int _scan_mon_inv_randarts( const monsters *mon, // Twisted Resurrection. static bool _mons_your_abomination(const monsters *mon) { - if (mon->type != MONS_ABOMINATION_SMALL - && mon->type != MONS_ABOMINATION_LARGE) - { - return (false); - } - - // XXX: Reusing the colour scheme - hacky! (jpeg) - return (mon->number == BROWN || mon->number == RED - || mon->number == LIGHTRED); + return ((mon->type == MONS_ABOMINATION_SMALL + || mon->type == MONS_ABOMINATION_LARGE) + && testbits(mon->flags, MF_CREATED_FRIENDLY)); } mon_holy_type mons_holiness(const monsters *mon) diff --git a/crawl-ref/source/monstuff.cc b/crawl-ref/source/monstuff.cc index 70ce9ea013..a8021f6e1b 100644 --- a/crawl-ref/source/monstuff.cc +++ b/crawl-ref/source/monstuff.cc @@ -893,7 +893,7 @@ void monster_die(monsters *monster, killer_type killer, int i, bool silent) monster->hit_dice, true, monster); } - if (mons_class_flag(monster->type, M_EVIL) + if (mons_is_evil(monster) && mons_holiness(monster) == MH_NATURAL) { did_god_conduct(DID_KILL_NATURAL_EVIL, @@ -1067,7 +1067,7 @@ void monster_die(monsters *monster, killer_type killer, int i, bool silent) notice |= did_god_conduct( DID_LIVING_KILLED_BY_SERVANT, monster->hit_dice ); - if (mons_class_flag( monster->type, M_EVIL )) + if (mons_is_evil(monster)) { notice |= did_god_conduct( diff --git a/crawl-ref/source/output.cc b/crawl-ref/source/output.cc index 94ec295c43..0931faa75d 100644 --- a/crawl-ref/source/output.cc +++ b/crawl-ref/source/output.cc @@ -25,6 +25,7 @@ #include "abl-show.h" #include "branch.h" +#include "cio.h" #include "describe.h" #include "directn.h" #include "format.h" @@ -964,11 +965,10 @@ void redraw_skill(const std::string &your_name, const std::string &class_name) // Level N Minotaur [of God] textcolor( YELLOW ); cgotoxy(1, 2, GOTO_STAT); - cprintf("Level %d %s", - you.experience_level, - species_name( you.species, you.experience_level ).c_str()); + nowrap_eol_cprintf("Level %d %s", you.experience_level, + species_name(you.species,you.experience_level).c_str()); if (you.religion != GOD_NO_GOD) - cprintf(" of %s", god_name(you.religion).c_str()); + nowrap_eol_cprintf(" of %s", god_name(you.religion).c_str()); clear_to_end_of_line(); textcolor( LIGHTGREY ); diff --git a/crawl-ref/source/religion.cc b/crawl-ref/source/religion.cc index 7317e0c5f5..57e472414e 100644 --- a/crawl-ref/source/religion.cc +++ b/crawl-ref/source/religion.cc @@ -5962,5 +5962,6 @@ int piety_breakpoint(int i) bool tso_unchivalric_attack_safe_monster(const monsters *mon) { const mon_holy_type holiness = mon->holiness(); - return (holiness != MH_NATURAL && holiness != MH_HOLY); + return (mons_is_evil(mon) + || (holiness != MH_NATURAL && holiness != MH_HOLY)); } diff --git a/crawl-ref/source/spells3.cc b/crawl-ref/source/spells3.cc index aabfc95a42..e2f1150de6 100644 --- a/crawl-ref/source/spells3.cc +++ b/crawl-ref/source/spells3.cc @@ -1106,8 +1106,6 @@ bool cast_twisted_resurrection(int pow, god_type god) if (total_mass < 400 + roll_dice(2, 500) || how_many_corpses < (coinflip() ? 3 : 2)) { - mpr("The spell fails."); - mprf("The corpse%s collapse%s into a pulpy mess.", how_many_corpses > 1 ? "s": "", how_many_corpses > 1 ? "": "s"); return (false); @@ -1134,9 +1132,6 @@ bool cast_twisted_resurrection(int pow, god_type god) return (false); } - // This was probably intended, but it's really boring. (jpeg) - // Use menv[mon].number instead (set in create_monster()). -// menv[mon].colour = colour; mpr("The heap of corpses melds into an agglomeration of writhing flesh!"); if (mon == MONS_ABOMINATION_LARGE) |