In Progress Lucia's Run

The project is currently under development.
Yeah I know it is not a layer, but an entity - this is why I've suggest to make it to flip randomly :)

Keep the good work, buddy.
 
I love this. And good call on making new sprites for Lucia. I think the characters from Wild Guns are too recognizable.

For years I've been thinking of making something like this, but of course my version would have been way too limited and rudimentary. I'd basically have entities spawn at the edges of the screen and zoom in while they scroll down. Glad to see you tackle this type of gameplay, DC  :)
 
mersox said:

You're one of the best creators around, so that's very high praise. Thank you mersox!

It may be a few more weeks before I can show some progress. I finally got back into updating the engine, and that's where the time to work on my module projects was coming from. I'm still doing bits of it here and there though, so keep an eye out.

DC
 
Damon Caskey said:
mersox said:

You're one of the best creators around, so that's very high praise. Thank you mersox!

It may be a few more weeks before I can show some progress. I finally got back into updating the engine, and that's where the time to work on my module projects was coming from. I'm still doing bits of it here and there though, so keep an eye out.

DC

Thanks DC! That's very kind of you.

I'm very curious to see what's inn store for this this mod, as well as the engine updates  :)
 
nedflandeurse said:
Looks good. also CVS style shading si pretty faster to do (at least for me.)
Considering the small size of sprites the result is pretty good!
I like it.

I missed your feedback nedflandeurse, thank you. I'm not as fast as some, since sprite editing is more of a side skill for me. While I'm here, I should probably note it will be a few more weeks before I can do much. I have a big work project to finish (migrating an 8000 page website to new server and upgrading the code from PHP 5.2 to 8.0). It's been ongoing for a while, but needs done by mid January, so pretty much everything OpenBOR related other than posting in the forum has ground to a halt. Soon as I can I'll be back at it.  :)

DC
 
Hi Damon, I'm just letting some ideas here; I always like the SNES Bastard!! fighting style but I find that this can be better exploited for a boss fight (see at 4:29):
https://www.youtube.com/watch?v=uJDOQntbG3U&t=429s
Extraordinary Maiden Magatsuhi: Second Rite is a shooting style like Space Harrier with a nice lock-on feature (maybe hard to realize in Openbor?):
https://www.youtube.com/watch?v=Iu5Llx_Q3fA
Good luck with your project migrating and I'll follow your progress on this nice Openbor mod ;).

 
I will be glad to test some features in Openbor like this front view in this Contra fangame (starts at 2:38):
https://www.youtube.com/watch?v=_eoV8VGpwM0
or this tunnel in Virtual Bart game on Megadrive (begins at 1:20):
https://www.youtube.com/watch?v=ipUg7urOWMQ
The sensation of speed is really nice here.
 
A bit different, but few years ago, Thinking aout Openbor,
I thought first about a Punch out game...
Then about a game like "The Super Spy"...
Something similar to that 2nd one would not be that hard to code... even for me... ^^
 
Here's a roughing to show OpenBOR generating scrolling, 3D curved surfaces like old school racing games. It's an array of sub-screens (one per scan-line), offset and scaled to produce a simulated raster manipulation. The next step is adding hills and valleys, and a terrain map to control them.

 
I'm revisiting this rasterization because it seems to me to have significant potential that can be exploited in various ways,
particularly for a Road Beat 'em up (which is just one possibility among many).

So I tried it myself with 3-pixel lines raster01 and raster02.png (alternately light gray, dark gray, light green, dark green to give the impression of scrolling)
which I stacked and declared like this:
Code:
name road_line
type none
nomove 1
subject_to_gravity 0
candamage 0
offscreenkill 0
nolife 1
speed 0
shadow 0
health 1
antigrab 1
setlayer 0

anim idle
loop 1
delay 1
offset 0 0
@script
if(getlocalvar("event") == "oncreate")
{
    void self = getlocalvar("self");
    int idx = getentityproperty(self, "map") - 1;
    if(idx < 0) idx = 0;
    if(idx > 89) idx = 89;
    setglobalvar("road_band"+idx, self);
}
@end_script
frame data/chars/road_line/raster01.png

Code:
name road_line2
type none
nomove 1
subject_to_gravity 0
candamage 0
offscreenkill 0
nolife 1
speed 0
shadow 0
health 1
antigrab 1
setlayer 0

anim idle
loop 1
delay 1
offset 0 0
@script
if(getlocalvar("event") == "oncreate")
{
    void self = getlocalvar("self");
    int idx = getentityproperty(self, "map") - 1;
    if(idx < 0) idx = 0;
    if(idx > 89) idx = 89;
    setglobalvar("road_band"+idx, self);
}
@end_script
frame data/chars/road_line/raster02.png

