Envision, Create, Share

Welcome to HBGames, a leading amateur game development forum and Discord server. All are welcome, and amongst our ranks you will find experts in their field from all aspects of video game design and development.

Day/Night and Clear Lights with Clock

Star

Sponsor

Day/Night and Clear Lights with Clock
version: 2.0
maker built for: RMXP
by: Brewmeister, Gubid, and Star


Description:

Day/Night system that goes from light to dark depending on the time of day. Clear lights that open up the darkness on the map instead of layering over darkness to make it look foggy, making it easier to place events as light sources. You are also able to use your own graphic and with further updates I will have different graphics for different lights. An onscreen clock appears and shows you the current time of day as well. Lag free with default scripts, tested with some but could cause some compatibility issues. Updated versions will include efforts to make compatible with most scripts.

Features:

  • Gradual darkness and brightness change (won't even see it happen)
  • Setting the speed for how long a day lasts (Normal time is set at 24 earth minutes = 24 game hours
  • Switches to make screen dark for caves and screens darker for houses
  • Setting the clock visible or invisible at start-up and by switch
  • Setting the opacity of caves
  • Setting the extra opacity of houses
  • Starting hour and day
  • Current hour and day recorded in variables
  • Stopping the flow of time by starting and stopping the timer in event
  • Restarting the timer at any time will start the timer at the time you left it off at.
  • Lights are checked by putting light100 as a comment in an event
  • Ability to change between standard and military time
  • Onscreen images that show moon or sun

Screenshots:

1932.png

Demo:


Script:

Incase the demo is down.

Code:
 

=begin

---------------------------------------------

DAY_NIGHT_LIGHT_SYSTEM

---------------------------------------------

by 

- Brewmeister

- Gubid

- Star 

---------------------------------------------

=end

 

 

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

# Editing of the Script

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

 

 

# How many real time minutes does it take for a whole gameday to go by?

# Normal time would be 24 minutes so a minute in game goes by every second.

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

GAME_DAY_IN_REAL_MINUTES = 24

 

 

# Current_Game_Day is the variable of the current day

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

CURRENT_GAME_DAY = 15

 

# Day you want Game_Day to start at.

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

INTIALIZE_GAME_DAY = 1

 

 

# If Flickercolon is true the : in the 00:00 flashes every second

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

FLICKERCOLON = true

 

# Hour_variable is the variable of the current hour

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

HOUR_VARIABLE = 9

 

# Inside_Switch is the switch set to make insides darker, not meant for caves

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

INSIDE_SWITCH = 9

 

# Inside_Opacity is the opacity set to increase when entering insides

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

INSIDE_OPACITY = 10

 

# Cave_Switch is the switch set meant for caves

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

CAVE_SWITCH = 11

 

# Cave_Opacity is the total opacity you want when entering caves.  Generally

# Should be set higher than the highest darkness.

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

CAVE_OPACITY = 220

 

# if AM_AND_PM is true, everything is not in military time

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

AM_AND_PM = true

 

# Starthour is the hour the game starts at

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

STARTHOUR = 2

 

# New_hour is the variable that changes the current hour.  You must use this in

# order to change the hour.  It will not tell you the current hour, only

# Hour_variable can tell the current hour.

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

NEW_HOUR = 10

 

# Set this switch to on in order to hide the clock

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

INVISIBLE_TIMER_SWITCH = 10

 

 

 

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

#Bitmap

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

class Bitmap

  def sub(ox,oy,light)

    ox -= (light.width / 2)

    oy -= (light.height / 2)

    for x in 0...light.width

      for y in 0...light.height

        lt_color = light.get_pixel(x,y)

        ds_color = self.get_pixel(x + ox,y + oy)

        ds_color.alpha -= lt_color.alpha

        self.set_pixel(x + ox,y + oy,ds_color)

      end

    end

  end

end

 

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

#end Bitmap

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

 

 

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

#Game_System

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

class Game_System  

  alias init_gme_sys initialize

  def initialize

    init_gme_sys

    @timer_working = true

    @timer_remember = 0

    @timer = STARTHOUR * 2400

  end

def update

    # reduce timer by 1

    if @timer_working

      if @timer > 57600

        @timer = 0

         $game_variables[CURRENT_GAME_DAY] += 1

      else

          if @timer_remember != 0 and @timer != @timer_remember

          @timer = @timer_remember

          @timer_remember = 0

          else

          @timer += (1 * (24/GAME_DAY_IN_REAL_MINUTES))

          end

      end

    elsif @timer_remember != @timer and @timer_working == false

      @timer_remember = @timer

    end

  end

end

 

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

#end Game_System

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

 

 

 

 

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

#Sprite_Timer

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

class Sprite_Timer < Sprite

  def initialize

    super

    self.bitmap = Bitmap.new(120, 20)

    self.bitmap.font.name = "Arial"

    self.bitmap.font.size = 15

    self.x = 620 - self.bitmap.width

    self.y = 0

    self.z = 2000

    @flicker = true

    if $game_variables[CURRENT_GAME_DAY] < INTIALIZE_GAME_DAY

      $game_variables[CURRENT_GAME_DAY] = INTIALIZE_GAME_DAY

      end

    update

  end

  def update

    super

    # Set timer to visible if working

    if $game_switches[INVISIBLE_TIMER_SWITCH] == true

    self.visible = false 

  else

    self.visible = true

    end

        if $game_variables[NEW_HOUR] != 0 and

           $game_variables[NEW_HOUR] != $game_variables[HOUR_VARIABLE]

      $game_system.timer = $game_variables[NEW_HOUR] * 2400

      if  $game_system.timer > 57600

        $game_system.timer % 57600

        $game_variables[CURRENT_GAME_DAY] += 1

      end

      $game_variables[NEW_HOUR] = 0

      end

    # If timer needs to be redrawn

      if $game_system.timer / Graphics.frame_rate != @total_sec and $game_system.timer_working

      # Clear window contents

      self.bitmap.clear

      # Calculate total number of seconds

      @total_sec = $game_system.timer / Graphics.frame_rate

      # Make a string for displaying the timer

      case $game_variables[HOUR_VARIABLE]

      when 0,1,2,3,4,5,18,19,20,21,22,23,24

      moon_and_sun = RPG::Cache.picture("Moon")

      cw = moon_and_sun.width 

      ch = moon_and_sun.height 

      rect = Rect.new(0, 0, cw, ch)

      when 6,7,8,9,10,11,12,13,14,15,16,17

      moon_and_sun = RPG::Cache.picture("Sun")

      cw = moon_and_sun.width 

      ch = moon_and_sun.height 

      rect = Rect.new(0, 0, cw, ch)

    end

      if $game_variables[HOUR_VARIABLE] > 24

      moon_and_sun = RPG::Cache.picture("Moon")

      cw = moon_and_sun.width 

      ch = moon_and_sun.height 

      rect = Rect.new(0, 0, cw, ch)

      end

      if AM_AND_PM == true

        if $game_variables[HOUR_VARIABLE] > 12

          min = (@total_sec - 720) / 60

          sec = @total_sec % 60

        else

          min = @total_sec / 60

          sec = @total_sec % 60

        end

            if $game_variables[HOUR_VARIABLE] > 11 and $game_variables[HOUR_VARIABLE] != 24

              setting = "PM"

            else

              setting = "AM"

            end

            if FLICKERCOLON == true and @flicker == false

            text = sprintf("%02d %02d " + setting, min, sec)

             @flicker = true

          else

            text = sprintf("%02d:%02d " + setting, min, sec)

            if FLICKERCOLON == true

              @flicker = false

            end

          end

      else

        min = @total_sec / 60

        sec = @total_sec % 60

        text = sprintf("%02d:%02d", min, sec)

        end

      if $game_variables[HOUR_VARIABLE] > 12 and AM_AND_PM == true

      $game_variables[HOUR_VARIABLE] = min + 12

      else

      $game_variables[HOUR_VARIABLE] = min

      end

      $sec = sec

      # Draw timer

      rect2 = Rect.new(1, 1, 120, 20)

      self.bitmap.font.color.set(0, 0, 0)

      self.bitmap.draw_text(rect2, text, 1)

      self.bitmap.font.color.set(255, 255, 255)

      self.bitmap.draw_text(self.bitmap.rect, text, 1)

      self.bitmap.blt(90, 0, moon_and_sun, rect)

      end

  end

end

 

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

#end Sprite_Timer

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

 

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

#Game_Event

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

class Game_Event < Game_Character

  attr_reader :erased

  attr_accessor :is_light

  alias init_gm_evnt_lights initialize

  def initialize(*args)

    init_gm_evnt_lights(*args)

    @is_light = false

  end

  alias refresh_gm_evnt_lights refresh

  def refresh

    tmp_page = @page

    refresh_gm_evnt_lights

    if tmp_page != @page

      @is_light = false

    end

  end

end

 

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

#end Game_Event

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

 

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

#Sprite_Nighttime

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

 

class Nighttime < Sprite

  def initialize(x,y)

    super()

    @width = $game_map.width * 32

    @height = $game_map.height * 32

    @lights = {}

    self.x = x

    self.y = y

    self.bitmap = Bitmap.new(@width, @height)

    self.bitmap.clear

    fillnight

  end

  def refresh

    self.bitmap.clear

    create_lights

    fillnight

  end

  

  def create_lights

    for event in $game_map.events.values

      unless event.erased or event.list == nil 

      for i in 0...event.list.size

        if event.list[i].code == 108 #comment

          if event.erased and event.list[i].parameters[0].include?("light")

            @lights.delete(event)

            next

          elsif event.list[i].parameters[0].include?("light")

            size = event.list[i].parameters[0].delete("light").to_i #convert text to interger

            @lights[event] = Light.new(event, size) unless @lights.keys.include?(event)

            event.is_light = true

            next

          end

        end

      end

      #in the event page is changed and it is no longer a light.. remove it. 

      if @lights[event] != nil and event.is_light == false

        @lights.delete(event)

       end

    end

  end

end

  def fillnight

    if $sec == nil

      $sec = 0

    end

    if $game_switches[INSIDE_SWITCH] == true

      extralpha = INSIDE_OPACITY

    else

      extralpha = 0

      end

     case $game_variables[HOUR_VARIABLE] 

    when 0, 1, 23

    startop = 210 - extralpha

    when 2

    startop = 210 - ($sec / 2) + extralpha

    when 3

    startop = 180 - ($sec / 2) + extralpha

    when 4

    startop = 150 - ($sec / 2) + extralpha

    when 5

    startop = 120 - ($sec / 2) + extralpha

    when 6

    startop = 90 - ($sec / 2) + extralpha

    when 7

    startop = 60 - ($sec / 2) + extralpha

    when 8

    startop = 30 - ($sec / 2) + extralpha

    when 9, 10, 11, 12, 13, 14, 15

    startop = 0 + extralpha

    when 16

    startop = 0 + ($sec / 2) + extralpha

    when 17

    startop = 30 + ($sec / 2) + extralpha

    when 18

    startop = 60 + ($sec / 2) + extralpha

    when 19

    startop = 90 + ($sec / 2) + extralpha

    when 20

    startop = 120 + ($sec / 2) + extralpha

    when 21

    startop = 150 + ($sec / 2) + extralpha

    when 22

    startop = 180 + ($sec / 2) + extralpha

  end

  if $game_switches[CAVE_SWITCH] == true

    startop = CAVE_OPACITY

    end

    

    self.bitmap.fill_rect(0, 0, @width, @height, Color.new(0,0,0,255))

    self.opacity = startop

    # Now subtract out the lights

    # Testing with a single light at tile 7,11

    apply_lights

  end

  def apply_lights

    applied_space = []

    for light in @lights.values

      image_sub = RPG::Cache.picture("LightSUB").clone

      image_blt = RPG::Cache.picture("LightBLT").clone

      base_rect = image_sub.rect

      overlapLights = []

      size = (light.size/100.0)

      lwidth = base_rect.width*size

      light_rect = Rect.new(light.x-(lwidth/2), light.y-(lwidth/2), lwidth, lwidth)

      for applied_rect in applied_space

        if light_rect.overlap?(applied_rect)

          overlapLights << light_rect.area_in_overlap(applied_rect)

        end

      end

      #now draw it 

      if overlapLights.size == 0 #no overlap detected.. then just BLT it into the image

        self.bitmap.fill_rect(light_rect, Color.new(0,0,0,0))

        self.bitmap.stretch_blt(light_rect, image_blt, base_rect) 

      else

        self.bitmap.sub(light.x,light.y,image_sub)

      end

      applied_space << light_rect

      image_sub.dispose

      image_blt.dispose

    end

  end

  def update

    if $game_switches[INSIDE_SWITCH] == true

      extralpha = INSIDE_OPACITY

    else

      extralpha = 0

      end

    case $game_variables[HOUR_VARIABLE] 

    when 0, 1, 23

    self.opacity = 210 - extralpha

    when 2

    self.opacity = 210 - ($sec / 2) + extralpha

    when 3

    self.opacity = 180 - ($sec / 2) + extralpha

    when 4

    self.opacity = 150 - ($sec / 2) + extralpha

    when 5

    self.opacity = 120 - ($sec / 2) + extralpha

    when 6

    self.opacity = 90 - ($sec / 2) + extralpha

    when 7

    self.opacity = 60 - ($sec / 2) + extralpha

    when 8

    self.opacity = 30 - ($sec / 2) + extralpha

    when 9, 10, 11, 12, 13, 14, 15

    self.opacity = 0 + extralpha

    when 16

    self.opacity = 0 + ($sec / 2) + extralpha

    when 17

    self.opacity = 30 + ($sec / 2) + extralpha

    when 18

    self.opacity = 60 + ($sec / 2) + extralpha

    when 19

    self.opacity = 90 + ($sec / 2) + extralpha

    when 20

    self.opacity = 120 + ($sec / 2) + extralpha

    when 21

    self.opacity = 150 + ($sec / 2) + extralpha

    when 22

    self.opacity = 180 + ($sec / 2) + extralpha

    end

      if $game_switches[CAVE_SWITCH] == true

    startop = CAVE_OPACITY

    end

    end

end

class Rect

  def overlap?(rect)

    corners = []

    corners << [rect.x, rect.y] #UL

    corners << [rect.x+rect.width, rect.y] #UR

    corners << [rect.x+rect.width, rect.y+height] #LR

    corners << [rect.x, rect.y+height] #LL

    for corner in corners

      if corner[0].between?(self.x, self.x+width) and corner[1].between?(self.y, self.y+height)

        return true

      end

    end

    return false

  end

  def area_in_overlap(rect)

    return rect

  end

end

class Light

  def initialize(event, size)

    @event = event

    @size = size

  end

  def size

    return @size

  end

  def x

    return @event.real_x/4 + 16

  end

  def y

    return @event.real_y/4 + 16

  end

end

 

 

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

#end Sprite_Nighttime

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

 

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

#Spriteset_Map

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

class Spriteset_Map

  alias init_spr_map_lights initialize 

  def initialize

    # Make nighttime sprite

    @nighttime = Nighttime.new(0,0)

    @nighttime.z = 2000

    init_spr_map_lights

    @nighttime.refresh

    @map_idd = $game_map.map_id

  end

   alias dns_dispose dispose

   def dispose

     dns_dispose

     @nighttime.dispose

   end

  alias upd_spr_map_lights update

  def update

    upd_spr_map_lights 

    # Update nighttime sprite

    @nighttime.ox = $game_map.display_x / 4

    @nighttime.oy = $game_map.display_y / 4

    if @hour_day != $game_variables[HOUR_VARIABLE]

      $game_map.refresh

      @hour_day = $game_variables[HOUR_VARIABLE]

      end

    if @map_idd != $game_map.map_id

      @nighttime.refresh

      @map_idd = $game_map.map_id

      end

    @nighttime.update

  end

end

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

#end Spriteset_Map

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

Images:

Incase demo is down

Sun.png

Moon.png

LightSUB2.png

LightSUB.png

LightBLT.png

light_sub_160.png

Instructions:

Place above main

in events with lights, make a comment that says "light" plus the size of the radius of the light. The normal size is 100 for bigger, use bigger numbers, smaller, smaller numbers. For example a normal light is "light100"

Terms and Conditions:

Free to use in any project, please give credit where it is due. Credit goes to Brewmeister, Gubid and Star
 

regi

Sponsor

Excellent stuff! I especially like the light system, it's just so much cleaner subtracting darkness than overlaying light with brightness. Is there anyway to isolate that feature/stand-alone?

And a comment on scripting: I believe it's a good habit to enclose variables within a class/module of some sort, rather than just hanging loosely in the Interpreter class, no?
 
I told you in the working thread that I like this script a lot, and I'm glad you did make it a seperate thread now that labels it as a script instead of a request topic. Again, glad to see that something this cool came out of a request thread - not too common!

As for the script itself... there's a few things that make me twitch throughout the whole thing. Before that, let me ask you to put your next script in a single tag instead of many, for the sole reason that with neat scripting style, the individual scripts are distinguishable by scrolling through anyway, and looking through it it so much easier - nevermind copypasting it. Also, the [ rgss ] tag is generally cooler, but as it's a submission, that's not the most important thing.
I gotta say once more that I don't really fancy the bunch of constants. Not going into detail that much, but when a variable is only used once, it really shouldn't be a constant.
The scripting style varies a lot throughout the thing... especially as far as commenting goes. That surely is because you worked on it with three people, but yeah... shouldn't be too much hazzle to make it nice and shiney now that you got a final product.
 
 
@regi: I think what you're looking for is this method:[rgss]class Bitmap
  def sub(ox,oy,light)
    ox -= (light.width / 2)
    oy -= (light.height / 2)
    for x in 0...light.width
      for y in 0...light.height
        lt_color = light.get_pixel(x,y)
        ds_color = self.get_pixel(x + ox,y + oy)
        ds_color.alpha -= lt_color.alpha
        self.set_pixel(x + ox,y + oy,ds_color)
      end
    end
  end
end
[/rgss]
 

Star

Sponsor

Just so you know, that a lot of that stuff went over my head. I'm just getting used to scripts now and a lot of it is still new to me. This thing came together because three people worked on it. If it were me alone, the lighting wouldn't be there of course. Everything else I handled mostly. That's why it looks like an amateur worked on it. Sadly, I sometimes rule "Things are working now" over "things are working now and it looks clean" because first of all, I don't know how to make it look that way.

I can put everything into one script effortlessly too

I don't understand what you mean by the bunch of constants? Or by variable only being used once.

Also regi, what do you mean by variables hanging loosely, you lost me there.

I'm sure there will be further updates to make it perfect. I still wanna make a weather script in there too
 
By "bunch of constants", I mean this:
Code:
#-----------------------------------

# Editing of the Script

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

 

 

# How many real time minutes does it take for a whole gameday to go by?

# Normal time would be 24 minutes so a minute in game goes by every second.

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

GAME_DAY_IN_REAL_MINUTES = 24

 

 

# Current_Game_Day is the variable of the current day

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

CURRENT_GAME_DAY = 15

 

# Day you want Game_Day to start at.

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

INTIALIZE_GAME_DAY = 1

 

 

# If Flickercolon is true the : in the 00:00 flashes every second

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

FLICKERCOLON = true

 

# Hour_variable is the variable of the current hour

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

HOUR_VARIABLE = 9

 

# Inside_Switch is the switch set to make insides darker, not meant for caves

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

INSIDE_SWITCH = 9

 

# Inside_Opacity is the opacity set to increase when entering insides

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

INSIDE_OPACITY = 10

 

# Cave_Switch is the switch set meant for caves

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

CAVE_SWITCH = 11

 

# Cave_Opacity is the total opacity you want when entering caves.  Generally

# Should be set higher than the highest darkness.

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

CAVE_OPACITY = 220

 

# if AM_AND_PM is true, everything is not in military time

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

AM_AND_PM = true

 

# Starthour is the hour the game starts at

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

STARTHOUR = 2

 

# New_hour is the variable that changes the current hour.  You must use this in

# order to change the hour.  It will not tell you the current hour, only

# Hour_variable can tell the current hour.

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

NEW_HOUR = 10

 

# Set this switch to on in order to hide the clock

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

INVISIBLE_TIMER_SWITCH = 10
That is basically a piece of code that - judging it by performance only - is unlimited times inefficient; simply because it doesn't do anything that couldn't be done easier otherwise, and takes additional resources to do that. Now you may argue about practicability, and again, I need to say that I'm the only person in these forums with this opinion, but... I think having the user of the script search for the number they want to change directly in the script will not keep too many people from changing it, and if it does, it's their damn fault for wanting fork-it-over scripts. Worst effect it could have is people actually learn some scripting in the process, and since when is that a bad thing ^^
But yeah, I'm aware of the fact that as reasonable as that may sound, Trick and Seph and whoever all did the constant way, and I'm not quite under the glorified spotlight they had... still, I'm not getting tired of mentioning it :D
 

regi

Sponsor

My comment was basically the same as BlueScope's. It's great that you're trying something new, but you can always improve! Generally you want to keep your variables in a class or module for organizational purposes. Merging everything in one script might be a good idea, too, since they're not too lengthy.
 

Star

Sponsor

BlueScope":is0b2pzq said:
That is basically a piece of code that - judging it by performance only - is unlimited times inefficient; simply because it doesn't do anything that couldn't be done easier otherwise, and takes additional resources to do that. Now you may argue about practicability, and again, I need to say that I'm the only person in these forums with this opinion, but... I think having the user of the script search for the number they want to change directly in the script will not keep too many people from changing it, and if it does, it's their damn fault for wanting fork-it-over scripts. Worst effect it could have is people actually learn some scripting in the process, and since when is that a bad thing ^^
But yeah, I'm aware of the fact that as reasonable as that may sound, Trick and Seph and whoever all did the constant way, and I'm not quite under the glorified spotlight they had... still, I'm not getting tired of mentioning it :D
So you're saying that making it easier for people to change how the script works which effectively makes it more marketable and convenient for those not so well trained in intelligence but have a strong desire to make an RM game, is inefficient and forcing people to learn scripts that I don't even halfway understand yet is a good thing?

In my defense, I learned scripting and how to script, a little bit by trial and error and seeing what other people do in their scripts to do things and piece things together to make happen what I want to happen. I don't even know what all the terms mean, sadly. I want to learn more and hopefully I will. To prove my point, I have no idea what Alias does. I tried looking it up today with no justice. My guess is that it allows you to call a method when a similar method is called under the same class without overwriting the previous. If this is true, I can probably make an alias for sprite_timer and create it's own class without overwriting previous ones. (not that people should be using timer scripts with this, that's ridiculous.
 
It's not really that inefficient, only slightly more than encapsulating the variables in the individual classes. The constants (most of them) get used by multiple classes. Since the main class is going to be instantiated during most of the game, you wouldn't save a whole lot other than occasionally having those variables cleared from memory when the object goes out of scope, only to be re-declared as soon as another map is created.

The benefit of making it easier for a non-scripter, I think, far outweighs the tiny bit of inefficiency.
Don't get me wrong, some of the engineering software I work with is 5-10 million lines of code and efficiency is crucial.

I think it's a little arrogant to take the attitude that if you can understand & navigate the scripts that everyone else should have to.

Trick & Seph used Constants appropriately given the nature of the programs they wrote. They were intended for amateur gamemakers
to be able to install, configure & use quickly & simply so they could concentrate on their game design without having to learn programming.

Essentially, to make it easier. Same reason you asked for all of the scripts in one code tag. :biggrin:

There are a lot of young (and not so young) people just starting out in the field of game-making who have grand visions & are overwhelmed
enough by the amount of work that goes into building a game. I, for one, don't want to be the one to discourage them. Some of them will
eventually learn to program while others never will. They might become experts at graphics, or screenplay, or conceptual design.


@Star, alias is just that, an "Alias" (another name for something)
Examples should be written

class Myclass
alias call_the_original_update update # rename the original update method defined in the default scripts, "call_the_original_update"

def update # redefine "update". Now any other object that calls this classes update method calls this one, not the one defined above
call_the_original_update #first, call the original update
@hp = 0 # basically, append this command to the end of the original update method
end
end


Pretty much the same as adding your new statement to the end of the original method, without having to edit the default scripts.

TTFN
 
Relax, guys... that's why I said it's my opinion. When I started using RPG Maker, I didn't know anything about scripting. I was like 10yo or something. And yet, for some reason, when I wanted to change something script-wise, I always found it. Might've taken me a second or two longer than if I would've just asked, but I found it. And I guess it did make me learn the whole thing after all, so that's where I come from.
And I'm aware that there's software where it's more vital to have an efficient code base. Thing is, why wouldn't you try to go for efficiency whereever you can? You're not driving all the way to work in first gear just because your car would survive it, do you?
Well, it's just my opinion. And the last thing I meant was trying to call the script bad because of that.
 
I'm relaxed. :scruff:

Yeh, I learned the same way. But I don't expect everyone else that might use this stuff to be programmers.

There are 2 different types of scripting, generally. 1) Scripting for scripters (SDK, MACL, Bitmap extensions, etc.) 2) Scripting for game developers that don't program. (Plug-n-play, "Super-Simple", etc..)

If you look at the few scripts I've published, you'll see I made some 'compromises' to make them as simple as possible for the "customer".
In fact, I always try to find a solution that allows the user to use the GUI to do what they need to do. (e.g. use 'terrain' to define an area instead of a hash in the script).

why wouldn't you try to go for efficiency wherever you can?

If you're learning to be a professional programmer, you would. It's really good to get yourself in the habit of ALWAYS looking for more efficient ways of doing things. If you're teaching someone to program, absolutely!
On the contrary, if you're creating something for non-programmers to use, in this case API programs that need some configuration, why wouldn't you go the extra step & make it as 'user-friendly' as possible when the difference in performance is negligible?

Seph & I spent an afternoon a few yrs ago doing a battery of 'stress tests' on methods in the SDK, and some other 'graphics' related methods sparked by a few similar complaints as yours, to measure the differences in computation time, and in most cases the differences were so minute they were 'inconclusive'.

You said, "...a few things that make me twitch" and "...is unlimited times inefficient", but the only inefficiency you pointed out was the use of Constants.
If you care to point out something you believe is truly inefficient, we're all ears. The nature of the program; representing light more accurately by subtracting from the darkness -vs- adding 'white' which makes the result look hazy is inherently demanding on the processor. While the methods we chose to use are pretty fast, if you think there's a better way we certainly want to hear it. e.g. the subtraction methods. The only thing I can think of is to extend the bitmap methods using a compiled .dll instead of interpreted code. I'm sure there would be a measurable difference.

TTFN
 
I assume it's just a matter of different perspective... in my opinion, everyone working on a game should at least have a slight idea of what's going on. For the relatively small amount of people that know how to script and make games (and not just scripts; you know what I mean), there's a lot of people who's project threads basically consist of a number of scripts they took from somewhere. While that is a different issue to discuss, I feel people should at least have a slight glimpse of an idea. I'm not trying to force them, but seriously, making games without knowing code is not more than putting resources together. Now I'm not saying that's a bad thing, but personally, I don't think anyone gets great games out of a habit such as that. (just as people who only know scripting usually have comparetively worse graphics or storyline).
And just to clarify it, with "unlimited times inefficient" I meant that using a constant for a single-used value just means that there's a (technically) redundant call every time the script is executed.


As far as improving goes, I've already checked out the methods you posted in the working thread. Personally, I suck at math, so I probably couldn't point out anything even if there was something... so yeah, sorry to not be of any help on that end.

What I can suggest is that you might want to alter the method of determining caves, houses, ... maybe a thing in the map name, however that's not prone to failure.
I think using a variable instead would be better - instead of setting houses and caves, set the variable to the desired amount of opacity change, saving three to four constants in the process besides :p That'd allow for a dynamic, completely accessible control and might even enable stuff like caves that get darker the further you go into them (think on player touch events that change that opacity level). Might look pretty cool!
 

Taiine

Member

There seems to be a bug with the script not updating the light sources when you are on the map.

For example in the demo. If you went into the home and back outside during the day, and waited around until night, none of the light sources update to display. That is until you leave the map and come back. Same for inside the home if you sit and wait.

They also don't update if your out at night and wait for day again until you leave and come back.
 
We have been taught (gammaking university) that we should never put fixed numbers into our programs and should always put them out as changeable constraints. Though that is different, I guess, because in C++ it's compiled not interpreted, so our constraints can be done as preprocessor find and replace doodahs.

This is a great script though and hopefully will fix the trend of "lights over light" that people seem to like. (Light sources don't block vision, they enhance it!)
 

Star

Sponsor

Taiine":1ujwxuwa said:
There seems to be a bug with the script not updating the light sources when you are on the map.

For example in the demo. If you went into the home and back outside during the day, and waited around until night, none of the light sources update to display. That is until you leave the map and come back. Same for inside the home if you sit and wait.

They also don't update if your out at night and wait for day again until you leave and come back.
Thanks for finding this for me. The problem lies within not being able to determine what a light is and updating it properly, I figured out a solution but it causes a giant lag for a short second at an hour of the day which is annoying in general. Will have to figure out a better solution later. For now, I've updated the demo to have events where things remain comment:light100 the whole time, it's not like you can tell they are lights during the day if there's no darkness being added. And even if there was, it still wouldn't show. We'll just use that as a workaround for now, till I come up with a better solution.

@Wyatt What's a fixnum? and a Changeable constraint? I haven't gone to any university or anything I'm only good at math.
Show me what you mean and lets see if I can't grasp it.

BlueScope":1ujwxuwa said:
Personally, I suck at math, so I probably couldn't point out anything even if there was something...
I'm afraid this script wouldn't be here today if it wasn't for math, god I love math, it's the multi-language of all cultures.

I updated the script and cleaned it up a bit using a few things. I was also thinking of separating the "settings" part of the script and making it to where you could remove it and the script would still function.

Meaning
if HOUR_VARIBLE == nil
HOUR_VARIBLE = 9
end

etc.
 

Taiine

Member

That works fine, really I see no issues yet as to why they can't just stay on.
This is likely to make it into my game, it's by fare one of the better day/night systems I've found, and being able to add lighting as well? extra bonus there.

Though with events not updating as time changes unless you change maps, it could be tricky if I wanted a npc only showing up say at night or such. mm..
 

Star

Sponsor

Its not that events weren't updating. It was the script wasn't updating when the lights came on at that time. But when I put it in the script to fix it, it causes a one second jolt of lag which is not exceptable in my book. Events should still update normally even if our script wasn't there. Alternatively, if you want to be sure they do, under spriteset map class add this code to the update method

if @hour_day != $game_variables[HOUR_VARIABLE]
$game_map.refresh
@hour_day = $game_variables[HOUR_VARIABLE]
end

edit: I just realized something with my own script that Gubid added, you can change the size of the light by changing 100 to bigger number or smaller number.
 
So, I found a way to allow this to be much faster. It however is not as exact either, but I think with a couple of modifications it wouldnt matter. I do plan at some point to make it smarter by writing my own function in C to do what I need, but until then this should work.

Now we just need to update this script to:
1. Allow moving lights (since it wont be uber slow now)
2. Work with VX

Yep, its gonna be da bling!

Updated Demo with some extras for raster operations: http://www.mediafire.com/?u92cfybjbxlciwh
 
Sorry for the necropost but I am at wit's end..

First off, let me just say this is an amazing script. I am thoroughly impressed with everything it sets out to do! But I am having some difficulties with it. I can get the game to load the script fine and see the light sources I placed until I load a map with an event that requires a variable and/or switch to activate the event (which is like every map.. lol).

When I do that I get this error: "Script 'DNS' line 296: NoMethodError occurred. undefined method 'size' for nil:NilClass"

This totally cripples my game and makes it unplayable :(... That's no good because this is the best script I've seen lol.. It fits perfectly in my game. I've already checked to see if it was a script conflict and there was no problem there. So I wondering what I'm doing wrong and if there is any way to remedy this problem? I desperately want to use this script its too good to pass up.
 

Thank you for viewing

HBGames is a leading amateur video game development forum and Discord server open to all ability levels. Feel free to have a nosey around!

Discord

Join our growing and active Discord server to discuss all aspects of game making in a relaxed environment. Join Us

Content

  • Our Games
  • Games in Development
  • Emoji by Twemoji.
    Top