[XP] Heretic's Map Death

Started by Heretic86, August 27, 2012, 07:53:07 am

Previous topic - Next topic

Heretic86

August 27, 2012, 07:53:07 am Last Edit: August 27, 2012, 09:25:54 am by Blizzard
Heretic's Map Death
Authors: Heretic
Version: 1.0
Type: Misc Add-on
Key Term: Misc Add-on



Introduction

Its pretty simple.  If everyone in the Party is Dead, you get a window that appears that tells you that your Party is Dead.  Then it goes to the Game Over screen.


Features


  • Allows Game Over from Poison / Slip Damage Effects on the Map Screen

  • Feature can be Disabled with a Game Switch or changing the Script Settings

  • NPC's, Events, and Animations still occur while the "Your Party Is Dead" message is displayed, but Player can not move and has no access to the Menu.

  • The "Your Party Is Dead" Window will display on the opposite side of the Player.  If the Player is on the top of the screen, the window will display on the bottom.  Likewise, if the Player is on the bottom half of the screen, the window will be on the top.  This was done in order to keep the Player's Character visible to the Player.




Screenshots

Spoiler: ShowHide



Demo

http://www.775.net/~heretic/downloads/rmxp/HereticsMapDeath.exe


Script

Spoiler: ShowHide

#==============================================================================
#
#      HERETIC's MAP DEATH
#      Version 1.0
#      Sunday, August 26th, 2012
#
#==============================================================================
#
#  ---  Overview  ---
#
#  This script will bring up the Game Over screen any time everyone in your
#  party Dies, due to Poison or other Damage Slip Inflicted States.  It can
#  be turned On and Off with a Game Switch, or simply set to true for being
#  on the entire time.
#
#
#  -----  Features  -----
#
#  - Customizable
#  - Other Animations still take place on Map Screen
#
#  ---  Instructions  ---
#
#  Change GAME SWITCH to ON to allow Game Over when everyone in your Party
#  has died at any time for any reason.  It can be turned off for places
#  that wouldnt make sense to Game Over if Party Dead, like In Town.
#
#  Switch Number can be changed to whatever Game Switch Number you want.
#
#  ---  Options  ---
#
#  WINDOW_DELAY - How long to wait between Death and Msg, and Msg and Game Over.
#  
#

class Party_Dead < Window_Base
 
 # ---  OPTIONS  ---
 
 ALLOW_MAP_DEATH = 20          # Turn this GAME SWITCH to ON or OFF, or true
 WINDOW_DELAY_IN_FRAMES = 30   # Delay between Death, Window, and Game Over
 OPACITY_CHANGE_PER_FRAME = 35 # Allows Your Party Is Dead Window to Fade
 
 # ---  END OPTIONS  ----
 
 def initialize(x, y, width, height)
   super(x, y, width, height)
   self.contents = Bitmap.new(width - 32, height - 32)
   self.opacity = 0
   self.back_opacity = 0
   self.contents_opacity = 0
   self.visible = true
   self.active = true
   #@id = id
   refresh
   @faded_in = false
 end
 
 def refresh
   # Setup the Window Options
   self.contents.clear
   self.contents.font.color = normal_color
   
   # If this Text is Adjusted, Window needs to be Adjusted
   # (x,  y, width, height, align =(0 = left, 1 = center, 2 = right))
   self.contents.draw_text(20, 14, 180, 32, "Your Party is Dead!", 1)
 end
 
 def update
   super
   if not @faded_in
     if self.opacity < 255
       self.opacity += Party_Dead::OPACITY_CHANGE_PER_FRAME
       self.back_opacity += Party_Dead::OPACITY_CHANGE_PER_FRAME
       self.contents_opacity += Party_Dead::OPACITY_CHANGE_PER_FRAME
     else
       @faded_in = true
     end
   elsif not @fade_out
     # If B or C buttons were pressed
     if Input.trigger?(Input::B) or Input.trigger?(Input::C)
         @fade_out = true          
     end
   elsif @fade_out and not @faded_out
     if self.opacity > 0
       self.opacity -= Party_Dead::OPACITY_CHANGE_PER_FRAME
       self.back_opacity -= Party_Dead::OPACITY_CHANGE_PER_FRAME
       self.contents_opacity -= Party_Dead::OPACITY_CHANGE_PER_FRAME
     else
       @faded_out = Graphics.frame_count
     end
   elsif @faded_out and
         Graphics.frame_count > @faded_out + Party_Dead::WINDOW_DELAY_IN_FRAMES
     # Call Game Over Scene
     $scene = Scene_Gameover.new
     # Dispose of Window
     self.dispose      
   end
 end
end

