Ideas for a tough as nails quest, input needed.

Started by GrimTrigger, April 27, 2012, 12:20:34 am

Previous topic - Next topic

GrimTrigger

April 27, 2012, 12:20:34 am Last Edit: April 27, 2012, 12:24:40 am by GrimTrigger
Hey guys, I'm working on a mid-game mission that breaks away from the boring dungeon crawl, and puts the player to the test.

I want to bring a true mountain climbing experience to my project, and create the experience I was hoping Bethesda would bring me with Skyrim's quest to visit the greybeards....which was more scenic than epic IMO.

So my challenge is to scale the tallest mountain in the world, and reach the summit. The purpose of doing this is a little complicated. Essentially no one has ever climbed this mountain and lived. Everyone.......every party who has attempted it before has failed, with most members being killed. During the time the quest takes place, the main character is going through a major internal crisis, and begins to doubt his own abilities. He resolves that if he is truly as capable as he once thought he was, surely conquering this mountain is within his capacity. He sets out alone, and has a life changing experience as his nearly dies climbing to the summit. Everything is supposed to be dramatic.

The rest is simply story plot, blah blah.

What I want to know from you is if you have any ideas on how to make the journey to the summit difficult, epic, and overall a worthwhile quest. I have the scenes complete, but I need things to make the quest hard.

Here are a few things I'm considering, taken from things I've seen in mountain climbing docs and videos.

>Thick fog/snow which can hamper you're ability to navigate.
>Some form of event that slowly damages you from the cold (how would I do this, status change??)
>Custom tileset with wall pieces to climb like stairs, but not as neatly displayed.
>Mountain type monsters, pitfalls, and perhaps an avalanche.

If anyone has other ideas, I'm all for it. Also, if you are willing to share things you've done to make quests challenging, I'd like to hear them. Doesn't have to be related to this quest. Essentially anything you've done to up the difficulty in a quest to make things more enjoyable, memorable, etc.

Andreavnn


GrimTrigger

Quote from: Andreavnn on April 27, 2012, 12:29:05 am
Here is a good thick cloud fog

Spoiler: ShowHide



Thanks! I need to work on making the the experience as intense as possible, and I have a feeling this will fit the job nicely.

Andreavnn

No problem, just pay it forward.  8)  Slippery ice and footprints in the snow are always a nice touch too.

Footprint Image > picture folder
Spoiler: ShowHide


Script
Spoiler: ShowHide
=begin
============
  Dynamic Footprints - version 1.0 (2005-11-07)
============
  by Wachunga

0.95 - original release
1.0 - fixed a small bug with directional footprints and
       updated the compatibility list
 
SETUP:
1) From the database (Tileset tab), give the appropriate tiles of any
    tilesets that you want to show footprints (e.g. sand in "Desert",
    snow in "Snow Field") the terrain tag 1.
2) Place the footprints file in the Graphics/Tilesets folder.

To prevent an event from having any footprints (e.g. birds), include <nofp>
somewhere in its name.

(If using non-RTP sprites, you may want to create customized footprints.)

FEATURES:
* customizable duration footprint fading (optional)
* direction-specific footprints (optional)
* rounded footprints paths
* overlapping footprints supported
* handles move events (jumping, speed changes, etc) and teleportation

COMPATIBILITY:
1) Cogwheel's Pixel Movement script - unfortunately, pixel movement by its
    very nature isn't very compatible with footprints (short of using sprites
    or pictures instead of a tileset) because a character can move part way
    across a tile without footprints appearing.
   
  2) Near Fantastica's Squad Based Movement/Action Battle System script -
     make sure it is below this script
 
  3) Near Fantastica's Updated Day Night script - again, make sure it is below
     this script
 
  4) Baskinein's Animated Sprite script - see:
     http://www.rmxp.net/forums/index.php?s=&showtopic=27407&view=findpost&p=261921
   
  5) Fukuyama's Caterpillar script - to only have one set of footprints
     for the whole group, no modifications are necessary (just make sure his
     script is above this one). To have a separate (overlapping) set of
     footprints for each character, uncomment (by moving the "= end") the
     following lines:

module Train_Actor
class Game_Party_Actor < Game_Character     
  def move_down(turn_enabled = true)
    if turn_enabled
      turn_down
    end
    if passable?(@x, @y, Input::DOWN)
      turn_down
      @y += 1
      increase_steps
    end
  end
  def move_left(turn_enabled = true)
    if turn_enabled
      turn_left
    end
    if passable?(@x, @y, Input::LEFT)
      turn_left
      @x -= 1
      increase_steps
    end
  end
  def move_right(turn_enabled = true)
    if turn_enabled
      turn_right
    end
    if passable?(@x, @y, Input::RIGHT)
      turn_right
      @x += 1
      increase_steps
    end
  end
  def move_up(turn_enabled = true)
    if turn_enabled
      turn_up
    end
    if passable?(@x, @y, Input::UP)
      turn_up
      @y -= 1
      increase_steps
    end
  end
