• All, Gmail is currently rejecting messages from my host. I have a ticket in process, but it may take some time to resolve. Until further notice, do NOT use Gmail for your accounts. You will be unable to receive confirmations and two factor messages to login.

Manual Updates

Can someone add some aiattack informations like this:
aiattack {val} : define a.i. attack style for this entity. Accepted values : normal, always, noattack.
"normal" is just normal, default a.i. attack style.
"noattack" is as the name implies (default for some types of entity, such as obstacle IIRC)
"always" only bias the chance of initiating an attack to 1 (= always initiate attack)
Maybye it's an old command that is replaced by aggression {val} but it's always interessing to know more about it :) .
 
What exactly do you want added? That's already a word for word explanation of what it does.
 
I only find it as a property name in the manual -> Entityproperty but not that this can be used in the entity header too with these 3 other values.
 
@O Ilusionista,

could you add a warning on the manual indicating that levels need a background?
it seems that if there is no background file, everything works fine except there are no shadows. it took me a while to figure it out by eliminating stuff until i realized the only thing left was to re-activate the background (it was replaced by Fglayers & bglayers)- Also , if you attempt to use a transparent tiny png.file as a background, the engine slows down & crashes....

Also , the manual says that fglayers do not support {watermode}, {amplitude}, {wavelength} and {wavespeed} - i am thinking this is no longer the case?

and last but not least, it seems that the engine does not support more than 5 entities "stacked" one on top of the other using different "setlayer" values.
I was attempting to make a "multilayered" panel sprite decoration using 6 entities on the same coordinates, but
after 5 entities/sprites, sprites that are supposed to be behind load in front of others & if you reload the level the stack changes and others "skip" the line -
is there any way to modify this?
 
hi @oldyz manual updates were suposed to work after any suggestion is confirmed to be true by the dev team, and I can see some problems on your post.

- the manual says you need a background (if I am not mistaken)
- you have no shadows because...since you don't use a background, the engine will display a black screen
- make no sense to use tiny transparent.png on background - the manual even stated that background is bottom layer with no transparency. Plus, tiny images on background makes no sense too.

About the multilayered thing, It would be better if @DCurrent could check if this affirmation is true.
 
@O Ilusionista -

indeed, the manual does recommend against using transparency on the background image because of processor intensive issues, but after checking with search function, there is no explicit warning about not using it

i would edit the thing like this:
bglayer {path} {xratio} {zratio} {xposition} {zposition} {xspacing} {zspacing} {xrepeat} {zrepeat} {transparency} {alpha} {watermode} {amplitude} {wavelength} {wavespeed} {bgspeedratio}

background {path} {xratio} {zratio} {xposition} {zposition} {xspacing} {zspacing} {xrepeat} {zrepeat} {transparency} {alpha} * see Warnings



  • * WARNING levels need to feature a background, otherwise shadows will not show up in 16/32 bit mode
  • * WARNING Don't use transparency for background.
  • These 2 command have same effect which is create a background layer with the image at {path}.
  • The image used must have a width which is a multiple of 4 (ex. 4, 200, 128, not 3, 202, 130).
  • The height could be any size but make sure it matches screen resolution to avoid void background areas.
  • Just like any image used by OpenBoR, background and bglayers must use paletted images. In 8 bit colourdepth (default), it must use same palette as 'background' (see above). In 16/32 bit, it can use different palette
  • Beware though, if bglayers use different palette than background, 'palette' command (see below) won't work
  • The graphic automatically repeats if the stage is longer than the background.
  • Layers are drawn in the order they are defined; currently, up to 100 are supported. However 'background' sets the bottommost layer while 'bglayer' sets layers in front of it.
  • {xratio} and {zratio} determine how fast the layer will scroll; 1 = same scroll speed as panel, 0.5 = same as background, any float value can be used for them. It works also in levels with direction up or down but the layers will autoscroll just like background.
  • {xposition} and {zposition} determine where the top left corner of the first layer will be. {xposition} is measured from left for direction right levels, from right for direction left, from bottom for direction up and from top for direction down levels.
  • {xspacing} and {zspacing} determine how how much blank space there will be between repeated layers. Only works if you set repeating layers (see below).
  • {xrepeat} and {zrepeat} determine how many times the image will repeat. Setting 0 will make layer not drawn at all (it will become palette holder). Setting -1 will make it repeat forever
  • use 1 for {transparency} to have your transparency color not appear. Remember that this is more processor intensive, so don't use it on images that won't benefit from it. And don't use it for 'background' too since it's the bottommost layer. In 16/32 bit mode, pure black color will be used instead.
  • ......