Code:
music data/music/race1.bor
type 1
scrollspeed 0

background    data/bgs/raster_road/background.png
panel        data/bgs/raster_road/background.png
order     a
levelscript data/scripts/road_raster.c

spawn1 240 0

spawn Boss
coords 400 120
at 0

# === RASTERIZED ROAD (90 alternating 5-5 different stripes) ===
spawn road_line
map 1
coords 480 0
at 0
spawn road_line
map 2
coords 480 3
at 0
spawn road_line
map 3
coords 480 6
at 0
spawn road_line
map 4
coords 480 9
at 0
spawn road_line
map 5
coords 480 12
at 0
spawn road_line2
map 6
coords 480 15
at 0
spawn road_line2
map 7
coords 480 18
at 0
spawn road_line2
map 8
coords 480 21
at 0
spawn road_line2
map 9
coords 480 24
at 0
spawn road_line2
map 10
coords 480 27
at 0
spawn road_line
map 11
coords 480 30
at 0
spawn road_line
map 12
coords 480 33
at 0
spawn road_line
map 13
coords 480 36
at 0
spawn road_line
map 14
coords 480 39
at 0
spawn road_line
map 15
coords 480 42
at 0
spawn road_line2
map 16
coords 480 45
at 0
spawn road_line2
map 17
coords 480 48
at 0
spawn road_line2
map 18
coords 480 51
at 0
spawn road_line2
map 19
coords 480 54
at 0
spawn road_line2
map 20
coords 480 57
at 0
spawn road_line
map 21
coords 480 60
at 0
spawn road_line
map 22
coords 480 63
at 0
spawn road_line
map 23
coords 480 66
at 0
spawn road_line
map 24
coords 480 69
at 0
spawn road_line
map 25
coords 480 72
at 0
spawn road_line2
map 26
coords 480 75
at 0
spawn road_line2
map 27
coords 480 78
at 0
spawn road_line2
map 28
coords 480 81
at 0
spawn road_line2
map 29
coords 480 84
at 0
spawn road_line2
map 30
coords 480 87
at 0
spawn road_line
map 31
coords 480 90
at 0
spawn road_line
map 32
coords 480 93
at 0
spawn road_line
map 33
coords 480 96
at 0
spawn road_line
map 34
coords 480 99
at 0
spawn road_line
map 35
coords 480 102
at 0
spawn road_line2
map 36
coords 480 105
at 0
spawn road_line2
map 37
coords 480 108
at 0
spawn road_line2
map 38
coords 480 111
at 0
spawn road_line2
map 39
coords 480 114
at 0
spawn road_line2
map 40
coords 480 117
at 0
spawn road_line
map 41
coords 480 120
at 0
spawn road_line
map 42
coords 480 123
at 0
spawn road_line
map 43
coords 480 126
at 0
spawn road_line
map 44
coords 480 129
at 0
spawn road_line
map 45
coords 480 132
at 0
spawn road_line2
map 46
coords 480 135
at 0
spawn road_line2
map 47
coords 480 138
at 0
spawn road_line2
map 48
coords 480 141
at 0
spawn road_line2
map 49
coords 480 144
at 0
spawn road_line2
map 50
coords 480 147
at 0
spawn road_line
map 51
coords 480 150
at 0
spawn road_line
map 52
coords 480 153
at 0
spawn road_line
map 53
coords 480 156
at 0
spawn road_line
map 54
coords 480 159
at 0
spawn road_line
map 55
coords 480 162
at 0
spawn road_line2
map 56
coords 480 165
at 0
spawn road_line2
map 57
coords 480 168
at 0
spawn road_line2
map 58
coords 480 171
at 0
spawn road_line2
map 59
coords 480 174
at 0
spawn road_line2
map 60
coords 480 177
at 0
spawn road_line
map 61
coords 480 180
at 0
spawn road_line
map 62
coords 480 183
at 0
spawn road_line
map 63
coords 480 186
at 0
spawn road_line
map 64
coords 480 189
at 0
spawn road_line
map 65
coords 480 192
at 0
spawn road_line2
map 66
coords 480 195
at 0
spawn road_line2
map 67
coords 480 198
at 0
spawn road_line2
map 68
coords 480 201
at 0
spawn road_line2
map 69
coords 480 204
at 0
spawn road_line2
map 70
coords 480 207
at 0
spawn road_line
map 71
coords 480 210
at 0
spawn road_line
map 72
coords 480 213
at 0
spawn road_line
map 73
coords 480 216
at 0
spawn road_line
map 74
coords 480 219
at 0
spawn road_line
map 75
coords 480 222
at 0
spawn road_line2
map 76
coords 480 225
at 0
spawn road_line2
map 77
coords 480 228
at 0
spawn road_line2
map 78
coords 480 231
at 0
spawn road_line2
map 79
coords 480 234
at 0
spawn road_line2
map 80
coords 480 237
at 0
spawn road_line
map 81
coords 480 480
at 0
spawn road_line
map 82
coords 480 243
at 0
spawn road_line
map 83
coords 480 246
at 0
spawn road_line
map 84
coords 480 249
at 0
spawn road_line
map 85
coords 480 252
at 0
spawn road_line2
map 86
coords 480 255
at 0
spawn road_line2
map 87
coords 480 258
at 0
spawn road_line2
map 88
coords 480 261
at 0
spawn road_line2
map 89
coords 480 264
at 0
spawn road_line2
map 90
coords 480 267
at 0