end
end

=end

#----------------------------------------------------------------------
# Footprints for six situations (down->up, left->right, down->left,
# left->up, up->right and right->down) are required (twelve for
# directional footprints). See the provided footprints template
# (footprints_template.png) for specific details, noting
# that the right half of the template can be empty if using the default
# of non-directional footprints (i.e. leaving FP_DIRECTIONAL = false).
FP_FILE = "footprints_default"
#----------------------------------------------------------------------
# FP_DIRECTIONAL specifies whether there are direction-specific
# footprints (e.g. footprints from player moving up are different
# from those left when player is moving down)
FP_DIRECTIONAL = false
#----------------------------------------------------------------------
# Terrain tag(s) as set in the database
FP_TAG = 1
#----------------------------------------------------------------------
# How much time elapses before footprints begin to fade
FP_BEFORE_FADE_TIME = 100
# After beginning to fade, how long the fading process actually takes
FP_FADE_TIME = 100
# Note: it's possible to maintain footprints indefinitely (with
# FP_FADE_TIME = 0), but if the player opens a menu or changes maps,
# the footprints won't be saved. To allow them to persist even then,
# use Near's Dynamic Maps script (slight modifications would be needed).
#----------------------------------------------------------------------
# tilemap indexes (do not modify)
# regular:
FP_DU = 384
FP_LR = 385
FP_DL = 386
FP_LU = 387
FP_UR = 388
FP_RD = 389
# directional:
FP_UD = 512
FP_RL = 513
FP_DR = 514
FP_RU = 515
FP_UL = 516
FP_LD = 517

#----------------------------------------------------------------------

class Spriteset_Map
attr_accessor :footprints 
attr_accessor :fp_tilemap
def initialize
   @viewport1 = Viewport.new(0, 0, 640, 480)
   @viewport2 = Viewport.new(0, 0, 640, 480)
   @viewport3 = Viewport.new(0, 0, 640, 480)
   @viewport2.z = 200
   @viewport3.z = 5000
   @tilemap = Tilemap.new(@viewport1)
   @tilemap.tileset = RPG::Cache.tileset($game_map.tileset_name)
   for i in 0..6
     autotile_name = $game_map.autotile_names[i]
     @tilemap.autotiles[i] = RPG::Cache.autotile(autotile_name)
   end
   @tilemap.map_data = $game_map.data
   @tilemap.priorities = $game_map.priorities
   @panorama = Plane.new(@viewport1)
   @panorama.z = -1000
   @fog = Plane.new(@viewport1)
   @fog.z = 3000
   @character_sprites = []
   for i in $game_map.events.keys.sort
     sprite = Sprite_Character.new(@viewport1, $game_map.events[i])
     @character_sprites.push(sprite)
   end
   @character_sprites.push(Sprite_Character.new(@viewport1, $game_player))
   @weather = RPG::Weather.new(@viewport1)
   @picture_sprites = []
   for i in 1..50
     @picture_sprites.push(Sprite_Picture.new(@viewport2,
       $game_screen.pictures[i]))
   end
   @timer_sprite = Sprite_Timer.new

   # Dynamic Footprints additions begin
   @footprints = []
   fp_tileset = FP_DIRECTIONAL ? Bitmap.new(256,1024) : Bitmap.new(256,512)
   # make a column for each footprint image
   # right -> down
   fp_tileset.blt(160, 0, RPG::Cache.tileset(FP_FILE), Rect.new(0, 0, 32, 32))
   # up -> right
   fp_tileset.blt(128, 0, RPG::Cache.tileset(FP_FILE), Rect.new(0, 32, 32, 32))   
   # left -> right   
   fp_tileset.blt(32, 0, RPG::Cache.tileset(FP_FILE), Rect.new(0, 64, 32, 32))   
   # down -> left
   fp_tileset.blt(64, 0, RPG::Cache.tileset(FP_FILE), Rect.new(32, 0, 32, 32))
   # left -> up
   fp_tileset.blt(96, 0, RPG::Cache.tileset(FP_FILE), Rect.new(32, 32, 32, 32))   
   # down -> up
   fp_tileset.blt(0, 0, RPG::Cache.tileset(FP_FILE), Rect.new(32, 64, 32, 32))

   # fill out each column, making copies of the image with decreasing opacity
   0.step(5*32, 32) do |x|
     opacity = 255
     0.step(15*32, 32) do |y|
       fp_tileset.blt(x, y, fp_tileset, Rect.new(x, 0, 32, 32), opacity)
       opacity -= 16
     end
   end

   if FP_DIRECTIONAL
     # down -> right
     fp_tileset.blt(160, 512, RPG::Cache.tileset(FP_FILE), Rect.new(64, 0, 32, 32))
     # right -> up
     fp_tileset.blt(128, 512, RPG::Cache.tileset(FP_FILE), Rect.new(64, 32, 32, 32))   
     # right -> left
     fp_tileset.blt(32, 512, RPG::Cache.tileset(FP_FILE), Rect.new(64, 64, 32, 32))   
     # left -> down
     fp_tileset.blt(64, 512, RPG::Cache.tileset(FP_FILE), Rect.new(96, 0, 32, 32))
     # up -> left
     fp_tileset.blt(96, 512, RPG::Cache.tileset(FP_FILE), Rect.new(96, 32, 32, 32))   
     # up -> down
     fp_tileset.blt(0, 512, RPG::Cache.tileset(FP_FILE), Rect.new(96, 64, 32, 32))
     
     0.step(5*32, 32) do |x|
       opacity = 255
       512.step(32*32, 32) do |y|
         fp_tileset.blt(x, y, fp_tileset, Rect.new(x, 512, 32, 32), opacity)
         opacity -= 16
       end
     end   
   end
   
   @fp_tilemap = Tilemap.new(@viewport1)   
   @fp_tilemap.tileset = fp_tileset
   @fp_tilemap.map_data = Table.new($game_map.width, $game_map.height, 3)
   # end Dynamic Footprints additions
   
   update