reguarding the setlayer stack limits, i can provide the files if the team needs to check it out,.
 
@O Ilusionista -

indeed, the manual does recommend against using transparency on the background image because of processor intensive issues, but after checking with search function, there is no explicit warning about not using it
it does, right from the manual:

Graphics​


"Layers are drawn in the order they are defined; currently, up to 100 are supported. However 'background' sets the bottommost layer while 'bglayer' sets layers in front of it."
"{alpha} will display the image using alpha transparency. It works just like for entities. Possible values are 0 to 6. Don't use it for background too."


If BACKGROUND is the bottommost layer - in other words, nothing can be behind it - and it even states you should not use alpha for it (which is an overkill, because it was already explained), its more than obvious that applying transparencie would be a bad idea :)

Honestly, I don't think the manual should not be idiot proof (not calling you idiot btw). But after having explained that something is at the lowest level and that nothing is behind it and that transparency should not be used in this (which should not even need to be explained anymore), I think that the person will not be able to work with the engine, being very honest.
 
I can't go into details right now because I have a deadline in the morning to deal with. Here's the short version:

  • fglayers support pretty much everything. All water modes, alpha transparency, quakes, and even a neon effect. The one and only restriction is that to use the native neon effect and palette swapping, a layer has to match the global palette.
  • The background is not strictly required, but it controls the global palette. I tend to use a filler and design my layers as the visual background.
  • Turning off layer transparency when level design permits does save some CPU. You don't need to try and build around this, but when you have an opportunity, take advantage of it. That said, you should try to design layers that don't have huge areas of transparency the engine can't auto trim.
  • There's absolutely no such thing as a "stack limit". There's a hard code limit of 5,000 entities on screen at one time, and a practical limit of ~1,000 before most platforms loose too much framerate. That's it, that's all. You can even have multiple entities on the exact same layer, and then sort them with their sortid property (only available to script). This is also how you should handle binds.
 
I can't go into details right now because I have a deadline in the morning to deal with. Here's the short version:

  • fglayers support pretty much everything. All water modes, alpha transparency, quakes, and even a neon effect. The one and only restriction is that to use the native neon effect and palette swapping, a layer has to match the global palette.
  • The background is not strictly required, but it controls the global palette. I tend to use a filler and design my layers as the visual background.
  • Turning off layer transparency when level design permits does save some CPU. You don't need to try and build around this, but when you have an opportunity, take advantage of it. That said, you should try to design layers that don't have huge areas of transparency the engine can't auto trim.
  • There's absolutely no such thing as a "stack limit". There's a hard code limit of 5,000 entities on screen at one time, and a practical limit of ~1,000 before most platforms loose too much framerate. That's it, that's all. You can even have multiple entities on the exact same layer, and then sort them with their sortid property (only available to script). This is also how you should handle binds.
thanks @DCurrent

i found that the "setlayer" Bug happens rarely now - i don't know if the lack of background i had affected it in some capacity and made it more frequent - but
it does happen from time to time and it has the tendency to occur if i do an "special" attack before the entities spawn.

i am stacking them like this:

Code:
spawn peepL7
flip 1
coords 575 155
at 837

spawn peepL6
flip 1
coords 575 155
at 837

spawn peepL5
flip 1
coords 575 155
at 837

spawn peepL4
flip 1
coords 575 155
at 837

spawn peepL3
flip 1
coords 575 155
at 837

spawn peepL2
flip 1
coords 575 155
at 837

spawn peepL1
flip 1
coords 575 155
at 837

spawn peepL0
flip 1
coords 575 155
at 837

and entity peepL0 and peepL3 or L2 do not appear from time to time - sometimes at first load, sometimes after quiting the game & re-starting or re-loading the level-

i will try to use spawnbind instead later on and see if i get a similar bug -

@O Ilusionista
The main issue was the lack of shadow because of the lack of background - no background , no shadow (except for custom shadows in the entity.txt files - if you use those i think people might never notice)
the reasons why i deleted/de-activated the background was because it was "not necessary" and figured i could save some memory without it - but turns out shadows depend on it.