90x3 pixels, which gives me a road 120 pixels high. Here's what it looks like on screen in the attached image.
The idea here would be to move each raster band 3 pixels downwards to simulate this effect of movement on the road.

Am I on the right track? Your concept of rasterized roads is so much more advanced (I'm trying to learn by doing it myself) and can you explain how you did it?
 

Attachments

  • bor - 0001.png
    bor - 0001.png
    103.2 KB · Views: 8
I'm revisiting this rasterization because it seems to me to have significant potential that can be exploited in various ways,
particularly for a Road Beat 'em up (which is just one possibility among many).

So I tried it myself with 3-pixel lines raster01 and raster02.png (alternately light gray, dark gray, light green, dark green to give the impression of scrolling)
which I stacked and declared like this:
Code:
name road_line
type none
nomove 1
subject_to_gravity 0
candamage 0
offscreenkill 0
nolife 1
speed 0
shadow 0
health 1
antigrab 1
setlayer 0

anim idle
loop 1
delay 1
offset 0 0
@script
if(getlocalvar("event") == "oncreate")
{
    void self = getlocalvar("self");
    int idx = getentityproperty(self, "map") - 1;
    if(idx < 0) idx = 0;
    if(idx > 89) idx = 89;
    setglobalvar("road_band"+idx, self);
}
@end_script
frame data/chars/road_line/raster01.png

Code:
name road_line2
type none
nomove 1
subject_to_gravity 0
candamage 0
offscreenkill 0
nolife 1
speed 0
shadow 0
health 1
antigrab 1
setlayer 0

anim idle
loop 1
delay 1
offset 0 0
@script
if(getlocalvar("event") == "oncreate")
{
    void self = getlocalvar("self");
    int idx = getentityproperty(self, "map") - 1;
    if(idx < 0) idx = 0;
    if(idx > 89) idx = 89;
    setglobalvar("road_band"+idx, self);
}
@end_script
frame data/chars/road_line/raster02.png

Code:
music data/music/race1.bor
type 1
scrollspeed 0

background    data/bgs/raster_road/background.png
panel        data/bgs/raster_road/background.png
order     a
levelscript data/scripts/road_raster.c

spawn1 240 0

spawn Boss
coords 400 120
at 0

# === RASTERIZED ROAD (90 alternating 5-5 different stripes) ===
spawn road_line
map 1
coords 480 0
at 0
spawn road_line
map 2
coords 480 3
at 0
spawn road_line
map 3
coords 480 6
at 0
spawn road_line
map 4
coords 480 9
at 0
spawn road_line
map 5
coords 480 12
at 0
spawn road_line2
map 6
coords 480 15
at 0
spawn road_line2
map 7
coords 480 18
at 0
spawn road_line2
map 8
coords 480 21
at 0
spawn road_line2
map 9
coords 480 24
at 0
spawn road_line2
map 10
coords 480 27
at 0
spawn road_line
map 11
coords 480 30
at 0
spawn road_line
map 12
coords 480 33
at 0
spawn road_line
map 13
coords 480 36
at 0
spawn road_line
map 14
coords 480 39
at 0
spawn road_line
map 15
coords 480 42
at 0
spawn road_line2
map 16
coords 480 45
at 0
spawn road_line2
map 17
coords 480 48
at 0
spawn road_line2
map 18
coords 480 51
at 0
spawn road_line2
map 19
coords 480 54
at 0
spawn road_line2
map 20
coords 480 57
at 0
spawn road_line
map 21
coords 480 60
at 0
spawn road_line
map 22
coords 480 63
at 0
spawn road_line
map 23
coords 480 66
at 0
spawn road_line
map 24
coords 480 69
at 0
spawn road_line
map 25
coords 480 72
at 0
spawn road_line2
map 26
coords 480 75
at 0
spawn road_line2
map 27
coords 480 78
at 0
spawn road_line2
map 28
coords 480 81
at 0
spawn road_line2
map 29
coords 480 84
at 0
spawn road_line2
map 30
coords 480 87
at 0
spawn road_line
map 31
coords 480 90
at 0
spawn road_line
map 32
coords 480 93
at 0
spawn road_line
map 33
coords 480 96
at 0
spawn road_line
map 34
coords 480 99
at 0
spawn road_line
map 35
coords 480 102
at 0
spawn road_line2
map 36
coords 480 105
at 0
spawn road_line2
map 37
coords 480 108
at 0
spawn road_line2
map 38
coords 480 111
at 0
spawn road_line2
map 39
coords 480 114
at 0
spawn road_line2
map 40
coords 480 117
at 0
spawn road_line
map 41
coords 480 120
at 0
spawn road_line
map 42
coords 480 123
at 0
spawn road_line
map 43
coords 480 126
at 0
spawn road_line
map 44
coords 480 129
at 0
spawn road_line
map 45
coords 480 132
at 0
spawn road_line2
map 46
coords 480 135
at 0
spawn road_line2
map 47
coords 480 138
at 0
spawn road_line2
map 48
coords 480 141
at 0
spawn road_line2
map 49
coords 480 144
at 0
spawn road_line2
map 50
coords 480 147
at 0
spawn road_line
map 51
coords 480 150
at 0
spawn road_line
map 52
coords 480 153
at 0
spawn road_line
map 53
coords 480 156
at 0
spawn road_line
map 54
coords 480 159
at 0
spawn road_line
map 55
coords 480 162
at 0
spawn road_line2
map 56
coords 480 165
at 0
spawn road_line2
map 57
coords 480 168
at 0
spawn road_line2
map 58
coords 480 171
at 0
spawn road_line2
map 59
coords 480 174
at 0
spawn road_line2
map 60
coords 480 177
at 0
spawn road_line
map 61
coords 480 180
at 0
spawn road_line
map 62
coords 480 183
at 0
spawn road_line
map 63
coords 480 186
at 0
spawn road_line
map 64
coords 480 189
at 0
spawn road_line
map 65
coords 480 192
at 0
spawn road_line2
map 66
coords 480 195
at 0
spawn road_line2
map 67
coords 480 198
at 0
spawn road_line2
map 68
coords 480 201
at 0
spawn road_line2
map 69
coords 480 204
at 0
spawn road_line2
map 70
coords 480 207
at 0
spawn road_line
map 71
coords 480 210
at 0
spawn road_line
map 72
coords 480 213
at 0
spawn road_line
map 73
coords 480 216
at 0
spawn road_line
map 74
coords 480 219
at 0
spawn road_line
map 75
coords 480 222
at 0
spawn road_line2
map 76
coords 480 225
at 0
spawn road_line2
map 77
coords 480 228
at 0
spawn road_line2
map 78
coords 480 231
at 0
spawn road_line2
map 79
coords 480 234
at 0
spawn road_line2
map 80
coords 480 237
at 0
spawn road_line
map 81
coords 480 480
at 0
spawn road_line
map 82
coords 480 243
at 0
spawn road_line
map 83
coords 480 246
at 0
spawn road_line
map 84
coords 480 249
at 0
spawn road_line
map 85
coords 480 252
at 0
spawn road_line2
map 86
coords 480 255
at 0
spawn road_line2
map 87
coords 480 258
at 0
spawn road_line2
map 88
coords 480 261
at 0
spawn road_line2
map 89
coords 480 264
at 0
spawn road_line2
map 90
coords 480 267
at 0

90x3 pixels, which gives me a road 120 pixels high. Here's what it looks like on screen in the attached image.
The idea here would be to move each raster band 3 pixels downwards to simulate this effect of movement on the road.

Am I on the right track? Your concept of rasterized roads is so much more advanced (I'm trying to learn by doing it myself) and can you explain how you did it?

You could do that, but it's going to be very static, and it's not at all how the video demo I posted works.

Mine only needs one floor image and can therefore use real scrolling. You could use more, but you don't need more. The affine transformation is achieved by redrawing it through sub screens.

DC
 
Thanks, that's what I thought too: a floor that should be half the width of the screen and repeat. That's much more advanced than my approach.

So you designed sprites that are 480x1 pixel wide and how do you declare them?
I'd love for you to tell me more if you don't mind 🙂
 
Thanks, that's what I thought too: a floor that should be half the width of the screen and repeat. That's much more advanced than my approach.

So you designed sprites that are 480x1 pixel wide and how do you declare them?
I'd love for you to tell me more if you don't mind 🙂

You're still not paying attention. Subscreens, NOT sprites. This isn't a bunch of one pixel tall sprites. It's a single scrolling layer hidden from view, then captured and played back with a series of one pixel tall subscreens that can then apply drawmethods to create affine transformations. The subscreens don't move. They can - but to do stuff like make hills and valleys. They are not scrolling to create the motion.

It's similar to how raster lines used to work, but done in software instead of hardware. More CPU intensive, but nothing modern CPUs can't eat for breakfast, and infinitely more flexible.

sample.png

DC
 
This isn't a bunch of one pixel tall sprites.
which would be a bad idea afterall - Having a 1px tile would require you to draw 272 sprites on the screen just to create the background, which would be a tremendous waste of memory.
Okay, modern systems can handle this, but it's still a bad habit.
 
You're still not paying attention. Subscreens, NOT sprites. This isn't a bunch of one pixel tall sprites. It's a single scrolling layer hidden from view, then captured and played back with a series of one pixel tall subscreens that can then apply drawmethods to create affine transformations. The subscreens don't move. They can - but to do stuff like make hills and valleys. They are not scrolling to create the motion.

It's similar to how raster lines used to work, but done in software instead of hardware. More CPU intensive, but nothing modern CPUs can't eat for breakfast, and infinitely more flexible.

View attachment 12038

DC
I'm sorry DC: it's not that I'm not paying attention to what you're saying, quite the contrary, it's simply that I've never used a subscreen before.
I don't know at the moment how to use it to create a route and configure its transformations.
This seems like an excellent method indeed, but currently unattainable for me and I don't know how to use it correctly.

I don't know what I could do to generate this route, but I am willing to pay to make it feasible and accessible to everyone on Openbor.
 
which would be a bad idea afterall - Having a 1px tile would require you to draw 272 sprites on the screen just to create the background, which would be a tremendous waste of memory.
Okay, modern systems can handle this, but it's still a bad habit.
There would be fewer than 272 pixels because often a good part of the screen is devoted to an interface or a horizontally moving background.

Of course O' and that's how old games used to materialize a road, by rasterizing it into pieces between 1 and 4 pixels high and shifting them left or right to give an illusion of movement (turns for example).
 
@kimono, at the moment I am engrossed in another project, and am currently sworn to secrecy under pain of DEATH! Well, not really, but the preference is to get done what I am working on before its unveiled. Until then I'm not even working on my own projects and don't have time to code something for you, but maybe when its done we can have another look.

@O Ilusionista,

In fairness the screen method is technically the same thing as having a bunch of sprites from a CPU load perspective. The screens aren't a free lunch, but they do give you much, MUCH more flexibility. Optimizing isn't about never using CPU time, it's about saving wherever you can, brute forcing when you have to, and getting the most overall bang for your buck. :)

DC
 
@kimono The only one closest to your approach is the disco light entity from stage 2-2 of SOR3 route in @Kratus's SOR2X. You see both lights that lean to each other? Those are the same two entities, but they have different movements in one script. Actually, each moves in different ways if you know what I mean. You check it out.

C:
void main()
{//Lean sprite with shiftX and frame check (SOR3 DANCE CLUB)
    void self  = getlocalvar("self");
    float time = openborvariant("elapsed_time");
    
    if(getlocalvar("value") == NULL()){
        setlocalvar("value", 0);
    }
    
    if(getglobalvar("activeText") == 0 || getglobalvar("activeText") == NULL()){
        void name    = getentityproperty(self, "defaultname");
        int frame    = getentityproperty(self, "animpos");
        float speed    = 0.010;
        
        if(time%2 == 0){
            if(name == "St2_Disco1"){
                if(frame == 0){
                    setlocalvar("value", getlocalvar("value")+1.6);
                    speed = speed;
                }else{
                    setlocalvar("value", getlocalvar("value")-1.6);
                    speed = -speed;
                }
                
                setdrawmethod(self,1,256,256,0,0, getlocalvar("value"),1);
                changeentityproperty(self, "velocity", speed, 0, 0);
            }
            
            if(name == "St2_Disco2"){
                if(frame == 0){
                    setlocalvar("value", getlocalvar("value")-1.6);
                    speed = speed;
                }else{
                    setlocalvar("value", getlocalvar("value")+1.6);
                    speed = -speed;
                }
                
                setdrawmethod(self,1,256,256,0,0, getlocalvar("value"), 1);
                changeentityproperty(self, "velocity", speed, 0, 0);
            }
        }
    }
}
 
Back
Top Bottom