end

alias fp_dispose dispose
def dispose
   @fp_tilemap.dispose
   fp_dispose
end

alias fp_update update
def update
   @fp_tilemap.ox = $game_map.display_x / 4
   @fp_tilemap.oy = $game_map.display_y / 4
   @fp_tilemap.update
   unless FP_FADE_TIME == 0
     for fp in @footprints
       if fp.time > 1
         fp.time -= 1
         if fp.fade and (FP_FADE_TIME - fp.time) % (FP_FADE_TIME/16.0) < 1
           @fp_tilemap.map_data[fp.x,fp.y,fp.z] += 8
         end
       else
         if not fp.fade
           # begin fading
           fp.time = FP_FADE_TIME
           fp.fade = true
         else       
           @fp_tilemap.map_data[fp.x,fp.y,fp.z] = 0
           @footprints.delete(fp)
         end
       end
     end
   end
   fp_update
end

  def show_footprints(fp_index,fp_x,fp_y)
    # start with first layer, then stack footprints as necessary
    fp_z = 0
    if @fp_tilemap.map_data[fp_x,fp_y,fp_z] == 0
     @fp_tilemap.map_data[fp_x,fp_y,fp_z] = fp_index
    else
     fp_z = 1
     if @fp_tilemap.map_data[fp_x,fp_y,fp_z] == 0
       @fp_tilemap.map_data[fp_x,fp_y,fp_z] = fp_index
     else
       fp_z = 2
       if @fp_tilemap.map_data[fp_x,fp_y,fp_z] != 0
         # delete the existing footprint at these coords from the list
         # (to prevent having multiples)
         for i in @footprints.reverse
           if i.x == fp_x and i.y == fp_y and i.z == fp_z
             @footprints.delete(i)
             break
           end
         end
       end
       @fp_tilemap.map_data[fp_x,fp_y,fp_z] = fp_index
     end
    end
    @footprints.push(Footprint.new(fp_x,fp_y,fp_z))     
  end 

end

#-------------------------------------------------------------------------------

class Game_Event < Game_Character
  alias fp_ge_init initialize
  def initialize(map_id, event)
   fp_ge_init(map_id, event)
   if @event.name.upcase.include?('<NOFP>')
     @fp_id = nil
   end
  end
end

#-------------------------------------------------------------------------------

class Game_Character

alias fp_gc_init initialize
def initialize
   fp_gc_init
   # 1st argument = second last x/y
   # 2nd argument = last x/y
   @last_x = [0,0]
   @last_y = [0,0]
   @fp_id = 0 # default footprints
end