about idiot proofing the manual - when it comes to memorizing technical stuff i have had big problems in the past 10 years and have to use notes constantly because i cant seem to recall information easily after 2 or 3 months if i don't use it -

Another thing:
Using Gimp, some images get optimized to 16 color palettes & openbor crashes with them for some reason - i have to force Gimp to save them as 256 colors with the use of a gradient fill layer and then exporting them -
 
Manual updates - 2023.12.04

  • Added findtitem and pickup functions
  • Fixed information about Bikers offscreenkill
  • Added more information about rider position and defautl palette
  • Added Steamer offscreenkill default value
  • Added missing parameters on frontpanel
  • Added many missing parameters on Background (xratio, zratio, etc)
  • Added missing parameters on Fglayer
  • Fixed information on Fglayer watermode

Noter: Right now, only the Chronocrash Legacy Manual were edited, as I am waiting DCemulation staff to fix the edit issue.
 
Hey Ilu are you aware of someone having openbor manual in a gui where you can type in command name and results popup , without having to press enter ?
I remember that kinda of search tool for mugen manual.
 
Hey Ilu are you aware of someone having openbor manual in a gui where you can type in command name and results popup , without having to press enter ?
I remember that kinda of search tool for mugen manual.
I think someone made a .CHM file (those Windows help files) long time ago, but I don't see it since long time ago
 
Ok i just did it , you can save this script as bat file and place it next to openbor html file from dcemu "OpenBORManual - DCEmulation.html" is the default filename but you can edit the bat contents, i think it works quite ok and can work with other htmls that are formatted this way so its kinda unversal.

Im plugging it into chronotools as bat

This is a python gui so it needs python installed, it will not work without it, it will also check if you heave library for parsing html files and will download it if you dont, after that it works ok.
Still some quirks of not getting rid of next command after searched one but works ok besides that.

1701985825240.png


Code:
0<0# : ^
'''
@echo off
set script=%~f0
python -x "%script%" %*
exit /b 0
'''
 
import subprocess
import sys

def install(package):
    subprocess.check_call([sys.executable, "-m", "pip", "install", package])

# Install packages
try:
    import tkinter
except ImportError:
    install('tkinter')

try:
    from bs4 import BeautifulSoup
except ImportError:
    install('beautifulsoup4')

try:
    from tkinter import ttk
except ImportError:
    install('ttk')

# Now you can import your packages and run your GUI
import tkinter as tk
from bs4 import BeautifulSoup
from tkinter import ttk