class Game_Party
 
 #--------------------------------------------------------------------------
 # * Slip Damage Check (for map)
 #--------------------------------------------------------------------------
 def check_map_slip_damage
   for actor in @actors
     if actor.hp > 0 and actor.slip_damage?
       actor.hp -= [actor.maxhp / 100, 1].max
       if actor.hp == 0
         $game_system.se_play($data_system.actor_collapse_se)
       end
       $game_screen.start_flash(Color.new(255,0,0,128), 4)
       # This had to be removed
       #$game_temp.gameover = $game_party.all_dead?
     end
   end
 end
 
 #--------------------------------------------------------------------------
 # * Determine Everyone is Dead
 #--------------------------------------------------------------------------
 def all_dead?
   # If number of party members is 0
   if $game_party.actors.size == 0
     return false
   end
   # If an actor is in the party with 0 or more HP
   for actor in @actors
     if actor.hp > 0
       return false
     end
   end

   if $scene.is_a?(Scene_Battle) or
      ($scene.is_a?(Scene_Map) and Party_Dead::ALLOW_MAP_DEATH)
     # All members dead
     return true
   else
     # They are dead but not the right scene
     return false
   end
 end
end

class Game_Map
 unless self.method_defined?('map_screen_death_update')
   alias map_screen_death_update update
 end
 
 def update
   # If Game Switch is ON or it is set to true in the Options
   if allow_map_death?
     # If the whole party died
     if $game_party.all_dead?
       # If the Player isnt being prevented from Moving with a Repeating Wait
       if not @died_time
         # Fades to Red and maintains the other color values
         tone = $game_screen.tone.clone
         tone.to_s.gsub(/([0-9\.]+)/) {@r = $1.to_f,
                                       @g = $2.to_f,
                                       @b = $3.to_f,
                                       @grey = $4.to_f}

         new_tone = Tone.new(80.0,@r[1],@r[2],@r[3])
         $game_screen.start_tone_change(new_tone, 200)
         
         # Prevent Interpreter from being Triggered by Player
         $game_temp.ignore_interpreter = true
         
         # Disable Menu Access
         $game_system.menu_disabled = true
         # Play Actor Collapse Sound Effect from Game Settings
         $game_system.se_play($data_system.actor_collapse_se)
         # Create a New Move Route and Repeat It
         dead_route = RPG::MoveRoute.new
         dead_route.repeat = true
         dead_route.skippable = false
       
         # Push on a Wait Command on to the MoveRoute for stopping the Player
         dead_route.list.unshift(RPG::MoveCommand.new(15, [20]))
         # Force the Move Route to the Cat Actor IF it was a Valid Direction
         $game_player.force_move_route(dead_route)

         # Frame Counter when Everyone was found Dead
         @died_time = Graphics.frame_count
       end
         
       # If the Window hasnt been Created      
       if !@dead_window and
           Graphics.frame_count > @died_time + Party_Dead::WINDOW_DELAY_IN_FRAMES
         if $game_player.screen_y > 240
           @dead_window = Party_Dead.new(220, 20, 250, 96)
         else
           @dead_window = Party_Dead.new(220, 370, 250, 96)
         end
       elsif @dead_window
         @dead_window.update
       end
     end
   end
   # Run Original
   map_screen_death_update    
 end
 
 #----------------------------------------------------------------------------
 # * Checks for a Game Switch Number, or just true
 #----------------------------------------------------------------------------

 def allow_map_death?
   # If the Option is looking for a Game Switch
   if Party_Dead::ALLOW_MAP_DEATH.is_a?(Integer)
     # Return the Value of the Game Switch
     return $game_switches[Party_Dead::ALLOW_MAP_DEATH]
   else
     # Return Value of the Constant (true) when not using a Game Switch
     return Party_Dead::ALLOW_MAP_DEATH
   end
 end    
end

class Interpreter
 def running?
   # Does the Interpreter need to be Ignored - Prevents last step on triggers.
   return true if $game_temp.ignore_interpreter
   # Original
   return @list != nil
 end
end

class Game_Temp
 attr_accessor :ignore_interpreter
 
 unless self.method_defined?('die_initialize')
   alias die_initialize :initialize
 end
 
 def initialize
   # Run the Original
   die_initialize
   # Create the New Variable
   @ignore_interpreter = false
 end
end



Instructions

Put above Main.


Compatibility

Should be highly compatible.  It does Alias several key methods, including Game_Map update.  If the Game_Map update is fully redefined by another script, it wont be compatible unless this script is placed BELOW that redefining script, but Aliasing it should be just fine and shouldn't cause you any issues what so ever.


Author's Notes

This script is set up by Default to use a Game Switch, so by Default, Game Switch 20 MUST BE ON for the Player to die on a Map Screen from Poison / Slip Damage Effects.  The idea behind using the Game Switch is that the Player can continue playing even if the entire party is dead, but they've managed to make it to an area of expected safety, like a Town where people would help them.  I believe that Disabling Map Death in Towns adds a way of balancing the difficulty in games that go to a Game Over screen when the entire party is dead.

The screen will also slowly fade to Red when the Party is Dead.  It should work just fine with any type of color adjusted screens, just adds a red tint.  If you are feeling really frisky, you can even customize the "Your Party Is Dead" message to display something else, or different languages, but you'll probably need to reposition the text accordingly to make it fit the window.
Current Scripts:
Heretic's Moving Platforms

Current Demos:
Collection of Art and 100% Compatible Scripts

(Script Demos are all still available in the Collection link above.  I lost some individual demos due to a server crash.)