def footprints
   # determine which prints to draw and where
   if terrain_tag(@last_x[1],@last_y[1]) != FP_TAG
     return
   end
   fp_index = nil
   # left
   if @x > @last_x[1]
     if @last_y[1] > @last_y[0]
       fp_index = FP_UR
     elsif @last_y[1] < @last_y[0]
       fp_index = FP_DIRECTIONAL ? FP_DR : FP_RD
     else
       fp_index = FP_LR
     end
   else
     # right
     if @x < @last_x[1]
       if @last_y[1] > @last_y[0]
         fp_index = FP_DIRECTIONAL ? FP_UL : FP_LU
       elsif @last_y[1] < @last_y[0]
         fp_index = FP_DL
       else
         fp_index = FP_DIRECTIONAL ? FP_RL : FP_LR
       end
     else
       # up
       if @y < @last_y[1]
         if @last_x[1] > @last_x[0]
           fp_index = FP_LU
         elsif @last_x[1] < @last_x[0]
           fp_index = FP_DIRECTIONAL ? FP_RU : FP_UR
         else
           fp_index = FP_DU
         end
       # down
       elsif @y > @last_y[1]
         if @last_x[1] > @last_x[0]
           fp_index = FP_DIRECTIONAL ? FP_LD : FP_DL
         elsif @last_x[1] < @last_x[0]
           fp_index = FP_RD
         else
           fp_index = FP_DIRECTIONAL ? FP_UD : FP_DU
         end
       end
     end
   end
   if fp_index != nil
     fp_x = @last_x[1]
     fp_y = @last_y[1]
     $scene.spriteset.show_footprints(fp_index,fp_x,fp_y)
   end
end

  def moveto(x, y)
    @x = x
    @y = y
    @real_x = x * 128
    @real_y = y * 128
    if @fp_id != nil
      # track the last positions
      @last_x = [@x,@x]
      @last_y = [@y,@y]
    end
  end

  def increase_steps
    @stop_count = 0
    # show footprints if enabled for this character
    if @fp_id != nil and $scene.is_a?(Scene_Map)
      footprints
      # track the last positions
      @last_x.shift
      @last_x.push(@x)   
      @last_y.shift
      @last_y.push(@y)   
    end
  end

  def terrain_tag(x=@x,y=@y)
    return $game_map.terrain_tag(x, y)
  end

  def update_jump
    @jump_count -= 1
    @real_x = (@real_x * @jump_count + @x * 128) / (@jump_count + 1)
    @real_y = (@real_y * @jump_count + @y * 128) / (@jump_count + 1)
    if @fp_id != nil and @jump_count == 0
      # track the last positions
      @last_x = [@x,@x]
      @last_y = [@y,@y]     
    end
  end 
 
end

#-------------------------------------------------------------------------------

class Scene_Map
  attr_reader :spriteset

  # only change is a couple of (commented) sections to prevent teleporting
  # within same map from losing footprints when the spriteset is recreated
  def transfer_player
    $game_temp.player_transferring = false
    if $game_map.map_id != $game_temp.player_new_map_id
      $game_map.setup($game_temp.player_new_map_id)
    else # Dynamic Footprints
      fp = @spriteset.footprints
      md = @spriteset.fp_tilemap.map_data
    end
    $game_player.moveto($game_temp.player_new_x, $game_temp.player_new_y)
    case $game_temp.player_new_direction
    when 2
      $game_player.turn_down
    when 4
      $game_player.turn_left
    when 6
      $game_player.turn_right
    when 8
      $game_player.turn_up
    end
    $game_player.straighten
    $game_map.update
    @spriteset.dispose
    @spriteset = Spriteset_Map.new
    if fp != nil or md != nil # Dynamic Footprints
      @spriteset.footprints = fp
      @spriteset.fp_tilemap.map_data = md
    end
    if $game_temp.transition_processing
      $game_temp.transition_processing = false
      Graphics.transition(20)
    end
    $game_map.autoplay
    Graphics.frame_reset
    Input.update
  end
end

#-------------------------------------------------------------------------------

class Footprint
attr_reader :x
attr_reader :y
attr_reader :z
attr_accessor :time
attr_accessor :fade

def initialize(x,y,z)
   @x = x
   @y = y
   @z = z
   @time = FP_BEFORE_FADE_TIME
   @fade = false
end

end

GrimTrigger

If you guys are wondering what I'm drawing my inspiration from, it's mostly from K2.

http://www.youtube.com/watch?v=x_nEl_Y4KUM&feature=related

GrimTrigger

Quote from: Andreavnn on April 27, 2012, 12:36:55 am
No problem, just pay it forward.  8)  Slippery ice and footprints in the snow are always a nice touch too.