class ManualSearch:
    def __init__(self, root):
        self.root = root
        self.entry_text = tk.StringVar()
        self.entry = tk.Entry(root, textvariable=self.entry_text, font=('TkDefaultFont', 12, 'bold'), fg='red')
        self.entry.pack()
        self.result = tk.Text(root, font=('TkDefaultFont', 12, 'bold'))     # Set the default font to bold
        self.result.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)  # Pack the result Text widget to the left
        self.entry.bind('<KeyRelease>', self.search)

        # Create a frame for the listbox and scrollbar
        self.frame = tk.Frame(root)
        self.frame.pack(side=tk.RIGHT, fill=tk.Y)  # Pack the frame to the right

        # Create a scrollbar
        self.scrollbar = tk.Scrollbar(self.frame)
        self.scrollbar.pack(side=tk.RIGHT, fill=tk.Y)

        # Create a listbox with bold font and blue text
        self.listbox = tk.Listbox(self.frame, yscrollcommand=self.scrollbar.set, font=('TkDefaultFont', 12, 'bold'), fg='red')
        self.listbox.pack(side=tk.LEFT, fill=tk.BOTH)
        self.scrollbar.config(command=self.listbox.yview)

        # Bind the listbox click event to a function
        self.listbox.bind('<<ListboxSelect>>', self.on_select)

        self.load_file()

    def load_file(self):
        try:
            with open('OpenBORManual - DCEmulation.html', 'r', encoding='utf-8') as f:
                contents = f.read()
            self.soup = BeautifulSoup(contents, 'html.parser')

            # Parse the terms from the HTML and add them to the listbox
            terms = [term.text for term in self.soup.find_all('b') if term.text.strip()]
            terms.sort()  # Sort the terms in alphabetical order
            for term in terms:
                self.listbox.insert(tk.END, term)

        except Exception as e:
            print(f"Error loading file: {e}")


    def search(self, event):
        query = self.entry_text.get().lower()  # Convert query to lowercase
        self.result.delete('1.0', tk.END)
        self.result.tag_config('bold', font=('TkDefaultFont', 12, 'bold'))
        self.result.tag_config('red', foreground='red')     # Create a new tag for red text
        self.result.tag_config('bold_red', foreground='red', font=('TkDefaultFont', 12, 'bold'))  # Create a new tag for bold and red text

        found = False
        for term in self.soup.find_all('b'):
            if term.text.lower().startswith(query):     # Convert term to lowercase
                found = True
                self.display_term(term)

        if not found:
            for term in self.soup.find_all('b'):
                if query in term.text.lower():    # Convert term to lowercase
                    self.display_term(term)

    def display_term(self, term):
        # Create new tags for blue and red text
        self.result.tag_config('blue', foreground='blue')
        self.result.tag_config('red', foreground='red')

        # Find the nearest preceding h1 or h2 tag
        h2_category = term.find_previous('h2')
        h1_category = term.find_previous('h1')

        # Check if h1 or h2 tag found and insert it into the result Text widget
        if h2_category and (not h1_category or h2_category.find_previous('h1') == h1_category):
            self.result.insert(tk.END, f'{h2_category.text}\n', 'blue')  # Apply the 'blue' tag

        if h1_category:
            self.result.insert(tk.END, f'{h1_category.text}\n', 'blue')  # Apply the 'blue' tag

        self.result.insert(tk.END, f'{term.text}\n', 'red')  # Apply the 'red' tag

        # Find the next 'ul' tag
        explanation = term.find_next('ul')
        if explanation:
            # Iterate over each 'li' tag within the 'ul' tag
            for li in explanation.find_all('li'):
                self.result.insert(tk.END, f'{li.text}\n\n')

        # Find the next 'p' tag after the 'ul' tag
        next_p = explanation.find_next_sibling('p')
        if next_p:
            self.result.insert(tk.END, f'{next_p.text}\n\n')


    def on_select(self, event):
        # Get the selected term
        selected_term = self.listbox.get(self.listbox.curselection())

        # Set the entry text to the selected term
        self.entry_text.set(selected_term)

        # Trigger the search function
        self.search(None)


root = tk.Tk()
root.title("OpenBOR Manual reference")

# Scale the GUI by a factor of 1
root.tk.call('tk', 'scaling', 1.0)

app = ManualSearch(root)
root.mainloop()
 
Last edited:
Yeah and if you update the manual, just update the html and this search gui will be always up to date cause it just reads html and parses data, if youd like some improvements i might add them, it has what i wanted so im good with how it is now

I might add a downloader to download actual html off website with update button
 
Talking about manual updates, the legacy manual at DCEmulation was moved to here (they added a messaged about it on the page):

I've added a message talking about the discontinued ports at the very start of the manual and pointing to the official github and also a link to a compiled "how to start" which will link back here:

Note to users of older platforms: Dreamcast, GP2X, and Wiz platforms are officially discontinued since build 4453. Therefore, some things may work differently on older ports and any configuration that has a build value greater than 4453 will not work on these platforms.

 
I've added a warning about the new OpenBOR version in the legacy manual OpenBORManual - dreamcast.wiki

MAJOR WARNING: All information contained here was written for version 3 of OpenBOR (up to build 6391). Version 4.0 (build 7530+) of OpenBOR was released with dozens of improvements, but the versions are not compatible with each other - and the PSP port has been officially discontinued.

Given the amount of changes, it no longer makes sense to update this manual - except when it is to correct legacy information.

You can read more information about OpenBOR 4.0 here OpenBOR - Updates

For a more complete manual, I recommend using the Wiki OpenBOR Wiki – Reference manual and guide for OpenBOR.
 
I've added a warning about the new OpenBOR version in the legacy manual OpenBORManual - dreamcast.wiki

FWIW, just about everything in the old manual works exactly as it always did. I worked really hard to keep backward compatibility. That's one of the main reasons 4.0 took so long (and why im not doing that from now on). The only breaks are in script and there's very few of them

Going forward though, it is best to stick with wiki. That's where I'm putting all up to date stuff.

DC
 
Back
Top Bottom