I've been curious how the ice slide thing works. As you reach the upper have of the mountain, it gets snowy and increasingly icy, so I could easily have you slide off and fall several hundred feet.

I'm thinking perhaps if I make a status that works like poison, I can have you slowly be harmed from cold, but it only works when you are walking....

Andreavnn

You could make a few events that work on actor touch that increase the actor's speed and move him forwards to the next one that does the same thing, then make a maze so if they pick the wrong ice path they end up falling back down to another map or something.

ShadowPierce

Quote from: GrimTrigger on April 27, 2012, 12:45:34 am
I've been curious how the ice slide thing works. As you reach the upper have of the mountain, it gets snowy and increasingly icy, so I could easily have you slide off and fall several hundred feet.

http://forum.chaos-project.com/index.php/topic,5727.0.html

Quote from: GrimTrigger on April 27, 2012, 12:45:34 am
I'm thinking perhaps if I make a status that works like poison, I can have you slowly be harmed from cold, but it only works when you are walking....

Do you want the poison to deal damage over time? Then:
http://forum.chaos-project.com/index.php/topic,2481.0.html

But if you want it to be done when taking steps, just check the "Slip Damage" checkbox in the Status tab in the database... (If you're using Blizz-ABS, you might want to ask a scripter about this)

;)

Spoiler: ShowHide
Quote from: Blizzard on February 16, 2011, 03:44:48 pmThere you go. It's the proof that SDK is crap. It's incompatible with itself.
3DS Friend Code: ShowHide
1161-0627-9890

GrimTrigger

@ Andreavnn

Ya I was thinking of using the ice that way, so if you mess up a few times, you slip down to a lower ledge. But if you slip near the cliff, you fall off and die.

@ ShadowPierce

Thanks for those

I'm working on customizing the tileset I'm using so that I can have a variety of icy, snow themed mountain graphics to work with. Lots of work on gimp making the standard rock wall and stone parts of tilesets take on icy properties. I'll post them up here for all to use once I finish.

Calintz

if you ask me, it wouldn't make sense to have the status hurt you when moving. it would be much more realistic to have it hurt you when you're standing still as this is when your body is most vulnerable to the elements.

diagostimo

you could have falling rocks to hurt the player or loose rocks around thin paths so if your stood on it to long or dont move fast enough you will fall part way back down the mountain. also you could place variables on thin paths that give the player a chance of slipping of the edge.

GrimTrigger

Quote from: Calintz on April 27, 2012, 06:47:03 pm
if you ask me, it wouldn't make sense to have the status hurt you when moving. it would be much more realistic to have it hurt you when you're standing still as this is when your body is most vulnerable to the elements.


I think I'm going to handle this with a timed challenge, such that once you reach a certain altitude, you need to reach the summit in "x" amount of time (timer event) or you will die, but if you go back down to a lower region, it resets.

GrimTrigger

I'm incorporating as many of these ideas as I can.

I'm also still working on the tileset improvements. Once I finish and check it for mistakes, I'll let you know, and post it in the Resource section if you want to look at it.

GrimTrigger

Here's the first part of the actual mountain:

Spoiler: ShowHide

diagostimo

i like the look of it so far, maybe put some random ledges up the cliff walls, even if you cant get on them, they will make the walls look less blank, i also thought you could have bridges that break, making you fall and you need to repair them or something.

GrimTrigger

Quote from: diagostimo on April 29, 2012, 01:28:02 am
i like the look of it so far, maybe put some random ledges up the cliff walls, even if you cant get on them, they will make the walls look less blank, i also thought you could have bridges that break, making you fall and you need to repair them or something.


Yep, I will certainly do that. In terms of the bridge, I can incorporate that into the map below this one. The premise of this mountain is that it hasn't ever been scaled.....so human objects would kind of break the lore so to speak. Good idea though, I can use that to force the player to keep going, to find a new route, etc. Thanks.

diagostimo

oh yes, you did state that above :P but ye it would be a good idea to force the player to continue forwards :)

djskagnetti

How about a helicopter character set so you can just fly to the top?  Or maybe a Batman-esque grappling hook skill?

GrimTrigger

Quote from: diagostimo on April 29, 2012, 01:57:45 am
oh yes, you did state that above :P but ye it would be a good idea to force the player to continue forwards :)


I have added a new theme to the quests, wherein as the player climbs the mountain, he is confronted by various negative aspects of himself. Essentially, they are magic-produced entities representing the "shadow" parts of the main character, and he must defeat them. It isn't revealled to him that this will happen, and thus the player will be unaware of when another deadly ambush takes place.